Compare commits

...

1127 Commits

Author SHA1 Message Date
Frank Bossen
4802ddd7f7 Partial fix for #138
Initial implementation of trellis quantization for arithmetic coding.
The rate computation does not yet implement all rules of the entropy
coder and may thus be suboptimal.
2014-12-21 01:52:41 +01:00
Josh Aas
9d8efde83b Take upstream r1455 to fix issue #95. 2014-12-20 13:21:16 -06:00
Frank Bossen
8a178239bd Partial fix for #138
Fix pass number computation in scan optimization to support case where
Huffman table optimization is not done, e.g. when arithmetic coding is
used
Enable combination of arithmetic coding and scan optimization
(previously disabled)
2014-12-20 04:23:39 +01:00
Frank Bossen
6c08ceb2ef Temp fix for #138
Disable scan optimization and trellis quantization when arithmetic
coding is used
2014-12-20 04:03:14 +01:00
Frank Bossen
4ac7101056 No scan opt if custom scan
Disables scan pattern optimization (JBOOLEAN_OPTIMIZE_SCANS extension
parameter) if a custom scan pattern is provided.
Fixes #137
2014-12-20 00:48:07 +01:00
Josh Aas
ed363b90ec Merge pull request #136 from tony2001/master
port upstream fix for local buffer overflow
2014-12-19 11:45:08 -06:00
Frank Bossen
8b7ffebe42 Fix filename in C file header 2014-12-17 07:53:18 +09:00
Frank Bossen
a6b1bda094 Consider vertical gradient in DC trellis
Add extension parameter JFLOAT_TRELLIS_DELTA_DC_WEIGHT that controls
how distortion is calculated in DC trellis quantization. The parameter
defines weighting between actual distortion of DC and distortion of
vertical gradient of DC.
By default the parameter is 0.0 and has no effect.
Addresses #117
2014-12-17 07:51:12 +09:00
Antony Dovgal
a06aeb25f2 port upstream fix for local buffer overflow
r1425

Fix Huffman local buffer overrun discovered by Debian developers when
attempting to transform a junk image using ImageMagick:
https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=768369
2014-12-16 13:52:33 +03:00
DRC
fa01dcb519 Partially fix 'make dist'
This incorporates an upstream fix to add jdmrg565.c to the tarball created
by 'make dist', as well as a fix to add the new jcmaster.h file to same.  There
are still some mozjpeg-specific files that aren't added when doing 'make dist'.
I'll let someone else worry about those.  This patch mainly ensures that any
files that might be eventually adopted upstream are included.
2014-12-14 06:00:40 -06:00
DRC
166aa51f5f Merge pull request #134 from dcommander/unit_test_fixes
Unit test fixes
2014-12-14 05:52:36 -06:00
DRC
3bc0839d7f Restore full bitwise compatibility with libjpeg-turbo when -revert is used
mozjpeg should produce identical output to libjpeg-turbo when the JCP_FASTEST
compression profile is used.  That means that that profile needs to revert to
the default libjpeg quantization/Huffman tables as well as disable mozjpeg's
duplicate table checking feature.  This patch also adds -revert to any instance
of cjpeg and jpegtran called by 'make test' (or ctest on Windows), so that
those tests actually work again.  The tests aren't useful for regression
testing the mozjpeg extensions, but at least they can now be used to regression
test the underlying code.
2014-12-14 05:31:57 -06:00
DRC
7432a53e2b Introduce a TJ_REVERT environment variable, which reverts the behavior of the TurboJPEG API to libjpeg[-turbo] defaults.
This serves the same purpose as the -revert switch in cjpeg.  It is primarily
included for testing purposes.
2014-12-14 04:43:02 -06:00
DRC
f645002fb6 Fix double free of cinfo->master caused by the extension framework modifications
There was an oversight in the extension framework.  jpeg_start_compress() can
be called multiple times between the time that a compress structure is created
and the time it is destroyed.  If this happened, then the following sequence
would occur:

-- heap alloc of master struct within jpeg_create_compress()
-- heap free of master struct within jinit_c_master_control()
-- static alloc of extended master struct (JPOOL_IMAGE) within
   jinit_c_master_control()
-- free extended master struct in jpeg_finish_compress()
-- jinit_c_master_control() now sees that cinfo->master is set and tries to
   free it, even though it has already been freed.  Chaos ensues.

The fix involved breaking out the extended master struct into a header so that
jpeg_create_compress() can go ahead and allocate it to the correct size, thus
eliminating the need to free and reallocate it in jinit_c_master_control().
Further, the master struct is now created in the permanent pool, so it will
survive until the compression struct is destroyed.  Further,
jinit_c_master_control() now resets all fields in the master struct that
are not related to the extension parameters.
2014-12-14 03:59:44 -06:00
fbossen
0123dd2472 Merge pull request #133 from dcommander/jpeg_set_compress_profile
Change JBOOLEAN_USE_MOZ_DEFAULTS to an integer parameter
2014-12-14 17:21:21 +09:00
DRC
668bb847d5 Rename jccompat.c to jcext.c
"jcext" is a bit more descriptive, since this code is primarily intended to
extend the libjpeg API.  It does so in a backward-ABI-compatible manner, but
"jccompat" could be misinterpreted to mean that the code is providing backward
compatibility at the code level..
2014-12-14 02:02:26 -06:00
DRC
3e2cf6909c Convert JBOOLEAN_USE_MOZ_DEFAULTS into an integer "compression profile" parameter
This eliminates JBOOLEAN_USE_MOZ_DEFAULTS and replaces it with
JINT_COMPRESS_PROFILE, a more flexible and descriptive parameter.  Currently,
this new parameter works in much the same way as the old-- it changes the
behavior of jpeg_set_defaults().  It currently supports only two values
(max. compression, i.e. mozjpeg defaults, and fastest, i.e. libjpeg-turbo
defaults), but it can be extended in the future with additional profiles that
balance compression ratio with performance.
2014-12-14 01:56:26 -06:00
Frank Bossen
f8dd3830eb Fix trellis / no Huffman opt combination
Enabling trellis and disabling Huffman table optimization was causing a
"Bogus buffer control mode" error as reported in #111
2014-12-09 21:24:53 -05:00
Frank Bossen
c51334f4d0 Add clarification re usage of scan optimization 2014-12-09 16:22:40 -05:00
Josh Aas
6d172465cc Drop executable bit for README-turbo.txt 2014-12-08 13:28:32 -06:00
Frank Bossen
fa6d5a29da Check quantization table index
Fixes #130
2014-12-07 23:10:52 -05:00
Frank Bossen
79929eae12 Fix argument name mismatch #128 2014-12-07 23:10:52 -05:00
Josh Aas
ef62d51374 Merge pull request #126 from dcommander/doc-tweaks
Tweak mozjpeg README file
2014-12-07 11:18:20 -06:00
Josh Aas
2c19e8cb79 Merge pull request #131 from tmatth/unused_but_set
jpegyuv: fix unused but set warning
2014-12-07 10:30:52 -06:00
Josh Aas
00ace7679a Bump mozjpeg version to 3.0 2014-12-07 10:15:45 -06:00
Tristan Matthews
775862809b jpegyuv: fix unused but set warning 2014-12-07 02:49:17 -05:00
DRC
bbaa3afe23 Wordsmith mozjpeg README file
This includes more descriptive text for the project summary (the same
text that is in the package descriptions), a more thorough description of the
libjpeg API extensibility framework, reformatting to improve readability
(particularly on 80-column terminals), and numerous grammar tweaks.
2014-12-01 15:50:00 -06:00
Frank Bossen
413ac73d98 Add documentation for mozjpeg
A brief explanation is provided for the parameters introduced in
mozjpeg
2014-11-29 19:20:33 -05:00
Frank Bossen
faa4c44453 Use single parameter for DC scan opt mode
JBOOLEAN_ONE_DC_SCAN and JBOOLEAN_SEP_DC_SCAN are merged into a single
parameter JINT_DC_SCAN_OPT_MODE
Default behavior is modified to use one DC scan per component
2014-11-29 19:15:46 -05:00
Frank Bossen
5dae26de7c Remove access to parameter that shouldn't be exposed 2014-11-28 15:06:30 -05:00
Frank Bossen
2a41c84487 Fix C comment style 2014-11-28 08:10:20 -05:00
Frank Bossen
675ad04262 Merge branch 'qtable'
Conflicts:
	jcparam.c (resolved)
2014-11-27 16:16:35 -05:00
Frank Bossen
30ef0977be Clean up qtable code and change defaults 2014-11-27 16:11:57 -05:00
fbossen
c5c47edfd2 Merge pull request #123 from dcommander/cjpeg-djpeg-jpegtran-version
Print the library version and exit whenever -version is passed to cjpeg, djpeg, or jpegtran
2014-11-24 16:59:54 -05:00
DRC
f20cba1bb0 Print the library version and exit whenever -version is passed to cjpeg, djpeg, or jpegtran. 2014-11-21 22:26:15 -06:00
fbossen
f46c7875dd Merge pull request #122 from dcommander/mozjpeg-defaults
Use mozjpeg defaults by default
2014-11-20 15:38:58 -05:00
DRC
9cb270a216 Use mozjpeg defaults by default
Since mozjpeg is now backward ABI-compatible with libjpeg[-turbo], it is now
possible to temporarily load mozjpeg into a binary application and cause that
application to generate uber-compressed JPEGs (at the expense of an extreme
performance loss, of course.)  For instance, someone could do

LD_LIBRARY_PATH=/opt/mozjpeg/lib convert blah_blah_blah

to make ImageMagick use mozjpeg instead of the system's pre-installed JPEG
library (libjpeg-turbo, in most cases.)  However, this only makes sense if
mozjpeg is actually producing different behavior by default than libjpeg-turbo.
Currently it isn't.  Currently it requires the application to set
JBOOLEAN_USE_MOZ_DEFAULTS to TRUE in order to enable the mozjpeg-specific
behavior, but of course applications that were built to use libjpeg[-turbo]
won't do that.  Thus, this patch sets use_moz_defaults to TRUE by default,
requiring an application to explicitly set it to FALSE in order to revert to
the libjpeg[-turbo] behavior (makes sense, since the only applications that
would need to revert to the libjpeg[-turbo] behavior would be mozjpeg-aware
applications.)

Note that we discussed the possibility of adding a function
(jpeg_revert_defaults()), which would act the same as jpeg_set_defaults() does
in libjpeg[-turbo].  This is a good solution for implementing the -revert
switch in cjpeg, but unfortunately it doesn't work for jpegtran.  The reason
is that jpeg_set_defaults() is called within the body of
jpeg_copy_critical_parameters(), which is part of the API.  So yet again,
if mozjpeg were loaded into a non-mozjpeg-aware application at run time, it
would be desirable for jpeg_copy_critical_parameters() to set the parameters
to mozjpeg defaults.  That means that, in order to implement the -revert
switch in jpegtran, it would be necessary to introduce a new function
(jpeg_revert_critical_parameters(), perhaps).  It seems cleaner to just keep
using the JBOOLEAN_USE_MOZ_DEFAULTS parameter to control the behavior of
jpeg_set_defaults(), even though this represents a minor abuse of the libjpeg
API (jpeg_set_defaults() is technically supposed to set all of the parameters
to defaults, irrespective of any previous state.  However, as long as we
document that JBOOLEAN_USE_MOZ_DEFAULTS works differently, then it should be
OK.)
2014-11-19 23:31:20 -06:00
Josh Aas
e6dd72874e Merge pull request #121 from dcommander/libjpeg-turbo-diff-review
Documentation and code cleanup from DRC
2014-11-18 17:58:36 -06:00
Josh Aas
445d9b4196 Merge pull request #120 from pornel/libjpeg-turbo
Libjpeg turbo sync
2014-11-17 22:52:38 -06:00
Frank Bossen
f3db724c2d Merge branch 'master' into qtable
Conflicts:
	cjpeg.c
	jcdctmgr.c
	jcparam.c
	jpeglib.h
	rdswitch.c
2014-11-12 14:15:12 -10:00
Frank Bossen
a8e56d39e5 Merge pull request #119
Define constant for number of DC trellis candidates
2014-11-12 13:37:53 -10:00
fbossen
1c5a481dfa Merge pull request #118 from dcommander/master
Backward ABI compatibility with libjpeg-turbo
2014-11-12 13:31:34 -10:00
Kornel Lesiński
3554fdb9cf Merge branch 'libjpeg-turbo'
* libjpeg-turbo:
  Remove trailing spaces
  Another oops.  tjBufSizeYUV2() should return -1 if width < 1.
  Oops.  tjPlaneSizeYUV() should return -1 if componentID > 0 and subsamp==TJSAMP_GRAY.
  The AltiVec code actually works on 32-bit PowerPC platforms as well, so change the "powerpc64" token to "powerpc".  Also clean up the shift code, which wasn't building properly on OS X.
  AltiVec SIMD implementation of fast forward DCT
  Bump version to 1.5 alpha1 to prepare for new features
  When building libjpeg-turbo on Un*x systems, INT32 is usually typedef'ed to long, not int, so we need to specify an int pointer when doing a 4-byte write to the RGB565 output buffer.  On little endian systems, this doesn't matter, but when you write a 32-bit int to a 64-bit long pointer address on a big endian system, you are writing to the upper 4 bytes, not the lower 4 bytes.  NOTE: this will probably break on big endian systems that use 16-bit ints (are there any of those still around?)
  Fix Windows build
  Fix issues with RGB565 color conversion on big endian machines.  The RGB565 routines are now abstracted in a separate file, with separate little-endian and big-endian versions defined at compile time through the use of macros (this is similar to how the colorspace extension routines work.)  This allows big-endian machines to take advantage of the same performance optimizations as little-endian machines, and it retains the performance on little-endian machines, since the conditional branch for endianness is at a very coarse-grained level.
  Fix build on OS X PowerPC platforms
  Oops.  Forgot to alter the version header in the change log to indicate the release of 1.4 beta.
2014-11-08 16:36:45 +00:00
DRC
e3ce6852a6 Remove trailing spaces
git-svn-id: svn://svn.code.sf.net/p/libjpeg-turbo/code/trunk@1411 632fc199-4ca6-4c93-a231-07263d6284db
2014-11-06 09:32:06 +00:00
DRC
3c85fc4bb1 Document the fact that the "age number" of the mozjpeg version of libjpeg is one higher (because it introduces new functions into the API) 2014-11-06 01:49:14 -06:00
DRC
017339f715 Change name of Mac package to com.mozilla.mozjpeg to avoid conflicts with libjpeg-turbo Mac package 2014-11-06 01:40:12 -06:00
DRC
63eb69de62 Remove unused code in TJBench
The merge from libjpeg-turbo 1.4 somehow failed here, and this function from
1.3 was left hanging.
2014-11-06 01:30:06 -06:00
DRC
ebc7c3a760 Reconcile indentation, whitespace, and other code formatting with libjpeg-turbo.
For whatever reason, some of these files didn't get fully merged from
libjpeg-turbo 1.4.  They still contained tab characters and other formatting
conventions from libjpeg-turbo 1.3.  This patch also fixes some obvious
indentation errors in the mozjpeg-specific code.  There is more formatting work
that needs to be done to the mozjpeg-specific code, to fix line overruns,
incorrect operator whitespace, and other issues that make it not consistent
with the libjpeg/libjpeg-turbo code.
2014-11-06 01:14:11 -06:00
DRC
5f1960f38c Fix a buglet introduced in the libjpeg-turbo changelog by mozjpeg 2014-11-05 20:54:20 -06:00
DRC
6b236241d2 Change "libmozjpeg" to "mozjpeg" in packaging and install functions
This might be slightly more controversial, since it changes the CMake and
autotools project names and the binaty package names to "mozjpeg", and it
changes the default install directory to /opt/mozjpeg.  To me, this makes much
more sense, but it does represent a change in operational behavior, which is
why I put it in a separate commit.
2014-11-05 20:47:54 -06:00
DRC
4618c247df Various wordsmithing and cosmetic changes to remove libjpeg-turbo-specific information
This patch does the following:
-- Implements some (hopefully non-controversial) changes to the package
descriptions, in order to prevent confusion (the existing descriptions from
libjpeg-turbo are not appropriate for mozjpeg.)
-- Replaces "libmozjpeg" with "mozjpeg" in all documentation and comments.  The project is called "mozjpeg", and it doesn't actually generate a library called
"libmozjpeg", so it doesn't make sense to use "libmozjpeg" to describe it.
-- Replaces "MozJPEG" with "TurboJPEG" in all documentation and comments.
"MozJPEG" appears to have been the product of blindly searching/replacing
instances of "Turbo".  TurboJPEG is the name of the API, and that name still
applies to the implementation in mozjpeg.  Furthermore, the TurboJPEG libraries
are still called "libturbojpeg" in mozjpeg.
-- Attempts to remove build instructions that are irrelevant or not applicable
to mozjpeg.  Further work possibly needs to be done here-- for instance, it
doesn't make much sense to have build instructions for mobile devices when the
library is not intended to be used for decoding.
-- Changes the vendor in the DEB and RPM files from "The libmozjpeg Project" to
"Mozilla Research".
-- Changes the source tarball location in the RPM spec file to correctly point
to the release tarball on github.
-- Changes the source directory in the RPM spec file to "mozjpeg-%{version}",
which is the actual name of the source directory in the mozjpeg tarballs.
2014-11-05 20:10:37 -06:00
DRC
7e27264523 Use tabs in the DLL definition files, per Microsoft conventions. 2014-11-05 17:17:04 -06:00
DRC
644fbcef01 Update the example code to demonstrate the use of the new extension parameter
accessor function.
2014-11-05 10:57:25 -06:00
DRC
90f94c9ec8 Rebase the DLL function ordinals for the ABI compatibility accessor functions.
The ABI compatibility feature was developed by the current maintainer of
libjpeg-turbo with an eye toward eventual inclusion in libjpeg-turbo (once
other features are added to libjpeg-turbo that necessitate the inclusion.)
Thus, it is easy to ensure that the DLL function ordinals will be synchronized
between libjpeg-turbo and mozjpeg.  However, it still makes sense to allow for
a little bit of breathing room, just in case.  Thus, this patch uses ordinals
starting at 200 for the accessor functions.  It would probably make sense to
start the equivalent decompressor get/set functions at ordinal 300, once they
are implemented.
2014-11-05 02:37:41 -06:00
DRC
29165500c9 Fix build error encountered when using MS Visual C++ (it doesn't support C99) -- at least not the version of MSVC++ I'm using.) 2014-11-04 01:59:19 -06:00
DRC
db2986c96f Restore backward ABI compatibility with libjpeg/libjpeg-turbo by moving the mozjpeg-specific parameters into the opaque jpeg_comp_master struct and implementing generic accessor functions for getting/setting those parameters. These functions can be used upstream, if the need for them arises in libjpeg-turbo, and they can also be easily extended to cover future extensions to the decompressor. Note that, in order to use jpeg_comp_master as a repository for extension parameters, cinfo->master is now allocated within the body of jpeg_CreateCompress(). It is later re-allocated in jinit_c_master_control(), because that function (and others in jcmaster.c) use an extended form of jpeg_comp_master, but the existing extension parameters are copied into the new master instance. Similar modifications would need to be made to the decompressor to support the same type of extension framework. 2014-11-04 01:58:52 -06:00
Frank Bossen
7b008bdf12 Add switch to cjpeg to select quant table
Replace -flat command line argument with more generic -quant_table
argument that selects one of several predefined quantization tables
2014-10-30 15:13:13 +01:00
Frank Bossen
8a12b6a6a0 Adjust lambda parameters
Parameters were retuned for grayscale and quality range 0-100
2014-10-30 14:52:41 +01:00
Frank Bossen
02fc068dc8 Add quantization tables
Add various quantization tables suggested in #84
Still need to do chroma
2014-10-29 16:10:48 +01:00
DRC
338ac421d7 Another oops. tjBufSizeYUV2() should return -1 if width < 1.
git-svn-id: svn://svn.code.sf.net/p/libjpeg-turbo/code/trunk@1409 632fc199-4ca6-4c93-a231-07263d6284db
2014-10-23 19:07:25 +00:00
DRC
1083a3bffb Oops. tjPlaneSizeYUV() should return -1 if componentID > 0 and subsamp==TJSAMP_GRAY.
git-svn-id: svn://svn.code.sf.net/p/libjpeg-turbo/code/trunk@1407 632fc199-4ca6-4c93-a231-07263d6284db
2014-10-23 18:53:20 +00:00
Frank Bossen
e581ede148 Fix mixed code/declarations 2014-09-30 11:22:08 -04:00
Frank Bossen
36b2fecd0c Merge branch 'floatovershoot' of https://github.com/pornel/mozjpeg into pornel-floatovershoot
Conflicts:
	jcdctmgr.c (resolved)
2014-09-30 10:57:09 -04:00
Frank Bossen
83d6a8e643 Add new quantization tables
New quantization tables tuned for PSNR-HVS are added.
Per-coefficient lambda weights are now derived based on the
quantization table entries.
2014-09-30 10:24:52 -04:00
Josh Aas
9de0e03f2f Merge pull request #108 from pornel/c89
C89 compat
2014-09-25 13:51:43 -05:00
Kornel Lesiński
873b390172 C89 compat 2014-09-25 10:11:45 -07:00
Kornel
6948e6c2bf Merge pull request #105 from dwbuiten/windowsfixes
Windows Fixes
2014-09-16 11:45:55 +01:00
Derek Buitenhuis
d81d671d36 Windows: Add jpeg_float_quality_scaling to exported symbols
Windows requires exported symbols to be explicitly declared.

Also, use a very large ordinal number so that any future symbols
added by IJG or TurboJPEG will not break ABI.

Fixes #104.

Signed-off-by: Derek Buitenhuis <derek.buitenhuis@gmail.com>
2014-09-16 10:45:45 +01:00
Derek Buitenhuis
7434b5eb2f Fix permissions on Windows-only files
Signed-off-by: Derek Buitenhuis <derek.buitenhuis@gmail.com>
2014-09-16 10:43:43 +01:00
fbossen
bf061b4a1c Merge pull request #101 from pornel/splinederinging
Deringing via overshoot clipping
2014-09-15 08:18:34 -04:00
Kornel Lesiński
d0755fa501 Estimate maximum useful overshoot from quantization table 2014-09-15 00:11:29 +01:00
Josh Aas
c88ce1aa16 Merge pull request #103 from pornel/dctargfix
Added missing braces
2014-09-14 09:30:10 -05:00
Kornel Lesiński
c629ccd7d9 Added missing braces 2014-09-14 14:14:30 +01:00
Frank Bossen
41ebea736d Make provisions for more default quant tables 2014-09-09 16:06:32 -04:00
Kornel Lesiński
2db4ee73ff C89 compatibility 2014-09-08 20:08:08 +01:00
Kornel Lesiński
bda865e181 Merge remote-tracking branch 'mozilla/master' into HEAD 2014-09-08 20:07:46 +01:00
Josh Aas
a914cb2d9f Merge pull request #102 from pornel/turbo
Libjpeg-turbo merge
2014-09-08 10:31:21 -05:00
Kornel Lesiński
9f785697e4 Script for git-svn reinitialization 2014-09-07 20:50:07 +01:00
Kornel Lesiński
662bf6ba7b Merge libjpeg-turbo r1390
* commit '73edb3d734a628fd88994bc974dc6737a58bd956': (45 commits)
  Rename the ARM64 assembly file to match the C file
  Fix several mathematical issues discovered in the ARM64 NEON code while running the extended regression tests introduced in r1267.  Specific comments can be found in the original patches: https://sourceforge.net/p/libjpeg-turbo/patches/64/
  Reformat code per Siarhei's original patch (to clearly indicate that the offset instructions are completely independent) and add Siarhei as an individual author (he no longer works for Nokia.)
  Clarify forward compatibility of iOS/ARM builds
  ARM64 NEON SIMD support for YCC-to-RGB565 conversion
  ARM NEON SIMD support for YCC-to-RGB565 conversion, and optimizations to the existing YCC-to-RGB conversion code:
  Ensure that tjFree() is used for any JPEG buffers that might have been dynamically allocated by the compress/transform functions.  To keep things simple, we use tjAlloc() for the statically-allocated buffer as well, so that tjFree() can always be used to free the buffer, regardless of whether it was allocated by tjbench or by the TurboJPEG library.  This fixes crashes that occurred on Windows when running tjunittest or tjbench with the -alloc flag.
  Revert r1335 and r1336.  It was a valiant effort, but on Windows, xmm8-xmm15 are non-volatile, and the overhead of pushing them onto the stack at the beginning of each function and popping them at the end was causing worse performance (in the neighborhood of 3-5%) than just using the work areas and limiting the register usage to xmm0-xmm7.  Best to leave the SSE2 code alone.  We can optimize the register usage for AVX2, once that port takes place.
  Windows doesn't have setenv().  Go, go Gadget Macros.
  1.4 beta1
  Fix 'make dist'
  Don't use sudo when building a Debian package unless the user is non-root
  Add a set of undocumented environment variables and Java system properties that allow compression features of libjpeg that are not normally exposed in the TurboJPEG API to be enabled.  These features are not normally exposed because, for the most part, they aren't "turbo" features, but it is still useful to be able to benchmark them without modifying the code.
  .func/.endfunc are only necessary when generating STABS debug info, which basically went out of style with parachute pants and Rick Astley.  At any rate, none of the platforms for which we're building the ARM code use it (DWARF is the common format these days), and the .func/.endfunc directives cause the clang integrated assembler to fail (http://llvm.org/bugs/show_bug.cgi?id=20424).
  Extend tjbenchtest so that it tests the dynamic JPEG buffer allocation feature in TurboJPEG.  Disable the tiling feature in TJBench whenever dynamic buffer allocation is enabled (because the tiling feature requires a separate buffer for each tile, using it successfully with dynamic buffer allocation would require a separate TurboJPEG compressor instance for each tile, and it's not worth going to that trouble right now.)
  Run the TurboJPEG conformance tests out of a directory in /tmp (for improved performance, if the source directory is on a remote file share.)  Fix an issue in TJBench.java that prevented it from working properly if the source image resided in a directory with a dot in the name.
  Oops
  Subtle point, but dest->outbuffer is a pointer to the address of the JPEG buffer, which is stored in the calling program.  Thus, *(dest->outbuffer) will always equal *outbuffer.  We need to compare *outbuffer with dest->buffer instead to determine if the pointer is being reused.
  If the output buffer in the TurboJPEG destination manager was allocated by the destination manager and is being reused from a previous compression operation, then we need to get the buffer size from the previous operation, since the calling program doesn't know the actual buffer size.
  Actually, we need to increase the size of BUFSIZE, not just the size of _buffer.  The previous patch might have cause problems if, for instance, state->free_in_buffer was 127 but 129 bytes were compressed.  In that case, only 127 of the 129 bytes would have been written to the file.  Also document the fix.
  ...

Conflicts:
	CMakeLists.txt
	Makefile.am
	configure.ac
	jcdctmgr.c
	release/deb-control.tmpl
	sharedlib/CMakeLists.txt
	simd/CMakeLists.txt
	turbojpeg.c
2014-09-07 18:21:19 +01:00
Kornel Lesiński
a7eb278df1 Merge mozjpeg into libjpeg-turbo
* origin/master: (23 commits)
  Update .gitignore
  .func/.endfunc are only necessary when generating STABS debug info, which basically went out of style with parachute pants and Rick Astley.  At any rate, none of the platforms for which we're building the ARM code use it (DWARF is the common format these days), and the .func/.endfunc directives cause the clang integrated assembler to fail (http://llvm.org/bugs/show_bug.cgi?id=20424).
  Enable DC trellis by default
  Avoid double inline attribute
  Detect libpng
  Implement DHT Merging
  Add .gitignore for autotools files
  Check memory alloc success
  Update cjpeg usage text
  Implement DQT merging
  Fix issue with scan printout
  Get rid of unnecessary and obsolete platform configuration instructions.
  Add error checks for malloc calls that don't already have them. Issue #87.
  yuvjpeg: fix trivial leak
  Parse quality as float
  PNG reading support
  Fix issue with DC trellis
  Add option to split DC scans
  Add trellis for DC
  Bump version to 2.1.
  ...

Conflicts:
	BUILDING.txt
	cdjpeg.h
	jcdctmgr.c
	jchuff.h
	jcmarker.c
	jcmaster.c
	jconfig.txt
	jpeglib.h
	rdswitch.c
2014-09-07 18:20:38 +01:00
Kornel Lesiński
71539b3e13 Merge libjpeg-turbo r1325
* commit 'b8d044a666056d4d8d28d7a5d0805ac32b619b36': (58 commits)
  Big oops.  wrjpgcom on Windows was being built using the rdjpgcom source.
  Prevent a buffer overrun if the comment begins with a literal quote character and the string exceeds 65k characters.  Also prevent comments longer than 65k characters from being written, since this will produce an incorrect JPEG file.
  Remove VMS-specific code
  Our copyright string is longer than JMSG_LENGTH_MAX, and this was causing a buffer overrun if output_message() was called with msg_code set to JMSG_COPYRIGHT, or if format_message() was called with msg_code set to JMSG_COPYRIGHT and with a buffer of length JMSG_LENGTH_MAX.
  We don't support non-ANSI C compilers
  Allow for building the MIPS DSPr2 extensions if the host is mips-* as well as mipsel-*.  The DSPr2 extensions are little endian, so we still have to check that the compiler defines __MIPSEL__ before enabling them.  This paves the way for supporting big-endian MIPS, and in the near term, it allows the SIMD extensions to be built with Sourcery CodeBench.
  SIMD-accelerated int upsample routine for MIPS DSPr2
  Fix MIPS build
  libjpeg-turbo has never supported non-ANSI compilers, so get rid of the crufty SIZEOF() macro.  It was not being used consistently anyhow, so it would not have been possible to build prior releases of libjpeg-turbo using the broken compilers for which that macro was designed.
  Remove MS-DOS code and information, and adjust copyright headers to reflect the removal of features in r1307 and r1308.  libjpeg-turbo has never supported MS-DOS, nor is it even possible for us to do so.
  Further copyright header cleanup
  Further copyright header cleanup
  Get rid of the HAVE_PROTOTYPES configuration option, as well as the related JMETHOD and JPP macros.  libjpeg-turbo has never supported compilers that don't handle prototypes.  Doing so requires ansi2knr, which isn't even supported in the IJG code anymore.
  Remove all of the NEED_SHORT_EXTERNAL_NAMES stuff.  There is scant information available as to which linkers ever had a 15-character global symbol name limit.  AFAICT, it might have been a VMS and/or a.out BSD thing, but none of those platforms have ever been supported by libjpeg-turbo (nor are such systems supported by other open source libraries of this nature.)
  Clean up code formatting in the SIMD interface functions
  SIMD-accelerated NULL convert routine for MIPS DSPr2
  Fix build, which was broken by the checkin of the MIPS DSPr2 accelerated smooth downsampling routine.  Until/unless other platforms include SIMD support for that function, it's just easier to #ifdef around it rather than adding stubs for the other platforms.
  Fix error in MIPS DSPr2 accelerated smooth downsample routine
  SIMD-accelerated h2v2 smooth downsampling routine for MIPS DSPr2
  Minor tweak to improve code readability
  ...

Conflicts:
	BUILDING.txt
	CMakeLists.txt
	Makefile.am
	cdjpeg.h
	cjpeg.1
	cjpeg.c
	configure.ac
	djpeg.1
	example.c
	jccoefct.c
	jcdctmgr.c
	jchuff.c
	jchuff.h
	jcinit.c
	jcmaster.c
	jcparam.c
	jcphuff.c
	jidctflt.c
	jpegint.h
	jpeglib.h
	jversion.h
	libjpeg.txt
	rdswitch.c
	simd/CMakeLists.txt
	tjbench.c
	turbojpeg.c
	usage.txt
	wrjpgcom.c
2014-09-07 16:59:11 +01:00
Kornel Lesiński
564022ebda Merge mozjpeg into libjpeg-turbo
* commit '1aa50b71d9453328ad30cce85baaf7ef87864197':
  Use precomputed table
  Improve floating point DCT
  Update doc re: various DCT implementations
  Fix build for wrjpgcom

Conflicts:
	jchuff.c
2014-09-07 16:51:55 +01:00
Kornel Lesiński
f9d1fcdf6f Merge libjpeg-turbo r1220
* commit '93ddfcfc1a814789ed64d967a6118616753bb9d5': (65 commits)
  Use clz/bsr instructions on ARM for bit counting rather than the lookup table (reduces memory footprint and can improve performance in some cases.)
  Make iOS build instructions more generic and applicable to all versions of Xcode;  modify iOS build procedure for Xcode 5.0 and later to fix a build issue with Xcode 5.1.
  Update build instructions to reflect the use of pkgbuild/productbuild
  Remove any claims of support for OS X 10.4 "Tiger" (the packaging system overhaul produces packages that require Leopard or later, and I haven't been able to test Tiger for years anyhow.)  Update TurboJPEG shared library version.
  Migrate Mac packaging system to pkgbuild, since PackageMaker is no longer supported.
  Remove the sections about replacing libjpeg at run time and compile time.  These were written before O/S distributions started shipping libjpeg-turbo, and they are either pedantic or no longer relevant.  Also remove any text that assumes the use of our official project binaries.  Notes specific to the official binaries have been moved into the project wiki.
  Fix Windows build
  Since we're now maintaining our own Cygwin pseudo-repository directories instead of recommending that users install these packages from a local source, it makes more sense to name the packages according to Cygwin specs, so they can be copied as-is into the pseudo-repository.
  39dbc2db9718f9af2f62eb486fd73328fe8bf5e8
  Fix 'make dist'
  RHEL 6 (and probably other platforms as well) sets _defaultdocdir=%{_datadir}/doc, which screws things up, since we're overriding _datadir.  Since we intend _defaultdocdir to be /usr/share/doc, just be explicit about it.
  Fix compiler warning about unused function when building with the libjpeg v6b API/ABI
  Fix compiler warning ("always_inline function might not be inlinable") when building with recent versions of GCC
  Enable silent build (can be overridden with 'make V=1') if the version of autotools being used is new enough.
  Extend YUVImage class to allow reuse of the same buffer with different metadata;  port TJBench changes that treat YUV encoding/decoding as an intermediate step of the JPEG compression/decompression pipeline rather than a separate test case;  add YUV encode/decode tests to the Java version of tjbenchtest
  formatting tweaks
  Fix an error that occurred when trying to use the lossless transform feature without specifying -quiet;  formatting tweak
  Move the garbage collection of the JPEG tiles into the decompression function to increase the chances that tiled decompression of large images will succeed without an OutOfMemoryError.
  Generate the Java documentation using javadoc 7, to improve readability.
  This should have been checked in with the previous commit.
  ...

Conflicts:
	BUILDING.txt
	configure.ac
	jversion.h
	release/Info.plist.in
	release/ReadMe.rtf
	tjbench.c
	turbojpeg.c
2014-09-07 16:50:54 +01:00
Kornel Lesiński
5d2d1d4c47 Merge mozjpeg into libjpeg-turbo
* mozjpeg: (94 commits)
  Disable scan optimization if no scan given
  Fixed mozjpeg build with Visual C++ 2010
  Added few error messages in cjpeg
  Fix trellis for nonprogressive mode (#69)
  Bugfix: AM_PROG_AR is not recognized by older automake, so only use it when defined
  Bump version number for 2.0, make this version 2.0.1.
  Update MS-SSIM tuning
  Fix #64
  Updating yuvjpeg and jpegyuv to match Daala tools.
  Fix #56
  Silence compiler warning
  Silence compiler warning
  Improve support of JPEG input in cjpeg
  Fix issue with JPEG read in cjpeg
  Add support for JPEG input in cjpeg
  Fix #50
  Disable trellis in jpegtran
  Update version to 2.0pre.
  Use single DC scan by default
  Add configure check for libm/pow. Fixes Linux build issue.
  ...
2014-09-07 16:06:59 +01:00
Kornel Lesiński
bdbb0138b9 Merge mozjpeg into libjpeg-turbo
* commit '72b66f9c77b3e4ae363b21e48145f635cec0b193':
  Initial commit of libjpeg-turbo plus readme edits.
2014-09-07 14:31:24 +01:00
DRC
78c2093bd4 The AltiVec code actually works on 32-bit PowerPC platforms as well, so change the "powerpc64" token to "powerpc". Also clean up the shift code, which wasn't building properly on OS X.
git-svn-id: svn://svn.code.sf.net/p/libjpeg-turbo/code/trunk@1406 632fc199-4ca6-4c93-a231-07263d6284db
2014-09-05 07:23:12 +00:00
DRC
a2cc95b827 AltiVec SIMD implementation of fast forward DCT
git-svn-id: svn://svn.code.sf.net/p/libjpeg-turbo/code/trunk@1405 632fc199-4ca6-4c93-a231-07263d6284db
2014-09-05 06:33:42 +00:00
DRC
7129fc6299 Bump version to 1.5 alpha1 to prepare for new features
git-svn-id: svn://svn.code.sf.net/p/libjpeg-turbo/code/trunk@1404 632fc199-4ca6-4c93-a231-07263d6284db
2014-09-04 18:51:31 +00:00
DRC
16db1b3f76 When building libjpeg-turbo on Un*x systems, INT32 is usually typedef'ed to long, not int, so we need to specify an int pointer when doing a 4-byte write to the RGB565 output buffer. On little endian systems, this doesn't matter, but when you write a 32-bit int to a 64-bit long pointer address on a big endian system, you are writing to the upper 4 bytes, not the lower 4 bytes. NOTE: this will probably break on big endian systems that use 16-bit ints (are there any of those still around?)
This patch also removes an unneeded macro from jdmerge.c.


git-svn-id: svn://svn.code.sf.net/p/libjpeg-turbo/code/trunk@1402 632fc199-4ca6-4c93-a231-07263d6284db
2014-09-04 17:28:28 +00:00
Kornel Lesiński
fdbbf10e90 Use more integers in Catmull-Rom 2014-09-03 16:31:28 +01:00
Kornel Lesiński
ecb17510f0 Deringing via overshoot clipping 2014-09-02 02:42:59 +01:00
DRC
33a9675dd3 Fix Windows build
git-svn-id: svn://svn.code.sf.net/p/libjpeg-turbo/code/trunk@1400 632fc199-4ca6-4c93-a231-07263d6284db
2014-08-30 22:00:33 +00:00
DRC
a4d5a6bb1c Fix issues with RGB565 color conversion on big endian machines. The RGB565 routines are now abstracted in a separate file, with separate little-endian and big-endian versions defined at compile time through the use of macros (this is similar to how the colorspace extension routines work.) This allows big-endian machines to take advantage of the same performance optimizations as little-endian machines, and it retains the performance on little-endian machines, since the conditional branch for endianness is at a very coarse-grained level.
git-svn-id: svn://svn.code.sf.net/p/libjpeg-turbo/code/trunk@1398 632fc199-4ca6-4c93-a231-07263d6284db
2014-08-30 20:33:49 +00:00
DRC
3f97ede419 Fix build on OS X PowerPC platforms
git-svn-id: svn://svn.code.sf.net/p/libjpeg-turbo/code/trunk@1395 632fc199-4ca6-4c93-a231-07263d6284db
2014-08-30 13:51:18 +00:00
DRC
ba88b106d5 Oops. Forgot to alter the version header in the change log to indicate the release of 1.4 beta.
git-svn-id: svn://svn.code.sf.net/p/libjpeg-turbo/code/trunk@1393 632fc199-4ca6-4c93-a231-07263d6284db
2014-08-30 13:47:51 +00:00
DRC
2ef1bec37f Rename the ARM64 assembly file to match the C file
git-svn-id: svn://svn.code.sf.net/p/libjpeg-turbo/code/trunk@1390 632fc199-4ca6-4c93-a231-07263d6284db
2014-08-29 01:53:17 +00:00
DRC
a1cea09935 Fix several mathematical issues discovered in the ARM64 NEON code while running the extended regression tests introduced in r1267. Specific comments can be found in the original patches:
https://sourceforge.net/p/libjpeg-turbo/patches/64/


git-svn-id: svn://svn.code.sf.net/p/libjpeg-turbo/code/trunk@1389 632fc199-4ca6-4c93-a231-07263d6284db
2014-08-29 01:49:59 +00:00
Frank Bossen
c0756e6119 Update .gitignore 2014-08-28 14:17:20 -04:00
Josh Aas
8b9eb07a36 Merge pull request #100 from ehsan/clang-as
.func/.endfunc are only necessary when generating STABS debug info, whic...
2014-08-26 14:10:48 -05:00
dcommander
2a21ae7463 .func/.endfunc are only necessary when generating STABS debug info, which basically went out of style with parachute pants and Rick Astley. At any rate, none of the platforms for which we're building the ARM code use it (DWARF is the common format these days), and the .func/.endfunc directives cause the clang integrated assembler to fail (http://llvm.org/bugs/show_bug.cgi?id=20424).
git-svn-id: svn://svn.code.sf.net/p/libjpeg-turbo/code/trunk@1375 632fc199-4ca6-4c93-a231-07263d6284db
2014-08-26 14:56:33 -04:00
Josh Aas
cd1bee49e1 Merge pull request #96 from dwbuiten/gitignore
Add .gitignore for autotools files
2014-08-26 12:32:58 -05:00
fbossen
df3ace7e9c Merge pull request #97 from dwbuiten/dhtmerge
Implement DHT Merging
2014-08-25 21:49:16 +02:00
DRC
33a4b3d400 Reformat code per Siarhei's original patch (to clearly indicate that the offset instructions are completely independent) and add Siarhei as an individual author (he no longer works for Nokia.)
git-svn-id: svn://svn.code.sf.net/p/libjpeg-turbo/code/trunk@1388 632fc199-4ca6-4c93-a231-07263d6284db
2014-08-25 15:26:09 +00:00
DRC
fe0750f0d2 Clarify forward compatibility of iOS/ARM builds
git-svn-id: svn://svn.code.sf.net/p/libjpeg-turbo/code/trunk@1387 632fc199-4ca6-4c93-a231-07263d6284db
2014-08-23 17:48:17 +00:00
DRC
a92d31df00 ARM64 NEON SIMD support for YCC-to-RGB565 conversion
git-svn-id: svn://svn.code.sf.net/p/libjpeg-turbo/code/trunk@1386 632fc199-4ca6-4c93-a231-07263d6284db
2014-08-23 15:57:38 +00:00
DRC
b052d67eb1 ARM NEON SIMD support for YCC-to-RGB565 conversion, and optimizations to the existing YCC-to-RGB conversion code:
-----

aee36252be.patch

From aee36252be20054afce371a92406fc66ba6627b5 Mon Sep 17 00:00:00 2001
From: Siarhei Siamashka <siarhei.siamashka@gmail.com>
Date: Wed, 13 Aug 2014 03:50:22 +0300
Subject: [PATCH] ARM: Faster NEON yuv->rgb conversion for Krait and Cortex-A15

The older code was developed and tested only on ARM Cortex-A8 and ARM Cortex-A9.
Tuning it for newer ARM processors can introduce some speed-up (up to 20%).

The performance of the inner loop (conversion of 8 pixels) improves from
~27 cycles down to ~22 cycles on Qualcomm Krait 300, and from ~20 cycles
down to ~18 cycles on ARM Cortex-A15.

The performance remains exactly the same on ARM Cortex-A7 (~58 cycles),
ARM Cortex-A8 (~25 cycles) and ARM Cortex-A9 (~30 cycles) processors.

Also use larger indentation in the source code for separating two independent
instruction streams.

-----

a5efdbf22c.patch

From a5efdbf22ce9c1acd4b14a353cec863c2c57557e Mon Sep 17 00:00:00 2001
From: Siarhei Siamashka <siarhei.siamashka@gmail.com>
Date: Wed, 13 Aug 2014 07:23:09 +0300
Subject: [PATCH] ARM: NEON optimized yuv->rgb565 conversion

The performance of the inner loop (conversion of 8 pixels):
* ARM Cortex-A7:  ~55 cycles
* ARM Cortex-A8:  ~28 cycles
* ARM Cortex-A9:  ~32 cycles
* ARM Cortex-A15: ~20 cycles
* Qualcomm Krait: ~24 cycles

Based on the Linaro rgb565 patch from
    https://sourceforge.net/p/libjpeg-turbo/patches/24/
but implements better instructions scheduling.


git-svn-id: svn://svn.code.sf.net/p/libjpeg-turbo/code/trunk@1385 632fc199-4ca6-4c93-a231-07263d6284db
2014-08-23 15:47:51 +00:00
DRC
7ff92d811b Ensure that tjFree() is used for any JPEG buffers that might have been dynamically allocated by the compress/transform functions. To keep things simple, we use tjAlloc() for the statically-allocated buffer as well, so that tjFree() can always be used to free the buffer, regardless of whether it was allocated by tjbench or by the TurboJPEG library. This fixes crashes that occurred on Windows when running tjunittest or tjbench with the -alloc flag.
git-svn-id: svn://svn.code.sf.net/p/libjpeg-turbo/code/trunk@1383 632fc199-4ca6-4c93-a231-07263d6284db
2014-08-22 19:27:28 +00:00
DRC
d0d81e9c3a Revert r1335 and r1336. It was a valiant effort, but on Windows, xmm8-xmm15 are non-volatile, and the overhead of pushing them onto the stack at the beginning of each function and popping them at the end was causing worse performance (in the neighborhood of 3-5%) than just using the work areas and limiting the register usage to xmm0-xmm7. Best to leave the SSE2 code alone. We can optimize the register usage for AVX2, once that port takes place.
git-svn-id: svn://svn.code.sf.net/p/libjpeg-turbo/code/trunk@1382 632fc199-4ca6-4c93-a231-07263d6284db
2014-08-22 18:30:44 +00:00
DRC
00696236df Windows doesn't have setenv(). Go, go Gadget Macros.
git-svn-id: svn://svn.code.sf.net/p/libjpeg-turbo/code/trunk@1380 632fc199-4ca6-4c93-a231-07263d6284db
2014-08-22 15:39:32 +00:00
DRC
2d055dc7c7 1.4 beta1
git-svn-id: svn://svn.code.sf.net/p/libjpeg-turbo/code/trunk@1379 632fc199-4ca6-4c93-a231-07263d6284db
2014-08-22 14:22:00 +00:00
DRC
50a3df621e Fix 'make dist'
git-svn-id: svn://svn.code.sf.net/p/libjpeg-turbo/code/trunk@1378 632fc199-4ca6-4c93-a231-07263d6284db
2014-08-22 14:19:12 +00:00
DRC
ea0f2c2811 Don't use sudo when building a Debian package unless the user is non-root
git-svn-id: svn://svn.code.sf.net/p/libjpeg-turbo/code/trunk@1377 632fc199-4ca6-4c93-a231-07263d6284db
2014-08-22 14:15:08 +00:00
DRC
04962caf3a Add a set of undocumented environment variables and Java system properties that allow compression features of libjpeg that are not normally exposed in the TurboJPEG API to be enabled. These features are not normally exposed because, for the most part, they aren't "turbo" features, but it is still useful to be able to benchmark them without modifying the code.
git-svn-id: svn://svn.code.sf.net/p/libjpeg-turbo/code/trunk@1376 632fc199-4ca6-4c93-a231-07263d6284db
2014-08-22 13:43:33 +00:00
DRC
83052612d0 .func/.endfunc are only necessary when generating STABS debug info, which basically went out of style with parachute pants and Rick Astley. At any rate, none of the platforms for which we're building the ARM code use it (DWARF is the common format these days), and the .func/.endfunc directives cause the clang integrated assembler to fail (http://llvm.org/bugs/show_bug.cgi?id=20424).
git-svn-id: svn://svn.code.sf.net/p/libjpeg-turbo/code/trunk@1375 632fc199-4ca6-4c93-a231-07263d6284db
2014-08-22 11:31:46 +00:00
DRC
2bbe593b31 Extend tjbenchtest so that it tests the dynamic JPEG buffer allocation feature in TurboJPEG. Disable the tiling feature in TJBench whenever dynamic buffer allocation is enabled (because the tiling feature requires a separate buffer for each tile, using it successfully with dynamic buffer allocation would require a separate TurboJPEG compressor instance for each tile, and it's not worth going to that trouble right now.)
git-svn-id: svn://svn.code.sf.net/p/libjpeg-turbo/code/trunk@1374 632fc199-4ca6-4c93-a231-07263d6284db
2014-08-22 03:04:06 +00:00
DRC
c62f3f40be Run the TurboJPEG conformance tests out of a directory in /tmp (for improved performance, if the source directory is on a remote file share.) Fix an issue in TJBench.java that prevented it from working properly if the source image resided in a directory with a dot in the name.
git-svn-id: svn://svn.code.sf.net/p/libjpeg-turbo/code/trunk@1373 632fc199-4ca6-4c93-a231-07263d6284db
2014-08-22 03:00:37 +00:00
DRC
ebfee8203a Oops
git-svn-id: svn://svn.code.sf.net/p/libjpeg-turbo/code/trunk@1370 632fc199-4ca6-4c93-a231-07263d6284db
2014-08-21 22:16:25 +00:00
DRC
4dec5210ef Subtle point, but dest->outbuffer is a pointer to the address of the JPEG buffer, which is stored in the calling program. Thus, *(dest->outbuffer) will always equal *outbuffer. We need to compare *outbuffer with dest->buffer instead to determine if the pointer is being reused.
git-svn-id: svn://svn.code.sf.net/p/libjpeg-turbo/code/trunk@1369 632fc199-4ca6-4c93-a231-07263d6284db
2014-08-21 22:15:19 +00:00
DRC
bc4d369b49 If the output buffer in the TurboJPEG destination manager was allocated by the destination manager and is being reused from a previous compression operation, then we need to get the buffer size from the previous operation, since the calling program doesn't know the actual buffer size.
git-svn-id: svn://svn.code.sf.net/p/libjpeg-turbo/code/trunk@1368 632fc199-4ca6-4c93-a231-07263d6284db
2014-08-21 15:51:47 +00:00
DRC
d4a32f71d4 Actually, we need to increase the size of BUFSIZE, not just the size of _buffer. The previous patch might have cause problems if, for instance, state->free_in_buffer was 127 but 129 bytes were compressed. In that case, only 127 of the 129 bytes would have been written to the file. Also document the fix.
git-svn-id: svn://svn.code.sf.net/p/libjpeg-turbo/code/trunk@1367 632fc199-4ca6-4c93-a231-07263d6284db
2014-08-21 03:40:37 +00:00
DRC
6bce2c22c7 Fix an extremely rare crash that can occur when compressing a very high-frequency MCU using quality 100 and no subsampling, and when dynamically allocating the JPEG buffer in the destination manager. Even with a test program designed specifically to reproduce the crash, it only occurred once in about 25 million iterations. More details here: https://sourceforge.net/p/libjpeg-turbo/bugs/64
git-svn-id: svn://svn.code.sf.net/p/libjpeg-turbo/code/trunk@1364 632fc199-4ca6-4c93-a231-07263d6284db
2014-08-21 01:53:47 +00:00
DRC
bbe6136281 Wordsmithing & clarifications
git-svn-id: svn://svn.code.sf.net/p/libjpeg-turbo/code/trunk@1363 632fc199-4ca6-4c93-a231-07263d6284db
2014-08-20 16:02:49 +00:00
DRC
7c0efc8589 Document the existence of the new ARM64 SIMD code
git-svn-id: svn://svn.code.sf.net/p/libjpeg-turbo/code/trunk@1362 632fc199-4ca6-4c93-a231-07263d6284db
2014-08-20 15:40:43 +00:00
DRC
f4543c7379 Properly detect the need for gas-preprocessor.pl when building for ARM64
git-svn-id: svn://svn.code.sf.net/p/libjpeg-turbo/code/trunk@1361 632fc199-4ca6-4c93-a231-07263d6284db
2014-08-20 13:14:46 +00:00
DRC
ce6f3d8cd2 Refactored YUVImage Java class so that it supports both unified YUV image buffers as well as separate YUV image planes; modified the JNI functions accordingly and added new helper functions to the TurboJPEG C API (tjPlaneWidth(), tjPlaneHeight(), tjPlaneSizeYUV()) to facilitate those modifications; changed potentially confusing "component width" and "component height" terms to "plane width" and "plane height" and modified variable names in turbojpeg.c to reflect this; numerous other documentation tweaks
git-svn-id: svn://svn.code.sf.net/p/libjpeg-turbo/code/trunk@1360 632fc199-4ca6-4c93-a231-07263d6284db
2014-08-17 12:23:49 +00:00
Frank Bossen
5f27ff790b Enable DC trellis by default 2014-08-17 10:43:59 +02:00
Josh Aas
d3c8cde986 Merge pull request #89 from pornel/floatq
Parse quality as float
2014-08-15 14:18:36 -05:00
DRC
804440b2e1 Make the wrapped functions static
git-svn-id: svn://svn.code.sf.net/p/libjpeg-turbo/code/trunk@1359 632fc199-4ca6-4c93-a231-07263d6284db
2014-08-15 16:40:56 +00:00
DRC
608dfddd22 Whitespace formatting tweaks
git-svn-id: svn://svn.code.sf.net/p/libjpeg-turbo/code/trunk@1355 632fc199-4ca6-4c93-a231-07263d6284db
2014-08-15 16:08:12 +00:00
DRC
370aaa61fd Add descriptions to help sort out which function goes with which version of the API.
git-svn-id: svn://svn.code.sf.net/p/libjpeg-turbo/code/trunk@1354 632fc199-4ca6-4c93-a231-07263d6284db
2014-08-15 16:07:15 +00:00
DRC
ba67ec6270 Fix build broken by r1349
git-svn-id: svn://svn.code.sf.net/p/libjpeg-turbo/code/trunk@1351 632fc199-4ca6-4c93-a231-07263d6284db
2014-08-15 14:40:36 +00:00
DRC
b83bfa68a9 Compiler warnings
git-svn-id: svn://svn.code.sf.net/p/libjpeg-turbo/code/trunk@1350 632fc199-4ca6-4c93-a231-07263d6284db
2014-08-15 14:40:05 +00:00
DRC
7def1fcf5b Restore backward compatibility between libjpeg-turbo 1.3.x JAR and the new JNI library
git-svn-id: svn://svn.code.sf.net/p/libjpeg-turbo/code/trunk@1349 632fc199-4ca6-4c93-a231-07263d6284db
2014-08-15 14:01:21 +00:00
DRC
91c739f541 Allow the int pixel versions of the various TurboJPEG JNI functions to share the same code as the byte pixel versions.
git-svn-id: svn://svn.code.sf.net/p/libjpeg-turbo/code/trunk@1348 632fc199-4ca6-4c93-a231-07263d6284db
2014-08-15 13:18:58 +00:00
Josh Aas
fc76d48701 Merge pull request #98 from pornel/inlineinline
Avoid double inline attribute
2014-08-14 21:57:44 -05:00
Josh Aas
df9b78ab5c Merge pull request #90 from pornel/png
PNG reading support
2014-08-14 21:54:31 -05:00
Kornel Lesiński
2e08021a9f Avoid double inline attribute 2014-08-14 22:16:31 +01:00
Kornel Lesiński
ad67be3b36 Detect libpng 2014-08-14 22:16:10 +01:00
Derek Buitenhuis
873a32e8d0 Implement DHT Merging
The current way multipass works, write_scan_header() seems to be called
multiple times, so only DC tables get merged, however, this will still
merge AC tables if possible.

Implements the second half of #30.

Signed-off-by: Derek Buitenhuis <derek.buitenhuis@gmail.com>
2014-08-14 18:19:29 +01:00
DRC
e9ccb2ff22 Clean up exception handling in the JNI code. The exception is actually not thrown until the function exits, so we can let the code fall through to bailout: if the TurboJPEG C function fails. Also, per the JNI spec, no other JNI functions can be called between GetPrimitiveArrayCritical() and ReleasePrimitiveArrayCritical(). This hasn't caused any problems thus far, but better safe than sorry.
git-svn-id: svn://svn.code.sf.net/p/libjpeg-turbo/code/trunk@1346 632fc199-4ca6-4c93-a231-07263d6284db
2014-08-14 16:54:04 +00:00
Derek Buitenhuis
6ab56c195e Add .gitignore for autotools files
This makes development work less error prone when committing.

Signed-off-by: Derek Buitenhuis <derek.buitenhuis@gmail.com>
2014-08-14 15:45:18 +01:00
Frank Bossen
2e7c6109ff Check memory alloc success 2014-08-13 16:33:45 +02:00
Frank Bossen
b2092f33c3 Update cjpeg usage text 2014-08-13 16:29:12 +02:00
Frank Bossen
c87576eb09 Merge branch 'dctrellis' 2014-08-13 16:21:39 +02:00
fbossen
fbff4b9500 Merge pull request #88 from dwbuiten/dqtmerge
Implement DQT merging
2014-08-13 16:15:09 +02:00
Derek Buitenhuis
d3a58a33cd Implement DQT merging
See #30.

Signed-off-by: Derek Buitenhuis <derek.buitenhuis@gmail.com>
2014-08-13 15:07:08 +01:00
Frank Bossen
05a5f4a9cc Fix issue with scan printout
Incorrect values of scan parameter Al were printed out in verbose mode
2014-08-13 15:35:29 +02:00
DRC
4db50792eb Oops. Parameter name is "strides", not "stride"
git-svn-id: svn://svn.code.sf.net/p/libjpeg-turbo/code/trunk@1345 632fc199-4ca6-4c93-a231-07263d6284db
2014-08-12 15:52:51 +00:00
DRC
8c2c415847 Reformat TurboJPEG C API documentation to improve ease of maintenance and to make it more consistent with the javadoc formatting; fix minor error in tjCompressFromYUV() prototype.
git-svn-id: svn://svn.code.sf.net/p/libjpeg-turbo/code/trunk@1344 632fc199-4ca6-4c93-a231-07263d6284db
2014-08-18 01:40:23 +01:00
Josh Aas
5b9d498fa0 Get rid of unnecessary and obsolete platform configuration instructions. 2014-08-11 14:09:11 -05:00
DRC
ab62cf7ba5 Extend the TurboJPEG C API to support handling YUV images stored in separate image planes instead of a unified buffer 2014-08-11 18:05:41 +00:00
DRC
22505838cb Clean up and consolidate notes regarding the YUV image format. This also corrects a factual error regarding the padding of the luminance plane-- because we now support 4:1:1, the component width is not necessarily padded to the nearest multiple of 2 if horizontal subsampling is used. 2014-08-10 20:12:17 +00:00
DRC
11fe81d0df Clean up notes using the doxygen @note command 2014-08-10 18:30:52 +00:00
DRC
0b8d990cef Make the documentation more readable by displaying fixed-width text (which is used to refer to variables and functions) in a different color. 2014-08-10 16:43:31 +00:00
DRC
ceb4712807 12-bit JPEG support 2014-08-09 23:06:07 +00:00
DRC
3c50582e77 Oops. The Windows version of collect_args/uncollect_args uses rsp, so we still need the rsp prologue/epilogue, despite the fact that we aren't using the stack as a work area. This fixes a segfault on Windows caused by r1335. 2014-08-09 22:58:18 +00:00
DRC
b7efc273a0 Attempt to improve performance by refactoring the compression-side color conversion and DCT algorithms so that they take full advantage of the additional registers available with 64-bit SSE2. This produces a somewhat yawn-worthy speedup of 2-3%, but at least the code is a lot more readable now. 2014-08-09 14:30:28 +00:00
Josh Aas
39bd663c71 Add error checks for malloc calls that don't already have them. Issue #87. 2014-08-07 22:42:08 -05:00
Josh Aas
1dc81a3bae Merge pull request #92 from tmatth/fix_yuvjpeg_leak
yuvjpeg: fix trivial leak
2014-08-07 10:23:25 -05:00
Tristan Matthews
3a379eda44 yuvjpeg: fix trivial leak
Cherry-picked from daala 91c1dfd8ec30fda886c31f00678eaf074e3e4a6c
2014-08-06 20:52:23 -04:00
Kornel Lesiński
5f434e6053 Parse quality as float 2014-08-04 21:35:51 +01:00
Kornel Lesiński
d11fc3c7c8 PNG reading support 2014-08-04 01:18:00 +01:00
Frank Bossen
7464e5fe76 Fix issue with DC trellis 2014-08-01 16:03:26 -04:00
Frank Bossen
33f39a2818 Add option to split DC scans
Command line option -split-dc-scan is added to code DC scans
independently (instead of interleaved). It should be determined whether
this option introduces any decoder compatibility issues ( see #83 )
Option -multidcscan is renamed to -opt-dc-scan
2014-07-31 15:26:38 -04:00
Frank Bossen
049e5c80b9 Add trellis for DC
Add option to apply trellis quantization to the DC coefficients ( see
#57 ). May need further refinement to make sure block order during
trellis optimization matches order during coding.
2014-07-31 12:11:36 -04:00
Josh Aas
594b7258cc Bump version to 2.1. 2014-07-29 09:12:48 -05:00
fbossen
0533b31891 Merge pull request #79 from arjun024/devel
more logical flow of control if trellis_quant enabled
2014-07-25 09:02:45 -04:00
Arjun Sreedharan
cca53c920d more logical flow of control if trellis_quant enabled
if trellis_quant is enabled, increment total number of
passes by optimization beginning pass number.

Signed-off-by: Arjun Sreedharan <arjun024@gmail.com>
2014-07-25 17:33:35 +05:30
Josh Aas
5901802871 Update README.md with link to 2.0 announcement and mailing list. 2014-07-24 16:39:26 -05:00
Frank Bossen
fbef31f76d Add option to disable progressive coding in cjpeg
Redefine baseline option in cjpeg to actually create a baseline JPEG
file by disabling progressive coding
2014-07-24 17:09:27 -04:00
Frank Bossen
1aa50b71d9 Use precomputed table
From jpeglib-turbo r1221:
Integrate a slightly modified version of Mozilla's patch for
precomputing the bit-counting LUT.  This is useful if the table needs
to be shared among multiple processes, although the primary reason for
doing that is reduced footprint on mobile devices, which are probably
already covered by the clz intrinsic code.
2014-07-24 10:50:59 -04:00
Frank Bossen
3adc64a4cb Improve floating point DCT
From libjpeg-turbo r1288
Port the more accurate (and slightly faster) floating point IDCT
implementation from jpeg-8a and later.  New research revealed that the
SSE/SSE2 floating point IDCT implementation was actually more accurate
than the jpeg-6b implementation, not less, which is why its
mathematical results have always differed from those of the jpeg-6b
implementation.  This patch brings the accuracy of the C code in line
with that of the SSE/SSE2 code.
2014-07-23 10:26:46 -04:00
Frank Bossen
ccb1d12f53 Update doc re: various DCT implementations
From libjpeg-turbo r1287
2014-07-23 10:23:24 -04:00
DRC
82b8751482 Fix performance and other issues uncovered in testing with actual ARM64 hardware; formatting tweaks; remove NEON platform check (NEON is always available with ARMv8) 2014-07-23 14:14:14 +00:00
Frank Bossen
c73a82c6aa Fix build for wrjpgcom
See r1325 in libjpeg-turbo
2014-07-23 09:22:55 -04:00
Frank Bossen
b9f25333f6 Disable scan optimization if no scan given
Addresses segmentation fault issue in #69
2014-07-21 20:11:46 +02:00
Josh Aas
0f6b96c68e Merge pull request #73 from pornel/master
Added few error messages in cjpeg
2014-07-21 11:23:20 -05:00
Josh Aas
eeea9ed397 Merge pull request #72 from jlongman/master
Bugfix: AM_PROG_AR is not recognized by older automake, so only use it w...
2014-07-21 11:21:30 -05:00
Josh Aas
b95528727f Merge pull request #75 from pmed/master
Fixed mozjpeg build with Visual C++ 2010
2014-07-21 11:18:33 -05:00
Pavel Medvedev
d9605b0560 Fixed mozjpeg build with Visual C++ 2010
Moved several variable declarations out of inner scopes to the function scope to compile C code with Visual C++ 2010
2014-07-21 15:32:54 +04:00
Kornel Lesiński
40e6e8b2a2 Added few error messages in cjpeg 2014-07-20 16:11:59 +01:00
Frank Bossen
514307e9e6 Fix trellis for nonprogressive mode (#69)
Correct number of trellis passes when in nonprogressive mode
2014-07-18 18:10:56 +02:00
jlongman
7388a54647 Bugfix: AM_PROG_AR is not recognized by older automake, so only use it when defined 2014-07-17 14:16:24 -04:00
DRC
24aeccff3e Include "Installed-Size" field in the deb-control file to prevent Ubuntu from complaining 2014-07-17 08:24:58 +00:00
DRC
e2f5c7cab3 Add proper support for Borland compilers (Borland needs section names to be prefixed with an underscore, and it needs OMF object files.) 2014-06-22 21:14:39 +00:00
DRC
8d4544b7bc Big oops. wrjpgcom on Windows was being built using the rdjpgcom source. 2014-06-22 20:46:48 +00:00
DRC
e3d3cc073d Prevent a buffer overrun if the comment begins with a literal quote character and the string exceeds 65k characters. Also prevent comments longer than 65k characters from being written, since this will produce an incorrect JPEG file. 2014-06-22 20:36:50 +00:00
DRC
b8f2b72acb Remove VMS-specific code 2014-05-29 19:31:45 +00:00
DRC
7e6f1ee2d4 Our copyright string is longer than JMSG_LENGTH_MAX, and this was causing a buffer overrun if output_message() was called with msg_code set to JMSG_COPYRIGHT, or if format_message() was called with msg_code set to JMSG_COPYRIGHT and with a buffer of length JMSG_LENGTH_MAX.
We can't simply increase JMSG_LENGTH_MAX, because it is part of the libjpeg API, and it is generally assumed that a buffer of this length will be passed to format_message().  Thus, the easiest solution is simply to use a shorter copyright string for JMSG_COPYRIGHT.
2014-05-28 20:19:54 +00:00
DRC
360ffd4441 We don't support non-ANSI C compilers 2014-05-21 04:13:09 +00:00
DRC
76ef3c5dda Allow for building the MIPS DSPr2 extensions if the host is mips-* as well as mipsel-*. The DSPr2 extensions are little endian, so we still have to check that the compiler defines __MIPSEL__ before enabling them. This paves the way for supporting big-endian MIPS, and in the near term, it allows the SIMD extensions to be built with Sourcery CodeBench. 2014-05-19 19:13:22 +00:00
DRC
6263c1fc1b SIMD-accelerated int upsample routine for MIPS DSPr2 2014-05-18 20:04:47 +00:00
DRC
ecfbabdbf3 Fix MIPS build 2014-05-18 19:36:05 +00:00
DRC
46611eb0ee libjpeg-turbo has never supported non-ANSI compilers, so get rid of the crufty SIZEOF() macro. It was not being used consistently anyhow, so it would not have been possible to build prior releases of libjpeg-turbo using the broken compilers for which that macro was designed. 2014-05-18 19:04:03 +00:00
DRC
144e7b79e4 Remove MS-DOS code and information, and adjust copyright headers to reflect the removal of features in r1307 and r1308. libjpeg-turbo has never supported MS-DOS, nor is it even possible for us to do so. 2014-05-18 18:33:44 +00:00
DRC
814fb56282 Further copyright header cleanup 2014-05-18 18:17:01 +00:00
DRC
44e609fa3a Further copyright header cleanup 2014-05-18 17:52:06 +00:00
DRC
f8301c92dd Get rid of the HAVE_PROTOTYPES configuration option, as well as the related JMETHOD and JPP macros. libjpeg-turbo has never supported compilers that don't handle prototypes. Doing so requires ansi2knr, which isn't even supported in the IJG code anymore. 2014-05-16 10:43:44 +00:00
DRC
2c0b793539 Remove all of the NEED_SHORT_EXTERNAL_NAMES stuff. There is scant information available as to which linkers ever had a 15-character global symbol name limit. AFAICT, it might have been a VMS and/or a.out BSD thing, but none of those platforms have ever been supported by libjpeg-turbo (nor are such systems supported by other open source libraries of this nature.) 2014-05-15 20:30:16 +00:00
DRC
5d5b9a497b Clean up code formatting in the SIMD interface functions 2014-05-15 19:45:11 +00:00
DRC
99de998e2c SIMD-accelerated NULL convert routine for MIPS DSPr2 2014-05-15 18:26:01 +00:00
DRC
b70fe7221e Fix build, which was broken by the checkin of the MIPS DSPr2 accelerated smooth downsampling routine. Until/unless other platforms include SIMD support for that function, it's just easier to #ifdef around it rather than adding stubs for the other platforms. 2014-05-15 18:22:24 +00:00
DRC
a37736dd43 Fix error in MIPS DSPr2 accelerated smooth downsample routine 2014-05-15 17:10:39 +00:00
DRC
c4c3ac6305 SIMD-accelerated h2v2 smooth downsampling routine for MIPS DSPr2 2014-05-14 15:00:10 +00:00
DRC
f66c307c2e Minor tweak to improve code readability 2014-05-14 14:57:43 +00:00
DRC
38bfd451d5 SIMD-accelerated merged upsampling routines for MIPS DSPr2 2014-05-13 18:40:14 +00:00
DRC
0297e2a61d The x86/x86-64 SIMD extensions were originally designed to accommodate changing the value of RGB_*, but this apparently broke when RGB-to-gray colorspace conversion was accelerated. Further, the ARM NEON extensions have always assumed that JCS_RGB behaves identically to JCS_EXT_RGB. Rather than fix these issues, it makes more sense to just stop claiming that we support changing the values of RGB_*, since doing so is no longer necessary. 2014-05-13 18:38:36 +00:00
DRC
cfbb147aad Add support for decompressing to RGB565 (16-bit) pixels 2014-05-12 09:23:57 +00:00
DRC
e99d135774 Document -rgb option in djpeg man page; "gray-scale"="grayscale" 2014-05-12 09:09:40 +00:00
DRC
f413bb5fb7 Use 2-space indentation for the enums, to be consistent with the structs 2014-05-12 00:34:58 +00:00
DRC
1d434bfdc9 Document the fact that the fast integer FDCT is not fully accelerated for quality levels above 97 + additional wordsmithing 2014-05-11 23:15:52 +00:00
DRC
8b11360a8b Port the more accurate (and slightly faster) floating point IDCT implementation from jpeg-8a and later. New research revealed that the SSE/SSE2 floating point IDCT implementation was actually more accurate than the jpeg-6b implementation, not less, which is why its mathematical results have always differed from those of the jpeg-6b implementation. This patch brings the accuracy of the C code in line with that of the SSE/SSE2 code. 2014-05-11 10:09:07 +00:00
DRC
e7fe0653e5 Provide a more thorough description of the trade-offs between the various DCT/IDCT algorithms, based on new resarch 2014-05-11 09:48:11 +00:00
DRC
84f9fbfe3e Modify Windows build system to take into account new assembly file names 2014-05-10 10:10:03 +00:00
DRC
1bd801a872 Using subdirectories unfortunately opened up a can of worms. In order to prevent object name conflicts, it is necessary to use the subdir-objects automake directive, but it simply doesn't work right on some of the versions of automake we still have to support. Another option would be to add a separate Makefile.am file to each subdirectory, but that requires maintaining a completely different set of build rules for each one. Fortunately, however, we're in the 21st century now, so we can use filenames longer than 8.3. 2014-05-10 09:53:34 +00:00
DRC
6af3f00efa Re-organize the x86/x86-64 SIMD routines into separate folders by instruction set so we can name each routine similarly to its corresponding C file. This also makes it easier to add support for new instruction sets. 2014-05-09 20:14:26 +00:00
DRC
0d25e86574 Remove trailing spaces (+ one additional tab in TJUnitTest.java that was missed in the previous commit) 2014-05-09 18:06:58 +00:00
DRC
e45363d7c2 Convert tabs to spaces in the libjpeg code and the SIMD code (TurboJPEG retains the use of tabs for historical reasons. They were annoying in the libjpeg code primarily because they were not consistently used and because they were used to format as well as indent the code. In the case of TurboJPEG, tabs are used just to indent the code, so even if the editor assumes a different tab width, the code will still be readable.) 2014-05-09 18:00:32 +00:00
DRC
ef1c66701a Fix an error in the MIPS DSPr2 fancy upsampling routine 2014-05-09 14:45:55 +00:00
DRC
f017a5de0f Fix regression that caused 'make test' to fail with non-x86 SIMD code. The round-off error in the SIMD float DCT/IDCT routines only exists in the SSE and SSE2 implementations. 2014-05-07 06:02:57 +00:00
DRC
e77bd79dc2 Shared the rm commands to reduce as much output noise as possible 2014-05-06 22:49:02 +00:00
DRC
943adfb1fe Redesign the libjpeg regression tests so that they fully cover all of the SIMD-accelerated algorithms (and most of the other ones as well) 2014-05-06 22:44:46 +00:00
DRC
43e9cee4b2 Replace our custom version of Android.mk with instructions on how to build a libjpeg-turbo SDK for Android using autotools. Upon consulting with AOSP, it appears that Android.mk isn't really necessary except when building libjpeg-turbo for use by the Android platform itself, and it makes more sense for them to maintain the makefile for that purpose rather than for it to be upstreamed. ndk-build has serious limitations that prevent it from being used to generate static libjpeg-turbo libraries (mainly, it isn't possible to combine pre-built objects from one module into a static library for another module, which is necessary because the SIMD extensions sometimes have to be built with different CFLAGS than the rest of the code.) In general, it's just better not to introduce a new build system. 2014-05-06 21:03:35 +00:00
DRC
3b78447867 Wordsmithing 2014-05-06 20:53:25 +00:00
DRC
7824f70008 SIMD-accelerated slow integer IDCT routine for MIPS DSPr2 2014-05-06 09:53:21 +00:00
DRC
361192b972 Phrasing. Boom. 2014-05-06 09:41:08 +00:00
DRC
1c6030799d Redesign the libjpeg regression tests so that they fully cover all of the SIMD-accelerated algorithms (and most of the other ones as well) 2014-05-06 08:58:11 +00:00
DRC
6fc85ff960 First pass at an Android makefile 2014-05-05 20:55:24 +00:00
DRC
a0908f87a5 We use __CHAR_UNSIGNED__ (automatically defined by the AC_C_CHAR_UNSIGNED macro) rather than CHAR_IS_UNSIGNED (defined by custom autoconf code in libjpeg that we didn't port over), although I doubt it matters on any of the platforms we support. 2014-04-20 19:11:52 +00:00
DRC
4c778664d0 Fix crashes and bogus output in the CMYK and decode-to-YUV features that occurred if JCS_EXTENSIONS wasn't defined. 2014-04-20 09:42:49 +00:00
DRC
2732926d8d Fix 'make dist' 2014-04-20 09:23:01 +00:00
DRC
8c1d7c702e This patch accomplishes the following:
-- Auto-generates HAVE_LOCALE_H macro and adds it to jconfig.h (this is used by rdjpgcom.c.)
-- Reconciles the description and ordering of macros between config.h.in and jconfig.h.in, so the two files can be easily diffed.
-- Eliminates the use of the autoheader-generated config.h in the project and moves relevant internal-only macros into a new file, jconfigint.h.  This is to avoid "already defined" warnings in files that were including both config.h (to get the internal autotools package information or the INLINE definition) and jconfig.h.
2014-04-20 09:13:37 +00:00
DRC
faac204f30 Work around an issue in Visual C++ 2010 and 2013 that was causing the 256-bit bitmap test in the regression tests to fail. More specifically, when optimization is enabled in these versions of Visual C++, the optimizer seems to get confused by the following code block:
delta = cur0 * 2;
       cur0 += delta;          /* form error * 3 */
       errorptr[0] = (FSERROR) (bpreverr0 + cur0);
       cur0 += delta;          /* form error * 5 */
       bpreverr0 = belowerr0 + cur0;
       cur0 += delta;          /* form error * 7 */

Each time cur0 is incremented by delta, the compiled code doubles the value of delta (WTF?!)  Thus, by the time the end of the block is reached, cur0 is equal to 15 times its former self, not 7 times its former self as it should be.  At any rate, it was a lot simpler to just refactor the code so that it uses multiplication.
2014-04-20 06:57:52 +00:00
DRC
682c2b69f9 Minor comment correction (we support the full range of IDCT scaling factors now.) 2014-04-18 07:57:48 +00:00
DRC
2dc2bbde66 Clarify how to do a 64-bit build using the Visual Studio IDE 2014-04-18 07:49:29 +00:00
DRC
d895eac10e Update Windows build instructions 2014-04-17 20:05:03 +00:00
DRC
378f4528ad Fix warnings about unused variables when building with GCC 4.8.x 2014-04-16 23:38:37 +00:00
DRC
e223a7ee9e Fix compiler warning ("always_inline function might not be inlinable") when building with recent versions of GCC; Unix EOL 2014-04-16 23:32:58 +00:00
DRC
2e3f284fa5 Set the BUILD environment variable properly when building with MinGW implementations that lack a Unix shell (TDM-GCC, for instance); Only set CMP0022 if it is supported (older CMake implementations don't support it); Remove trailing spaces 2014-04-16 23:29:38 +00:00
DRC
2dac0fbd04 Remove trailing spaces 2014-04-15 03:42:40 +00:00
DRC
9e74f518bd wordsmithing 2014-04-15 03:41:31 +00:00
DRC
222279a4f0 wordsmithing 2014-04-15 03:07:44 +00:00
DRC
038cf66ab2 Integrate a slightly modified version of Mozilla's patch for precomputing the bit-counting LUT. This is useful if the table needs to be shared among multiple processes, although the primary reason for doing that is reduced footprint on mobile devices, which are probably already covered by the clz intrinsic code. 2014-03-28 18:50:30 +00:00
DRC
a60728cb34 Use clz/bsr instructions on ARM for bit counting rather than the lookup table (reduces memory footprint and can improve performance in some cases.) 2014-03-28 18:33:25 +00:00
DRC
5610bb1fec Make iOS build instructions more generic and applicable to all versions of Xcode; modify iOS build procedure for Xcode 5.0 and later to fix a build issue with Xcode 5.1. 2014-03-27 03:35:21 +00:00
DRC
86612bf441 Update build instructions to reflect the use of pkgbuild/productbuild 2014-03-25 05:27:16 +00:00
DRC
af19664571 Remove any claims of support for OS X 10.4 "Tiger" (the packaging system overhaul produces packages that require Leopard or later, and I haven't been able to test Tiger for years anyhow.) Update TurboJPEG shared library version. 2014-03-23 18:06:11 +00:00
DRC
aa411b107f Migrate Mac packaging system to pkgbuild, since PackageMaker is no longer supported. 2014-03-23 17:53:07 +00:00
DRC
fdc2954e79 Remove the sections about replacing libjpeg at run time and compile time. These were written before O/S distributions started shipping libjpeg-turbo, and they are either pedantic or no longer relevant. Also remove any text that assumes the use of our official project binaries. Notes specific to the official binaries have been moved into the project wiki. 2014-03-23 15:21:20 +00:00
DRC
87768cc42c Fix Windows build 2014-03-22 23:03:03 +00:00
DRC
166227c3c7 Since we're now maintaining our own Cygwin pseudo-repository directories instead of recommending that users install these packages from a local source, it makes more sense to name the packages according to Cygwin specs, so they can be copied as-is into the pseudo-repository. 2014-03-22 20:51:38 +00:00
DRC
1cf34093b9 2014-03-22 20:43:03 +00:00
DRC
d10edbc1ee Fix 'make dist' 2014-03-22 20:22:52 +00:00
DRC
67599a5dc6 RHEL 6 (and probably other platforms as well) sets _defaultdocdir=%{_datadir}/doc, which screws things up, since we're overriding _datadir. Since we intend _defaultdocdir to be /usr/share/doc, just be explicit about it. 2014-03-21 11:01:00 +00:00
DRC
dd12a235c5 Fix compiler warning about unused function when building with the libjpeg v6b API/ABI 2014-03-21 09:35:02 +00:00
DRC
92c7ae8911 Fix compiler warning ("always_inline function might not be inlinable") when building with recent versions of GCC 2014-03-21 09:23:41 +00:00
DRC
7bb4dbb81b Enable silent build (can be overridden with 'make V=1') if the version of autotools being used is new enough. 2014-03-21 08:36:58 +00:00
DRC
c4f4d18352 Extend YUVImage class to allow reuse of the same buffer with different metadata; port TJBench changes that treat YUV encoding/decoding as an intermediate step of the JPEG compression/decompression pipeline rather than a separate test case; add YUV encode/decode tests to the Java version of tjbenchtest 2014-03-17 11:14:52 +00:00
DRC
5e75573709 formatting tweaks 2014-03-17 10:40:10 +00:00
DRC
5bfddde8fd Fix an error that occurred when trying to use the lossless transform feature without specifying -quiet; formatting tweak 2014-03-17 10:19:42 +00:00
DRC
b7d9250185 Move the garbage collection of the JPEG tiles into the decompression function to increase the chances that tiled decompression of large images will succeed without an OutOfMemoryError. 2014-03-17 10:13:17 +00:00
DRC
821a20d0e8 Generate the Java documentation using javadoc 7, to improve readability. 2014-03-16 23:12:25 +00:00
DRC
a35cc3acf8 This should have been checked in with the previous commit. 2014-03-16 22:59:51 +00:00
DRC
9e9df11625 Extend the YUV decode functionality to the TurboJPEG Java API, and port the TJUnitTest modifications that treat YUV encoding/decoding as an intermediate step of the JPEG compression/decompression pipeline rather than a separate test case; Add the ability to encode YUV images from an arbitrary position in a large image buffer; Significantly refactor the handling of YUV images; numerous doc tweaks; other Java API cleanup and usability improvements 2014-03-16 22:56:26 +00:00
DRC
960ea8fb66 As with tjDecompressToYUV*(), tjCompressFromYUV() also conditionally uses an intermediate buffer if the source image dimensions do not fall on MCU boundaries. 2014-03-15 08:48:53 +00:00
DRC
d56079bc7e Remove unneeded/unused code 2014-03-14 08:59:27 +00:00
DRC
80d2fe24c8 Streamline the BufferedImage functionality in the compressor so that it works the same way as compressing a "normal" image, and deprecate the old BufferedImage methods and other redundant methods. Eliminate the use of deprecated features in the test programs. 2014-03-14 08:53:33 +00:00
DRC
b0073a2851 Remove benchmarks. They were originally intended as a way of measuring overhead for small compress/decompress operations, but using TJBench with a small image is a better way to accomplish that. 2014-03-14 04:32:03 +00:00
DRC
68a89e0170 Formatting tweak 2014-03-14 04:27:03 +00:00
DRC
5d4f2feeed Oops. This code should not have been removed. It is necessary for generating the error images. 2014-03-14 04:15:43 +00:00
DRC
3aa498b9e1 Actually, the issue with nightshot_iso_100 is unrelated to the image size. Reducing the size to 128x95, the same size as vgl_6548_0026, does not eliminate the problem. The issue seems to always occur when decompression scaling is enabled. It is unclear at this point whether this is a bug or expected behavior, but the pixels generated by the split decompression functions appear correct. They are just slightly different (but not visibly so) from the pixels generated by the monolithic decompression function. 2014-03-13 21:19:12 +00:00
DRC
022952d37d Add a mode to tjbenchtest for testing the YUV encoding/decoding functions 2014-03-13 20:48:38 +00:00
DRC
593bb84e41 If we have transformed a 4:2:2 or 4:4:0 image in any way that transposes the horizontal and vertical dimensions, then we need to inform the decompression function that the subsampling type has changed. Otherwise, tjDecodeYUV() will not produce correct results. 2014-03-13 20:33:43 +00:00
DRC
dbebf635b0 Whitespace tweaks 2014-03-13 08:32:20 +00:00
DRC
2ed7138390 Execute warmup runs with tjTransform() as well 2014-03-12 07:17:23 +00:00
DRC
88ae091ca1 Fix a couple of output formatting issues 2014-03-12 07:16:17 +00:00
DRC
009b6a50b5 Since we now have a complete set of YUV functions, TJBench can be greatly simplified. It now tests YUV encoding/decoding as an intermediate step of JPEG compression/decompression, which eliminates the need for a separate YUV mode. Several other things have been streamlined in the process. 2014-03-12 06:51:39 +00:00
DRC
885da7cef9 Fix a segfault that would occur in decompress-only mode if -alloc was specified without -tile. 2014-03-12 06:17:12 +00:00
DRC
7f0bceb586 Silence warning in CMake 2.8.12 and later 2014-03-11 06:31:09 +00:00
DRC
e4552b8143 Fix the build of the Java classes when using MSVC 2010 and later. Something in the recesses of my brain is telling me that I tried this before and it failed under some circumstances, but it must have been a bug in an older CMake implementation. CMake 2.8.8 and later seem to work fine with this patch. This patch also updates the minimum required version to 2.8.8, because 2.8.8 fixed another issue that was preventing the SIMD code from building under MSVC 2010 and later. 2014-03-11 06:24:46 +00:00
DRC
1cdf41108b For now, punt on trying to support fancy upsampling in tjDecodeYUV(). Fancy upsampling requires context rows and other refinements, which are difficult to implement correctly with the algorithm we're using. Longer-term, supporting fancy upsampling would probably require using the main buffer that libjpeg allocates. 2014-03-10 20:14:53 +00:00
DRC
adb33bb1a4 Fix additional uninitialized values reported by valgrind 2014-03-10 20:11:56 +00:00
DRC
8419f05afa When tjDecodeYUV() is used with a "fresh" decompressor instance (one that hasn't been previously used to decompress a JPEG image), then it needs comps_in_scan, data_precision, and the quantization tables to be defined. This patch also extends TJUnitTest to check for this error. 2014-03-10 09:34:04 +00:00
DRC
435f18d902 Silence valgrind false positives about uninitialized values. Even with this patch, valgrind still complains about uninitialized values when decompressing or decoding to a buffer with an alpha-enabled colorspace. Not sure why this happens, but it occurs in libjpeg-turbo 1.3 as well, and only when the x86/x86-64 SIMD code is being used. It is my belief that these remaining warnings are also false positives, because if the output buffer is memset to all 0's prior to invoking tjDecodeYUV()/tjDecompress(), no errors are reported. If any of the alpha channel bits were in fact not being initialized, then they would still be 0 after invoking tjDecodeYUV()/tjDecompress(), and TJUnitTest would report an error. 2014-03-08 20:50:35 +00:00
DRC
bac0f31e7c Add a blank line before the alpha-enabled colorspace tests in order to improve readability 2014-03-08 20:32:37 +00:00
DRC
897a525e3f Go ahead and call jinit_master_decompress() rather than trying to reproduce its functionality. That function does a few things that we were missing, including allocating the range limit table used by the plain C color conversion code. 2014-03-07 03:52:57 +00:00
DRC
2409fb9d03 Oops. We need to call start_pass() on the color converter in order to allocate the conversion tables used by the plain C code. 2014-03-06 20:07:03 +00:00
DRC
89c9791c8e Fix regression introduced in r1122 that caused SIMD detection to malfunction for ARM platforms (and probably ARM64 and MIPS as well.) 2014-03-06 09:26:49 +00:00
DRC
b861ef600c Fix unitialized value reported by valgrind (the upsampling routine used by 4:4:0 and 4:1:1 reads the value of component_index.) 2014-02-28 09:35:34 +00:00
DRC
5c2f2cccb7 Implement a YUV decode function in the TurboJPEG API, to be symmetric with tjEncodeYUV(). 2014-02-28 09:17:14 +00:00
DRC
9961cd6aed Remove benchmarks. They were originally intended as a way of measuring overhead for small compress/decompress operations, but using TJBench with a small image is a better way to accomplish that. 2014-02-28 09:06:42 +00:00
DRC
6500625c07 Remove unused code (the destination manager is not used during YUV encoding, there are no virtual arrays to realize, and jinit_c_prep_controller() is unnecessary because we are not using smoothing.) 2014-02-28 05:34:02 +00:00
DRC
b7e14cbaca Use C-style comments 2014-02-27 21:22:54 +00:00
DRC
005d7c52a7 Oops 2014-02-20 19:33:44 +00:00
DRC
b9e72234e1 Older versions of automake don't support AM_PROG_AR, so only execute that macro if it exists. 2014-02-15 07:14:58 +00:00
DRC
618fb42ff1 Fix autoconf warnings 2014-02-15 07:02:04 +00:00
DRC
9ba6976321 Update copyright year in file header as well 2014-02-11 09:55:32 +00:00
DRC
040c688263 Fix an issue that prevented tjEncodeYUV3() and TJCompressor.encodeYUV() from working properly if the source image was very tiny. Basically, jpeg_start_compress() was attempting to write the JPEG headers, which was overrunning the YUV buffer. This patch removes the call to jpeg_start_compress() in tjEncodeYUV3() and replaces it with calls to the individual routines that are necessary to initialize the color converter and downsampler. TJUnitTest has also been modified to test for this condition (the buffer size regression test now works in YUV mode.) 2014-02-11 09:45:18 +00:00
DRC
d3d06f42c1 Update copyright notice to reflect recent SIMD contributions 2014-02-09 14:12:12 +00:00
DRC
7d8ed9833e Further examination of the code reveals that this change is unnecessary. The histogram stores a count of each color in the image, so it will always contain at least one non-zero element, and thus the total can never be zero. Since the histogram is generated from the image data and not read from the header, there is no chance that header corruption would affect it. 2014-02-07 19:05:07 +00:00
DRC
3317c65fb9 Fix several potential overflow issues identified by the community. 2014-02-06 19:30:32 +00:00
DRC
bf417e56e0 Remove trailing space 2014-02-06 19:13:24 +00:00
DRC
890f35098a Create a separate stub file for 64-bit ARM, since it currently implements only the decompression-related functions. 2014-02-05 19:03:41 +00:00
DRC
1bb1e69186 First pass at ARMv8 64-bit NEON SIMD support 2014-02-05 08:15:44 +00:00
DRC
abb6a513fa Formatting tweaks 2014-02-05 07:39:38 +00:00
DRC
671fea53d1 Remove trailing spaces 2014-02-01 06:17:31 +00:00
DRC
857564d019 Some motion JPEG implementations generate "abbreviated JPEG streams" (JPEG images without the default tables included) for some or all of the video frames, in order to save space. When these are encountered, it is generally expected that they will be decompressed using the default Huffman tables, so libjpeg-turbo now does this unless the tables have been explicitly specified by an application. 2014-01-31 17:22:15 +00:00
DRC
4f4d870822 Include instructions for building iOS binaries using Xcode 4.6.x and Xcode 5.0. 2014-01-29 19:31:09 +00:00
DRC
540789427c Per the conventions of the image compression and digital video communities, use "YCbCr" to describe the JPEG colorspace and "YUV" to describe an image format consisting of Y, Cb, and Cr planes (this partially reverts r960.) 2013-11-25 21:12:23 +00:00
DRC
c5aefc3659 Fix CVE-2013-6629 and CVE-2013-6630 2013-11-21 18:31:08 +00:00
DRC
db6e007c44 Back-port code from jpeg-8 that removes unpopulated (and unneeded) tables for AC and DC coefficients when generating progressive JPEG files with arithmetic coding. This should make such files bitwise compatible with jpeg-8, barring any other mathematical differences listed in README-turbo.txt. Add regression tests for progressive+arithmetic JPEG files. 2013-11-06 06:50:38 +00:00
DRC
2d4ca5d710 Remove unnecessary whitespace 2013-11-06 05:51:03 +00:00
DRC
3b80b515fe Add the ability to test scaling when decompressing to YUV; compression from YUV to JPEG; and YUV padding. Replace clunky -411 and -440 parameters with a -subsamp parameter that allows any of the subsampling options to be tested in isolation. 2013-11-05 19:53:12 +00:00
DRC
61298968fa Add the ability to test scaling when decompressing to YUV; compression from YUV to JPEG; and YUV padding. Replace clunky -411 and -440 parameters with a -subsamp parameter that allows any of the subsampling options to be tested in isolation. 2013-11-04 23:07:54 +00:00
DRC
bd029eb0f7 Make environment variable syntax consistent between ARM and x86 code, and add an option to disable SIMD on x86 (this option will be added to the x86-64 code as well, but it makes more sense to add it when we add AVX support.) 2013-10-31 07:40:24 +00:00
DRC
b767b5e6bb Deprecate and undocument the FORCE{MMX|SSE|SSE2|SSE3} flags. These were originally introduced in TurboJPEG/IPP as a way to override the automatic CPU selection in the underlying IPP codec, which was closed source. They are not meaningful anymore, since libjpeg-turbo provides environment variables to accomplish the same thing and since it no longer necessarily uses x86 SIMD code behind the scenes. 2013-10-31 07:11:39 +00:00
DRC
a7fa97cda5 Extend the TurboJPEG Java API to support compressing JPEG images from YUV planar images 2013-10-31 05:04:51 +00:00
DRC
98e6ffb50c Add 'tjunittest -yuv -alloc' test on Windows as well 2013-10-31 05:02:20 +00:00
DRC
fca3a77590 r1065 broke the build on Windows, because getinstance() defines a variable. Thus, it needs to occur before the array initialization code. 2013-10-31 05:00:19 +00:00
DRC
2bdc88ba48 Clean up formatting code and rename the JPEG files generated during the YUV decode tests to reflect the fact that they are being generated from YUV source images. 2013-10-31 04:53:27 +00:00
DRC
b3633e930b Extend the TurboJPEG C API to support compressing JPEG images from YUV planar images 2013-10-30 23:02:57 +00:00
DRC
8e4a07e20f Oops 2013-10-30 22:21:58 +00:00
DRC
07eadec225 Fix a really subtle issue whereby an invalid free() could occur if a program called tjInitDecompress() and then accidentally passed the handle to tjEncodeYUV3(), or if a program called tjInitCompress() and then accidentally passed the handle to tjDecompressToYUV2(). 2013-10-30 22:21:06 +00:00
DRC
811d68b21b Fix logic error from r1037 2013-10-26 00:29:53 +00:00
DRC
2bf81e8eb7 Fix a couple of issues with return value checking. JFREAD(), which wraps fread(), will never return -1. fread() will instead return 0 or a short object count if an error occurs, and ferror() will return 1 in that case. The second issue was that we were assigning the return value of ftell() to an unsigned long prior to checking the value, so the value would never be < 0 if an error occurred. It would instead be (unsigned long)-1. 2013-10-12 21:51:16 +00:00
DRC
c6c8c7911f SIMD-accelerated integer convsamp routine for MIPS DSPr2 2013-10-12 21:39:20 +00:00
DRC
3c6b1ba545 SIMD-accelerated floating point quantize and convsamp routines for MIPS DSPr2 2013-10-09 18:39:44 +00:00
DRC
b4832c620f adjust DSPr2 performance claims 2013-10-08 02:32:07 +00:00
DRC
10138c9d35 SIMD-accelerated fast integer inverse DCT routine for MIPS DSPr2 2013-10-08 02:18:59 +00:00
DRC
6addfed58b SIMD-accelerated fast integer forward DCT routine for MIPS DSPr2 2013-10-08 02:11:21 +00:00
DRC
01f46504ee SIMD-accelerated slow integer forward DCT and quantize routines for MIPS DSPr2 2013-09-30 18:13:27 +00:00
DRC
e2563adb2e Some of the IJG headers say "Modified by", so clarify that our "Modifications" are not referring to these. 2013-09-28 03:22:53 +00:00
DRC
fa4e9b5926 Actually, the second bug was hidden by the first, so the initial ChangeLog entry was correct from the user's point of view. 2013-09-28 03:11:46 +00:00
DRC
0ccc581b8c Fix an issue that resulted in an error ("Invalid SOS parameters for sequential JPEG. Didn't expect more than one scan.") when decoding progressive+arithmetic JPEGs generated by libjpeg-turbo. 2013-09-28 03:03:04 +00:00
DRC
198cc7c161 SIMD-accelerated 3/4 and 3/2 decompression scaling for MIPS DSPr2 2013-09-27 17:51:08 +00:00
DRC
f934fc621e SIMD-accelerated 1/2 and 1/4 decompression scaling for MIPS DSPr2 2013-09-27 17:43:23 +00:00
DRC
154c2dc749 SIMD-optimized RGB-to-grayscale conversion for MIPS DSPr2 2013-09-27 17:39:57 +00:00
DRC
afb8fce223 Name the package *cygwin64.tar.bz2 when building on Cygwin64. 2013-09-26 07:29:20 +00:00
DRC
8abacdbd4b Fix segfault in MIPS DSPr2 upsample routines that occurred when doing 'make test' 2013-09-25 17:33:37 +00:00
DRC
0a90c5d778 Due to the way in which the configure script silently falls back to a non-SIMD build if SIMD can't be enabled, we accidentally released iOS ARM v7 and v7s binaries in 1.3.0 that did not contain NEON SIMD code, because gas-preprocessor.pl wasn't in the PATH. In order to prevent this from happening again, specifying --with-simd now has the effect of forcing a SIMD build, and if this argument is specified, any issues encountered while enabling SIMD are treated as fatal. 2013-09-25 04:36:44 +00:00
DRC
1719c57186 Clarify that the bug affects cjpeg as well as jpegtran. 2013-09-24 03:37:29 +00:00
DRC
4aa11c8bb4 We can't enable optimized entropy coding unless we're using Huffman coding. This fixes a bug whereby attempting to create a progressive JPEG with arithmetic coding would fail. 2013-09-24 03:18:27 +00:00
DRC
59aa40fa79 The connect.apple.com alias has apparently been down for about a month 2013-09-23 18:37:34 +00:00
DRC
11b9c8802c In the Windows installer packages, place a duplicate copy of turbojpeg.dll in c:\libjpeg-turbo[-gcc][64]\bin. This is mainly to give installers an easy way to find the DLL for the purposes of bundling it. Specifically, this was necessary for TurboVNC, becuase 32-bit CMake running on 64-bit Windows cannot ever access the "real" c:\windows\system32 directory. 2013-09-19 22:57:18 +00:00
DRC
0213d619bf Fix 'make dist' 2013-08-23 07:57:21 +00:00
DRC
04a34ea5bf 2013-08-23 07:46:07 +00:00
DRC
ae0631474a Oops. Forgot to implement access method for the colorspace & extend TJBench 2013-08-23 07:13:59 +00:00
DRC
ff3d754f29 Wordsmithing 2013-08-23 06:38:59 +00:00
DRC
0fb3247f9a Add CMYK support to the TurboJPEG Java API & clean up a few things in the C API 2013-08-23 04:45:43 +00:00
DRC
24668df1df Add CMYK support to the TurboJPEG C API 2013-08-23 02:49:25 +00:00
DRC
9ad7a4c6ca 2013-08-20 00:17:26 +00:00
DRC
45b2cca4c0 Add 4:1:1 subsampling support in the TurboJPEG Java API 2013-08-18 11:04:21 +00:00
DRC
2296d513c1 Add note regarding the fact that 4:4:0 lacks full SIMD support; Add an option for benchmarking 4:4:0 subsampling in TJBench; Wordsmithing; Disable timestamp in generated HTML files to make diffing and merging easier 2013-08-18 10:39:30 +00:00
DRC
5ca8bf8738 Add 4:1:1 subsampling support in the TurboJPEG C API 2013-08-18 10:19:00 +00:00
DRC
6bcd8f8345 Disable timestamp in generated HTML files to make diffing and merging easier. 2013-08-18 09:38:52 +00:00
DRC
f4cdf5e8a2 Wordsmithing 2013-08-18 09:31:45 +00:00
DRC
b34b2ad711 Add note regarding the fact that 4:4:0 lacks full SIMD support; Add an option for benchmarking 4:4:0 subsampling in tjbench. 2013-08-18 09:15:37 +00:00
DRC
458a2dd64e Upgrade to Doxygen 1.8.3.1 2013-08-18 08:47:03 +00:00
DRC
e99b408fe6 Remove stray closing bracket that prevented the use of this header in a C++ application 2013-08-12 21:35:46 +00:00
DRC
0442d164dc By default, install the libraries into /opt/libjpeg-turbo/lib32 on any 32-bit system, not just x86, and into /opt/libjpeg-turbo/lib64 on any 64-bit system, not just x86-64. In particular, this addresses an issue with building TurboVNC and VirtualGL on ARM systems. 2013-08-11 23:23:41 +00:00
DRC
aa5a1808fe SIMD support for performing upsampling using MIPS DSPr2 instructions 2013-07-27 21:50:02 +00:00
DRC
3f2e3b11f0 SIMD support for performing downsampling using MIPS DSPr2 instructions 2013-07-27 21:48:18 +00:00
DRC
41e3657631 SIMD support for performing fancy upsampling using MIPS DSPr2 instructions 2013-07-27 21:44:14 +00:00
DRC
64da9d6ba8 SIMD support for performing color conversion using MIPS DSPr2 instructions 2013-07-24 21:50:20 +00:00
DRC
6accd550fd Fix lintian warning about missing maintainer address when installing on recent Debian-based systems 2013-07-07 04:42:56 +00:00
DRC
7421f92041 Use ELF64 object format on 64-bit kFreeBSD systems. 2013-07-03 14:21:49 +00:00
DRC
22be928d5a Fix incorrect data output and buffer overruns in the new tjDecompressToYUV2() function whenever scaling is used along with a 4:2:0 JPEG image; extend tjunittest and TJUnitTest to test for these issues. 2013-05-07 21:17:35 +00:00
DRC
6586b254ee Clean up the output of tjunittest and TJUnitTest 2013-05-04 23:41:33 +00:00
DRC
cd5c8559d6 Make sure the RPM provides "libjpeg-turbo" as well, for backward compatibility (the TurboVNC RPM build, in particular, checks for this.) 2013-05-04 04:48:27 +00:00
DRC
ca4751d1df Fix 'make rpm' 2013-05-01 05:48:22 +00:00
DRC
4fcdeb795d Extend the TurboJPEG Java API to support generating YUV images with arbitrary padding and to support image scaling when decompressing to YUV 2013-04-28 01:32:52 +00:00
DRC
771fbdeb99 Fix backward compatibility between the Java classes and the 1.2.x JNI library (as long as the 1.3 Java features are not used.) 2013-04-27 23:25:17 +00:00
DRC
52559c88b4 Bump the age number of the TurboJPEG DSO, because interfaces have been added. 2013-04-27 22:18:29 +00:00
DRC
7440604f2b Correct misuse of the word "pitch" + more code formatting tweaks 2013-04-27 20:55:45 +00:00
DRC
aaa5ae742a Code formatting tweaks 2013-04-27 12:38:20 +00:00
DRC
2f83944e9b Java doc tweaks 2013-04-27 01:08:55 +00:00
DRC
5bede571dd Not that it matters, because JNI uses dlopen()/dlsym() to load symbols, but for bookkeeping purposes, move the JNI symbols introduced in libjpeg-turbo 1.3 into a new section. 2013-04-26 23:43:15 +00:00
DRC
da64629c62 Extend the TurboJPEG C API to support generating YUV images with arbitrary padding and to support image scaling when decompressing to YUV 2013-04-26 10:33:29 +00:00
DRC
afa79bd62f Further doc tweaks 2013-04-26 08:46:46 +00:00
DRC
c8a3df184e Subtle point, but since libjpeg-turbo 1.3 now supports scaling factors > 1, the width and height specified in tjDecompress2() are not necessarily smaller than the JPEG width/height. 2013-04-26 05:35:22 +00:00
DRC
45b9c02bd7 Bump version to prepare for new features 2013-04-25 09:45:50 +00:00
DRC
9431d5c677 Fix I/O suspension. This little nugget of code was introduced in r30 as part of an early attempt to make buffered I/O work with the optimized Huffman codec. Ultimately, r32 reverted a lot of that mess and introduced much of the logic we now use, rendering this code unnecessary, but it was never reverted because it only causes problems when I/O suspension is used, and apparently no one has tried to do that with libjpeg-turbo until now. 2013-04-25 08:55:31 +00:00
DRC
8e4bc5dfb0 For consistency, allow the name of the Mac and Cygwin packages to be overridden as well. 2013-04-24 23:39:37 +00:00
DRC
0803520704 Minor doc tweaks + ChangeLog update 2013-04-24 06:40:25 +00:00
DRC
61130e332a In order to avoid a functional regression with previous releases, the JAR file needs to be able to load either the 64-bit or 32-bit JNI library on Un*x systems. 2013-04-24 06:21:24 +00:00
DRC
3d625746d4 Move the TurboJPEG DLLs back into the system directory on Windows platforms. For Windows, it doesn't really simplify the build system to install these libraries in c:\libjpeg-turbo*, and it introduces potential problems with loading the JNI library. Specifically, if a user linked their Java app against the 64-bit libjpeg-turbo SDK and then used a 32-bit JVM at run time, they would not be able to load the 32-bit turbojpeg.dll without manipulating java.library.path or the PATH environment (and vice versa for building against the 32-bit libjpeg-turbo SDK and using a 64-bit JVM at run time.) 2013-04-24 05:26:42 +00:00
DRC
b8614f5d9f Older versions of automake don't support multiple _JAVA primaries, but we don't actually have to specify a "dist" primary, since the Java sources are already included under EXTRA_DIST. 2013-04-24 03:36:30 +00:00
DRC
931a4929bb Fix 'make dist' 2013-04-24 03:15:23 +00:00
DRC
2de2cf9e54 Further enhancements/fixes to the packaging system:
-- The Mac and Cygwin packages will now be created with the directory structure defined by the configure variables "prefix", "bindir", "libdir", etc., with the exception that the docs are always installed under /usr/share/doc/{package_name}-{version} on Cygwin and /Library/Documentation/{package_name} on Mac.
-- Fixed a duplicate filename warning when generating RPMs with the default prefix of /opt/libjpeg-turbo.
-- Moved the TurboJPEG libraries out of the system directory on Windows and Mac.  It is no longer necessary to put them there, since we are not trying to be backward compatible with TurboJPEG/IPP anymore.
-- Fixed an issue whereby building the "installer" target on Windows would not build the Java JAR file, thus causing an error if the JAR had not been previously built.
-- Building the "install" target on Windows will now install libjpeg-turbo into c:\libjpeg-turbo[-gcc][64] (the same directories used by the installers.)  This can be overridden by setting CMAKE_INSTALL_PREFIX.
-- The Java classes on all platforms will now look for the JNI library in the directory under which the build/packaging system installs it.
2013-04-23 22:29:00 +00:00
DRC
f42e2be51a Overhaul Linux/Unix packaging system, primarily to avoid conflicts with vendor-supplied libjpeg-turbo packages (such as in Fedora and RHEL 6.) This also streamlines the packaging system somewhat, since it is no longer necessary to move the TurboJPEG libraries into the system library directory. Relocating those libraries was originally done to provide backward compatibility with TurboJPEG/IPP, but that package is long obsolete, and the software that formerly used it has been linking statically with libjpeg-turbo for quite some time.
If the default prefix (/opt/libjpeg-turbo) is used, then we now always install 32-bit libraries in /opt/libjpeg-turbo/lib32 and 64-bit libraries in /opt/libjpeg-turbo/lib64 instead of trying to conform to the Debian or Red Hat conventions.  The RPM and DEB packages will now be created with the directory structure defined by the configure variables "prefix", "bindir", "libdir", etc., with the exception that the docs are always installed under /usr/share/doc/{package_name}-{version}.
2013-04-19 04:25:14 +00:00
DRC
9f804a5590 Formatting tweaks 2013-04-11 05:17:53 +00:00
DRC
0af70afcea Remove unneeded headers (cdef.h isn't available on all platforms) and change u_int32_t to unsigned int, since u_int32_t isn't available on all platforms. This fixes build issues on Solaris. 2013-03-30 20:54:15 +00:00
DRC
22c11c2e20 Grammar police 2013-03-23 21:35:41 +00:00
DRC
9d0c277115 Document issues encountered when building on OS X 10.7 and later. 2013-03-23 09:57:03 +00:00
DRC
c543f1b6f9 It's more correct to say "The Independent JPEG Group's software", since libjpeg-turbo emulates both the command-line and application programming interfaces. 2013-03-23 05:35:37 +00:00
DRC
5f55e384a9 Add note about how to obtain PackageMaker if using recent Xcode releases. 2013-02-24 20:39:30 +00:00
DRC
70d2cc0e04 Bump version for post-beta pre-releases 2013-02-22 06:58:31 +00:00
DRC
7f90cedc40 2013-02-14 07:31:35 +00:00
DRC
be2b542bba Trying to build ARM v7/v7s iOS binaries from the "official" libjpeg-turbo tarball (generated on RHEL4/autoconf 2.59/automake 1.9.2/libtool 1.5.6) using either Xcode 3.2.x or 4.5.x produces an error: "libtool: compile: unable to infer tagged configuration". Further study is warranted, but the most expedient way around it at the moment is to re-run autoconf on the OS X machine that is being used to generate the iOS binaries. 2013-02-11 03:38:53 +00:00
DRC
22c2e01d7a Fix 'make dist' 2013-02-06 23:55:59 +00:00
DRC
8b3e32bf48 Include a C version of md5cmp rather than depending on an external md5sum binary, since md5sum is not available on all platforms (specifically, it doesn't exist on FreeBSD, and it has to be installed via MacPorts on OS X.) 2013-02-06 23:51:08 +00:00
DRC
1f63b8d9d1 Fix line break 2013-02-04 23:46:52 +00:00
DRC
0b818b4134 Include ARM v7s (iPhone 5, iPad 4) support in the universal libjpeg/libturbojpeg libraries distributed with our official binary package for OS X. 2013-02-04 22:29:57 +00:00
DRC
e160ae113f Oops. Separate .def file is not needed when compiling with jpeg-8 API/ABI emulation. 2013-01-27 15:54:59 +00:00
DRC
a0d29e0364 Wordsmith the project description 2013-01-23 01:32:25 +00:00
DRC
cc4145ce2f Actually, turbojpeg.c works with libjpeg as well 2013-01-22 13:56:34 +00:00
DRC
9f8a003137 Eliminated the awkward and confusing "TurboJPEG/OSS" designation, since there are no other active implementations of the TurboJPEG API anymore; don't refer to the libjpeg API library as "libjpeg-turbo" anymore, since that can be confusing; ARM v7s build instructions 2013-01-21 23:42:12 +00:00
DRC
fc9fec465f ImageIO.read() returns null if the input image type is not supported (which occurs when trying to read a PPM file), so output a friendly error instead of letting the next line throw a null pointer exception. 2013-01-19 06:43:27 +00:00
DRC
3252455c3f New year, new copyright message 2013-01-19 01:16:38 +00:00
DRC
a1c870d302 Fix several issues with SRPM generation: (1) ensure that all relevant configure arguments get passed down to the configure command line in the generated spec file, (2) adjust the file manifest in the spec to accommodate the differing "age" version whenever the in-memory source/dest managers are used, and (3) fix an issue with the value of SO_MAJOR_VERSION passed down to the configure command line in the generated spec file (SO_MAJOR_VERSION has to remain pure, so we use a different variable to pass down the combined "current+age" value to libtool in Makefile.am.) 2013-01-19 01:06:46 +00:00
DRC
81de93c8a5 Since Windows doesn't use lazy loading, clarify that a Windows application that uses jpeg_mem_dest() or jpeg_mem_src() must use the DLL containing those functions at run time. Other wordsmithing 2013-01-19 00:13:57 +00:00
DRC
f46db556e3 Compiler warnings on Windows 2013-01-18 23:45:06 +00:00
DRC
ba4a6c32f8 Implement in-memory source/destination managers even when not emulating the libjpeg v8 API/ABI 2013-01-18 23:42:31 +00:00
DRC
6a9229ae96 Include justification for not supporting SmartScale, DCT scaling, and the libjpeg v9 ABI 2013-01-18 06:12:51 +00:00
DRC
8adaa68d4b Subtle point, but the libjpeg v7+ API is not backward incompatible. That is, programs that were built against jpeg-6b can still build against jpeg-7+ with no issues. It's only the ABI that is backward incompatible, so the primary justification for implementing the emulation feature was to provide run-time (ABI) compatibility. 2013-01-18 06:02:10 +00:00
DRC
670d50d910 Say "do not include" rather than "omit", to be consistent with the CMake build system and the output of the configure script. 2013-01-17 21:48:11 +00:00
DRC
00113423f9 Include full readme for nightshot_iso_100 2013-01-13 21:11:50 +00:00
DRC
647786ee51 The GNU version of md5sum is picky about the spacing 2013-01-13 12:49:57 +00:00
DRC
c4c137f5e9 Fix the x86 build with NASM 0.98. Since NASM 0.98 is the default version on OS X, we want to at least allow people to build 32-bit code with it, even though it can't properly build 64-bit code. 2013-01-13 12:12:53 +00:00
DRC
eebb09941b Fix 'make dist' 2013-01-13 11:40:58 +00:00
DRC
fdaa047891 Acknowledge the source of nightshot_iso_100.bmp 2013-01-13 11:30:12 +00:00
DRC
ba01bcbbc5 Consolidate the MD5 sums into one location and add a --without-turbojpeg switch to the Un*x build to allow building libjpeg-turbo without the TurboJPEG/OSS wrapper library. These modifications were supposed to lay the ground work for adding compile-time-selectable 12-bit JPEG support, but unfortunately there are deeper issues that prevent the implementation of that feature right now (namely, some of the modifications made to the C code to support the SIMD code are apparently not 12-bit-friendly.) 2013-01-13 11:25:20 +00:00
DRC
1e7853c0cc In all fairness, breaking backward ABI compatibility was necessary in jpeg-7 and jpeg-8 due to the fact that the caller allocates the struct. 2013-01-13 11:05:25 +00:00
DRC
af67ada048 Modify 'make test' so that it uses MD5 sums instead of reference images. This eliminates the need to check most of the test images into the repository, which keeps the source tarball to a reasonable size. 2013-01-13 03:00:25 +00:00
DRC
58c992a2ae Also remove mention of install.txt and filelist.txt in the build system and README. 2013-01-13 01:19:09 +00:00
DRC
cf55125611 install.txt contains no information relevant to libjpeg-turbo, and filelist.txt does not give any information that can't be gleaned by looking at the headers in the various source files. 2013-01-13 01:17:08 +00:00
DRC
c27f55d6f9 2013-01-12 07:29:53 +00:00
DRC
b684672502 2013-01-12 07:28:35 +00:00
DRC
33fb70b328 2013-01-11 11:07:37 +00:00
DRC
ecc22a1007 Wordsmithing; Remove mention of TurboJPEG/IPP-- it is no longer a relevant comparison, since the version of IPP on which TurboJPEG/IPP was based is now quite old, and TurboJPEG/IPP is no longer distributed or supported by The VirtualGL Project; Include information about mathematical incompatibilities with jpeg-8 2013-01-10 11:47:39 +00:00
DRC
5ae35d8a86 Prevent compiler warning on Windows if jmorecfg.h is included after the Windows headers, which also define FAR. 2013-01-06 17:59:42 +00:00
DRC
6b041a9221 Spacing tweak 2013-01-01 11:41:44 +00:00
DRC
13ac9e8554 Indicate our support for some of the jpeg-8d features, as well as arithmetic coding 2013-01-01 11:39:04 +00:00
DRC
5b620429e5 Undocument ansi2knr.c, since we don't include it 2013-01-01 11:12:20 +00:00
DRC
628b982497 Merge some of the README changes from jpeg-8d and change the copyright and version strings to reflect that we use some of that code. 2013-01-01 10:56:38 +00:00
DRC
41f0b53f18 Port RGB-to-Grayscale color transform from jpeg-8d 2013-01-01 10:52:29 +00:00
DRC
e14730f6cc Further changes to the copyright/attribution notices to make it clear that our modified files are not part of the IJG's software. 2013-01-01 10:50:59 +00:00
DRC
674a037ec7 We now support the additional decompression scaling factors from jpeg-7 2013-01-01 10:47:02 +00:00
DRC
f914eb1111 Port the width/height force feature from jpegtran v8d. 2013-01-01 10:44:00 +00:00
DRC
7d12636291 Add cjpeg -rgb option from jpeg-8d 2013-01-01 10:25:43 +00:00
DRC
f0f1ce1b7f Minor modifications from jpeg-8d 2013-01-01 10:17:03 +00:00
DRC
ee4c7d28ab Further changes to the copyright/attribution notices to make it clear that our modified files are not part of the IJG's software. 2013-01-01 10:12:34 +00:00
DRC
9c1aac4639 Further changes to the copyright/attribution notices to make it clear that our modified files are not part of the IJG's software. 2013-01-01 09:49:47 +00:00
DRC
936ae5a813 1.2.90 (1.3 beta1) 2012-12-31 09:44:31 +00:00
DRC
de30fe9460 Change the copyright notices to make it clear that our modified files are not part of the IJG's software. 2012-12-31 02:42:18 +00:00
DRC
6683a2411a Fix bug in unused code 2012-12-01 22:33:25 +00:00
DRC
e456841c1c Use a more robust method of obtaining the build timestamp on Windows. 'wmic os get LocalDateTime' will always return the timestamp in the format we want (YYYYMMDD), whereas date /t is sensitive to locale. If wmic fails, then we fall back to using date /t, even though this means that the BUILD variable will end up in the incorrect format on some systems. 2012-10-12 09:29:44 +00:00
DRC
1b9184db5b Fix MinGW build and remove duplication of effort 2012-10-02 06:47:37 +00:00
DRC
8f94c2b084 2012-10-02 04:20:43 +00:00
DRC
70d3c1aeec Add a Java version of TJBench and extend the TurboJPEG Java API to support it (this involved adding a polymorphic method in TJCompressor that accepts x and y offsets into a larger buffer, similar to the previous modification that had been done to TJDecompressor.) 2012-09-24 02:27:55 +00:00
DRC
a6c9eaf155 If libturbojpeg.jnilib is not found on Mac systems, specifically look for it under /usr/lib, since /usr/lib isn't part of the default java.library.path on that platform. 2012-08-24 02:44:39 +00:00
DRC
f506e2cbb5 Fix build issues that occurred whenever the source directory contained the letters "col", "mer", or "gra". 2012-08-07 21:59:28 +00:00
DRC
05cd6e6ea0 Allow the libjpeg-turbo32 package to be used on MultiArch-compatible systems without overriding the linker path or LD_LIBRARY_PATH. 2012-08-07 18:44:24 +00:00
DRC
0a9250c2c0 Oops. Add support for TJFLAG_FASTDCT to tjDecompressToYUV() as well. 2012-07-03 20:02:49 +00:00
DRC
019d51d4f1 Add flags to the TurboJPEG API that allow the caller to force the use of either the fast or the accurate DCT/IDCT algorithms in the underlying codec. 2012-06-29 23:46:38 +00:00
DRC
7b8366223a More recent versions of autoconf add -traditional-cpp to the CPP flags, which causes jsimdcfg.inc.h to not preprocess correctly unless we expand all of the instances of the #definev macro. 2012-06-28 23:24:29 +00:00
DRC
52ce04b193 Later versions of autoconf (specifically, the one shipped with Xcode 4.3) default to building x86-64, so it is necessary to override the host_alias to get a 32-bit build. 2012-06-28 23:21:13 +00:00
DRC
b368b2f300 Provide further details about the regression 2012-06-18 00:09:19 +00:00
DRC
0651ee366b Acknowledge the existence of 1.2.1 2012-06-15 22:00:47 +00:00
DRC
791e9b4316 Fixed regression caused by a bug in the 32-bit strict memory access code in jdmrgss2.asm (contributed by Chromium to stop valgrind from whining whenever the output buffer size was not evenly divisible by 16 bytes.) On Linux/x86, this regression caused incorrect pixels on the right-hand side of images whose rows were not 16-byte aligned, whenever fancy upsampling was used. This patch also enables the strict memory access code on all platforms, not just Linux (it does no harm on other platforms) and removes a couple of pcmpeqb instructions that were rendered unnecessary by r836. 2012-06-15 21:58:06 +00:00
DRC
7702469e15 Eliminate the use of the MASKMOVDQU instruction, to speed up decompression performance by 10x on AMD Bobcat embedded processors (and ~5% on AMD desktop processors.) 2012-06-13 01:23:09 +00:00
DRC
c19ea22c80 Add new JNI functions to mapfile so they will be visible on Linux 2012-06-08 08:25:17 +00:00
DRC
b03457663d Fix array size calculations 2012-06-07 09:38:57 +00:00
DRC
448d12d298 Add x, y parameters to TJDecompressor so that it can be used to decompress to an arbitrary position in the destination image (TurboVNC needs this.) 2012-06-06 08:41:06 +00:00
DRC
8aab7a1dad Guard against num_components being a ridiculous value due to a corrupt header 2012-05-30 20:34:42 +00:00
DRC
ca423d39a3 Preserve all 128 bits of xmm6 and xmm7 2012-04-26 19:48:33 +00:00
DRC
1086af6541 Fix memory leak in the colorspace emulation code 2012-04-26 03:18:49 +00:00
DRC
7e768e9849 Provide the legacy unversioned libturbojpeg.so resource so that RPMs that dependended on older libjpeg-turbo distributions will still work. 2012-03-29 21:29:36 +00:00
DRC
9d7101c8f6 Emulate colorspace extensions if they are not present in the libjpeg API. This allows the TurboJPEG wrapper to be used with libjpeg rather than libjpeg-turbo. Not useful within the context of our project, but other projects prefer to include the TurboJPEG wrapper in-tree, and this allows them to be linked against either libjpeg-turbo or libjpeg. 2012-03-23 19:47:57 +00:00
DRC
c2dab98ea0 Get rid of the Solaris packaging system. Solaris packages are obsolete, only a handful of people were downloading those binaries, and maintaining the system was proving to be a pain. 2012-03-23 19:44:54 +00:00
DRC
c17aa549ab Ensure that tjDecompress2() exits cleanly if setDecompDefaults() fails 2012-03-23 19:37:40 +00:00
DRC
c650f3c220 Add a dummy version number to the TurboJPEG dynamic library on Unix systems so Linux distro maintainers will not reject it out of hand. 2012-03-23 03:24:39 +00:00
DRC
25fc4cc39f Get rid of the Solaris packaging system. Solaris packages are obsolete, only a handful of people were downloading those binaries, and maintaining the system was proving to be a pain. 2012-03-23 03:17:41 +00:00
DRC
fee19c375b "Sun Studio"="Oracle Solaris Studio" 2012-03-23 03:11:12 +00:00
DRC
65586bf2be Fix universal DMG build 2012-03-23 00:50:09 +00:00
DRC
f3e8b02df5 Visual Studio 2010 doesn't like the wildcard, so let CMake expand it instead. 2012-03-17 14:32:05 +00:00
DRC
6de1345133 Fix the behavior of the alpha-enabled colorspace constants whenever libjpeg-turbo is built without SIMD support and merged upsampling is used. 2012-03-16 14:30:46 +00:00
DRC
2a74bcdce4 Allow RGB JPEG files to be created/decoded when using the LJT colorspace extensions 2012-03-11 22:05:25 +00:00
DRC
c06e5f2928 Oops 2012-02-10 05:31:03 +00:00
DRC
2c6f3ed984 Move build dir. variables back into makemacpkg to avoid messing up the Solaris packaging system. 2012-02-10 03:39:43 +00:00
DRC
b7af9a7762 Don't include documentation in 32-bit supplemental package 2012-02-10 03:18:41 +00:00
DRC
f52a5670da Fix 'make dist' 2012-02-10 01:55:28 +00:00
DRC
33e613d948 iOS universal package was promoted to a 1.2 feature 2012-02-10 01:44:55 +00:00
DRC
a856d7bf70 RPM spec no longer uses %{_srcdir} 2012-02-10 01:39:28 +00:00
DRC
5d0234739e Install docs when doing 'make install' on Unix; Fix 'install' target on Windows; Include wizard.txt, example.c, and structure.txt in installed docs 2012-02-10 01:37:20 +00:00
DRC
aad846c416 'make iosdmg' now works with 32-bit builds as well 2012-02-10 01:24:26 +00:00
DRC
ba12191cc8 Clean up the iOS packaging mechanism so that ARM architectures can be added to i386-only builds as well. 2012-02-10 01:07:59 +00:00
DRC
4a2fe27cb6 Infrastructure for producing a universal x86-64/i386/ARM version of libjpeg.a and libturbojpeg.a on OS X, so that the same library can be used to build OS X and iOS apps 2012-02-09 09:23:30 +00:00
DRC
2aedbe637d Merge description from README-turbo.txt into packages 2012-02-08 09:18:42 +00:00
DRC
05c7b00f1d 2012-02-07 20:39:33 +00:00
DRC
0441bdfd88 Wordsmithing and grammar 2012-02-07 00:15:42 +00:00
DRC
efbdb72ac3 Several clarifications regarding v7/v8 API/ABI support 2012-02-03 08:55:36 +00:00
DRC
92eb806f1d Fix issue whereby libjpeg-turbo would report "fractional sampling not implemented" when attempting to use decompression scaling with a non-power-of-2 scaling ratio and a JPEG file that was compressed using an odd form of subsampling, such as 3x2. 2012-02-03 06:55:26 +00:00
DRC
dbfa2648d8 Accelerated 4:2:2 upsampling routine for ARM (improves performance ~20-30% when decompressing 4:2:2 JPEGs using fancy upsampling) 2012-02-02 22:32:45 +00:00
DRC
50b6c75d9d Oops. Need to use -nosmooth so that the output matches the reference images generated by jpeg-8 2012-02-01 02:49:10 +00:00
DRC
e74d1c77ea Add more extensive TurboJPEG regression tests 2012-01-31 11:38:13 +00:00
DRC
016f5cdbcf Add tests for the additional scaling factors 2012-01-31 11:09:11 +00:00
DRC
40feae60f4 Fix 'make dist' 2012-01-31 10:49:23 +00:00
DRC
df1fccf695 Merge copyright messages into one string and change the run-time messages to avoid confusion (we are not technically based on the latest libjpeg, although we do borrow some code from it) 2012-01-31 10:47:02 +00:00
DRC
2f7d48a87e Combine all of the scaling tests using a for loop 2012-01-31 10:43:56 +00:00
DRC
da2b560b34 Incorporate a few upstream doc changes; grammar police; wordsmithing; Move -arithmetic into "switches for advanced users"; Additional documentation for IDCT scaling extensions 2012-01-31 10:19:29 +00:00
DRC
faff5f4891 Move test images into their own subdirectory 2012-01-31 05:47:07 +00:00
DRC
a112f12efd Compiler warnings 2012-01-31 05:27:41 +00:00
DRC
5e805d2f4b Expose new scaling factors in TurboJPEG API 2012-01-28 06:49:56 +00:00
DRC
030b6fc1c1 Document the new scaling factors 2012-01-28 06:49:22 +00:00
DRC
88d2e0d792 Oops. Height of output buffer should equal scaled height, not JPEG height. 2012-01-28 06:31:21 +00:00
DRC
8644ed2a04 Support additional scaling factors when decompressing 2012-01-28 01:48:07 +00:00
DRC
a6b5eab50f Oops. Need to handle cases in which num_components > n 2012-01-28 01:19:52 +00:00
DRC
9d14254225 Bump version to 1.2.80 (1.3 alpha1) to prepare for receiving new features 2012-01-27 22:12:49 +00:00
DRC
311728cd98 Be clear that we are only emulating the libjpeg v7/v8 API/ABI, not the library itself. 2012-01-27 09:52:20 +00:00
DRC
44e6c174ee 2012-01-27 09:42:51 +00:00
DRC
d2e0417960 Move -arithmetic into "switches for advanced users" 2012-01-27 09:39:46 +00:00
DRC
aa31d1d14b Update upstream e-mail address 2012-01-27 09:27:20 +00:00
DRC
4cf0357c0f Properly decompress erroneous CMYK/YCCK images whose K component has an ID of 1 instead of 4 (this is to support SumatraPDF) 2012-01-27 01:23:20 +00:00
DRC
0f654d4674 Move INLINE macro into config.h. That's really where it belongs anyhow, since it is used only internally, and putting it in jconfig.h was causing problems with DevIL. 2012-01-26 22:20:31 +00:00
DRC
14faccfa93 Grammar police 2012-01-17 22:56:22 +00:00
DRC
e420e3a19c Subtle point, but TurboJPEG is the API and TurboJPEG/OSS is the library implementing that API. 2012-01-17 22:55:03 +00:00
DRC
5bd7a89f6a Compiler warnings 2012-01-17 11:48:38 +00:00
DRC
230440c8e7 Add program that demonstrates how to check for the existence of the colorspace extensions 2011-12-19 15:01:55 +00:00
DRC
c1e4151607 Added new alpha channel colorspace constants/pixel formats, so applications can specify that they need the unused byte in a 4-component RGB output buffer set to 0xFF when decompressing. 2011-12-19 02:21:03 +00:00
DRC
67420f1fa1 Add LIBJPEG_TURBO_VERSION macro for checking the libjpeg-turbo version at compile time 2011-12-18 16:29:35 +00:00
DRC
51b8cd674a "which"="that" 2011-12-15 13:12:59 +00:00
DRC
90d7c850fa Fixed non-fatal out-of-bounds read in SSE2 SIMD code reported by valgrind when decompressing a JPEG image to a bitmap buffer whose size was not a multiple of 16 bytes. 2011-12-01 10:58:36 +00:00
DRC
8ec31e2fb2 Expose NASM variable in ccmake 2011-11-29 09:01:23 +00:00
DRC
e0eea893be NASM automatically adds the current directory to the include path, but YASM doesn't, so we need to explicitly add it. 2011-11-29 08:58:27 +00:00
DRC
f2e5e59720 1.2.0 2011-11-29 08:53:32 +00:00
DRC
1df063383d 2011-11-01 17:14:22 +00:00
DRC
1b0a8cdd79 2011-10-28 06:45:53 +00:00
DRC
6fa79e5dbf 2011-10-28 06:45:06 +00:00
DRC
ed6a876521 2011-10-28 06:25:13 +00:00
DRC
16b1fdf84d Fix 'make dist' 2011-10-27 23:25:28 +00:00
DRC
d8b3658cdf iOS doesn't allow dynamic linking against non-system libs 2011-10-27 20:40:21 +00:00
DRC
d475ea928b ARM + iOS instructions 2011-10-19 05:13:27 +00:00
DRC
c2e128f8c5 Make sure we don't call jpeg_destroy_[de]compress() on an uninitialized struct, as bad mojo can ensue. 2011-10-18 22:07:13 +00:00
DRC
9b0741512e Fix compiler warning 2011-10-18 22:06:22 +00:00
DRC
211ab00fc4 Oops. Don't try to use custom filter at the C level unless it is defined at the Java level. 2011-09-26 18:46:09 +00:00
DRC
de5d1ec4e4 Wordsmithing 2011-09-20 18:20:43 +00:00
DRC
91ad5467ab Always link tjbench against jpeg-static instead of the JPEG DLL, since we are only using libjpeg for bitmap I/O 2011-09-20 05:41:54 +00:00
DRC
5d1cec9a79 Add TJCustomFilter to Windows build 2011-09-20 05:35:31 +00:00
DRC
bc1e5525b0 Add a couple of missing pages 2011-09-20 05:04:06 +00:00
DRC
f343d7332a Implement custom filter callback in Java 2011-09-20 05:02:19 +00:00
DRC
1109f68db6 Fix 'make docs' with out-of-tree builds 2011-09-19 18:58:21 +00:00
DRC
50b3728013 Fix 'make headers' with out-of-tree builds 2011-09-19 18:47:00 +00:00
DRC
42df487a35 2011-09-17 00:41:14 +00:00
DRC
85a878bf07 Implement a custom DCT filter callback for lossless transforms 2011-09-17 00:18:31 +00:00
DRC
4a87a4a6bd Eliminate "main is usually a function" warnings 2011-09-10 17:30:36 +00:00
DRC
066c44b341 Fill unused byte with 0xFF on Windows as well 2011-09-09 18:38:20 +00:00
DRC
ba8383452c Use 8-bit write to avoid potential pointer aliasing issues (also, at least on x86, it's faster than the previous approach.) 2011-09-09 18:15:53 +00:00
DRC
d345306ecc When decompressing to a 4-byte RGB buffer, set the unused byte to 0xFF so it can be interpreted as an opaque alpha channel. 2011-09-08 23:54:40 +00:00
DRC
edf4d637e1 Improve performance of non-SIMD color conversion routines and use global constants to define colorspace extension parameters 2011-09-07 06:31:00 +00:00
DRC
c02c1fa775 Fix compile error when JCS_EXTENSIONS!=1 2011-09-07 05:03:18 +00:00
DRC
a20f5d026a Use descriptions from libjpeg v8 2011-09-07 03:26:06 +00:00
DRC
d3aa5c9f94 Back out CMYK-to-RGB conversions. There is really no way to properly do CMYK-to-RGB conversion without color management, which is out of scope for libjpeg-turbo. Applications wishing to do a trivial conversion, such as was implemented in these routines, can simply request CMYK output and do the trivial conversion themselves (or, even better, use an OSS color management library.) We should not encourage the use of in-library CMYK-to-RGB conversion as a substitute for color management. 2011-09-07 02:32:02 +00:00
DRC
e808882c95 Update Nokia contact info 2011-09-06 18:58:22 +00:00
DRC
a02a9af565 Improve performance of IFAST iDCT by changing the order of transpose and descale steps 2011-09-06 18:57:53 +00:00
DRC
061f96dc7d Make ARM ISLOW iDCT faster on typical cases, and eliminate the possibility of 16-bit overflows when handling arbitrary coefficients. 2011-09-06 18:55:45 +00:00
DRC
00e258dedd Improve the performance of YCbCr to RGB conversion on ARM 2011-08-24 23:27:44 +00:00
DRC
7672bd3ac5 NEON-accelerated slow integer inverse DCT 2011-08-22 13:48:01 +00:00
DRC
00a69f142a NEON-accelerated quantization 2011-08-17 21:00:59 +00:00
DRC
adce3b2eeb 2011-08-17 20:59:56 +00:00
DRC
6070e60924 Use integer arithmetic for CMYK-to-RGB conversions 2011-08-16 01:39:05 +00:00
DRC
dbb92f2eee Improve performance of ARM NEON IFAST iDCT 2011-08-15 08:36:51 +00:00
DRC
33ddbcc5b3 Oops 2011-08-12 19:31:09 +00:00
DRC
9227c0d77b Add Nokia copyright (for ARM NEON code) 2011-08-12 19:30:21 +00:00
DRC
29b738d9b6 2011-08-12 19:28:28 +00:00
DRC
22b4359e42 ARM NEON-accelerated RGB-to-YCbCr conversion 2011-08-12 19:27:20 +00:00
DRC
35c1909f0b Oops 2011-08-11 02:17:17 +00:00
DRC
8de30b8c28 CMYK/YCCK support 2011-08-11 02:16:44 +00:00
DRC
14dfb6b81d Support for accelerated forward DCT using ARM NEON instructions 2011-08-11 02:15:31 +00:00
DRC
ce02d1d62a Support for accelerated forward DCT using ARM NEON instructions 2011-08-10 23:31:13 +00:00
DRC
157c7635db 2011-07-26 09:22:16 +00:00
DRC
b10d6c827d Don't include JAR file in 32-bit compatibility package 2011-07-19 09:52:11 +00:00
DRC
cf446479aa Trying to out-clever ourselves by having autotools generate the deb-control file broke the 32-bit supplementary DEB, so revert to the method we used in LJT 1.0 to generate this file. 2011-07-19 09:29:01 +00:00
DRC
4658c17c9e Windows doesn't have random() 2011-07-15 10:06:56 +00:00
DRC
869095444e Use random noise to ensure that the JPEG image generated in the buffer size test exceeds the size of the uncompressed source image. 2011-07-12 06:22:06 +00:00
DRC
489864aefa Re-work TJBUFSIZE() to take into account the level of chrominance subsampling 2011-07-12 03:17:23 +00:00
DRC
2bfd5d8c7d Restore compatibility with the jpeg-6b error enum, even if arithmetic coding is enabled. 2011-06-21 06:13:16 +00:00
DRC
71be635a89 Prevent jmorecfg.h from re-defining INT32 and INT16 if those types have already been defined by the Windows system headers. 2011-06-21 04:56:02 +00:00
DRC
e3f7e75525 NEON-optimized 2x2 and 4x4 scaled iDCTs 2011-06-17 21:12:58 +00:00
DRC
b6fb92eeff 2011-06-15 02:43:42 +00:00
DRC
04dc101077 iOS ARM support 2011-06-14 22:17:37 +00:00
DRC
d02c734a19 iOS ARM support 2011-06-14 22:16:50 +00:00
DRC
9d5f6b9e33 Fix a minor ABI incompatibility caused by the introduction of new error constants into the enum in jerror.h. 2011-05-31 20:22:37 +00:00
DRC
de8be2e9f0 Re-factor checkBufYUV() function to more closely resemble re-factored checkBuf() function 2011-05-27 02:10:42 +00:00
DRC
64d644bcc3 Change the name of the pre-computed bits table to match its actual function 2011-05-26 11:28:22 +00:00
DRC
395bf7e218 turbojpegl.c=turbojpeg.c 2011-05-26 10:45:06 +00:00
DRC
67810edcf7 jpegtran on Windows needs the same fix as cjpeg and djpeg to eliminate errors when I/O redirection is used. 2011-05-25 06:02:50 +00:00
DRC
cd39e3abc1 Need to set TJFLAG_NOREALLOC for tjTransform() 2011-05-25 04:52:25 +00:00
DRC
14ae3e4959 Oops. Add the already-advertised -bmp option 2011-05-25 04:35:53 +00:00
DRC
ac31113152 MinGW seems to barf unless jinclude.h is included before jpeglib.h 2011-05-25 04:12:52 +00:00
DRC
42c015d5a2 "jpegut"="tjunittest" & "jpgtest"="tjbench" 2011-05-25 04:12:22 +00:00
DRC
49e17cd6a7 "jpegut"="tjunittest" & "jpgtest"="tjbench" 2011-05-25 03:54:56 +00:00
DRC
5e3346ba58 "jpegut"="tjunittest" & "jpgtest"="tjbench" 2011-05-25 03:52:22 +00:00
DRC
2bc15f6bac Fix OS X uninstaller 2011-05-25 03:51:29 +00:00
DRC
1d4c5744a8 Add dynamic allocation test; Fix compression ratio output in quiet mode; Fix memory leak 2011-05-25 02:58:21 +00:00
DRC
24b83b5b0c Remove wxWindows license files from packages 2011-05-24 17:33:06 +00:00
DRC
8e732e32be Fix 'make dist' 2011-05-24 17:18:11 +00:00
DRC
e3086351f9 Fix 'make dist' 2011-05-24 17:14:43 +00:00
DRC
3ee533eb7c Fix 'make dist' 2011-05-24 17:07:51 +00:00
DRC
626f00e5c8 Fix build on Windows 2011-05-24 17:03:51 +00:00
DRC
994f49d8c2 Added "See also" for tjAlloc() and tjFree() 2011-05-24 17:00:15 +00:00
DRC
411c62396d Add new API functions, tjAlloc() and tjFree(), which allow memory to be allocated and freed using a method of the library's choosing. At the moment, the primary purpose for this is to avoid allocating/freeing memory across the DLL boundary on Windows. 2011-05-24 16:52:47 +00:00
DRC
4703b773af Fix memory leak in new TurboJPEG auto-reallocation mode 2011-05-24 15:15:15 +00:00
DRC
2ff9d2a26d Remove any references to the wxWindows Library License and VirtualGL copyrights 2011-05-24 14:13:01 +00:00
DRC
d25fe3fd18 Remove any references to the wxWindows Library License and VirtualGL copyrights 2011-05-24 14:12:07 +00:00
DRC
9682a6e036 Refactor uninstall script. No legacy code remains, so relicense under BSD-style license. Remove uninstall app from package for now, until we can come up with a new version that doesn't have any legacy code. 2011-05-24 13:59:14 +00:00
DRC
a501250666 Refactored to use new TurboJPEG API and new BMP library + additional cleanup. There is no legacy code remaining, so the refactored version of the program has been re-licensed under a BSD-style license. 2011-05-24 13:41:27 +00:00
DRC
9bfb9ee536 Add new API functions to JNI mapfile as well 2011-05-24 13:37:37 +00:00
DRC
8338344cf8 Need stdlib.h to get NULL on Linux 2011-05-24 13:37:01 +00:00
DRC
abeb01d5f1 Don't require buffer size to be preset if using TJFLAG_NOREALLOC 2011-05-24 10:17:32 +00:00
DRC
16d4cc3b34 Use tjutil instead of rrutil 2011-05-24 09:17:57 +00:00
DRC
7f352fc982 Add max, min functions 2011-05-24 09:17:43 +00:00
DRC
34e538a8ca Prevent header from being included multiple times 2011-05-24 09:15:44 +00:00
DRC
3fbb13e0cd Completely refactor BMP library so that it takes advantage of the existing BMP and PPM load/save routines in libjpeg 2011-05-24 09:13:17 +00:00
DRC
3bdddc666b Simplify initialization code (we don't have to explicitly initialize a component to 0, because the whole buffer has already been initialized to 0) 2011-05-23 05:50:07 +00:00
DRC
c2ddde57c4 Refactor slightly to match new C code 2011-05-23 05:49:08 +00:00
DRC
7a8cefdb71 Clean up error messages; Fix lossless transformation; General cleanup 2011-05-22 13:55:56 +00:00
DRC
4fa973b836 Refactored jpegut to test the new TurboJPEG API. There is no legacy code remaining, so the refactored version of the program has been re-licensed under a BSD-style license. 2011-05-22 13:55:17 +00:00
DRC
3ec2702bfc Clean up constants so that flags, pixel formats, etc. are clearly differentiated; Update documentation accordingly; Name the enums to make it easier to reference them in the docs and clean up the references accordingly; Set Doxygen option to force a detailed description for the constants to always be generated 2011-05-21 15:34:54 +00:00
DRC
aa92628cd4 Completely refactored the TurboJPEG C API so that it uses pixel formats instead of the clunky pixel size + flags combination to define the pixel size and component order. tjCompress2() and tjTransform() can also now grow the JPEG buffer as needed, which can allow programs to save memory by not pre-allocating the "worst-case" buffer size calculated by TJBUFSIZE(). Converted API documentation to Doxygen. There is no legacy code remaining, so the refactored version of the library has been re-licensed under a BSD-style license. 2011-05-21 14:37:15 +00:00
DRC
6be4598bec Remove duplicate entries 2011-05-21 14:23:30 +00:00
DRC
14a2cd0317 2011-05-10 22:14:38 +00:00
DRC
fcdffa2265 Not necessary to save r10 and r11, since these are scratch registers 2011-05-10 21:44:33 +00:00
DRC
d6e51e6cde Can't assume that current directory is in PATH 2011-05-10 21:09:27 +00:00
DRC
ef534974a8 Include scaled decompression test images when doing 'make dist' 2011-05-10 21:05:49 +00:00
DRC
99799a6c29 ARM NEON support 2011-05-03 08:47:43 +00:00
DRC
a399b5bbea YASM support 2011-05-03 06:32:41 +00:00
DRC
6f78dc30c5 Fix I/O redirection in cjpeg and djpeg on Windows 2011-05-02 00:37:32 +00:00
DRC
f84a4eb00d New libjpeg-turbo domain 2011-04-27 00:32:24 +00:00
DRC
c3f61d6f57 2011-04-26 23:46:38 +00:00
DRC
65b1230f18 Update license text to reflect the newly-relicensed jchuff.c 2011-04-26 23:44:37 +00:00
DRC
ed7ec8322c Re-factor and re-license under the libjpeg BSD-style license. Justification: the accelerated Huffman encoding optimizations in libjpeg-turbo were all developed by me as an independent developer. The structure of the inline Huffman encoding macros was originally borrowed from similar routines in the TurboJPEG/mediaLib codec, which is part of VirtualGL and TurboVNC. Thus, although the code for these macros was not copied verbatim, they were still thought to be a derivative work of TurboJPEG/mediaLib, and I assigned the copyright and license from TurboJPEG/mediaLib to them. I have re-written these routines from first principles by breaking down the libjpeg out-of-line routines. Although the new code bears algorithmic similarities to the TurboJPEG/mediaLib macros, it can now clearly be shown to be derived from the out-of-line routines and thus, in my opinion, it can no longer be considered a derivative of TurboJPEG/mediaLib. -- DRC 2011-04-26 22:08:31 +00:00
DRC
2540beb951 Add more comprehensive tests for IDCT scaling 2011-04-25 23:56:40 +00:00
DRC
431e5937b5 Eliminate excessive I/O overhead when reading BMP files in cjpeg 2011-04-25 22:47:44 +00:00
DRC
2fea4ae8bf 2011-04-25 22:46:25 +00:00
DRC
5d3d11ee66 2011-04-18 07:01:46 +00:00
DRC
bdc88147bb Re-factor and re-license under the libjpeg BSD-style license. Justification: the accelerated Huffman decoding optimizations in libjpeg-turbo were all developed by me as an independent developer. The structure of the inline Huffman decoding macros was originally borrowed from similar routines in the TurboJPEG/mediaLib codec, which is part of VirtualGL and TurboVNC. Thus, although the code for these macros was not copied verbatim, they were still thought to be a derivative work of TurboJPEG/mediaLib, and I assigned the copyright and license from TurboJPEG/mediaLib to them. I have re-written these routines from first principles by breaking down the libjpeg out-of-line routines. Although the new code bears algorithmic similarities to the TurboJPEG/mediaLib macros, it can now clearly be shown to be derived from the out-of-line routines and thus, in my opinion, it can no longer be considered a derivative of TurboJPEG/mediaLib. -- DRC 2011-04-18 06:52:07 +00:00
DRC
47ce37c6b0 2011-04-17 15:29:17 +00:00
DRC
93598f71bb The previous attempt to handle unexpected markers in the data stream caused breakage in applications that attempted to set bytes_in_buffer to a larger value than the actual size of the JPEG image. The latter behavior was causing the fast decoder to be used for the last MCU in the image under certain circumstances, and this sometimes caused the EOI marker to be encountered by the fast decoder, which was treating it as an "unexpected" marker and throwing an error. Now, the fast decoder simply hands off the decoding of the block to the slow decoder if any marker is encountered. 2011-04-16 18:53:26 +00:00
DRC
82c0d4c9e9 Update build instructions to reflect the fact that 32-bit LJT build doesn't work with NASM 0.99 or 2.00 2011-04-16 13:29:54 +00:00
DRC
a9300ce862 Use option() to handle configuration variables, so they will show up in the CMake GUI 2011-04-15 00:24:02 +00:00
DRC
4611077eab Don't need MSVC definition in assembler code anymore 2011-04-07 05:27:29 +00:00
DRC
667766d07f 2011-04-05 07:01:26 +00:00
DRC
31a13fcbb2 Attempt to make build work with Visual Studio 2010 (still doesn't work if SIMD or Java are enabled-- see bug tracker) 2011-04-04 21:00:53 +00:00
DRC
10979fb0fe Comment code 2011-04-04 04:56:24 +00:00
DRC
5bc9a1076e Fix jpegoptim with v7 emulation as well 2011-04-03 07:08:18 +00:00
DRC
cc2cf7db19 Allow customization of Java compiler flags 2011-04-03 06:10:18 +00:00
DRC
d5a3955024 Ensure that image_width and image_height are initialized if libjpeg v8 emulation is enabled. 2011-04-02 05:37:49 +00:00
DRC
8b351a8fa6 Change build instructions and README to reflect the fact that the Java front-end classes are now part of the build and distribution 2011-04-02 05:17:12 +00:00
DRC
9a77f7f3ce Add testclean target for cleaning up test images 2011-04-02 04:43:14 +00:00
DRC
9237ae5f3e Fix compiler warning 2011-04-02 04:19:21 +00:00
DRC
0e72ee1ccc Oops. Constructor should actually do something. 2011-04-02 03:43:12 +00:00
DRC
7e60806f34 Distribute TJLoader.java.in 2011-04-02 02:33:29 +00:00
DRC
115955e36e Ensure that *gra*.asm is rebuilt whenever *gry*.asm changes. 2011-04-02 02:14:13 +00:00
DRC
90a42bb4d2 Slight refactor to put ScalingFactor into its own class (mainly because the $ in the class name was wreaking havoc on the build scripts, but also to add a few convenience methods to it) and to create a separate loader class so we can provide a .jar file with the MinGW distribution that loads the correct DLL 2011-04-02 02:09:03 +00:00
DRC
d6d704d30d Fix compiler warning with OpenJDK 2011-04-01 20:31:03 +00:00
DRC
3f8b9470a9 2011-04-01 11:26:10 +00:00
DRC
a391158b34 Include TurboJPEG/OSS Java wrapper JAR in Windows distribution packages 2011-04-01 11:13:11 +00:00
DRC
187e286f44 Fix regression bug that caused the "Installer" targets to fail when building from the MSVC IDE 2011-04-01 11:10:46 +00:00
DRC
1c610ebfa3 Modify build instructions to reflect the fact that the Java front-end classes are now built along with the JNI wrapper 2011-04-01 01:21:22 +00:00
DRC
5c4e594064 Fix 'make dist' so that it includes only what we need from java/ (it was errantly including java/Makefile) 2011-04-01 00:37:20 +00:00
DRC
d56b1c71cd Build and package TurboJPEG/OSS Java wrapper into JAR file 2011-04-01 00:20:33 +00:00
DRC
2139a653b0 Use a different naming convention, to avoid conflict with jpegut 2011-03-31 20:58:03 +00:00
DRC
f634833a16 Use the same naming convention for the output files as the Java tests 2011-03-31 20:48:30 +00:00
DRC
892ed7e6b4 Clean up compiler warnings 2011-03-31 10:06:17 +00:00
DRC
977458e00d make testclean should clean up .yuv and 4:4:0 files as well 2011-03-31 09:41:53 +00:00
DRC
76e7801a58 "JAVA_CFLAGS"="JNI_CFLAGS" 2011-03-31 08:03:26 +00:00
DRC
7ed5fe39c9 Get rid of unused IS_WIN32 conditional 2011-03-31 04:14:55 +00:00
DRC
35acffcf0c Create local round up function for jmemmgr.c so we can revert the original argument types of jround_up() without breaking the build on 64-bit Windows. 2011-03-29 05:01:23 +00:00
DRC
1fbaddde3b Clean up packaging system 2011-03-22 09:31:25 +00:00
DRC
51a4282abc MinGW64 no longer prefixes symbols with underscores by default 2011-03-22 09:19:29 +00:00
DRC
bcfb6ed138 2011-03-18 05:59:07 +00:00
DRC
59fd32e903 Throw a warning if an unexpected marker is found in the middle of the JPEG data stream 2011-03-18 05:44:55 +00:00
DRC
efc012f0b5 Throw a warning if an unexpected marker is found in the middle of the JPEG data stream 2011-03-18 05:44:27 +00:00
DRC
d8cc0513ee Fix compression from/decompression to TYPE_INT_{RGB|BGR} BufferedImages on big endian platforms 2011-03-17 07:39:25 +00:00
DRC
f90d1d84c7 More Java API cleanup 2011-03-16 00:02:53 +00:00
DRC
22faf366c3 Java code cleanup + Java docs 2011-03-15 20:52:02 +00:00
DRC
552dd27bde tjTransform() was not working properly if r.w=0 or r.h=0 2011-03-15 20:09:47 +00:00
DRC
4c5eae3bd0 Wordsmithing 2011-03-15 19:33:43 +00:00
DRC
4a0cf492f4 Add notes about performance 2011-03-10 07:25:41 +00:00
DRC
ac0eff91f6 Add an option to display the output image 2011-03-07 09:59:08 +00:00
DRC
d04c64b75a If a scaled-down JPEG output image is requested, we must decompress and recompress the transformed image. 2011-03-07 08:21:11 +00:00
DRC
d594af38e1 On Windows, long is 32-bit, so use jlong instead 2011-03-04 15:28:16 +00:00
DRC
fed7b30436 We actually don't need windows.h at all, and it makes both MinGW and VC++ unhappy because of conflicting macros (such as INT32 in jmorecfg.h) 2011-03-04 14:57:14 +00:00
DRC
32fa016937 MinGW already has snprintf(), so don't use our macro substitute there 2011-03-04 14:37:00 +00:00
DRC
5526cf13d0 Oops. Forgot to add TJTransform class 2011-03-04 14:10:29 +00:00
DRC
58a0845738 Include new grayscale SIMD routines in dist 2011-03-04 14:05:23 +00:00
DRC
0260fd6196 2011-03-04 13:46:55 +00:00
DRC
d5bc5379a4 Add access methods for getting at the JPEG buffer 2011-03-04 13:41:05 +00:00
DRC
c5efebc394 If transforming and outputting a JPEG file, output the transformed file directly instead of decompressing/recompressing it 2011-03-04 13:40:42 +00:00
DRC
15ff5c1feb Add TJTransformer JNI functions to mapfile 2011-03-04 13:39:46 +00:00
DRC
696f25e052 Handle 4:4:0 (transposed 4:2:2 subsampling) 2011-03-04 13:04:24 +00:00
DRC
074a6f24bb Handle 4:4:0 (transposed 4:2:2 subsampling) 2011-03-04 12:52:45 +00:00
DRC
89d167655e Implement lossless cropping interface in Java 2011-03-04 10:13:59 +00:00
DRC
91332307b5 Don't need PAD() anymore 2011-03-04 10:01:22 +00:00
DRC
a43dd1aeb7 Print stack trace on error 2011-03-04 09:54:59 +00:00
DRC
e3c79837d1 Methods of a final class are automatically final 2011-03-04 09:15:07 +00:00
DRC
77f2cf4e75 Modify filename of decompressed output files to indicate that scaling was used 2011-03-04 04:14:47 +00:00
DRC
19f178b9f3 If losslessly transforming to grayscale, compute trimmed dimensions based on grayscale MCU size, not MCU size of source image 2011-03-04 03:38:47 +00:00
DRC
5e9da424a4 Tile generation did not work with TJXFORM_HFLIP, because the underlying transform code was using an in-place algorithm, which modified the source coefficients after the first tile was generated. Thus, create a new option which allows TurboJPEG to turn off the in-place horizontal flip if there are multiple transforms being performed from the same set of coefficients. 2011-03-04 03:20:34 +00:00
DRC
7e1d9c4e42 Transform tests; Variable benchmark time; General cleanup 2011-03-04 02:25:00 +00:00
DRC
3bcf42b4ac Add an option to force grayscale->RGB conversion (needed for jpgtest regression test) 2011-03-03 16:58:47 +00:00
DRC
5e9c5f9ff7 Move per-format flag assignments to the actual TurboJPEG function calls 2011-03-02 10:30:29 +00:00
DRC
086cc1e5cc Make the C version work more like the Java version 2011-03-02 10:13:55 +00:00
DRC
1873d021c7 Generate separate JPEG images for the YUV decode tests 2011-03-02 09:30:57 +00:00
DRC
4be061b162 Oops. Left out the all-important transform structures 2011-03-02 09:27:49 +00:00
DRC
66b6d80ed6 Since lossless transforms have such a high fixed performance cost, implement a mechanism for performing more than one at a time on the same source image. 2011-03-02 09:22:41 +00:00
DRC
92df122286 Wordsmithing and general cleanup 2011-03-02 09:05:09 +00:00
DRC
0c7b322efe Fix Windows build; Add grayscale tests to Windows build; Add proper implementation of snprintf on Windows and use snprintf() in TurboJPEG library and tests instead of sprintf() 2011-03-02 02:17:30 +00:00
DRC
43f33a4d19 Fix compiler warnings in Visual C++ 2011-03-02 01:30:38 +00:00
DRC
b02715c1b1 Fix compiler warnings in Visual C++ 2011-03-02 01:27:26 +00:00
DRC
ef842c142c Perform size checks on arrays 2011-03-02 01:09:20 +00:00
DRC
b58789cb91 Use new scaling API 2011-03-01 20:43:47 +00:00
DRC
95dfd2ab45 Make error handling more consistent with other TurboJPEG C code 2011-03-01 20:23:12 +00:00
DRC
581609cebd Use "bailout" label to be more consistent with other TurboJPEG C code 2011-03-01 20:17:12 +00:00
DRC
e701ed74c0 Use consistent formatting conventions 2011-03-01 20:03:32 +00:00
DRC
ce03e93dfd Add getScalingFactors() method to libturbojpeg version script 2011-03-01 10:20:23 +00:00
DRC
be085e08b3 tjGetScaledSize() would never be able to accommodate scaling factors > 1, so replace it with a function that returns a list of fractional scaling factors that TurboJPEG supports. 2011-03-01 09:53:07 +00:00
DRC
da6a1f6c76 Don't call jpeg_finish_compress() with YUV output, because it tries to insert an EOI marker right in the middle of our image data. 2011-03-01 08:23:53 +00:00
DRC
407cd22df3 2011-02-28 22:23:37 +00:00
DRC
43577eacf9 Unused variables 2011-02-28 10:51:55 +00:00
DRC
045e8f7f07 Improve performance a bit for the non-SIMD case 2011-02-27 10:51:20 +00:00
DRC
c17c5c8188 Improve performance a bit for the non-SIMD case 2011-02-27 10:26:08 +00:00
DRC
f2cb47a275 Add short names for RGB->grayscale MMX functions 2011-02-27 09:09:54 +00:00
DRC
a8bb67e5a9 Change filename in header 2011-02-27 07:59:38 +00:00
DRC
3c620745a7 Make Visual C++ happy 2011-02-27 00:08:06 +00:00
DRC
3f2ef301c4 Expose libjpeg lossless transform feature in TurboJPEG/OSS 2011-02-26 22:02:37 +00:00
DRC
28db388687 Fix compiler warnings 2011-02-26 21:20:46 +00:00
DRC
a3845bd44b Enable full GCC compiler warnings by default 2011-02-26 21:12:36 +00:00
DRC
c8ddbca289 "tjScaledSize"="tjGetScaledSize" (again) 2011-02-26 20:15:27 +00:00
DRC
b8530db29f Remove entry for tjScaledSize() 2011-02-26 20:04:23 +00:00
DRC
cc9133fadf Include tjGetScaledSize() in version scripts 2011-02-26 19:59:01 +00:00
DRC
02156d7c53 "tjScaledSize"="tjGetScaledSize" 2011-02-26 19:53:58 +00:00
DRC
8b3f7c6ff0 Add RGB --> Grayscale YUV decoding test 2011-02-25 06:21:54 +00:00
DRC
cc8df443e6 2011-02-25 06:17:17 +00:00
DRC
8755a6805a Implement YUV encode/decode methods at the Java level; Remove some of the arguments from the Java API and replace with get/set methods; General API cleanup; Fix BufferedImage grayscale tests in TJUnitTest 2011-02-25 06:11:03 +00:00
DRC
7ce8dfe258 Oops. Committed some debugging code 2011-02-25 02:12:11 +00:00
DRC
3405865cd2 Replace the TJ_YUV flag with two new API functions 2011-02-25 02:08:23 +00:00
DRC
18f4b35de5 Tiling doesn't work with YUV encoding either 2011-02-25 00:26:07 +00:00
DRC
1630b15a0e Fix various CR/LF issues 2011-02-25 00:25:31 +00:00
DRC
4dc725069a Use a proper version script for libturbojpeg 2011-02-25 00:23:44 +00:00
DRC
2a07591e9b Add line feed 2011-02-23 20:57:17 +00:00
DRC
6ce4882e2a Numerous enhancements, including using the new BufferedImage support to read/write non-JPEG files 2011-02-23 20:51:54 +00:00
DRC
4e08a1d3bc Check for invalid subsampling factor 2011-02-23 20:51:23 +00:00
DRC
a311c1cd21 Support for compressing from/decompressing to a BufferedImage in the Java wrapper 2011-02-23 12:09:56 +00:00
DRC
4802041125 More JNI cleanup + added unit test and fixed bugs uncovered by it 2011-02-23 02:20:49 +00:00
DRC
8bde192230 Oops. dumpbuf() was displaying only red components. 2011-02-23 01:40:22 +00:00
DRC
e005c1f751 Test all YUV decode paths 2011-02-22 19:59:05 +00:00
DRC
e7c15f3e41 2011-02-22 10:28:18 +00:00
DRC
1a9a4d13c7 Streamline Java wrapper 2011-02-22 10:27:31 +00:00
DRC
892b81cb44 Add new functions to anonymous version script 2011-02-22 06:44:50 +00:00
DRC
38218222cd Make the scaling API a bit more friendly 2011-02-22 06:41:29 +00:00
DRC
05c1af2f57 "TurboJPEG/OSS"="TurboJPEG", since the TurboJPEG header is used with other codecs besides libjpeg-turbo 2011-02-22 00:36:04 +00:00
DRC
9eecea2a8e Add TJBUFSIZEYUV() convenience function 2011-02-22 00:16:14 +00:00
DRC
2c31f2b499 RGBA=RGBX, BGRA=BGRX, ABGR=XBGR, ARGB=XRGB 2011-02-19 18:10:05 +00:00
DRC
86eefe66a6 Implement "ultra quiet mode" for generating output that is easy to copy/paste into a spreadsheet 2011-02-19 18:06:09 +00:00
DRC
964a22d663 Wordsmithing 2011-02-19 17:57:08 +00:00
DRC
b457b5d42e Include jpgtest in Unix/Linux distribution packages 2011-02-19 17:52:45 +00:00
DRC
400d484c41 Include libjpeg run-time programs and jpgtest in installer; Move documentation in SDK distribution packages into doc\ subdirectory 2011-02-19 17:50:23 +00:00
DRC
47ae9a3e0f Disable CXX compiler check 2011-02-19 17:48:26 +00:00
DRC
22f9ca067c Wordsmithed the project description 2011-02-18 22:47:32 +00:00
DRC
85712cb267 Distribute high-quality and grayscale test images 2011-02-18 22:46:05 +00:00
DRC
055ddf28b4 The API/ABI should be described as "libjpeg v8", not "libjpeg v8b", since there are multiple libjpeg releases with the same interface 2011-02-18 20:55:20 +00:00
DRC
ad02bb6032 Add high-quality JPEG tests to CMake build system 2011-02-18 20:52:57 +00:00
DRC
6262130033 Various doc tweaks 2011-02-18 20:51:10 +00:00
DRC
756095aaf0 The SIMD quantization algorithm does not produce correct results with the fast forward integer DCT and JPEG qualities >= 98, so for now, use the non-SIMD quantization function under those circumstances. 2011-02-18 20:50:08 +00:00
DRC
25299d0d2f Updated (C) 2011-02-18 20:43:04 +00:00
DRC
439527e0b9 SIMD-accelerated RGB-to-Grayscale color conversion 2011-02-18 11:23:45 +00:00
DRC
a683760d1c Expose TurboJPEG scaling features in Java wrapper 2011-02-16 03:26:48 +00:00
DRC
f46386f87d Print scaled image size when performing verbose decompression test 2011-02-16 02:29:07 +00:00
DRC
10e445c341 Fix seg fault 2011-02-16 02:25:40 +00:00
DRC
e4f9ae630d Test scaled decompression feature in TurboJPEG 2011-02-16 02:08:17 +00:00
DRC
8252677857 Use same naming scheme for output files as v1.1 2011-02-16 01:23:48 +00:00
DRC
452d7857cc General code cleanup 2011-02-15 21:57:50 +00:00
DRC
b9e093c1a8 General code cleanup 2011-02-15 21:57:26 +00:00
DRC
aa8b75afa8 Added scaling API to TurboJPEG/OSS 2011-02-15 08:31:34 +00:00
DRC
50103b80ca Ensure that YUV temp buffers get properly freed if a failure occurs 2011-02-15 05:26:28 +00:00
DRC
d850ff7386 Ensure that the exit status of the program indicates failure if one of the pixel value checks fails 2011-02-15 05:19:31 +00:00
DRC
d70d48ea3e Ported jpgtest.cxx to pure C to avoid the need for a C++ compiler 2011-02-15 04:04:02 +00:00
DRC
7404770855 Restructure Java classes into their own package 2011-02-08 06:54:36 +00:00
DRC
b56211da74 Use Java capitalization conventions 2011-02-08 02:11:37 +00:00
DRC
4c2c2e7467 New C version of jpgtest needs libm 2011-02-08 02:09:04 +00:00
DRC
1913d03c89 Ported jpgtest.cxx to pure C to avoid the need for a C++ compiler 2011-02-07 08:06:16 +00:00
DRC
023d8b367d 2011-02-06 18:51:24 +00:00
DRC
f0512c5686 JNI expects symbols to either have both an underscore and an @ suffix or to have neither, so since MinGW doesn't add an underscore, we need to disable the suffix as well 2011-02-06 18:48:13 +00:00
DRC
62bb97b9ac Update (C) message 2011-02-06 16:35:58 +00:00
DRC
2719c40abc 1.1.90 2011-02-06 16:11:41 +00:00
DRC
3bc6dc4305 Add java/ to dist 2011-02-06 15:58:22 +00:00
DRC
be2de6bc98 Propagate --with-jni down to RPM SPEC 2011-02-06 15:51:27 +00:00
DRC
a117c67704 Don't set BUILDJNILIB=1 or default JAVA_CFLAGS unless --with-jni is specified 2011-02-06 15:35:38 +00:00
DRC
74ff1aac8e Build JNI wrapper on Windows 2011-02-05 06:01:18 +00:00
DRC
345c3eed92 2011-02-05 05:51:46 +00:00
DRC
3bfca02ca0 2011-02-05 05:41:18 +00:00
DRC
a4b6e4cd66 OS X Tiger requires that JNI libraries have the extension .jnilib, so create a sym link to make it happy 2011-02-05 04:41:36 +00:00
DRC
763f26b29a 2011-02-05 04:17:37 +00:00
DRC
4ac54c3cd6 Detect jni.h; Provide mechanism for adding include paths necessary to find it; Set intelligent defaults for Linux/Mac/Solaris 2011-02-04 22:16:41 +00:00
DRC
c20ba350ad Eliminate compiler warnings in Sun Studio 2011-02-04 22:13:14 +00:00
DRC
5cc45fd6df JNI interface changed for TJ class, since it only has static methods now 2011-02-04 11:22:15 +00:00
DRC
eaad60012a 1.1.90 2011-02-04 11:07:34 +00:00
DRC
36adfee700 Add JNI wrapper for TurboJPEG/OSS 2011-02-04 11:06:36 +00:00
DRC
b10fb30664 Oops. Committed debugging code 2011-02-02 06:02:38 +00:00
DRC
d83e1f8900 Clarify that the C wrappers fall under the same license as the rest of the SIMD code 2011-02-02 05:38:34 +00:00
DRC
26a69b1a29 Clarify that the C wrappers fall under the same license as the rest of the SIMD code 2011-02-02 05:31:16 +00:00
DRC
5a5af28b7c Clarify that the C wrappers fall under the same license as the rest of the SIMD code 2011-02-02 05:29:19 +00:00
DRC
1dd9985842 2011-01-28 08:00:40 +00:00
DRC
6ca296de5d 2011-01-28 07:48:41 +00:00
DRC
21b5c4bc4d The fast integer DCT degrades for qualities > 95, so use the slow integer DCT instead to ensure that perceptually lossless performance is maintained. 2011-01-25 06:52:31 +00:00
DRC
9ca11b80fc Clarifications 2011-01-06 01:19:43 +00:00
DRC
2e1b59c09d Eliminate all of the __memalign() mess and just handle the alignment ourselves 2011-01-05 23:35:53 +00:00
DRC
3c7c57b3ad Ensure temp. buffers for YUV output are 16-byte aligned on 32-bit Windows 2011-01-05 22:33:24 +00:00
DRC
fd7105e1d6 Make arithmetic coding support status messages more clear 2011-01-04 21:40:11 +00:00
DRC
38b8c2f0ef Further protect against invalid Huffman codes 2011-01-04 08:09:41 +00:00
DRC
6ac57da9cd Include new tjDecompressHeader2() function 2010-12-14 19:48:38 +00:00
DRC
4d53f88ea5 2010-12-14 01:23:16 +00:00
DRC
4add559463 Added YUV decode functionality to the "decompress only" test 2010-12-14 01:22:00 +00:00
DRC
f0d2577482 Added extended tjDecompressHeader() function which can determine the type of subsampling used in the JPEG image 2010-12-14 01:21:29 +00:00
DRC
55a9cbffe7 Fix various memory corruption issues in the new JPEG->YUV feature 2010-12-11 06:01:11 +00:00
DRC
f54cc16225 If the output width/height are not an even number of MCU's, then use an intermediate buffer to ensure that the output format is XVideo-compatible 2010-12-10 10:58:49 +00:00
DRC
f80fb63847 Provide TJ_YUV option for tjDecompress() as well 2010-12-10 04:59:13 +00:00
DRC
33c17e84f2 Don't require quality argument when encoding to YUV 2010-12-09 10:01:57 +00:00
DRC
979a590374 Merge the TurboJPEG planar YUV encoding feature from VirtualGL 2.2 2010-11-24 04:02:37 +00:00
DRC
c0cfde855c Hide internal SIMD symbols in libjpeg-turbo shared library 2010-11-23 20:42:48 +00:00
DRC
1f981a0210 Eliminate spurious global symbols 2010-11-23 18:00:46 +00:00
DRC
2e25b45529 Include arithmetic coding test files in dist 2010-11-23 17:13:02 +00:00
DRC
bdb1602e25 Allow arithmetic encoding/decoding to be disabled in CMake build 2010-11-23 17:11:06 +00:00
DRC
fe418b6240 Added configure options to disable arithmetic encoding/decoding 2010-11-23 06:50:14 +00:00
DRC
19e6975e90 Support arithmetic encoding and decoding 2010-11-23 05:49:54 +00:00
DRC
a97cc7c538 2010-11-23 04:46:59 +00:00
DRC
d06a3aec90 2010-11-22 19:51:42 +00:00
DRC
2f1473783f RGBA=RGBX, etc. 2010-11-18 19:55:29 +00:00
DRC
a6ae163f09 Oops. Still need to explicitly make symlinks in this script, because prefix!=/opt/libjpeg-turbo 2010-11-17 23:14:53 +00:00
DRC
76f402f51b Create /opt/libjpeg-turbo/lib32 and /opt/libjpeg-turbo/lib64 symlinks when doing 'make install' 2010-11-17 22:44:40 +00:00
DRC
b6d2ffa0c3 Fix invalid use of fpos_t 2010-11-13 05:31:25 +00:00
DRC
b6563b2d50 Document jpgtest decompress-only feature 2010-11-12 10:18:08 +00:00
DRC
024e30659f Add option to test decompression only + clean up error handling 2010-11-12 10:14:11 +00:00
DRC
cd9000a034 Use version script for jpeg-6b emulation as well 2010-11-07 19:12:30 +00:00
DRC
24fd779ccf Update header description for grayscale bitmap support 2010-11-04 22:42:18 +00:00
DRC
366f303099 Grayscale bitmap support in TurboJPEG/OSS 2010-11-04 22:39:59 +00:00
DRC
409b94e337 2010-11-04 22:22:30 +00:00
DRC
b4aae95e78 Allow Mac and Solaris packages to be built with v7/v8b emulated libraries 2010-10-21 19:47:06 +00:00
DRC
8705f11462 Emulate the version script in libjpeg v7/v8 shared libraries 2010-10-19 06:38:57 +00:00
DRC
627856c2cf Accommodate spaces in CMAKE_BINARY_DIR 2010-10-18 09:46:27 +00:00
DRC
257a3bcf05 2010-10-18 08:41:11 +00:00
DRC
117bacff3a 1.0.90 (1.1 beta1) 2010-10-18 08:27:04 +00:00
DRC
d910129db9 Modify OS X universal binary creation process to give the user more control over the 32-bit fork (necessary for building universal binaries with libjpeg v7/v8b emulation, for instance) 2010-10-18 08:24:42 +00:00
DRC
e300354827 MinGW under Cygwin needs CMAKE_SYSTEM_NAME=Windows as well, since technically, we're cross-compiling 2010-10-18 07:56:14 +00:00
DRC
abd867408b Cygwin is only supported with the autotools build system 2010-10-18 07:23:58 +00:00
DRC
7a4d1f0fdb Additional information/corrections involving libjpeg v7/v8b emulation 2010-10-18 02:21:10 +00:00
DRC
89c9085fcd Use built-in cmake compare_files function rather than GNU cmp (which isn't natively available on Windows) 2010-10-18 01:06:36 +00:00
DRC
71cbfe8860 Allow RPMs and SRPMs to be generated with v7/v8b emulation; Add CMake scripts and other missing files to source distribution 2010-10-18 00:15:31 +00:00
DRC
76a6ac5c44 Install headers as well 2010-10-17 07:28:08 +00:00
DRC
1040f1ac81 Windows packaging has been moved to the CMake build system, so remove it from autotools 2010-10-17 06:50:35 +00:00
DRC
4b8c2743fb Document 'make install' 2010-10-16 22:04:29 +00:00
DRC
2413fda880 Allow installation from the build system (without needing to build an installer) 2010-10-16 21:55:14 +00:00
DRC
d91d48ed83 Eliminate redundant dependency statement; Notify user when SIMD is disabled 2010-10-16 21:27:38 +00:00
DRC
364c050c1a Additional MinGW recipes 2010-10-16 21:02:54 +00:00
DRC
f228b139fa Remove old Windows build system 2010-10-16 09:23:36 +00:00
DRC
6a6ac8951c Document new CMake build system 2010-10-16 09:22:43 +00:00
DRC
deab46b949 Oops. Forgot to check in header templates 2010-10-16 08:52:55 +00:00
DRC
5b8f6495d1 Integrate installer build into CMake build system 2010-10-16 08:51:43 +00:00
DRC
edc8253164 Fix dependencies for the color conversion routines, which build other .asm files indirectly 2010-10-15 20:07:41 +00:00
DRC
8f91c754c8 Print error message if trying to do a native Unix build 2010-10-15 19:11:11 +00:00
DRC
e0b2920fdd Unix LF 2010-10-15 08:43:32 +00:00
DRC
03c5cacaec Allow nasm path to be overridden 2010-10-15 08:39:44 +00:00
DRC
d8d4b03bc5 Set version information for DLL's 2010-10-15 06:42:45 +00:00
DRC
ce23b96141 Export the correct symbols from the Windows DLL when built with libjpeg v7 or v8b emulation 2010-10-15 05:33:21 +00:00
DRC
75905554de Use version suffix on Cygwin DLL as well 2010-10-15 04:58:13 +00:00
DRC
ea84d5dd61 Echo version and build 2010-10-15 04:55:13 +00:00
DRC
bb8322f4c8 First pass at a CMake build system 2010-10-15 03:43:24 +00:00
DRC
a478af780a Space = Tab 2010-10-13 19:22:50 +00:00
DRC
21e8297c16 Oops. Should be single, not double = sign 2010-10-13 19:22:20 +00:00
DRC
0879ed8eaf Document the libjpeg v7/v8 extensions 2010-10-12 03:02:31 +00:00
DRC
53c7d3bc82 Mention new v7/v8 extensions 2010-10-12 02:50:18 +00:00
DRC
7e08d60891 Document new v7/v8 features; .doc = .txt 2010-10-12 01:55:31 +00:00
DRC
1dc925aa11 Enable the use of separate luminance/chrominance quality scaling with libjpeg v6b code base as well 2010-10-11 23:36:04 +00:00
DRC
fd644379ed Add sanity check in BMP reader module to avoid cjpeg crash for empty input
image
2010-10-10 07:27:26 +00:00
DRC
a119e8f8d0 Add sanity check in BMP reader module to avoid cjpeg crash for empty input
image; Support 32-bit BMPs
2010-10-10 07:25:16 +00:00
DRC
153f54b94f Add option for setting luminance & chrominance quality independently (currently only works if using libjpeg v7 or v8 code base) 2010-10-10 07:21:55 +00:00
DRC
ddf1f74cc3 Display libjpeg-turbo version/copyrights in run-time programs 2010-10-10 06:54:21 +00:00
DRC
674ea621df Add -raw option to rdjpgcom for outputting non-printable characters as-is; Make rdjpgcom locale-aware. 2010-10-10 06:04:05 +00:00
DRC
3576a86dfb Fix byte order issue with 16bit PPM/PGM files 2010-10-10 06:01:00 +00:00
DRC
7a3ae15f7d Fix transpose feature with jpeg v6b code base 2010-10-10 02:48:21 +00:00
DRC
be1aa6e080 Implement lossless crop feature from jpeg v7 and v8 2010-10-10 02:15:56 +00:00
DRC
8dc66668e6 Fix version numbers for v7/v8 shared libs 2010-10-10 00:40:37 +00:00
DRC
65ee62c698 Improve readability and flexibility of compatibility macros 2010-10-09 19:57:51 +00:00
DRC
ba825db7ad Remove comments describing DCT scaling feature 2010-10-09 19:24:28 +00:00
DRC
c49c2e80e8 Oops. Forgot to include the new macro header 2010-10-09 19:09:41 +00:00
DRC
74e983609c Bump revision to 1.1 alpha 2010-10-08 08:07:37 +00:00
DRC
aa25adaaa0 Bump revision to 1.1 alpha 2010-10-08 08:07:10 +00:00
DRC
d0d0f09d40 Added optional emulation of the jpeg-7 or jpeg-8b API/ABI's 2010-10-08 08:05:44 +00:00
DRC
0b1530e1e3 "OS/X" = "OS X" 2010-09-30 18:54:31 +00:00
DRC
b9d65553d7 Use testimgflt.ppm in Windows tests 2010-09-09 22:05:49 +00:00
DRC
1b6f7d3992 Require a full build prior to testing (this fixes a problem whereby running 'make test' on an unbuilt tree would fail) 2010-09-09 21:02:21 +00:00
DRC
30ce53edf9 Include testimgflt.ppm in distribution 2010-09-09 21:00:31 +00:00
DRC
c37c0d1195 Most of the "nosimd" test images no longer exist, so don't try to include them in the distribution 2010-09-09 20:40:35 +00:00
DRC
031227571f 1.0.1 2010-09-09 20:34:10 +00:00
DRC
5e8d78ff40 Remove simd/ prefix from #include (not necessary and was causing problems with Visual Studio project) 2010-09-06 17:37:12 +00:00
DRC
134d29791f Automatically determine whether INCOMPLETE_TYPES_BROKEN should be defined 2010-08-21 21:14:17 +00:00
DRC
d982f7d040 Clarify licensing 2010-08-11 21:46:46 +00:00
DRC
8737bd492f Strike that! Reverse it! 2010-08-07 16:27:56 +00:00
DRC
ddef5f56d3 No longer need separate test BMP for non-SIMD unit tests 2010-08-07 16:14:05 +00:00
DRC
09345b6eb4 Fix typo in SIMD dispatch routines which was causing 4:2:0 upsampling to
be used instead of 4:2:2 when decompressing JPEG images using SSE2 code
2010-08-07 16:06:56 +00:00
DRC
7dcc736177 Fix build with YASM 2010-08-03 18:45:11 +00:00
DRC
2f85b88bdf Handle erroneous Huffman codes 2010-07-30 17:15:52 +00:00
DRC
84aba108d6 1.0.1 2010-07-30 15:28:22 +00:00
DRC
843e7306a1 Document NASM version requirement for 64-bit backward compatible build 2010-07-08 07:01:20 +00:00
DRC
1c7414ba64 We're no longer using the RM macro in Makefile.am, so it doesn't need to be substituted anymore 2010-07-08 05:41:47 +00:00
DRC
6e6910e89b 64-bit support doesn't just exist in 10.6. 2010-07-02 09:20:12 +00:00
DRC
3b5b551723 Log only changes to this source tree, not the external build scripts 2010-07-02 09:13:58 +00:00
DRC
7a4df47c41 2010-06-10 19:49:49 +00:00
DRC
faab86eecc Not all platforms define RM 2010-06-10 19:44:56 +00:00
DRC
80a67be49b Include non-SIMD test images in distribution 2010-06-10 18:56:27 +00:00
DRC
3f60381c7a Don't require --without-simd to be specified on non-x86 architectures, and fix 'make test' on such architectures 2010-06-10 18:52:41 +00:00
DRC
6993ea56e9 1.0.0 2010-06-10 04:12:48 +00:00
DRC
7aa7b6dbec Cygwin distribution package 2010-06-09 20:17:09 +00:00
DRC
3d9b2409ce Cygwin package build 2010-06-09 20:16:04 +00:00
DRC
82b3873e31 Added bug tracker ID's 2010-06-05 06:58:22 +00:00
DRC
1edebfd17b Oops 2010-06-05 03:09:17 +00:00
DRC
aaa3706132 Ensure that libdir is set properly during build and install so that the run-time library bindings for the binary programs will be correct 2010-06-05 03:00:36 +00:00
DRC
c840af9323 Remove bin and man directories when uninstalling package 2010-06-05 01:20:35 +00:00
DRC
bf617c729e Distribute man pages in source tarball 2010-06-05 01:12:35 +00:00
DRC
7387b7409a 2010-06-05 01:03:23 +00:00
DRC
36a5d9d238 Install libjpeg run-time programs and man pages and include in Unix/Linux packages; Create a 32-bit compatibility package for amd64 Debian which has only the 32-bit libraries 2010-06-05 01:02:38 +00:00
DRC
83d312b3f5 Create sym. link from /opt/libjpeg-turbo/lib/64 to /opt/libjpeg-turbo/lib/amd64 2010-06-05 00:35:18 +00:00
DRC
66ecd42c6e 2010-06-05 00:22:32 +00:00
DRC
bb631abf79 Allow arbitrary package name to be specified 2010-06-05 00:02:23 +00:00
DRC
b0a89debf1 Install libjpeg run-time programs and man pages and include in Unix/Linux packages 2010-06-04 23:54:10 +00:00
DRC
e4451444a3 Some Linux platforms require -m32 in the LDFLAGS as well 2010-06-04 23:09:00 +00:00
DRC
e086462c22 Don't need to use sudo when building Solaris PKG or RPM's 2010-05-18 22:21:46 +00:00
DRC
f77287acae Oops 2010-05-18 19:18:42 +00:00
DRC
85f7af7f92 Create sym links so that headers and static libs can always be found in the same place on Solaris, Linux, and Mac 2010-05-18 19:04:47 +00:00
DRC
fe51f97001 Go ahead and set the version to 1.0.0 so all interim builds will be release candidates 2010-05-18 17:31:32 +00:00
DRC
e480777a66 0.0.94 2010-05-18 05:32:01 +00:00
DRC
daddf82191 64-bit FreeBSD sets host_cpu to "amd64", not "x86_64". Handle that case so that configure will work without explicitly specifying --host. 2010-05-17 20:47:57 +00:00
DRC
6be102a7a4 Some systems (FreeBSD, in particular) don't define the RM macro in automake 2010-05-17 20:42:51 +00:00
DRC
d40bcf1723 Define TJ_411 so that VirtualGL <= 2.1.x and TurboVNC <= 0.6 can be built with the libjpeg-turbo SDK 2010-05-17 16:42:14 +00:00
DRC
8b4725152d Updated Windows build information 2010-05-17 16:41:12 +00:00
DRC
9582b1cdee Use new e-mail alias 2010-05-11 00:39:45 +00:00
DRC
7cdba23378 Only disable filesystem redirection in the 64-bit installers 2010-05-10 23:39:22 +00:00
DRC
68f4bb1ad4 Handle cases in which MinGW inexplicably builds the DLL as libjpeg-0.dll instead of libjpeg-62.dll 2010-05-10 22:20:14 +00:00
DRC
5b6447311e Use "make nsi" instead of "make dist" to be consistent with MinGW build 2010-05-10 22:19:24 +00:00
DRC
0cc699da2a Create separate packages for Win64 binaries 2010-05-10 22:18:10 +00:00
DRC
2a16fd79cc 2010-05-10 20:03:36 +00:00
DRC
0f7601bf85 xmm6-xmm15 must also be preserved by the callee; Win64 should fully work now 2010-04-23 15:41:34 +00:00
DRC
1d7eaef724 Win64 should fully work now 2010-04-21 17:20:12 +00:00
DRC
ac87162327 Use 64-bit holding buffer on Win64 for increased performance 2010-04-20 21:13:26 +00:00
DRC
7321ba352c Updated (C) 2010-04-20 20:54:03 +00:00
DRC
c3a5da1def Not sure why the cjpeg/djpeg image loaders got disabled, but re-enable them 2010-04-20 19:16:06 +00:00
DRC
ec65eee13b Win64 (mostly) works now 2010-04-20 19:15:09 +00:00
DRC
d8f6cdb23b Use correct filenames in headers 2010-04-20 18:20:13 +00:00
DRC
199c556b18 0.0.93 2010-04-20 18:12:38 +00:00
DRC
719a2b62ad Only have to use 32-bit mov for r14, since it is populated from the stack 2010-04-19 18:58:07 +00:00
DRC
fcbd92d31e Attempt to fix Win64 issues 2010-04-17 21:57:25 +00:00
DRC
20e5edecac 0.0.92 2010-04-13 07:56:24 +00:00
DRC
c2bfb82eb7 Added FreeBSD build instructions 2010-04-10 05:53:35 +00:00
DRC
f3a31100ec Fix x86-64 build on FreeBSD systems 2010-04-06 20:05:39 +00:00
DRC
fe706f6e28 I'm not sure why, but this was necessary in order to return the 32-bit performance to the 0.0.90 baseline 2010-03-20 22:38:53 +00:00
DRC
0d30199d2b Clarify license description 2010-03-20 20:00:51 +00:00
DRC
30d3cc5854 Add ChangeLog to repository 2010-03-15 11:40:31 +00:00
DRC
c6838b243e Fix data corruption issues when decompressing large JPEG images and/or using buffered I/O. Specifically, decode_mcu_fast() can potentially process more than 1 MCU, so make sure there is enough space in the buffer to accommodate this case. Otherwise, the buffer pointer goes negative, and bad mojo ensues. Also, the fast decoder's method of handling unread markers doesn't make libjpeg's restart handler happy, so disable fast decode when restarts are used. 2010-03-15 11:34:58 +00:00
DRC
56e1973681 Include ChangeLog.txt in dist 2010-03-03 09:37:58 +00:00
DRC
efe0be8eeb Bump version number 2010-03-03 09:36:31 +00:00
DRC
a0609a5e50 Don't allow code path to be forced on a system that doesn't support it 2010-03-03 08:46:29 +00:00
DRC
0298a12bd8 Bleepin' Windows uses LLP64, not LP64 2010-02-26 23:01:19 +00:00
DRC
689114d5ef Oops. Debian users might like documentation as well. 2010-02-25 20:14:10 +00:00
DRC
bb4cee56c8 Clarify the DLL hell problem 2010-02-25 06:21:12 +00:00
DRC
5c8514046b Install jpeg62.dll in SDK directory, not Windows system directory. Also, check whether SDK is already installed prior to re-installing 2010-02-25 05:52:44 +00:00
DRC
ea3b2ebdc8 Ensure static libs are built with PIC 2010-02-24 21:27:32 +00:00
DRC
5926e27a45 Visual C++ libraries can't be made to work with MinGW because of the dependency on msvcr90.dll, so build a separate installer for MinGW libraries 2010-02-24 07:24:26 +00:00
DRC
c139c254e6 4.0 is significantly slower than 4.1+ 2010-02-24 00:30:00 +00:00
DRC
aebd271f92 Get rid of cjpeg/djpeg-specific #defines 2010-02-23 23:54:28 +00:00
DRC
14b2ea965a We don't actually need to use GCC 4.0 to do a backward compatible build, and it slows things down relative to GCC 4.2 2010-02-23 23:23:42 +00:00
DRC
bab8a11dd8 Fix Windows package script to accommodate new output directory for VC build 2010-02-23 22:56:05 +00:00
DRC
dafd6e3e76 Fix compiler warning about ending struct with a comma 2010-02-23 21:43:21 +00:00
DRC
e8b4d69f1a Make sure CFLAGS, CXXFLAGS, LDFLAGS, and host_alias are unset to get a 32-bit build 2010-02-23 20:17:48 +00:00
DRC
659295da13 Oops. Didn't mean to commit the debug statement 2010-02-23 10:39:07 +00:00
DRC
b8c4739843 For some unknown reason, the sym link and the actual file get flipped around whenever you do 'make install'. Make sure the script handles both cases. 2010-02-23 10:22:33 +00:00
DRC
9f90f4835e Compile properly with C++ 2010-02-23 08:12:38 +00:00
DRC
a443f36e44 Oops. Missing test image 2010-02-22 22:57:45 +00:00
DRC
90965c3d7e Fix 'make dist' since we added new test images 2010-02-22 22:50:13 +00:00
DRC
3ee7a1103f Added additional documentation for flags 2010-02-22 08:35:19 +00:00
DRC
f72fb65759 Make TJ_FORCE* options work correctly 2010-02-22 08:34:44 +00:00
DRC
852575c603 A bit better solution for 64-bit cleanliness 2010-02-22 06:14:05 +00:00
DRC
3a2d3ad1c5 Clarify Win64 issue 2010-02-22 04:55:23 +00:00
DRC
7e2aebae6b Use the C library DLL only with jpeg62.dll where it is needed. Build turbojpeg.dll with the static C library to maintain backward compatibility with TurboJPEG/IPP 2010-02-22 04:51:09 +00:00
DRC
04a22b9409 Speed up make testclean 2010-02-22 04:12:06 +00:00
DRC
f626e49ae2 Added note about this being an outdated document 2010-02-21 15:45:00 +00:00
DRC
bd8a138197 Add note about texinfo dependency in NASM build 2010-02-19 21:51:26 +00:00
DRC
5fe77ba686 Remove debug output 2010-02-19 07:01:23 +00:00
DRC
b079982e2c test depends on jpegut as well 2010-02-19 07:00:30 +00:00
DRC
34e8ec1eef Unfortunately, we have to use the DLL version of the C library to avoid crashes in cjpeg 2010-02-19 06:59:18 +00:00
DRC
8dcefc5dbd Oops. DLL object was misnamed and thus wasn't getting removed on 'make clean' 2010-02-19 06:56:53 +00:00
DRC
40b41cfd6a Improve unit tests 2010-02-19 06:56:03 +00:00
DRC
22659e40da Improve unit tests 2010-02-19 05:12:39 +00:00
DRC
69ec314fb5 MinGW64 requires that the functions be prefixed with an underscore. Visual C++ apparently doesn't 2010-02-18 13:14:29 +00:00
DRC
b50c3ca33f First attempt at Win64 support 2010-02-18 13:03:41 +00:00
DRC
b96fd4daa4 dumpbuf() should have void return type 2010-02-18 05:12:58 +00:00
DRC
c3574b2b38 Oops. Leftover bugs from the 64-bit port (cause seg fault when using JDCT_FLOAT or JDCT_IFAST when decompressing) 2010-02-18 04:14:14 +00:00
DRC
e25f0c337c Exit with non-zero status if an error is encountered 2010-02-18 00:40:17 +00:00
DRC
feca7e5b6f Sun Studio recipes 2010-02-17 02:25:06 +00:00
DRC
ede97ef4b4 Build Sun packages 2010-02-17 02:24:02 +00:00
DRC
f37c1f3363 Make sure existing .deb file is removed prior to building new one 2010-02-17 01:08:37 +00:00
DRC
4c24ec5383 Replace clunky doexit() mechanism with a better means of error trapping 2010-02-17 01:07:46 +00:00
DRC
def5d225f9 Oops. Need to use %dir to list directories 2010-02-17 00:56:59 +00:00
DRC
3b9219b882 Build libturbojpeg.so using mapfile on Solaris 2010-02-16 22:40:26 +00:00
DRC
00c5bcbd7b Set default optimization flags to -xO5 if using Sun Studio 2010-02-16 22:35:25 +00:00
DRC
9c5f5a5314 Fix build with Sun Studio 2010-02-16 22:34:12 +00:00
DRC
0d88231511 Install additional documentation 2010-02-16 05:54:00 +00:00
DRC
668d21fe80 Split build instructions into a new file and add SDK usage notes to README-turbo.txt 2010-02-16 05:29:10 +00:00
DRC
af894dd7be Make sure directories under /opt/libjpeg-turbo get deleted when uninstalling RPM 2010-02-16 05:04:46 +00:00
DRC
27c9e4290d Build TurboJPEG/OSS with a version script to prevent any non-global symbols from being accessible (this is to protect against potential namespace conflicts when preloading it into an application via VirtualGL.) 2010-02-16 05:03:51 +00:00
DRC
70d9c0bd55 Create Windows installer 2010-02-15 17:10:36 +00:00
DRC
f40efc062f Keep dllexport symbols out of static lib 2010-02-15 17:07:46 +00:00
DRC
16299d15a8 Add mechanism for building universal (i386/x86-64) binaries on Snow Leopard 2010-02-15 16:14:26 +00:00
DRC
68e57edef5 Use more appropriate temp. directory name 2010-02-15 15:16:58 +00:00
DRC
ff6f4bcf88 Add mechanism for creating Mac packages 2010-02-15 14:57:18 +00:00
DRC
e35e2360e5 Use a cleaner method of arg checking that works with set -u 2010-02-15 13:32:09 +00:00
DRC
cb2dd6c427 Instructions for Tiger-compatible build on Leopard/Snow Leopard 2010-02-15 13:27:17 +00:00
DRC
1798b82a86 Oops. This should have been included with r100 2010-02-15 12:08:46 +00:00
DRC
6b0f9283dd Add mechanism for creating DEB packages 2010-02-15 12:06:27 +00:00
DRC
79fc8d851e Actually, we only need to 'make dist-gzip' prior to building the SRPM 2010-02-15 11:36:46 +00:00
DRC
eda68dbd6a Add mechanism for creating RPMs 2010-02-15 11:32:23 +00:00
DRC
b754ae7260 Should really use $(srcdir) here 2010-02-15 11:10:08 +00:00
DRC
f7f66301b2 Change default prefix to /opt/libjpeg-turbo 2010-02-15 11:08:57 +00:00
DRC
bfa7c1f2ee Don't need Visual C++ project file 2010-02-15 11:07:33 +00:00
DRC
615df6941d Change package name & version 2010-02-15 11:05:53 +00:00
DRC
4b24e9833c Make sure 'make dist' includes everything we want (and nothing we don't) 2010-02-15 11:04:51 +00:00
DRC
1a275c641e More missing files from jpeg-6b 2010-02-15 10:49:01 +00:00
Thomas G. Lane
41f55c093a The Independent JPEG Group's JPEG software v6b 2014-09-07 20:00:00 +01:00
Thomas G. Lane
16c97143f3 The Independent JPEG Group's JPEG software v6a 2014-09-07 20:00:00 +01:00
Thomas G. Lane
0baf670330 The Independent JPEG Group's JPEG software v6 2014-09-07 20:00:00 +01:00
Thomas G. Lane
357eba2331 The Independent JPEG Group's JPEG software v5b 2014-09-07 20:00:00 +01:00
Thomas G. Lane
54656d1d59 The Independent JPEG Group's JPEG software v5a 2014-09-07 20:00:00 +01:00
Thomas G. Lane
c5414ae082 The Independent JPEG Group's JPEG software v5 2014-09-07 20:00:00 +01:00
Thomas G. Lane
24b8211e9f The Independent JPEG Group's JPEG software v4a 2014-09-07 20:00:00 +01:00
Thomas G. Lane
f14f1a0dc3 The Independent JPEG Group's JPEG software v4 2014-09-07 20:00:00 +01:00
Thomas G. Lane
9821061877 The Independent JPEG Group's JPEG software v3 2014-09-07 20:00:00 +01:00
Thomas G. Lane
98f16a9b4d The Independent JPEG Group's JPEG software v2 2014-09-07 20:00:00 +01:00
Thomas G. Lane
7a9a82bf06 The Independent JPEG Group's JPEG software v1 2014-09-07 20:00:00 +01:00
DRC
db1a243631 Reflect the fact that CFLAGS=CXXFLAGS=-O3 by default 2010-02-14 08:02:55 +00:00
DRC
55e8d83a10 Set CFLAGS=CXXFLAGS=-O3 if using GCC and the flags are not already set 2010-02-14 07:39:07 +00:00
DRC
5838d99dfe builddir isn't always defined 2010-02-14 02:15:52 +00:00
DRC
825d07f5d5 License info + updated performance claims 2010-02-13 23:06:03 +00:00
DRC
64462a3578 Enable (i.e. fix) VPATH and out-of-tree builds 2010-02-13 22:55:05 +00:00
DRC
36db4985d5 Instructions for cross compiling MinGW libs on Cygwin 2010-02-12 23:24:21 +00:00
DRC
4240858f53 Build instructions 2010-02-12 22:52:37 +00:00
DRC
ea1c8a3360 MinGW uses autoconf 2.56 2010-02-12 22:22:01 +00:00
DRC
c65c17f5ea Visual C++ build 2010-02-12 09:37:20 +00:00
DRC
392b89a5a5 Clean up test detritus 2010-02-12 06:27:34 +00:00
DRC
3b1c09417f Re-add relevant files and tests from libjpeg v6b 2010-02-12 06:01:49 +00:00
DRC
f222c7547c Restore --without-simd option for testing purposes 2010-02-12 05:37:07 +00:00
DRC
444950fec8 Do not build libturbojpeg as a versioned library 2010-02-12 04:34:41 +00:00
DRC
3ca410784c Oops. Still need to #define WITH_SIMD 2010-02-12 04:28:29 +00:00
DRC
4c1c7f5a52 Make SIMD build compulsory (otherwise, what's the point?) 2010-02-11 06:57:57 +00:00
DRC
2e069ba879 Build shared libraries by default; Include libturbojpeg in distribution 2010-02-11 06:39:32 +00:00
DRC
c61c02e031 Oops. Use EGREP instead of GREP, because GREP is not available in earlier versions of autotools 2010-02-05 09:19:13 +00:00
DRC
05e874048b Fix build problems on Solaris 10 2010-01-29 07:14:57 +00:00
DRC
4f2536e187 Enable 64-bit libjpeg/SIMD build on Solaris 2010-01-28 23:57:53 +00:00
DRC
7d3a698e52 Use the correct version to name the shared library, and if the shared library build is enabled, allow the headers to be installed 2010-01-28 22:18:41 +00:00
DRC
49933cde47 Allow building libjpeg.so if --enable-shared is passed to configure (but disable shared library build by default) 2010-01-28 05:34:53 +00:00
Adam Tkac
63c18bbe6c [Bugfix] Mark stack as non-executable in NASM code. 2010-01-27 10:10:23 +00:00
DRC
1fee9f05fb Enable 64-bit build on Snow Leopard 2009-10-08 09:41:39 +00:00
DRC
b2c532f62d Work around alignment issue with OS X linker which was causing problems on Leopard and Snow Leopard 2009-10-08 09:04:56 +00:00
DRC
9a6243c913 Some systems (notably OS X Leopard) have fls() already, so rename ours to avoid conflict 2009-10-01 22:26:14 +00:00
DRC
4d289a4912 Not all platforms define __WORDSIZE 2009-09-28 08:19:40 +00:00
DRC
5b3da6d4e3 Greatly improve performance of Huffman decoding 2009-09-28 00:33:02 +00:00
DRC
95de778c46 Significantly improve grayscale performance 2009-09-24 06:18:25 +00:00
Adam Tkac
f585c78fe6 Merge unified_buildsys branch to trunk (r3892 - r3898) 2009-09-14 13:07:14 +00:00
DRC
164cb4004b Update (C) notice and fix line feed in usage instructions 2009-09-03 01:35:12 +00:00
Peter Åstrand
cb9c102ddb Corrected last patch: Use jsimd_none.c instead of jsimd_i386.c on
VC/Windows at this point.
2009-08-19 14:20:46 +00:00
Peter Åstrand
0cae220381 Windows build fixes:
* Use jsimd_i386.c instead of the attic jsimd.c

* Corrected include of jsimd.h in jsimd_i386.c.
2009-08-19 13:53:48 +00:00
DRC
389975d9ee Unfortunately, the previous enhancements made an invalid assumption about the code sizes, which caused "DCT out of range" errors in the decoder. Was able to fix 64-bit without losing any performance, but unfortunately had to revert 32-bit back to its previous behavior for now. 2009-08-06 08:58:48 +00:00
DRC
a1a5989d85 Update copyrights to indicate files modified with colorspace extensions 2009-08-06 08:32:00 +00:00
DRC
8311c51c07 Oops. Clean up a couple of remaining 32-bit memory accesses 2009-08-06 07:51:26 +00:00
DRC
2691a24539 Improve compression performance by 15-20% 2009-07-30 08:35:06 +00:00
Pierre Ossman
1bd552079d Make our Makefile.am a bit easier to convert to a standalone one by
indicating which headers are the public ones.
2009-07-10 12:59:14 +00:00
Pierre Ossman
daa07a8ac3 Make sure bmp.h gets distributed. 2009-07-10 12:56:00 +00:00
Pierre Ossman
7a9b1adb5f Make sure the indirectly used assembly files get packaged. 2009-07-10 12:47:13 +00:00
Pierre Ossman
769c80420b Make x86_64 SIMD code PIC friendly
Use RIP relative addressing as that works in both PIC and non-PIC mode.
2009-06-29 12:58:48 +00:00
Pierre Ossman
6212076d91 Clean up SIMD glue code
The SIMD glue code has gotten a bit #ifdef heavy so clean it up by having
one file for each possible SIMD arch. This also allows a simplification of
the x86_64 code as SSE/SSE2 is always known to exist on that arch.
2009-06-29 11:20:42 +00:00
Pierre Ossman
c8eee1dffe Remove unused variable. 2009-06-26 14:10:33 +00:00
Pierre Ossman
88617301e9 Improve the messages for the SIMD configuration test now that we support
more than one arch.
2009-06-26 14:09:47 +00:00
DRC
33d5bcb4f3 Add back in cjpeg and djpeg utilities for testing purposes 2009-06-25 20:41:17 +00:00
DRC
9b74d3f224 64-bit SIMD acceleration 2009-06-25 20:38:31 +00:00
DRC
5cac289deb Fix dependencies for merged upsampling code 2009-06-25 20:33:51 +00:00
DRC
cf75c6f1be Test fast upsampling
"4:1:1 = 4:2:0"
2009-04-05 21:53:20 +00:00
DRC
b0716b6875 Add colorspace extensions to merged upsampling routines 2009-04-05 21:51:25 +00:00
DRC
adce982c72 Remove unnecessary code 2009-04-05 21:47:40 +00:00
DRC
d8d563f60a Oops. jcolsamp.inc should be included from j[c|d]clr[mmx|ss2].asm so it received the effect of the redefined RGB_* macros 2009-04-04 15:25:45 +00:00
DRC
9cc9035c67 Oops. jcolsamp.inc needs to be included from j[c|d]clr[mmx|ss2].asm so that it receives the effect of the redefined RGB_* macros 2009-04-04 15:22:14 +00:00
Adam Tkac
af9ce6951a Don't install test programs, build them only. 2009-04-03 14:54:40 +00:00
Adam Tkac
c689a22bb0 Check if C++ compiler is present. 2009-04-03 14:47:50 +00:00
DRC
65b7cbecf3 Include low-level unit tests borrowed from VirtualGL 2009-04-03 12:04:24 +00:00
DRC
f7e0f6d5f5 Implement new colorspaces to allow directly compressing from/decompressing to RGB/RGBX/BGR/BGRX/XBGR/XRGB without conversion 2009-04-03 12:00:51 +00:00
DRC
6b7eeb745c Add environment variables to force MMX/SSE2 code path selection 2009-04-03 11:27:17 +00:00
DRC
3901fbb143 Fix build for RGB_PIXELSIZE==4 2009-04-01 20:02:14 +00:00
DRC
bf9f8d041b Eliminate backward incompatibility that required empty_output_buffer() to handle cases in which the buffer wasn't 100% full 2009-03-16 23:58:30 +00:00
Pierre Ossman
a63544a357 Work around subdirectory bug in older automake.
Older versions of automake doesn't properly support no-recursive make.
Reimplement the build system by having a local Makefile.am in the
simd/ directory.
2009-03-16 13:34:18 +00:00
DRC
98d1d692b5 Fix broken buffered I/O (to make cjpeg work) 2009-03-14 01:21:13 +00:00
Adam Tkac
de4b417a81 Make source compilable via GNU autotools which are part of RHEL 5. 2009-03-13 13:58:44 +00:00
Adam Tkac
de0008d00e Revert r3657 (import of autogenerated) files. 2009-03-13 13:44:18 +00:00
Pierre Ossman
89e518a098 Add new simd files to Visual Studio project file. 2009-03-13 12:24:28 +00:00
Pierre Ossman
59641bb95f Move variable init around a bit to please crappy compilers. 2009-03-13 12:17:26 +00:00
Pierre Ossman
a06a8bc928 Don't mix LOCAL() and qualifiers. 2009-03-13 12:16:51 +00:00
DRC
0a22f153ea Include Huffman codec optimizations borrowed from TurboJPEG 2009-03-12 17:24:27 +00:00
Adam Tkac
4a7a6cc081 Import autogenerated files for unix/ and common/ subdirs to make source
compilable without GNU autotools.
2009-03-11 11:14:37 +00:00
Pierre Ossman
093fe3bb51 Add SSE2 SIMD implementation of computationally intensive routines. 2009-03-09 13:34:17 +00:00
Pierre Ossman
205cdc87d4 Add SSE SIMD implementation of computationally intensive routines. 2009-03-09 13:31:56 +00:00
Pierre Ossman
a5cccc9dbf Most SIMD implementations need 16 byte alignment 2009-03-09 13:30:47 +00:00
Pierre Ossman
c7de3b4d83 Make sure the work space memory is properly aligned
We use the heap allocators to avoid having more than one implementation
of the alignment logic.
2009-03-09 13:29:37 +00:00
Pierre Ossman
9a4a8bb721 Add 3DNow SIMD implementation of computationally intensive routines. 2009-03-09 13:28:10 +00:00
Pierre Ossman
649fe159ce Add MMX SIMD implementation of computationally intensive routines. 2009-03-09 13:25:30 +00:00
Pierre Ossman
e1594812ac "Optimise" quantization step by replacing the division by a multiplication.
This has no measurable difference right now but makes it possible to do
SIMD implementations of this stage.
2009-03-09 13:23:04 +00:00
Pierre Ossman
863946aebd Implement x86 SIMD framework
Add NASM support and stub routine for detecting SIMD extensions.
2009-03-09 13:21:27 +00:00
Pierre Ossman
c5cf41164a Framework for supporting SIMD acceleration
Designed to impose minimal changes on the "normal" code.
2009-03-09 13:15:56 +00:00
Pierre Ossman
a4f55b50c9 Split up the forward DCT routine into three stages
Divide it into sample conversion, DCT and quantization in order to
easily provide alternative implementations of each stage.
2009-03-09 10:37:20 +00:00
Pierre Ossman
d7bacc0721 Improve memory allocater alignment handling
Fix some broken assumptions and allow any alignment, not just those
associated with C types.
2009-03-09 10:34:53 +00:00
Pierre Ossman
f1962bc0ce Explain the config header voodoo. 2009-03-06 15:30:42 +00:00
Pierre Ossman
8622727c09 Don't test for GNU malloc as we don't need it (or even check the result
of the test).
2009-03-06 15:00:56 +00:00
Peter Åstrand
ebd6166488 Renamed README_TightVNC.txt as README_TigerVNC.txt 2009-03-03 12:04:47 +00:00
Peter Åstrand
f83b43b7c9 Rebrand the source as TigerVNC. It is my hope that this patch is
minimal but still complete. The rebranding was done using a script:

find trunk -name .svn -prune -o -type f -exec rep.sh \{\} \;
pushd trunk
svn revert doc/TODO doc/registered-codes.txt doc/ft-protocol-problems.txt doc/rfbtight.tex
perl -pi -e 's|tightvnc|tigervnc|g' unix/configure.ac win/configure.ac unix/README

With rep.sh looking like:

perl -pi -e 's|TightVNC|TigerVNC|g' "$@"
perl -pi -e 's|www\.tightvnc\.com/bugs\.html|www\.tigervnc\.org|g' "$@"
perl -pi -e 's|www\.tightvnc\.com|www\.tigervnc\.org|g' "$@"
perl -pi -e 's|devteam\@tightvnc\.com|tigervnc-devel\@lists\.sourceforge\.net|g' "$@"
perl -pi -e 's|TigerVNC Team|TightVNC Team|g' "$@"
perl -pi -e 's|TigerVNC Group|TightVNC Group|g' "$@"
perl -pi -e 's|TigerVNC protocol|TightVNC protocol|g' "$@"
perl -pi -e 's|TigerVNC-specific|TightVNC-specific|g' "$@"
perl -pi -e 's|Vendor signatures: standard VNC/RealVNC, TridiaVNC, and TigerVNC|Vendor signatures: standard VNC/RealVNC, TridiaVNC, and TightVNC|g' "$@"
perl -pi -e 's|TigerVNC vendor|TightVNC vendor|g' "$@"
perl -pi -e 's|TigerVNC extension|TightVNC extension|g' "$@"
perl -pi -e 's|protocolTigerVNC|protocolTightVNC|g' "$@"
perl -pi -e 's|TigerVNC additions were|TightVNC additions were|g' "$@"
perl -pi -e 's|TigerVNC 1\.2|TightVNC 1\.2|g' "$@"
perl -pi -e 's|TigerVNC authentication type|TightVNC authentication type|g' "$@"
2009-02-27 10:12:14 +00:00
Peter Åstrand
e2796477e6 This should be the final modification to restore a working Visual
Studio build. A static jconfig.h has been re-added, but in a separate
directory, to avoid clash with jconfig.h generated by configure
script. Also, jconfig.h now includes the inline macro. jpeg.dsp has
been modified to search in the "win" subdir, to find jconfig.h. 

This patch is in spirit similar to r121.
2008-12-02 09:56:26 +00:00
Adam Tkac
c653640b0d [Bugfix] Include man files and more jpeg libraries in tarball 2008-10-22 11:19:25 +00:00
Adam Tkac
2d830a0e0c Add headers to Makefile.am-s to fix "make dist" command in common/* subtree 2008-06-18 15:29:19 +00:00
Adam Tkac
6687665312 - introduced common/jpeg/jconfig.h.in - minimal jconfig.h template 2008-04-14 13:11:58 +00:00
Adam Tkac
d88cc24540 - introduced common/jpeg/{configure.ac,Makefile.am}
- removed autogenerated stuff (jconfig.h, configure, config.guess, config.sub, jconfig.h, install-sh)
- minor macros changes in jchuff.c, jcphuff.c, jmorecfg.h (same with configure produced macros)
2008-04-03 13:29:28 +00:00
Constantin Kaplinsky
3347727ebb Migrating to new directory structure adopted from the RealVNC's source tree. More changes will follow. 2006-05-25 05:01:55 +00:00
337 changed files with 58190 additions and 42200 deletions

7
.gitauthors Normal file
View File

@@ -0,0 +1,7 @@
dcommander = DRC <dcommander@users.sourceforge.net>
astrand = Peter Åstrand <astrand@cendio.se>
ossman_ = Pierre Ossman <ossman@cendio.se>
const_k = Constantin Kaplinsky <const@tightvnc.com>
atkac = Adam Tkac <atkac@redhat.com>

14
.gitignore vendored Normal file
View File

@@ -0,0 +1,14 @@
Makefile.in
/autom4te.cache
/aclocal.m4
/compile
/configure
/depcomp
/install-sh
/missing
/stamp-h1
/config.guess
/config.h.in
/config.sub
/ltmain.sh
/ar-lib

View File

@@ -35,27 +35,15 @@ Build Requirements
NOTE: the NASM build will fail if texinfo is not installed. NOTE: the NASM build will fail if texinfo is not installed.
-- GCC v4.1 or later recommended for best performance -- GCC v4.1 (or later) or clang recommended
* Beginning with Xcode 4, Apple stopped distributing GCC and switched to
the LLVM compiler. Xcode v4.0 through v4.6 provides a GCC front end
called LLVM-GCC. Unfortunately, as of this writing, neither LLVM-GCC nor
the LLVM (clang) compiler produces optimal performance with libmozjpeg.
Building libmozjpeg with LLVM-GCC v4.2 results in a 10% performance
degradation when compressing using 64-bit code, relative to building
libmozjpeg with GCC v4.2. Building libmozjpeg with LLVM (clang)
results in a 20% performance degradation when compressing using 64-bit
code, relative to building libmozjpeg with GCC v4.2. If you are
running Snow Leopard or earlier, it is suggested that you continue to use
Xcode v3.2.6, which provides GCC v4.2. If you are using Lion or later, it
is suggested that you install Apple GCC v4.2 through MacPorts.
-- If building the MozJPEG Java wrapper, JDK or OpenJDK 1.5 or later is -- If building the TurboJPEG Java wrapper, JDK or OpenJDK 1.5 or later is
required. Some systems, such as OS X 10.4, Solaris 10 and later, and Red required. Some systems, such as Solaris 10 and later and Red Hat Enterprise
Hat Enterprise Linux 5 and later, have this pre-installed. On OS X 10.5 and Linux 5 and later, have this pre-installed. On OS X 10.5 and later, it will
later, it will be necessary to install the Java Developer Package, which can be necessary to install the Java Developer Package, which can be downloaded
be downloaded from http://developer.apple.com/downloads (Apple ID required.) from http://developer.apple.com/downloads (Apple ID required.) For systems
For systems that do not have a JDK installed, you can obtain the Oracle Java that do not have a JDK installed, you can obtain the Oracle Java Development
Development Kit from http://www.java.com. Kit from http://www.java.com.
================== ==================
@@ -64,19 +52,19 @@ Out-of-Tree Builds
Binary objects, libraries, and executables are generated in the same directory Binary objects, libraries, and executables are generated in the same directory
from which configure was executed (the "binary directory"), and this directory from which configure was executed (the "binary directory"), and this directory
need not necessarily be the same as the libmozjpeg source directory. You need not necessarily be the same as the mozjpeg source directory. You
can create multiple independent binary directories, in which different versions can create multiple independent binary directories, in which different versions
of libmozjpeg can be built from the same source tree using different of mozjpeg can be built from the same source tree using different
compilers or settings. In the sections below, {build_directory} refers to the compilers or settings. In the sections below, {build_directory} refers to the
binary directory, whereas {source_directory} refers to the libmozjpeg source binary directory, whereas {source_directory} refers to the mozjpeg source
directory. For in-tree builds, these directories are the same. directory. For in-tree builds, these directories are the same.
====================== ================
Building libmozjpeg Building mozjpeg
====================== ================
The following procedure will build libmozjpeg on Linux, FreeBSD, Cygwin, and The following procedure will build mozjpeg on Linux, FreeBSD, Cygwin, and
Solaris/x86 systems (on Solaris, this generates a 32-bit library. See below Solaris/x86 systems (on Solaris, this generates a 32-bit library. See below
for 64-bit build instructions.) for 64-bit build instructions.)
@@ -86,9 +74,6 @@ for 64-bit build instructions.)
sh {source_directory}/configure [additional configure flags] sh {source_directory}/configure [additional configure flags]
make make
NOTE: Running autoreconf in the source directory is usually only necessary if
building libmozjpeg from the SVN repository.
This will generate the following files under .libs/ This will generate the following files under .libs/
libjpeg.a libjpeg.a
@@ -99,7 +84,7 @@ This will generate the following files under .libs/
cygjpeg-{version}.dll (Cygwin) cygjpeg-{version}.dll (Cygwin)
Shared library for the libjpeg API Shared library for the libjpeg API
By default, {version} is 62.1.0, 7.1.0, or 8.0.2, depending on whether By default, {version} is 62.2.0, 7.2.0, or 8.1.2, depending on whether
libjpeg v6b (default), v7, or v8 emulation is enabled. If using Cygwin, libjpeg v6b (default), v7, or v8 emulation is enabled. If using Cygwin,
{version} is 62, 7, or 8. {version} is 62, 7, or 8.
@@ -110,28 +95,28 @@ This will generate the following files under .libs/
libjpeg.dll.a (Cygwin) libjpeg.dll.a (Cygwin)
Import library for the libjpeg API Import library for the libjpeg API
libmozjpeg.a libturbojpeg.a
Static link library for the MozJPEG API Static link library for the TurboJPEG API
libmozjpeg.so.0.0.0 (Linux, Unix) libturbojpeg.so.0.1.0 (Linux, Unix)
libmozjpeg.0.0.0.dylib (OS X) libturbojpeg.0.1.0.dylib (OS X)
cygmozjpeg-0.dll (Cygwin) cygturbojpeg-0.dll (Cygwin)
Shared library for the MozJPEG API Shared library for the TurboJPEG API
libmozjpeg.so (Linux, Unix) libturbojpeg.so (Linux, Unix)
libmozjpeg.dylib (OS X) libturbojpeg.dylib (OS X)
Development symlink for the MozJPEG API Development symlink for the TurboJPEG API
libmozjpeg.dll.a (Cygwin) libturbojpeg.dll.a (Cygwin)
Import library for the MozJPEG API Import library for the TurboJPEG API
libjpeg v7 or v8 API/ABI Emulation libjpeg v7 or v8 API/ABI Emulation
---------------------------------- ----------------------------------
Add --with-jpeg7 to the configure command line to build a version of Add --with-jpeg7 to the configure command line to build a version of
libmozjpeg that is API/ABI-compatible with libjpeg v7. Add --with-jpeg8 to mozjpeg that is API/ABI-compatible with libjpeg v7. Add --with-jpeg8 to
the configure command to build a version of libmozjpeg that is the configure command to build a version of mozjpeg that is
API/ABI-compatible with libjpeg v8. See README-turbo.txt for more information API/ABI-compatible with libjpeg v8. See README-turbo.txt for more information
on libjpeg v7 and v8 emulation. on libjpeg v7 and v8 emulation.
@@ -140,7 +125,7 @@ In-Memory Source/Destination Managers
------------------------------------- -------------------------------------
When using libjpeg v6b or v7 API/ABI emulation, add --without-mem-srcdst to the When using libjpeg v6b or v7 API/ABI emulation, add --without-mem-srcdst to the
configure command line to build a version of libmozjpeg that lacks the configure command line to build a version of mozjpeg that lacks the
jpeg_mem_src() and jpeg_mem_dest() functions. These functions were not part of jpeg_mem_src() and jpeg_mem_dest() functions. These functions were not part of
the original libjpeg v6b and v7 APIs, so removing them ensures strict the original libjpeg v6b and v7 APIs, so removing them ensures strict
conformance with those APIs. See README-turbo.txt for more information. conformance with those APIs. See README-turbo.txt for more information.
@@ -150,7 +135,7 @@ Arithmetic Coding Support
------------------------- -------------------------
Since the patent on arithmetic coding has expired, this functionality has been Since the patent on arithmetic coding has expired, this functionality has been
included in this release of libmozjpeg. libmozjpeg's implementation is included in this release of mozjpeg. mozjpeg's implementation is
based on the implementation in libjpeg v8, but it works when emulating libjpeg based on the implementation in libjpeg v8, but it works when emulating libjpeg
v7 or v6b as well. The default is to enable both arithmetic encoding and v7 or v6b as well. The default is to enable both arithmetic encoding and
decoding, but those who have philosophical objections to arithmetic coding can decoding, but those who have philosophical objections to arithmetic coding can
@@ -158,11 +143,11 @@ add --without-arith-enc or --without-arith-dec to the configure command line to
disable encoding or decoding (respectively.) disable encoding or decoding (respectively.)
MozJPEG Java Wrapper TurboJPEG Java Wrapper
---------------------- ----------------------
Add --with-java to the configure command line to incorporate an optional Java Add --with-java to the configure command line to incorporate an optional Java
Native Interface wrapper into the MozJPEG shared library and build the Java Native Interface wrapper into the TurboJPEG shared library and build the Java
front-end classes to support it. This allows the MozJPEG shared library to front-end classes to support it. This allows the TurboJPEG shared library to
be used directly from Java applications. See java/README for more details. be used directly from Java applications. See java/README for more details.
You can set the JAVAC, JAR, and JAVA configure variables to specify You can set the JAVAC, JAR, and JAVA configure variables to specify
@@ -173,9 +158,9 @@ to specify arguments that should be passed to the C compiler when building the
JNI wrapper. Run 'configure --help' for more details. JNI wrapper. Run 'configure --help' for more details.
======================== ==================
Installing libmozjpeg Installing mozjpeg
======================== ==================
If you intend to install these libraries and the associated header files, then If you intend to install these libraries and the associated header files, then
replace 'make' in the instructions above with replace 'make' in the instructions above with
@@ -188,16 +173,16 @@ For example,
will install the header files in /usr/local/include and the library files in will install the header files in /usr/local/include and the library files in
/usr/local/lib64. If 'prefix' and 'libdir' are not specified, then the default /usr/local/lib64. If 'prefix' and 'libdir' are not specified, then the default
is to install the header files in /opt/libmozjpeg/include and the library is to install the header files in /opt/mozjpeg/include and the library
files in /opt/libmozjpeg/lib32 (32-bit) or /opt/libmozjpeg/lib64 files in /opt/mozjpeg/lib32 (32-bit) or /opt/mozjpeg/lib64
(64-bit.) (64-bit.)
NOTE: You can specify a prefix of /usr and a libdir of, for instance, NOTE: You can specify a prefix of /usr and a libdir of, for instance,
/usr/lib64 to overwrite the system's version of libjpeg. If you do this, /usr/lib64 to overwrite the system's version of libjpeg. If you do this,
however, then be sure to BACK UP YOUR SYSTEM'S INSTALLATION OF LIBJPEG before however, then be sure to BACK UP YOUR SYSTEM'S INSTALLATION OF LIBJPEG before
overwriting it. It is recommended that you instead install libmozjpeg into overwriting it. It is recommended that you instead install mozjpeg into
a non-system directory and manipulate the LD_LIBRARY_PATH or create symlinks a non-system directory and manipulate the LD_LIBRARY_PATH or create symlinks
to force applications to use libmozjpeg instead of libjpeg. See to force applications to use mozjpeg instead of libjpeg. See
README-turbo.txt for more information. README-turbo.txt for more information.
@@ -216,17 +201,6 @@ Add
to the configure command line. to the configure command line.
64-bit Build on 64-bit OS X
---------------------------
Add
--host x86_64-apple-darwin NASM=/opt/local/bin/nasm
to the configure command line. NASM 2.07 or later from MacPorts must be
installed.
32-bit Build on 64-bit OS X 32-bit Build on 64-bit OS X
--------------------------- ---------------------------
@@ -243,12 +217,12 @@ to the configure command line.
Add Add
--host x86_64-apple-darwin NASM=/opt/local/bin/nasm \ --host x86_64-apple-darwin NASM=/opt/local/bin/nasm \
CFLAGS='-isysroot /Developer/SDKs/MacOSX10.4u.sdk \ CFLAGS='-isysroot /Developer/SDKs/MacOSX10.5.sdk \
-mmacosx-version-min=10.4 -O3' \ -mmacosx-version-min=10.5 -O3' \
LDFLAGS='-isysroot /Developer/SDKs/MacOSX10.4u.sdk \ LDFLAGS='-isysroot /Developer/SDKs/MacOSX10.5.sdk \
-mmacosx-version-min=10.4' -mmacosx-version-min=10.5'
to the configure command line. The OS X 10.4 SDK, and NASM 2.07 or later from to the configure command line. The OS X 10.5 SDK, and NASM 2.07 or later from
MacPorts, must be installed. MacPorts, must be installed.
@@ -258,12 +232,12 @@ MacPorts, must be installed.
Add Add
--host i686-apple-darwin \ --host i686-apple-darwin \
CFLAGS='-isysroot /Developer/SDKs/MacOSX10.4u.sdk \ CFLAGS='-isysroot /Developer/SDKs/MacOSX10.5.sdk \
-mmacosx-version-min=10.4 -O3 -m32' \ -mmacosx-version-min=10.5 -O3 -m32' \
LDFLAGS='-isysroot /Developer/SDKs/MacOSX10.4u.sdk \ LDFLAGS='-isysroot /Developer/SDKs/MacOSX10.5.sdk \
-mmacosx-version-min=10.4 -m32' -mmacosx-version-min=10.5 -m32'
to the configure command line. The OS X 10.4 SDK must be installed. to the configure command line. The OS X 10.5 SDK must be installed.
64-bit Library Build on 64-bit Solaris 64-bit Library Build on 64-bit Solaris
@@ -295,10 +269,10 @@ Add
CC=cc CC=cc
to the configure command line. libmozjpeg will automatically be built with to the configure command line. mozjpeg will automatically be built with
the maximum optimization level (-xO5) unless you override CFLAGS. the maximum optimization level (-xO5) unless you override CFLAGS.
To build a 64-bit version of libmozjpeg using Oracle Solaris Studio, add To build a 64-bit version of mozjpeg using Oracle Solaris Studio, add
--host x86_64-pc-solaris CC=cc CFLAGS='-xO5 -m64' LDFLAGS=-m64 --host x86_64-pc-solaris CC=cc CFLAGS='-xO5 -m64' LDFLAGS=-m64
@@ -315,67 +289,115 @@ Use CMake (see recipes below)
ARM Support ARM Support
=========== ===========
This release of libmozjpeg can use ARM NEON SIMD instructions to accelerate This release of mozjpeg can use ARM NEON SIMD instructions to accelerate
JPEG compression/decompression by approximately 2-4x on ARMv7 and later JPEG compression/decompression by approximately 2-4x on ARMv7 and later
platforms. If libmozjpeg is configured on an ARM Linux platform, then the platforms. If mozjpeg is configured on an ARM Linux platform, then the
build system will automatically include the NEON SIMD routines, if they are build system will automatically include the NEON SIMD routines, if they are
supported. supported. Build instructions for other ARM-based platforms follow.
Building libmozjpeg for iOS Building mozjpeg for iOS
------------------------------ ------------------------
iOS platforms, such as the iPhone and iPad, also use ARM processors, some of iOS platforms, such as the iPhone and iPad, use ARM processors, some of which
which support NEON instructions. Additional steps are required to build support NEON instructions. Additional steps are required in order to build
libmozjpeg for these platforms. The steps below assume iOS SDK v4.3. If mozjpeg for these platforms.
you are using a different SDK version, then you will need to modify the
examples accordingly.
Additional build requirements: Additional build requirements:
gas-preprocessor.pl (https://github.com/yuvi/gas-preprocessor) should be gas-preprocessor.pl
installed in your PATH. (https://sourceforge.net/p/libjpeg-turbo/code/HEAD/tree/gas-preprocessor)
should be installed in your PATH.
Set the following shell variables for simplicity: Set the following shell variables for simplicity:
Xcode 3.2.x / iOS 4.3 SDK: Xcode 4.2 and earlier:
IOS_PLATFORMDIR="/Developer/Platforms/iPhoneOS.platform" IOS_PLATFORMDIR=/Developer/Platforms/iPhoneOS.platform
IOS_SYSROOT="$IOS_PLATFORMDIR/Developer/SDKs/iPhoneOS4.3.sdk" Xcode 4.3 and later:
IOS_GCC="$IOS_PLATFORMDIR/Developer/usr/bin/arm-apple-darwin10-llvm-gcc-4.2" IOS_PLATFORMDIR=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform
Xcode 4.5.x / iOS 6.0 SDK: IOS_SYSROOT=$IOS_PLATFORMDIR/Developer/SDKs/iPhoneOS*.sdk
IOS_PLATFORMDIR="/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform"
IOS_SYSROOT="$IOS_PLATFORMDIR/Developer/SDKs/iPhoneOS6.0.sdk"
IOS_GCC="$IOS_PLATFORMDIR/Developer/usr/bin/arm-apple-darwin10-llvm-gcc-4.2"
ARM v6 only (up to and including iPhone 3G): Xcode 4.6.x and earlier:
IOS_GCC=$IOS_PLATFORMDIR/Developer/usr/bin/arm-apple-darwin10-llvm-gcc-4.2
Xcode 5.0.x and later:
IOS_GCC=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang
ARM v6 (code will run on all iOS devices, not SIMD-accelerated):
[NOTE: Requires Xcode 4.4.x or earlier] [NOTE: Requires Xcode 4.4.x or earlier]
IOS_CFLAGS="-march=armv6 -mcpu=arm1176jzf-s -mfpu=vfp" IOS_CFLAGS="-march=armv6 -mcpu=arm1176jzf-s -mfpu=vfp"
ARM v7 only (iPhone 3GS-4S, iPad 1st-3rd Generation): ARM v7 (code will run on iPhone 3GS-4S/iPad 1st-3rd Generation and newer):
Xcode 4.6.x and earlier:
IOS_CFLAGS="-march=armv7 -mcpu=cortex-a8 -mtune=cortex-a8 -mfpu=neon" IOS_CFLAGS="-march=armv7 -mcpu=cortex-a8 -mtune=cortex-a8 -mfpu=neon"
Xcode 5.0.x and later:
IOS_CFLAGS="-arch armv7"
ARM v7s only (iPhone 5, iPad 4th Generation): ARM v7s (code will run on iPhone 5/iPad 4th Generation and newer):
[NOTE: Requires Xcode 4.5 or later] [NOTE: Requires Xcode 4.5 or later]
Xcode 4.6.x and earlier:
IOS_CFLAGS="-march=armv7s -mcpu=swift -mtune=swift -mfpu=neon" IOS_CFLAGS="-march=armv7s -mcpu=swift -mtune=swift -mfpu=neon"
Xcode 5.0.x and later:
IOS_CFLAGS="-arch armv7s"
Follow the procedure under "Building libmozjpeg" above, adding Follow the procedure under "Building mozjpeg" above, adding
--host arm-apple-darwin10 --enable-static --disable-shared \ --host arm-apple-darwin10 --enable-static --disable-shared \
CC="$IOS_GCC" LD="$IOS_GCC" \ CC="$IOS_GCC" LD="$IOS_GCC" \
CFLAGS="-mfloat-abi=softfp -isysroot $IOS_SYSROOT -O3 $IOS_CFLAGS" \ CFLAGS="-mfloat-abi=softfp -isysroot $IOS_SYSROOT -O3 $IOS_CFLAGS" \
LDFLAGS="-mfloat-abi=softfp -isysroot $IOS_SYSROOT $IOS_CFLAGS" LDFLAGS="-mfloat-abi=softfp -isysroot $IOS_SYSROOT $IOS_CFLAGS"
to the configure command line. If using Xcode 5.0.x or later, also add
CCASFLAGS="-no-integrated-as $IOS_CFLAGS"
to the configure command line. to the configure command line.
NOTE: You can also add -miphoneos-version-min={version} to $IOS_CFLAGS above
in order to support older versions of iOS than the default version supported by
the SDK.
Once built, lipo can be used to combine the ARM v6, v7, and/or v7s variants Once built, lipo can be used to combine the ARM v6, v7, and/or v7s variants
into a universal library. into a universal library.
NOTE: If you are building libmozjpeg from the "official" project tarball,
then it is highly likely that you will need to run 'autoreconf -fiv' in the Building libjpeg-turbo for Android
source tree prior to building ARM v7 or v7s iOS binaries using the techniques ----------------------------------
described above. Otherwise, you may get a libtool error such as "unable to
infer tagged configuration." Building libjpeg-turbo for Android platforms requires the Android NDK
(https://developer.android.com/tools/sdk/ndk) and autotools. The following is
a general recipe script that can be modified for your specific needs.
# Set these variables to suit your needs
NDK_PATH={full path to the "ndk" directory-- for example, /opt/android/ndk}
BUILD_PLATFORM={the platform name for the NDK package you installed--
for example, "windows-x86" or "linux-x86_64"}
TOOLCHAIN_VERSION={"4.6", "4.8", etc. This corresponds to a toolchain
directory under ${NDK_PATH}/toolchains/.}
ANDROID_VERSION={The minimum version of Android to support-- for example,
"9", "19", etc.}
HOST=arm-linux-androideabi
TOOLCHAIN=${NDK_PATH}/toolchains/${HOST}-${TOOLCHAIN_VERSION}/prebuilt/${BUILD_PLATFORM}
SYSROOT=${NDK_PATH}/platforms/android-${ANDROID_VERSION}/arch-arm
ANDROID_INCLUDES="-I${SYSROOT}/usr/include -I${TOOLCHAIN}/include"
ANDROID_CFLAGS="-march=armv7-a -mfloat-abi=softfp -fprefetch-loop-arrays \
-fstrict-aliasing --sysroot=${SYSROOT}"
export CPP=${TOOLCHAIN}/bin/${HOST}-cpp
export AR=${TOOLCHAIN}/bin/${HOST}-ar
export AS=${TOOLCHAIN}/bin/${HOST}-as
export NM=${TOOLCHAIN}/bin/${HOST}-nm
export CC=${TOOLCHAIN}/bin/${HOST}-gcc
export LD=${TOOLCHAIN}/bin/${HOST}-ld
export RANLIB=${TOOLCHAIN}/bin/${HOST}-ranlib
export OBJDUMP=${TOOLCHAIN}/bin/${HOST}-objdump
export STRIP=${TOOLCHAIN}/bin/${HOST}-strip
cd {build_directory}
sh {source_directory}/configure --host=${HOST} \
CFLAGS="${ANDROID_INCLUDES} ${ANDROID_CFLAGS} -O3" \
CPPFLAGS="${ANDROID_INCLUDES} ${ANDROID_CFLAGS}" \
LDFLAGS="${ANDROID_CFLAGS}" --with-simd ${1+"$@"}
make
******************************************************************************* *******************************************************************************
@@ -387,7 +409,7 @@ infer tagged configuration."
Build Requirements Build Requirements
================== ==================
-- CMake (http://www.cmake.org) v2.6 or later -- CMake (http://www.cmake.org) v2.8.8 or later
-- Microsoft Visual C++ 2005 or later -- Microsoft Visual C++ 2005 or later
@@ -397,11 +419,12 @@ Build Requirements
http://msdn.microsoft.com/en-us/windows/bb980924.aspx http://msdn.microsoft.com/en-us/windows/bb980924.aspx
The Windows SDK includes both 32-bit and 64-bit Visual C++ compilers and The Windows SDK includes both 32-bit and 64-bit Visual C++ compilers and
everything necessary to build libmozjpeg. everything necessary to build mozjpeg.
* For 32-bit builds, you can also use Microsoft Visual C++ Express * You can also use Microsoft Visual Studio Express Edition, which is a free
Edition. Visual C++ Express Edition is a free download. download. (NOTE: versions prior to 2012 can only be used to build 32-bit
* If you intend to build libmozjpeg from the command line, then add the code.)
* If you intend to build mozjpeg from the command line, then add the
appropriate compiler and SDK directories to the INCLUDE, LIB, and PATH appropriate compiler and SDK directories to the INCLUDE, LIB, and PATH
environment variables. This is generally accomplished by executing environment variables. This is generally accomplished by executing
vcvars32.bat or vcvars64.bat and SetEnv.cmd. vcvars32.bat and vcvars32.bat or vcvars64.bat and SetEnv.cmd. vcvars32.bat and
@@ -414,12 +437,16 @@ Build Requirements
-- MinGW -- MinGW
GCC v4.1 or later recommended for best performance MinGW-builds (http://sourceforge.net/projects/mingwbuilds/) or
tdm-gcc (http://tdm-gcc.tdragon.net/) recommended if building on a Windows
machine. Both distributions install a Start Menu link that can be used to
launch a command prompt with the appropriate compiler paths automatically
set.
-- NASM (http://www.nasm.us/) 0.98 or later (NASM 2.05 or later is required for -- NASM (http://www.nasm.us/) 0.98 or later (NASM 2.05 or later is required for
a 64-bit build) a 64-bit build)
-- If building the MozJPEG Java wrapper, JDK 1.5 or later is required. This -- If building the TurboJPEG Java wrapper, JDK 1.5 or later is required. This
can be downloaded from http://www.java.com. can be downloaded from http://www.java.com.
@@ -429,17 +456,17 @@ Out-of-Tree Builds
Binary objects, libraries, and executables are generated in the same directory Binary objects, libraries, and executables are generated in the same directory
from which cmake was executed (the "binary directory"), and this directory need from which cmake was executed (the "binary directory"), and this directory need
not necessarily be the same as the libmozjpeg source directory. You can not necessarily be the same as the mozjpeg source directory. You can
create multiple independent binary directories, in which different versions of create multiple independent binary directories, in which different versions of
libmozjpeg can be built from the same source tree using different compilers mozjpeg can be built from the same source tree using different compilers
or settings. In the sections below, {build_directory} refers to the binary or settings. In the sections below, {build_directory} refers to the binary
directory, whereas {source_directory} refers to the libmozjpeg source directory, whereas {source_directory} refers to the mozjpeg source
directory. For in-tree builds, these directories are the same. directory. For in-tree builds, these directories are the same.
====================== ================
Building libmozjpeg Building mozjpeg
====================== ================
Visual C++ (Command Line) Visual C++ (Command Line)
@@ -449,7 +476,7 @@ Visual C++ (Command Line)
cmake -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=Release {source_directory} cmake -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=Release {source_directory}
nmake nmake
This will build either a 32-bit or a 64-bit version of libmozjpeg, depending This will build either a 32-bit or a 64-bit version of mozjpeg, depending
on which version of cl.exe is in the PATH. on which version of cl.exe is in the PATH.
The following files will be generated under {build_directory}: The following files will be generated under {build_directory}:
@@ -460,12 +487,12 @@ The following files will be generated under {build_directory}:
DLL for the libjpeg API DLL for the libjpeg API
sharedlib/jpeg.lib sharedlib/jpeg.lib
Import library for the libjpeg API Import library for the libjpeg API
mozjpeg-static.lib turbojpeg-static.lib
Static link library for the MozJPEG API Static link library for the TurboJPEG API
mozjpeg.dll turbojpeg.dll
DLL for the MozJPEG API DLL for the TurboJPEG API
mozjpeg.lib turbojpeg.lib
Import library for the MozJPEG API Import library for the TurboJPEG API
{version} is 62, 7, or 8, depending on whether libjpeg v6b (default), v7, or {version} is 62, 7, or 8, depending on whether libjpeg v6b (default), v7, or
v8 emulation is enabled. v8 emulation is enabled.
@@ -479,11 +506,16 @@ Choose the appropriate CMake generator option for your version of Visual Studio
instance: instance:
cd {build_directory} cd {build_directory}
cmake -G "Visual Studio 9 2008" {source_directory} cmake -G "Visual Studio 10" {source_directory}
NOTE: Add "Win64" to the generator name (for example, "Visual Studio 10
Win64") to build a 64-bit version of libjpeg-turbo. Recent versions of CMake
no longer document that. A separate build directory must be used for 32-bit
and 64-bit builds.
You can then open ALL_BUILD.vcproj in Visual Studio and build one of the You can then open ALL_BUILD.vcproj in Visual Studio and build one of the
configurations in that project ("Debug", "Release", etc.) to generate a full configurations in that project ("Debug", "Release", etc.) to generate a full
build of libmozjpeg. build of mozjpeg.
This will generate the following files under {build_directory}: This will generate the following files under {build_directory}:
@@ -493,12 +525,12 @@ This will generate the following files under {build_directory}:
DLL for the libjpeg API DLL for the libjpeg API
sharedlib/{configuration}/jpeg.lib sharedlib/{configuration}/jpeg.lib
Import library for the libjpeg API Import library for the libjpeg API
{configuration}/mozjpeg-static.lib {configuration}/turbojpeg-static.lib
Static link library for the MozJPEG API Static link library for the TurboJPEG API
{configuration}/mozjpeg.dll {configuration}/turbojpeg.dll
DLL for the MozJPEG API DLL for the TurboJPEG API
{configuration}/mozjpeg.lib {configuration}/turbojpeg.lib
Import library for the MozJPEG API Import library for the TurboJPEG API
{configuration} is Debug, Release, RelWithDebInfo, or MinSizeRel, depending on {configuration} is Debug, Release, RelWithDebInfo, or MinSizeRel, depending on
the configuration you built in the IDE, and {version} is 62, 7, or 8, the configuration you built in the IDE, and {version} is 62, 7, or 8,
@@ -508,9 +540,12 @@ depending on whether libjpeg v6b (default), v7, or v8 emulation is enabled.
MinGW MinGW
----- -----
NOTE: This assumes that you are building on a Windows machine. If you are
cross-compiling on a Linux/Unix machine, then see "Build Recipes" below.
cd {build_directory} cd {build_directory}
cmake -G "MSYS Makefiles" {source_directory} cmake -G "MinGW Makefiles" {source_directory}
make mingw32-make
This will generate the following files under {build_directory} This will generate the following files under {build_directory}
@@ -520,12 +555,12 @@ This will generate the following files under {build_directory}
DLL for the libjpeg API DLL for the libjpeg API
sharedlib/libjpeg.dll.a sharedlib/libjpeg.dll.a
Import library for the libjpeg API Import library for the libjpeg API
libmozjpeg.a libturbojpeg.a
Static link library for the MozJPEG API Static link library for the TurboJPEG API
libmozjpeg.dll libturbojpeg.dll
DLL for the MozJPEG API DLL for the TurboJPEG API
libmozjpeg.dll.a libturbojpeg.dll.a
Import library for the MozJPEG API Import library for the TurboJPEG API
{version} is 62, 7, or 8, depending on whether libjpeg v6b (default), v7, or {version} is 62, 7, or 8, depending on whether libjpeg v6b (default), v7, or
v8 emulation is enabled. v8 emulation is enabled.
@@ -543,8 +578,8 @@ libjpeg v7 or v8 API/ABI Emulation
----------------------------------- -----------------------------------
Add "-DWITH_JPEG7=1" to the cmake command line to build a version of Add "-DWITH_JPEG7=1" to the cmake command line to build a version of
libmozjpeg that is API/ABI-compatible with libjpeg v7. Add "-DWITH_JPEG8=1" mozjpeg that is API/ABI-compatible with libjpeg v7. Add "-DWITH_JPEG8=1"
to the cmake command to build a version of libmozjpeg that is to the cmake command to build a version of mozjpeg that is
API/ABI-compatible with libjpeg v8. See README-turbo.txt for more information API/ABI-compatible with libjpeg v8. See README-turbo.txt for more information
on libjpeg v7 and v8 emulation. on libjpeg v7 and v8 emulation.
@@ -553,7 +588,7 @@ In-Memory Source/Destination Managers
------------------------------------- -------------------------------------
When using libjpeg v6b or v7 API/ABI emulation, add -DWITH_MEM_SRCDST=0 to the When using libjpeg v6b or v7 API/ABI emulation, add -DWITH_MEM_SRCDST=0 to the
CMake command line to build a version of libmozjpeg that lacks the CMake command line to build a version of mozjpeg that lacks the
jpeg_mem_src() and jpeg_mem_dest() functions. These functions were not part of jpeg_mem_src() and jpeg_mem_dest() functions. These functions were not part of
the original libjpeg v6b and v7 APIs, so removing them ensures strict the original libjpeg v6b and v7 APIs, so removing them ensures strict
conformance with those APIs. See README-turbo.txt for more information. conformance with those APIs. See README-turbo.txt for more information.
@@ -563,7 +598,7 @@ Arithmetic Coding Support
------------------------- -------------------------
Since the patent on arithmetic coding has expired, this functionality has been Since the patent on arithmetic coding has expired, this functionality has been
included in this release of libmozjpeg. libmozjpeg's implementation is included in this release of mozjpeg. mozjpeg's implementation is
based on the implementation in libjpeg v8, but it works when emulating libjpeg based on the implementation in libjpeg v8, but it works when emulating libjpeg
v7 or v6b as well. The default is to enable both arithmetic encoding and v7 or v6b as well. The default is to enable both arithmetic encoding and
decoding, but those who have philosophical objections to arithmetic coding can decoding, but those who have philosophical objections to arithmetic coding can
@@ -571,11 +606,11 @@ add "-DWITH_ARITH_ENC=0" or "-DWITH_ARITH_DEC=0" to the cmake command line to
disable encoding or decoding (respectively.) disable encoding or decoding (respectively.)
MozJPEG Java Wrapper TurboJPEG Java Wrapper
---------------------- ----------------------
Add "-DWITH_JAVA=1" to the cmake command line to incorporate an optional Java Add "-DWITH_JAVA=1" to the cmake command line to incorporate an optional Java
Native Interface wrapper into the MozJPEG shared library and build the Java Native Interface wrapper into the TurboJPEG shared library and build the Java
front-end classes to support it. This allows the MozJPEG shared library to front-end classes to support it. This allows the TurboJPEG shared library to
be used directly from Java applications. See java/README for more details. be used directly from Java applications. See java/README for more details.
If you are using CMake 2.8, you can set the Java_JAVAC_EXECUTABLE, If you are using CMake 2.8, you can set the Java_JAVAC_EXECUTABLE,
@@ -586,11 +621,11 @@ instead. You can also set the JAVACFLAGS CMake variable to specify arguments
that should be passed to the Java compiler when building the front-end classes. that should be passed to the Java compiler when building the front-end classes.
======================== ==================
Installing libmozjpeg Installing mozjpeg
======================== ==================
You can use the build system to install libmozjpeg into a directory of your You can use the build system to install mozjpeg into a directory of your
choosing (as opposed to creating an installer.) To do this, add: choosing (as opposed to creating an installer.) To do this, add:
-DCMAKE_INSTALL_PREFIX={install_directory} -DCMAKE_INSTALL_PREFIX={install_directory}
@@ -600,12 +635,12 @@ to the cmake command line.
For example, For example,
cmake -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=Release \ cmake -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=c:\libmozjpeg {source_directory} -DCMAKE_INSTALL_PREFIX=c:\mozjpeg {source_directory}
nmake install nmake install
will install the header files in c:\libmozjpeg\include, the library files will install the header files in c:\mozjpeg\include, the library files
in c:\libmozjpeg\lib, the DLL's in c:\libmozjpeg\bin, and the in c:\mozjpeg\lib, the DLL's in c:\mozjpeg\bin, and the
documentation in c:\libmozjpeg\doc. documentation in c:\mozjpeg\doc.
============= =============
@@ -619,11 +654,11 @@ Build Recipes
cd {build_directory} cd {build_directory}
CC=/usr/bin/x86_64-w64-mingw32-gcc \ CC=/usr/bin/x86_64-w64-mingw32-gcc \
cmake -G "Unix Makefiles" -DCMAKE_SYSTEM_NAME=Windows \ cmake -G "Unix Makefiles" -DCMAKE_SYSTEM_NAME=Windows \
-DCMAKE_AR=/usr/bin/x86_64-w64-mingw32-ar \ -DCMAKE_RC_COMPILER=/usr/bin/x86_64-w64-mingw32-windres.exe \
-DCMAKE_RANLIB=/usr/bin/x86_64-w64-mingw32-ranlib {source_directory} {source_directory}
make make
This produces a 64-bit build of libmozjpeg that does not depend on This produces a 64-bit build of mozjpeg that does not depend on
cygwin1.dll or other Cygwin DLL's. The mingw64-x86_64-gcc-core and cygwin1.dll or other Cygwin DLL's. The mingw64-x86_64-gcc-core and
mingw64-x86_64-gcc-g++ packages (and their dependencies) must be installed. mingw64-x86_64-gcc-g++ packages (and their dependencies) must be installed.
@@ -634,29 +669,14 @@ mingw64-x86_64-gcc-g++ packages (and their dependencies) must be installed.
cd {build_directory} cd {build_directory}
CC=/usr/bin/i686-w64-mingw32-gcc \ CC=/usr/bin/i686-w64-mingw32-gcc \
cmake -G "Unix Makefiles" -DCMAKE_SYSTEM_NAME=Windows \ cmake -G "Unix Makefiles" -DCMAKE_SYSTEM_NAME=Windows \
-DDCMAKE_AR=/usr/bin/i686-w64-mingw32-ar \ -DCMAKE_RC_COMPILER=/usr/bin/i686-w64-mingw32-windres.exe \
-DCMAKE_RANLIB=/usr/bin/i686-w64-mingw32-ranlib {source_directory}
make
This produces a 32-bit build of libmozjpeg that does not depend on
cygwin1.dll or other Cygwin DLL's. The mingw64-i686-gcc-core and
mingw64-i686-gcc-g++ packages (and their dependencies) must be installed.
MinGW-w64 Build on Windows
--------------------------
This produces a 64-bit build of libmozjpeg using the "native" MinGW-w64
toolchain (which is faster than the Cygwin version):
cd {build_directory}
CC={mingw-w64_binary_path}/x86_64-w64-mingw32-gcc \
cmake -G "MSYS Makefiles" \
-DCMAKE_AR={mingw-w64_binary_path}/x86_64-w64-mingw32-ar \
-DCMAKE_RANLIB={mingw-w64_binary_path}/x86_64-w64-mingw32-ranlib \
{source_directory} {source_directory}
make make
This produces a 32-bit build of mozjpeg that does not depend on
cygwin1.dll or other Cygwin DLL's. The mingw64-i686-gcc-core and
mingw64-i686-gcc-g++ packages (and their dependencies) must be installed.
MinGW Build on Linux MinGW Build on Linux
-------------------- --------------------
@@ -695,17 +715,17 @@ make deb
make dmg make dmg
Create Macintosh package/disk image. This requires the PackageMaker Create Macintosh package/disk image. This requires pkgbuild and
application, which must be installed in /Developer/Applications/Utilities. productbuild, which are installed by default on OS X 10.7 and later and which
Note that PackageMaker is not included in recent releases of Xcode, but it can be obtained by installing Xcode 3.2.6 (with the "Unix Development"
can be obtained by downloading the "Auxiliary Tools for Xcode" package from option) on OS X 10.6. Packages built in this manner can be installed on OS X
http://developer.apple.com/downloads. 10.5 and later, but they must be built on OS X 10.6 or later.
make udmg [BUILDDIR32={32-bit build directory}] make udmg [BUILDDIR32={32-bit build directory}]
On 64-bit OS X systems, this creates a Macintosh package and disk image that On 64-bit OS X systems, this creates a Macintosh package and disk image that
contains universal i386/x86-64 binaries. You should first configure a 32-bit contains universal i386/x86-64 binaries. You should first configure a 32-bit
out-of-tree build of libmozjpeg, then configure a 64-bit out-of-tree out-of-tree build of mozjpeg, then configure a 64-bit out-of-tree
build, then run 'make udmg' from the 64-bit build directory. The build build, then run 'make udmg' from the 64-bit build directory. The build
system will look for the 32-bit build under {source_directory}/osxx86 by system will look for the 32-bit build under {source_directory}/osxx86 by
default, but you can override this by setting the BUILDDIR32 variable on the default, but you can override this by setting the BUILDDIR32 variable on the
@@ -717,13 +737,13 @@ make iosdmg [BUILDDIR32={32-bit build directory}] \
[BUILDDIRARMV7S={ARM v7s build directory}] [BUILDDIRARMV7S={ARM v7s build directory}]
On OS X systems, this creates a Macintosh package and disk image in which the On OS X systems, this creates a Macintosh package and disk image in which the
libmozjpeg static libraries contain ARM architectures necessary to build mozjpeg static libraries contain ARM architectures necessary to build
iOS applications. If building on an x86-64 system, the binaries will also iOS applications. If building on an x86-64 system, the binaries will also
contain the i386 architecture, as with 'make udmg' above. You should first contain the i386 architecture, as with 'make udmg' above. You should first
configure ARM v6, ARM v7, and/or ARM v7s out-of-tree builds of libmozjpeg configure ARM v6, ARM v7, and/or ARM v7s out-of-tree builds of mozjpeg
(see "Building libmozjpeg for iOS" above.) If you are building an x86-64 (see "Building mozjpeg for iOS" above.) If you are building an x86-64
version of libmozjpeg, you should configure a 32-bit out-of-tree build as version of mozjpeg, you should configure a 32-bit out-of-tree build as
well. Next, build libmozjpeg as you would normally, using an out-of-tree well. Next, build mozjpeg as you would normally, using an out-of-tree
build. When it is built, run 'make iosdmg' from the build directory. The build. When it is built, run 'make iosdmg' from the build directory. The
build system will look for the ARM v6 build under {source_directory}/iosarmv6 build system will look for the ARM v6 build under {source_directory}/iosarmv6
by default, the ARM v7 build under {source_directory}/iosarmv7 by default, by default, the ARM v7 build under {source_directory}/iosarmv7 by default,
@@ -753,7 +773,7 @@ If using MinGW:
If using the Visual Studio IDE, build the "installer" project. If using the Visual Studio IDE, build the "installer" project.
The installer package (libmozjpeg[-gcc][64].exe) will be located under The installer package (mozjpeg[-gcc][64].exe) will be located under
{build_directory}. If building using the Visual Studio IDE, then the installer {build_directory}. If building using the Visual Studio IDE, then the installer
package will be located in a subdirectory with the same name as the package will be located in a subdirectory with the same name as the
configuration you built (such as {build_directory}\Debug\ or configuration you built (such as {build_directory}\Debug\ or
@@ -767,24 +787,24 @@ Building a Windows installer requires the Nullsoft Install System
** Regression testing ** Regression testing
******************************************************************************* *******************************************************************************
The most common way to test libmozjpeg is by invoking 'make test' on The most common way to test mozjpeg is by invoking 'make test' on
Unix/Linux platforms or 'ctest' on Windows platforms, once the build has Unix/Linux platforms or 'ctest' on Windows platforms, once the build has
completed. This runs a series of tests to ensure that mathematical completed. This runs a series of tests to ensure that mathematical
compatibility has been maintained between libmozjpeg and libjpeg v6b. This compatibility has been maintained. This also invokes the TurboJPEG unit tests,
also invokes the MozJPEG unit tests, which ensure that the colorspace which ensure that the colorspace extensions, YUV encoding, decompression
extensions, YUV encoding, decompression scaling, and other features of the scaling, and other features of the TurboJPEG C and Java APIs are working
MozJPEG C and Java APIs are working properly (and, by extension, that the properly (and, by extension, that the equivalent features of the underlying
equivalent features of the underlying libjpeg API are also working.) libjpeg API are also working.)
Invoking 'make testclean' or 'nmake testclean' (if using NMake) or building Invoking 'make testclean' or 'nmake testclean' (if using NMake) or building
the 'testclean' target (if using the Visual Studio IDE) will clean up the the 'testclean' target (if using the Visual Studio IDE) will clean up the
output images generated by 'make test'. output images generated by 'make test'.
On Unix/Linux platforms, more extensive tests of the MozJPEG C and Java On Unix/Linux platforms, more extensive tests of the TurboJPEG C and Java
wrappers can be run by invoking 'make tjtest'. These extended MozJPEG tests wrappers can be run by invoking 'make tjtest'. These extended TurboJPEG tests
essentially iterate through all of the available features of the MozJPEG APIs essentially iterate through all of the available features of the TurboJPEG APIs
that are not covered by the MozJPEG unit tests (this includes the lossless that are not covered by the TurboJPEG unit tests (this includes the lossless
transform options) and compare the images generated by each feature to images transform options) and compare the images generated by each feature to images
generated using the equivalent feature in the libjpeg API. The extended generated using the equivalent feature in the libjpeg API. The extended
MozJPEG tests are meant to test for regressions in the MozJPEG wrappers, TurboJPEG tests are meant to test for regressions in the TurboJPEG wrappers,
not in the underlying libjpeg API library. not in the underlying libjpeg API library.

View File

@@ -2,12 +2,16 @@
# Setup # Setup
# #
cmake_minimum_required(VERSION 2.6) cmake_minimum_required(VERSION 2.8.8)
# Use LINK_INTERFACE_LIBRARIES instead of INTERFACE_LINK_LIBRARIES
if(POLICY CMP0022)
cmake_policy(SET CMP0022 OLD)
endif()
project(libmozjpeg C) project(mozjpeg C)
set(VERSION 2.0.1) set(VERSION 3.0)
if(MINGW OR CYGWIN) if(CYGWIN OR NOT CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows")
execute_process(COMMAND "date" "+%Y%m%d" OUTPUT_VARIABLE BUILD) execute_process(COMMAND "date" "+%Y%m%d" OUTPUT_VARIABLE BUILD)
string(REGEX REPLACE "\n" "" BUILD "${BUILD}") string(REGEX REPLACE "\n" "" BUILD "${BUILD}")
elseif(WIN32) elseif(WIN32)
@@ -43,10 +47,23 @@ message(STATUS "VERSION = ${VERSION}, BUILD = ${BUILD}")
option(WITH_SIMD "Include SIMD extensions" TRUE) option(WITH_SIMD "Include SIMD extensions" TRUE)
option(WITH_ARITH_ENC "Include arithmetic encoding support" TRUE) option(WITH_ARITH_ENC "Include arithmetic encoding support" TRUE)
option(WITH_ARITH_DEC "Include arithmetic decoding support" TRUE) option(WITH_ARITH_DEC "Include arithmetic decoding support" TRUE)
option(WITH_JPEG7 "Emulate libjpeg v7 API/ABI (this makes libmozjpeg backward incompatible with libjpeg v6b)" FALSE) option(WITH_JPEG7 "Emulate libjpeg v7 API/ABI (this makes mozjpeg backward incompatible with libjpeg v6b)" FALSE)
option(WITH_JPEG8 "Emulate libjpeg v8 API/ABI (this makes libmozjpeg backward incompatible with libjpeg v6b)" FALSE) option(WITH_JPEG8 "Emulate libjpeg v8 API/ABI (this makes mozjpeg backward incompatible with libjpeg v6b)" FALSE)
option(WITH_MEM_SRCDST "Include in-memory source/destination manager functions when emulating the libjpeg v6b or v7 API/ABI" TRUE) option(WITH_MEM_SRCDST "Include in-memory source/destination manager functions when emulating the libjpeg v6b or v7 API/ABI" TRUE)
option(WITH_TURBOJPEG "Include the TurboJPEG wrapper library and associated test programs" TRUE)
option(WITH_JAVA "Build Java wrapper for the TurboJPEG library" FALSE) option(WITH_JAVA "Build Java wrapper for the TurboJPEG library" FALSE)
option(WITH_12BIT "Encode/decode JPEG images with 12-bit samples (implies WITH_SIMD=0 WITH_TURBOJPEG=0 WITH_ARITH_ENC=0 WITH_ARITH_DEC=0)" FALSE)
if(WITH_12BIT)
set(WITH_SIMD FALSE)
set(WITH_TURBOJPEG FALSE)
set(WITH_ARITH_ENC FALSE)
set(WITH_ARITH_DEC FALSE)
set(BITS_IN_JSAMPLE 12)
message(STATUS "12-bit JPEG support enabled")
else()
set(BITS_IN_JSAMPLE 8)
endif()
if(WITH_ARITH_ENC) if(WITH_ARITH_ENC)
set(C_ARITH_CODING_SUPPORTED 1) set(C_ARITH_CODING_SUPPORTED 1)
@@ -62,6 +79,12 @@ else()
message(STATUS "Arithmetic decoding support disabled") message(STATUS "Arithmetic decoding support disabled")
endif() endif()
if(WITH_TURBOJPEG)
message(STATUS "TurboJPEG C wrapper enabled")
else()
message(STATUS "TurboJPEG C wrapper disabled")
endif()
if(WITH_JAVA) if(WITH_JAVA)
message(STATUS "TurboJPEG Java wrapper enabled") message(STATUS "TurboJPEG Java wrapper enabled")
else() else()
@@ -132,14 +155,14 @@ if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
set(CMAKE_INSTALL_PREFIX_DEFAULT ${CMAKE_INSTALL_PREFIX_DEFAULT}64) set(CMAKE_INSTALL_PREFIX_DEFAULT ${CMAKE_INSTALL_PREFIX_DEFAULT}64)
endif() endif()
set(CMAKE_INSTALL_PREFIX "c:/${CMAKE_INSTALL_PREFIX_DEFAULT}" CACHE PATH set(CMAKE_INSTALL_PREFIX "c:/${CMAKE_INSTALL_PREFIX_DEFAULT}" CACHE PATH
"Directory into which to install libmozjpeg (default: c:/${CMAKE_INSTALL_PREFIX_DEFAULT})" "Directory into which to install mozjpeg (default: c:/${CMAKE_INSTALL_PREFIX_DEFAULT})"
FORCE) FORCE)
endif() endif()
message(STATUS "Install directory = ${CMAKE_INSTALL_PREFIX}") message(STATUS "Install directory = ${CMAKE_INSTALL_PREFIX}")
configure_file(win/jconfig.h.in jconfig.h) configure_file(win/jconfig.h.in jconfig.h)
configure_file(win/config.h.in config.h) configure_file(win/jconfigint.h.in jconfigint.h)
include_directories("${CMAKE_CURRENT_BINARY_DIR}" "${CMAKE_SOURCE_DIR}") include_directories("${CMAKE_CURRENT_BINARY_DIR}" "${CMAKE_SOURCE_DIR}")
@@ -156,13 +179,13 @@ endif()
# Targets # Targets
# #
set(JPEG_SOURCES jcapimin.c jcapistd.c jccoefct.c jccolor.c jcdctmgr.c jchuff.c set(JPEG_SOURCES jcapimin.c jcapistd.c jccoefct.c jccolor.c jcdctmgr.c jcext.c
jcinit.c jcmainct.c jcmarker.c jcmaster.c jcomapi.c jcparam.c jcphuff.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 jdatadst.c jdatasrc.c jcphuff.c jcprepct.c jcsample.c jctrans.c jdapimin.c jdapistd.c jdatadst.c
jdcoefct.c jdcolor.c jddctmgr.c jdhuff.c jdinput.c jdmainct.c jdmarker.c jdatasrc.c jdcoefct.c jdcolor.c jddctmgr.c jdhuff.c jdinput.c jdmainct.c
jdmaster.c jdmerge.c jdphuff.c jdpostct.c jdsample.c jdtrans.c jerror.c jdmarker.c jdmaster.c jdmerge.c jdphuff.c jdpostct.c jdsample.c jdtrans.c
jfdctflt.c jfdctfst.c jfdctint.c jidctflt.c jidctfst.c jidctint.c jidctred.c jerror.c jfdctflt.c jfdctfst.c jfdctint.c jidctflt.c jidctfst.c jidctint.c
jquant1.c jquant2.c jutils.c jmemmgr.c jmemnobs.c) jidctred.c jquant1.c jquant2.c jutils.c jmemmgr.c jmemnobs.c)
if(WITH_ARITH_ENC OR WITH_ARITH_DEC) if(WITH_ARITH_ENC OR WITH_ARITH_DEC)
set(JPEG_SOURCES ${JPEG_SOURCES} jaricom.c) set(JPEG_SOURCES ${JPEG_SOURCES} jaricom.c)
@@ -205,6 +228,7 @@ if(WITH_SIMD)
add_dependencies(jpeg-static simd) add_dependencies(jpeg-static simd)
endif() endif()
if(WITH_TURBOJPEG)
set(TURBOJPEG_SOURCES turbojpeg.c transupp.c jdatadst-tj.c jdatasrc-tj.c) set(TURBOJPEG_SOURCES turbojpeg.c transupp.c jdatadst-tj.c jdatasrc-tj.c)
if(WITH_JAVA) if(WITH_JAVA)
set(TURBOJPEG_SOURCES ${TURBOJPEG_SOURCES} turbojpeg-jni.c) set(TURBOJPEG_SOURCES ${TURBOJPEG_SOURCES} turbojpeg-jni.c)
@@ -245,17 +269,24 @@ add_executable(tjbench-static tjbench.c bmp.c tjutil.c rdbmp.c rdppm.c wrbmp.c
target_link_libraries(tjbench-static turbojpeg-static jpeg-static) target_link_libraries(tjbench-static turbojpeg-static jpeg-static)
set_property(TARGET tjbench-static PROPERTY COMPILE_FLAGS set_property(TARGET tjbench-static PROPERTY COMPILE_FLAGS
"-DBMP_SUPPORTED -DPPM_SUPPORTED") "-DBMP_SUPPORTED -DPPM_SUPPORTED")
endif()
add_executable(cjpeg-static cjpeg.c cdjpeg.c rdbmp.c rdgif.c rdppm.c rdswitch.c if(WITH_12BIT)
rdtarga.c rdjpeg.c) set(COMPILE_FLAGS "-DGIF_SUPPORTED -DPPM_SUPPORTED -DUSE_SETMODE")
set_property(TARGET cjpeg-static PROPERTY COMPILE_FLAGS else()
"-DBMP_SUPPORTED -DGIF_SUPPORTED -DPPM_SUPPORTED -DTARGA_SUPPORTED -DUSE_SETMODE") set(COMPILE_FLAGS "-DBMP_SUPPORTED -DGIF_SUPPORTED -DPPM_SUPPORTED -DTARGA_SUPPORTED -DUSE_SETMODE")
set(CJPEG_BMP_SOURCES rdbmp.c rdtarga.c)
set(DJPEG_BMP_SOURCES wrbmp.c wrtarga.c)
endif()
add_executable(cjpeg-static cjpeg.c cdjpeg.c rdgif.c rdppm.c rdswitch.c rdjpeg.c
${CJPEG_BMP_SOURCES})
set_property(TARGET cjpeg-static PROPERTY COMPILE_FLAGS ${COMPILE_FLAGS})
target_link_libraries(cjpeg-static jpeg-static) target_link_libraries(cjpeg-static jpeg-static)
add_executable(djpeg-static djpeg.c cdjpeg.c rdcolmap.c rdswitch.c wrbmp.c wrgif.c add_executable(djpeg-static djpeg.c cdjpeg.c rdcolmap.c rdswitch.c wrgif.c
wrppm.c wrtarga.c) wrppm.c ${DJPEG_BMP_SOURCES})
set_property(TARGET djpeg-static PROPERTY COMPILE_FLAGS set_property(TARGET djpeg-static PROPERTY COMPILE_FLAGS ${COMPILE_FLAGS})
"-DBMP_SUPPORTED -DGIF_SUPPORTED -DPPM_SUPPORTED -DTARGA_SUPPORTED -DUSE_SETMODE")
target_link_libraries(djpeg-static jpeg-static) target_link_libraries(djpeg-static jpeg-static)
add_executable(jpegtran-static jpegtran.c cdjpeg.c rdswitch.c transupp.c) add_executable(jpegtran-static jpegtran.c cdjpeg.c rdswitch.c transupp.c)
@@ -264,7 +295,7 @@ set_property(TARGET jpegtran-static PROPERTY COMPILE_FLAGS "-DUSE_SETMODE")
add_executable(rdjpgcom rdjpgcom.c) add_executable(rdjpgcom rdjpgcom.c)
add_executable(wrjpgcom rdjpgcom.c) add_executable(wrjpgcom wrjpgcom.c)
# #
@@ -279,167 +310,438 @@ endif()
enable_testing() enable_testing()
set(MD5_JPEG_INT 9a68f56bc76e466aa7e52f415d0f4a5f) if(WITH_12BIT)
set(MD5_JPEG_FAST 0e1502e7fa421835e376a314fac2a39f) set(TESTORIG testorig12.jpg)
set(MD5_JPEG_FAST_100 7bf72a8e741d64eecb960c97323af77c) set(MD5_JPEG_RGB_ISLOW 9620f424569594bb9242b48498ad801f)
set(MD5_JPEG_FLOAT d1623885ffafcd40c684af09e3d65cd5) set(MD5_PPM_RGB_ISLOW f3301d2219783b8b3d942b7239fa50c0)
set(MD5_JPEG_FLOAT_NOSIMD fb4884c35f8273f498cb32879de5c455) set(MD5_JPEG_422_IFAST_OPT 7322e3bd2f127f7de4b40d4480ce60e4)
set(MD5_JPEG_INT_GRAY 72b51f894b8f4a10b3ee3066770aa38d) set(MD5_PPM_422_IFAST 79807fa552899e66a04708f533e16950)
set(MD5_PPM_INT d1ed0d11f076b842525271647716aeb8) set(MD5_PPM_422M_IFAST 07737bfe8a7c1c87aaa393a0098d16b0)
set(MD5_PPM_FAST 048298a2d2410261c0533cb97bcfef23) set(MD5_JPEG_420_IFAST_Q100_PROG a1da220b5604081863a504297ed59e55)
set(MD5_PPM_FLOAT 7f5b446ee36b2630e06785b8d42af15f) set(MD5_PPM_420_Q100_IFAST 1b3730122709f53d007255e8dfd3305e)
set(MD5_PPM_FLOAT_NOSIMD 64072f1dbdc5b3a187777788604971a5) set(MD5_PPM_420M_Q100_IFAST 980a1a3c5bf9510022869d30b7d26566)
set(MD5_PPM_INT_2_1 9f9de8c0612f8d06869b960b05abf9c9) set(MD5_JPEG_GRAY_ISLOW 235c90707b16e2e069f37c888b2636d9)
set(MD5_PPM_INT_15_8 b6875bc070720b899566cc06459b63b7) set(MD5_PPM_GRAY_ISLOW 7213c10af507ad467da5578ca5ee1fca)
set(MD5_PPM_INT_7_4 06a177eae05f164fac57f7a2c346ee87) set(MD5_PPM_GRAY_ISLOW_RGB e96ee81c30a6ed422d466338bd3de65d)
set(MD5_PPM_INT_13_8 bc3452573c8152f6ae552939ee19f82f) set(MD5_JPEG_420S_IFAST_OPT 7af8e60be4d9c227ec63ac9b6630855e)
set(MD5_PPM_INT_3_2 f5a8b88a8a7f96016f04d259cf82ed67) set(MD5_JPEG_3x2_FLOAT_PROG a8c17daf77b457725ec929e215b603f8)
set(MD5_PPM_INT_11_8 d8cc73c0aaacd4556569b59437ba00a5) set(MD5_PPM_3x2_FLOAT 42876ab9e5c2f76a87d08db5fbd57956)
set(MD5_PPM_INT_5_4 32775dd9ad2ab90f4c5b219b53e0c86c) set(MD5_PPM_420M_ISLOW_2_1 4ca6be2a6f326ff9eaab63e70a8259c0)
set(MD5_PPM_INT_9_8 d25e61bc7eac0002f5b393aa223747b6) set(MD5_PPM_420M_ISLOW_15_8 12aa9f9534c1b3d7ba047322226365eb)
set(MD5_PPM_INT_7_8 ddb564b7c74a09494016d6cd7502a946) set(MD5_PPM_420M_ISLOW_13_8 f7e22817c7b25e1393e4ec101e9d4e96)
set(MD5_PPM_INT_3_4 8ed8e68808c3fbc4ea764fc9d2968646) set(MD5_PPM_420M_ISLOW_11_8 800a16f9f4dc9b293197bfe11be10a82)
set(MD5_PPM_INT_5_8 a3363274999da2366a024efae6d16c9b) set(MD5_PPM_420M_ISLOW_9_8 06b7a92a9bc69f4dc36ec40f1937d55c)
set(MD5_PPM_INT_1_2 e692a315cea26b988c8e8b29a5dbcd81) set(MD5_PPM_420M_ISLOW_7_8 3ec444a14a4ab4eab88ffc49c48eca43)
set(MD5_PPM_INT_3_8 79eca9175652ced755155c90e785a996) set(MD5_PPM_420M_ISLOW_3_4 3e726b7ea872445b19437d1c1d4f0d93)
set(MD5_PPM_INT_1_4 79cd778f8bf1a117690052cacdd54eca) set(MD5_PPM_420M_ISLOW_5_8 a8a771abdc94301d20ffac119b2caccd)
set(MD5_PPM_INT_1_8 391b3d4aca640c8567d6f8745eb2142f) set(MD5_PPM_420M_ISLOW_1_2 b419124dd5568b085787234866102866)
set(MD5_PPM_FAST_1_2 f30bcf6d32ccd44cbdd9aeaacbd9454f) set(MD5_PPM_420M_ISLOW_3_8 343d19015531b7bbe746124127244fa8)
set(MD5_BMP_256 4980185e3776e89bd931736e1cddeee6) set(MD5_PPM_420M_ISLOW_1_4 35fd59d866e44659edfa3c18db2a3edb)
set(MD5_JPEG_ARI e986fb0a637a8d833d96e8a6d6d84ea1) set(MD5_PPM_420M_ISLOW_1_8 ccaed48ac0aedefda5d4abe4013f4ad7)
set(MD5_PPM_ARI 72b59a99bcf1de24c5b27d151bde2437) set(MD5_JPEG_CROP cdb35ff4b4519392690ea040c56ea99c)
set(MD5_JPEG_PROG 1c4afddc05c0a43489ee54438a482d92) else()
set(MD5_JPEG_PROG_ARI 0a8f1c8f66e113c3cf635df0a475a617) set(TESTORIG testorig.jpg)
set(MD5_JPEG_RGB_ISLOW 768e970dd57b340ff1b83c9d3d47c77b)
set(MD5_PPM_RGB_ISLOW 00a257f5393fef8821f2b88ac7421291)
set(MD5_BMP_RGB_ISLOW_565 f07d2e75073e4bb10f6c6f4d36e2e3be)
set(MD5_BMP_RGB_ISLOW_565D 4cfa0928ef3e6bb626d7728c924cfda4)
set(MD5_JPEG_422_IFAST_OPT 2540287b79d913f91665e660303ab2c8)
set(MD5_PPM_422_IFAST 35bd6b3f833bad23de82acea847129fa)
set(MD5_PPM_422M_IFAST 8dbc65323d62cca7c91ba02dd1cfa81d)
set(MD5_BMP_422M_IFAST_565 3294bd4d9a1f2b3d08ea6020d0db7065)
set(MD5_BMP_422M_IFAST_565D da98c9c7b6039511be4a79a878a9abc1)
set(MD5_JPEG_420_IFAST_Q100_PROG 990cbe0329c882420a2094da7e5adade)
set(MD5_PPM_420_Q100_IFAST 5a732542015c278ff43635e473a8a294)
set(MD5_PPM_420M_Q100_IFAST ff692ee9323a3b424894862557c092f1)
set(MD5_JPEG_GRAY_ISLOW 72b51f894b8f4a10b3ee3066770aa38d)
set(MD5_PPM_GRAY_ISLOW 8d3596c56eace32f205deccc229aa5ed)
set(MD5_PPM_GRAY_ISLOW_RGB 116424ac07b79e5e801f00508eab48ec)
set(MD5_BMP_GRAY_ISLOW_565 12f78118e56a2f48b966f792fedf23cc)
set(MD5_BMP_GRAY_ISLOW_565D bdbbd616441a24354c98553df5dc82db)
set(MD5_JPEG_420S_IFAST_OPT 388708217ac46273ca33086b22827ed8)
if(WITH_SIMD)
set(MD5_JPEG_3x2_FLOAT_PROG 343e3f8caf8af5986ebaf0bdc13b5c71)
set(MD5_PPM_3x2_FLOAT 1a75f36e5904d6fc3a85a43da9ad89bb)
else()
set(MD5_JPEG_3x2_FLOAT_PROG 9bca803d2042bd1eb03819e2bf92b3e5)
set(MD5_PPM_3x2_FLOAT f6bfab038438ed8f5522fbd33595dcdc)
endif()
set(MD5_JPEG_420_ISLOW_ARI e986fb0a637a8d833d96e8a6d6d84ea1)
set(MD5_JPEG_444_ISLOW_PROGARI 0a8f1c8f66e113c3cf635df0a475a617)
set(MD5_PPM_420M_IFAST_ARI 72b59a99bcf1de24c5b27d151bde2437)
set(MD5_JPEG_420_ISLOW 9a68f56bc76e466aa7e52f415d0f4a5f)
set(MD5_PPM_420M_ISLOW_2_1 9f9de8c0612f8d06869b960b05abf9c9)
set(MD5_PPM_420M_ISLOW_15_8 b6875bc070720b899566cc06459b63b7)
set(MD5_PPM_420M_ISLOW_13_8 bc3452573c8152f6ae552939ee19f82f)
set(MD5_PPM_420M_ISLOW_11_8 d8cc73c0aaacd4556569b59437ba00a5)
set(MD5_PPM_420M_ISLOW_9_8 d25e61bc7eac0002f5b393aa223747b6)
set(MD5_PPM_420M_ISLOW_7_8 ddb564b7c74a09494016d6cd7502a946)
set(MD5_PPM_420M_ISLOW_3_4 8ed8e68808c3fbc4ea764fc9d2968646)
set(MD5_PPM_420M_ISLOW_5_8 a3363274999da2366a024efae6d16c9b)
set(MD5_PPM_420M_ISLOW_1_2 e692a315cea26b988c8e8b29a5dbcd81)
set(MD5_PPM_420M_ISLOW_3_8 79eca9175652ced755155c90e785a996)
set(MD5_PPM_420M_ISLOW_1_4 79cd778f8bf1a117690052cacdd54eca)
set(MD5_PPM_420M_ISLOW_1_8 391b3d4aca640c8567d6f8745eb2142f)
set(MD5_BMP_420_ISLOW_256 4980185e3776e89bd931736e1cddeee6)
set(MD5_BMP_420_ISLOW_565 bf9d13e16c4923b92e1faa604d7922cb)
set(MD5_BMP_420_ISLOW_565D 6bde71526acc44bcff76f696df8638d2)
set(MD5_BMP_420M_ISLOW_565 8dc0185245353cfa32ad97027342216f)
set(MD5_BMP_420M_ISLOW_565D d1be3a3339166255e76fa50a0d70d73e)
set(MD5_JPEG_CROP b4197f377e621c4e9b1d20471432610d) set(MD5_JPEG_CROP b4197f377e621c4e9b1d20471432610d)
endif()
if(WITH_JAVA) if(WITH_JAVA)
add_test(TJUnitTest ${JAVA_RUNTIME} -cp "java/${OBJDIR}turbojpeg.jar" "-Djava.library.path=${CMAKE_CURRENT_BINARY_DIR}/${OBJDIR}" TJUnitTest) add_test(TJUnitTest
add_test(TJUnitTest-yuv ${JAVA_RUNTIME} -cp "java/${OBJDIR}turbojpeg.jar" "-Djava.library.path=${CMAKE_CURRENT_BINARY_DIR}/${OBJDIR}" TJUnitTest -yuv) ${JAVA_RUNTIME} -cp java/${OBJDIR}turbojpeg.jar
add_test(TJUnitTest-yuv-nopad ${JAVA_RUNTIME} -cp "java/${OBJDIR}turbojpeg.jar" "-Djava.library.path=${CMAKE_CURRENT_BINARY_DIR}/${OBJDIR}" TJUnitTest -yuv -noyuvpad) -Djava.library.path=${CMAKE_CURRENT_BINARY_DIR}/${OBJDIR}
add_test(TJUnitTest-bi ${JAVA_RUNTIME} -cp "java/${OBJDIR}turbojpeg.jar" "-Djava.library.path=${CMAKE_CURRENT_BINARY_DIR}/${OBJDIR}" TJUnitTest -bi) TJUnitTest)
add_test(TJUnitTest-bi-yuv ${JAVA_RUNTIME} -cp "java/${OBJDIR}turbojpeg.jar" "-Djava.library.path=${CMAKE_CURRENT_BINARY_DIR}/${OBJDIR}" TJUnitTest -bi -yuv) add_test(TJUnitTest-yuv
add_test(TJUnitTest-bi-yuv-nopad ${JAVA_RUNTIME} -cp "java/${OBJDIR}turbojpeg.jar" "-Djava.library.path=${CMAKE_CURRENT_BINARY_DIR}/${OBJDIR}" TJUnitTest -bi -yuv -noyuvpad) ${JAVA_RUNTIME} -cp java/${OBJDIR}turbojpeg.jar
-Djava.library.path=${CMAKE_CURRENT_BINARY_DIR}/${OBJDIR}
TJUnitTest -yuv)
add_test(TJUnitTest-yuv-nopad
${JAVA_RUNTIME} -cp java/${OBJDIR}turbojpeg.jar
-Djava.library.path=${CMAKE_CURRENT_BINARY_DIR}/${OBJDIR}
TJUnitTest -yuv -noyuvpad)
add_test(TJUnitTest-bi
${JAVA_RUNTIME} -cp java/${OBJDIR}turbojpeg.jar
-Djava.library.path=${CMAKE_CURRENT_BINARY_DIR}/${OBJDIR}
TJUnitTest -bi)
add_test(TJUnitTest-bi-yuv
${JAVA_RUNTIME} -cp java/${OBJDIR}turbojpeg.jar
-Djava.library.path=${CMAKE_CURRENT_BINARY_DIR}/${OBJDIR}
TJUnitTest -bi -yuv)
add_test(TJUnitTest-bi-yuv-nopad
${JAVA_RUNTIME} -cp java/${OBJDIR}turbojpeg.jar
-Djava.library.path=${CMAKE_CURRENT_BINARY_DIR}/${OBJDIR}
TJUnitTest -bi -yuv -noyuvpad)
endif() endif()
add_test(tjunittest tjunittest)
add_test(tjunittest-alloc tjunittest -alloc) foreach(libtype shared static)
add_test(tjunittest-yuv tjunittest -yuv) if(libtype STREQUAL "shared")
add_test(tjunittest-yuv-alloc tjunittest -yuv -alloc) set(dir sharedlib/)
add_test(tjunittest-yuv-nopad tjunittest -yuv -noyuvpad)
add_test(cjpeg-int sharedlib/cjpeg -dct int -outfile testoutint.jpg "${CMAKE_SOURCE_DIR}/testimages/testorig.ppm")
add_test(cjpeg-int-cmp "${CMAKE_COMMAND}" -DMD5=${MD5_JPEG_INT} -DFILE=testoutint.jpg -P "${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake")
add_test(cjpeg-fast sharedlib/cjpeg -dct fast -opt -outfile testoutfst.jpg "${CMAKE_SOURCE_DIR}/testimages/testorig.ppm")
add_test(cjpeg-fast-cmp "${CMAKE_COMMAND}" -DMD5=${MD5_JPEG_FAST} -DFILE=testoutfst.jpg -P "${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake")
add_test(cjpeg-fast-100 sharedlib/cjpeg -dct fast -quality 100 -opt -outfile testoutfst100.jpg "${CMAKE_SOURCE_DIR}/testimages/testorig.ppm")
add_test(cjpeg-fast-100-cmp "${CMAKE_COMMAND}" -DMD5=${MD5_JPEG_FAST_100} -DFILE=testoutfst100.jpg -P "${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake")
add_test(cjpeg-float sharedlib/cjpeg -dct float -outfile testoutflt.jpg "${CMAKE_SOURCE_DIR}/testimages/testorig.ppm")
if(WITH_SIMD)
add_test(cjpeg-float-cmp "${CMAKE_COMMAND}" -DMD5=${MD5_JPEG_FLOAT} -DFILE=testoutflt.jpg -P "${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake")
else() else()
add_test(cjpeg-float-cmp "${CMAKE_COMMAND}" -DMD5=${MD5_JPEG_FLOAT_NOSIMD} -DFILE=testoutflt.jpg -P "${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake") set(dir "")
set(suffix -static)
endif() endif()
add_test(cjpeg-int-gray sharedlib/cjpeg -dct int -grayscale -outfile testoutgray.jpg "${CMAKE_SOURCE_DIR}/testimages/testorig.ppm") if(WITH_TURBOJPEG)
add_test(cjpeg-int-gray-cmp "${CMAKE_COMMAND}" -DMD5=${MD5_JPEG_INT_GRAY} -DFILE=testoutgray.jpg -P "${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake") add_test(tjunittest${suffix} tjunittest${suffix})
add_test(djpeg-int sharedlib/djpeg -dct int -fast -ppm -outfile testoutint.ppm "${CMAKE_SOURCE_DIR}/testimages/testorig.jpg") add_test(tjunittest${suffix}-alloc tjunittest${suffix} -alloc)
add_test(djpeg-int-cmp "${CMAKE_COMMAND}" -DMD5=${MD5_PPM_INT} -DFILE=testoutint.ppm -P "${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake") add_test(tjunittest${suffix}-yuv tjunittest${suffix} -yuv)
add_test(djpeg-fast sharedlib/djpeg -dct fast -ppm -outfile testoutfst.ppm "${CMAKE_SOURCE_DIR}/testimages/testorig.jpg") add_test(tjunittest${suffix}-yuv-alloc tjunittest${suffix} -yuv -alloc)
add_test(djpeg-fast-cmp "${CMAKE_COMMAND}" -DMD5=${MD5_PPM_FAST} -DFILE=testoutfst.ppm -P "${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake") add_test(tjunittest${suffix}-yuv-nopad tjunittest${suffix} -yuv -noyuvpad)
add_test(djpeg-float sharedlib/djpeg -dct float -ppm -outfile testoutflt.ppm "${CMAKE_SOURCE_DIR}/testimages/testorig.jpg")
if(WITH_SIMD)
add_test(djpeg-float-cmp "${CMAKE_COMMAND}" -DMD5=${MD5_PPM_FLOAT} -DFILE=testoutflt.ppm -P "${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake")
else()
add_test(djpeg-float-cmp "${CMAKE_COMMAND}" -DMD5=${MD5_PPM_FLOAT_NOSIMD} -DFILE=testoutflt.ppm -P "${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake")
endif() endif()
foreach(scale 2_1 15_8 7_4 13_8 3_2 11_8 5_4 9_8 7_8 3_4 5_8 1_2 3_8 1_4 1_8)
string(REGEX REPLACE "_" "/" scalearg ${scale}) # These tests are carefully chosen to provide full coverage of as many of the
add_test(djpeg-int-${scale} sharedlib/djpeg -dct int -nosmooth -scale ${scalearg} -ppm -outfile testoutint${scale}.ppm "${CMAKE_SOURCE_DIR}/testimages/testorig.jpg") # underlying algorithms as possible (including all of the SIMD-accelerated
add_test(djpeg-int-${scale}-cmp "${CMAKE_COMMAND}" -DMD5=${MD5_PPM_INT_${scale}} -DFILE=testoutint${scale}.ppm -P "${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake") # ones.)
endforeach()
add_test(djpeg-fast-1_2 sharedlib/djpeg -dct fast -scale 1/2 -ppm -outfile testoutfst1_2.ppm "${CMAKE_SOURCE_DIR}/testimages/testorig.jpg") # CC: null SAMP: fullsize FDCT: islow ENT: huff
add_test(djpeg-fast-1_2-cmp "${CMAKE_COMMAND}" -DMD5=${MD5_PPM_FAST_1_2} -DFILE=testoutfst1_2.ppm -P "${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake") add_test(cjpeg${suffix}-rgb-islow
add_test(djpeg-256 sharedlib/djpeg -dct int -bmp -colors 256 -outfile testout.bmp "${CMAKE_SOURCE_DIR}/testimages/testorig.jpg") ${dir}cjpeg${suffix} -revert -rgb -dct int -outfile testout_rgb_islow.jpg
add_test(djpeg-256-cmp "${CMAKE_COMMAND}" -DMD5=${MD5_BMP_256} -DFILE=testout.bmp -P "${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake") ${CMAKE_SOURCE_DIR}/testimages/testorig.ppm)
add_test(cjpeg-prog sharedlib/cjpeg -dct int -progressive -outfile testoutp.jpg "${CMAKE_SOURCE_DIR}/testimages/testorig.ppm") add_test(cjpeg${suffix}-rgb-islow-cmp
add_test(cjpeg-prog-cmp "${CMAKE_COMMAND}" -DMD5=${MD5_JPEG_PROG} -DFILE=testoutp.jpg -P "${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake") ${CMAKE_COMMAND} -DMD5=${MD5_JPEG_RGB_ISLOW} -DFILE=testout_rgb_islow.jpg
add_test(jpegtran-prog sharedlib/jpegtran -outfile testoutt.jpg testoutp.jpg") -P ${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake)
add_test(jpegtran-prog-cmp "${CMAKE_COMMAND}" -DMD5=${MD5_JPEG_INT} -DFILE=testoutt.jpg -P "${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake") # CC: null SAMP: fullsize IDCT: islow ENT: huff
add_test(djpeg${suffix}-rgb-islow
${dir}djpeg${suffix} -dct int -ppm -outfile testout_rgb_islow.ppm
testout_rgb_islow.jpg)
add_test(djpeg${suffix}-rgb-islow-cmp
${CMAKE_COMMAND} -DMD5=${MD5_PPM_RGB_ISLOW} -DFILE=testout_rgb_islow.ppm
-P ${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake)
if(NOT WITH_12BIT)
# CC: RGB->RGB565 SAMP: fullsize IDCT: islow ENT: huff
add_test(djpeg${suffix}-rgb-islow-565
${dir}djpeg${suffix} -dct int -rgb565 -dither none -bmp
-outfile testout_rgb_islow_565.bmp testout_rgb_islow.jpg)
add_test(djpeg${suffix}-rgb-islow-565-cmp
${CMAKE_COMMAND} -DMD5=${MD5_BMP_RGB_ISLOW_565}
-DFILE=testout_rgb_islow_565.bmp
-P ${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake)
# CC: RGB->RGB565 (dithered) SAMP: fullsize IDCT: islow ENT: huff
add_test(djpeg${suffix}-rgb-islow-565D
${dir}djpeg${suffix} -dct int -rgb565 -bmp
-outfile testout_rgb_islow_565D.bmp testout_rgb_islow.jpg)
add_test(djpeg${suffix}-rgb-islow-565D-cmp
${CMAKE_COMMAND} -DMD5=${MD5_BMP_RGB_ISLOW_565D}
-DFILE=testout_rgb_islow_565D.bmp
-P ${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake)
endif()
# CC: RGB->YCC SAMP: fullsize/h2v1 FDCT: ifast ENT: 2-pass huff
add_test(cjpeg${suffix}-422-ifast-opt
${dir}cjpeg${suffix} -revert -sample 2x1 -dct fast -opt
-outfile testout_422_ifast_opt.jpg
${CMAKE_SOURCE_DIR}/testimages/testorig.ppm)
add_test(cjpeg${suffix}-422-ifast-opt-cmp
${CMAKE_COMMAND} -DMD5=${MD5_JPEG_422_IFAST_OPT}
-DFILE=testout_422_ifast_opt.jpg
-P ${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake)
# CC: YCC->RGB SAMP: fullsize/h2v1 fancy IDCT: ifast ENT: huff
add_test(djpeg${suffix}-422-ifast
${dir}djpeg${suffix} -dct fast -outfile testout_422_ifast.ppm
testout_422_ifast_opt.jpg)
add_test(djpeg${suffix}-422-ifast-cmp
${CMAKE_COMMAND} -DMD5=${MD5_PPM_422_IFAST} -DFILE=testout_422_ifast.ppm
-P ${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake)
# CC: YCC->RGB SAMP: h2v1 merged IDCT: ifast ENT: huff
add_test(djpeg${suffix}-422m-ifast
${dir}djpeg${suffix} -dct fast -nosmooth -outfile testout_422m_ifast.ppm
testout_422_ifast_opt.jpg)
add_test(djpeg${suffix}-422m-ifast-cmp
${CMAKE_COMMAND} -DMD5=${MD5_PPM_422M_IFAST} -DFILE=testout_422m_ifast.ppm
-P ${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake)
if(NOT WITH_12BIT)
# CC: YCC->RGB565 SAMP: h2v1 merged IDCT: ifast ENT: huff
add_test(djpeg${suffix}-422m-ifast-565
${dir}djpeg${suffix} -dct int -nosmooth -rgb565 -dither none -bmp
-outfile testout_422m_ifast_565.bmp testout_422_ifast_opt.jpg)
add_test(djpeg${suffix}-422m-ifast-565-cmp
${CMAKE_COMMAND} -DMD5=${MD5_BMP_422M_IFAST_565}
-DFILE=testout_422m_ifast_565.bmp
-P ${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake)
# CC: YCC->RGB565 (dithered) SAMP: h2v1 merged IDCT: ifast ENT: huff
add_test(djpeg${suffix}-422m-ifast-565D
${dir}djpeg${suffix} -dct int -nosmooth -rgb565 -bmp
-outfile testout_422m_ifast_565D.bmp testout_422_ifast_opt.jpg)
add_test(djpeg${suffix}-422m-ifast-565D-cmp
${CMAKE_COMMAND} -DMD5=${MD5_BMP_422M_IFAST_565D}
-DFILE=testout_422m_ifast_565D.bmp
-P ${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake)
endif()
# CC: RGB->YCC SAMP: fullsize/h2v2 FDCT: ifast ENT: prog huff
add_test(cjpeg${suffix}-420-q100-ifast-prog
${dir}cjpeg${suffix} -revert -sample 2x2 -quality 100 -dct fast -prog
-outfile testout_420_q100_ifast_prog.jpg
${CMAKE_SOURCE_DIR}/testimages/testorig.ppm)
add_test(cjpeg${suffix}-420-q100-ifast-prog-cmp
${CMAKE_COMMAND} -DMD5=${MD5_JPEG_420_IFAST_Q100_PROG}
-DFILE=testout_420_q100_ifast_prog.jpg
-P ${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake)
# CC: YCC->RGB SAMP: fullsize/h2v2 fancy IDCT: ifast ENT: prog huff
add_test(djpeg${suffix}-420-q100-ifast-prog
${dir}djpeg${suffix} -dct fast -outfile testout_420_q100_ifast.ppm
testout_420_q100_ifast_prog.jpg)
add_test(djpeg${suffix}-420-q100-ifast-prog-cmp
${CMAKE_COMMAND} -DMD5=${MD5_PPM_420_Q100_IFAST}
-DFILE=testout_420_q100_ifast.ppm
-P ${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake)
# CC: YCC->RGB SAMP: h2v2 merged IDCT: ifast ENT: prog huff
add_test(djpeg${suffix}-420m-q100-ifast-prog
${dir}djpeg${suffix} -dct fast -nosmooth
-outfile testout_420m_q100_ifast.ppm testout_420_q100_ifast_prog.jpg)
add_test(djpeg${suffix}-420m-q100-ifast-prog-cmp
${CMAKE_COMMAND} -DMD5=${MD5_PPM_420M_Q100_IFAST}
-DFILE=testout_420m_q100_ifast.ppm
-P ${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake)
# CC: RGB->Gray SAMP: fullsize FDCT: islow ENT: huff
add_test(cjpeg${suffix}-gray-islow
${dir}cjpeg${suffix} -revert -gray -dct int -outfile testout_gray_islow.jpg
${CMAKE_SOURCE_DIR}/testimages/testorig.ppm)
add_test(cjpeg${suffix}-gray-islow-cmp
${CMAKE_COMMAND} -DMD5=${MD5_JPEG_GRAY_ISLOW}
-DFILE=testout_gray_islow.jpg
-P ${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake)
# CC: Gray->Gray SAMP: fullsize IDCT: islow ENT: huff
add_test(djpeg${suffix}-gray-islow
${dir}djpeg${suffix} -dct int -outfile testout_gray_islow.ppm
testout_gray_islow.jpg)
add_test(djpeg${suffix}-gray-islow-cmp
${CMAKE_COMMAND} -DMD5=${MD5_PPM_GRAY_ISLOW}
-DFILE=testout_gray_islow.ppm
-P ${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake)
# CC: Gray->RGB SAMP: fullsize IDCT: islow ENT: huff
add_test(djpeg${suffix}-gray-islow-rgb
${dir}djpeg${suffix} -dct int -rgb -outfile testout_gray_islow_rgb.ppm
testout_gray_islow.jpg)
add_test(cjpeg${suffix}-gray-islow-rgb-cmp
${CMAKE_COMMAND} -DMD5=${MD5_PPM_GRAY_ISLOW_RGB}
-DFILE=testout_gray_islow_rgb.ppm
-P ${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake)
if(NOT WITH_12BIT)
# CC: Gray->RGB565 SAMP: fullsize IDCT: islow ENT: huff
add_test(djpeg${suffix}-gray-islow-565
${dir}djpeg${suffix} -dct int -rgb565 -dither none -bmp
-outfile testout_gray_islow_565.bmp testout_gray_islow.jpg)
add_test(djpeg${suffix}-gray-islow-565-cmp
${CMAKE_COMMAND} -DMD5=${MD5_BMP_GRAY_ISLOW_565}
-DFILE=testout_gray_islow_565.bmp
-P ${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake)
# CC: Gray->RGB565 (dithered) SAMP: fullsize IDCT: islow ENT: huff
add_test(djpeg${suffix}-gray-islow-565D
${dir}djpeg${suffix} -dct int -rgb565 -bmp
-outfile testout_gray_islow_565D.bmp testout_gray_islow.jpg)
add_test(djpeg${suffix}-gray-islow-565D-cmp
${CMAKE_COMMAND} -DMD5=${MD5_BMP_GRAY_ISLOW_565D}
-DFILE=testout_gray_islow_565D.bmp
-P ${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake)
endif()
# CC: RGB->YCC SAMP: fullsize smooth/h2v2 smooth FDCT: islow
# ENT: 2-pass huff
add_test(cjpeg${suffix}-420s-ifast-opt
${dir}cjpeg${suffix} -revert -sample 2x2 -smooth 1 -dct int -opt -outfile
testout_420s_ifast_opt.jpg ${CMAKE_SOURCE_DIR}/testimages/testorig.ppm)
add_test(cjpeg${suffix}-420s-ifast-opt-cmp
${CMAKE_COMMAND} -DMD5=${MD5_JPEG_420S_IFAST_OPT}
-DFILE=testout_420s_ifast_opt.jpg
-P ${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake)
# CC: RGB->YCC SAMP: fullsize/int FDCT: float ENT: prog huff
add_test(cjpeg${suffix}-3x2-float-prog
${dir}cjpeg${suffix} -revert -sample 3x2 -dct float -prog
-outfile testout_3x2_float_prog.jpg
${CMAKE_SOURCE_DIR}/testimages/testorig.ppm)
add_test(cjpeg${suffix}-3x2-float-prog-cmp
${CMAKE_COMMAND} -DMD5=${MD5_JPEG_3x2_FLOAT_PROG}
-DFILE=testout_3x2_float_prog.jpg
-P ${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake)
# CC: YCC->RGB SAMP: fullsize/int IDCT: float ENT: prog huff
add_test(djpeg${suffix}-3x2-float-prog
${dir}djpeg${suffix} -dct float -outfile testout_3x2_float.ppm
testout_3x2_float_prog.jpg)
add_test(djpeg${suffix}-3x2-float-prog-cmp
${CMAKE_COMMAND} -DMD5=${MD5_PPM_3x2_FLOAT} -DFILE=testout_3x2_float.ppm
-P ${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake)
if(WITH_ARITH_ENC) if(WITH_ARITH_ENC)
add_test(cjpeg-ari sharedlib/cjpeg -dct int -arithmetic -outfile testoutari.jpg "${CMAKE_SOURCE_DIR}/testimages/testorig.ppm") # CC: YCC->RGB SAMP: fullsize/h2v2 FDCT: islow ENT: arith
add_test(cjpeg-ari-cmp "${CMAKE_COMMAND}" -DMD5=${MD5_JPEG_ARI} -DFILE=testoutari.jpg -P "${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake") add_test(cjpeg${suffix}-420-islow-ari
add_test(jpegtran-toari sharedlib/jpegtran -arithmetic -outfile testouta.jpg "${CMAKE_SOURCE_DIR}/testimages/testimgint.jpg") ${dir}cjpeg${suffix} -revert -dct int -arithmetic
add_test(jpegtran-toari-cmp "${CMAKE_COMMAND}" -DMD5=${MD5_JPEG_ARI} -DFILE=testouta.jpg -P "${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake") -outfile testout_420_islow_ari.jpg
add_test(cjpeg-prog-ari sharedlib/cjpeg -dct int -progressive -arithmetic -sample 1x1 -outfile testoutpa.jpg "${CMAKE_SOURCE_DIR}/testimages/testorig.ppm") ${CMAKE_SOURCE_DIR}/testimages/testorig.ppm)
add_test(cjpeg-prog-ari-cmp "${CMAKE_COMMAND}" -DMD5=${MD5_JPEG_PROG_ARI} -DFILE=testoutpa.jpg -P "${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake") add_test(cjpeg${suffix}-420-islow-ari-cmp
${CMAKE_COMMAND} -DMD5=${MD5_JPEG_420_ISLOW_ARI}
-DFILE=testout_420_islow_ari.jpg
-P ${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake)
add_test(jpegtran${suffix}-420-islow-ari
${dir}jpegtran${suffix} -revert -arithmetic
-outfile testout_420_islow_ari.jpg
${CMAKE_SOURCE_DIR}/testimages/testimgint.jpg)
add_test(jpegtran${suffix}-420-islow-ari-cmp
${CMAKE_COMMAND} -DMD5=${MD5_JPEG_420_ISLOW_ARI}
-DFILE=testout_420_islow_ari.jpg
-P ${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake)
# CC: YCC->RGB SAMP: fullsize FDCT: islow ENT: prog arith
add_test(cjpeg${suffix}-444-islow-progari
${dir}cjpeg${suffix} -revert -sample 1x1 -dct int -progressive -arithmetic
-outfile testout_444_islow_progari.jpg
${CMAKE_SOURCE_DIR}/testimages/testorig.ppm)
add_test(cjpeg${suffix}-444-islow-progari-cmp
${CMAKE_COMMAND} -DMD5=${MD5_JPEG_444_ISLOW_PROGARI}
-DFILE=testout_444_islow_progari.jpg
-P ${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake)
endif() endif()
if(WITH_ARITH_DEC) if(WITH_ARITH_DEC)
add_test(djpeg-ari sharedlib/djpeg -dct int -fast -ppm -outfile testoutari.ppm "${CMAKE_SOURCE_DIR}/testimages/testimgari.jpg") # CC: RGB->YCC SAMP: h2v2 merged IDCT: ifast ENT: arith
add_test(djpeg-ari-cmp "${CMAKE_COMMAND}" -DMD5=${MD5_PPM_ARI} -DFILE=testoutari.ppm -P "${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake") add_test(cjpeg${suffix}-420m-ifast-ari
add_test(jpegtran-fromari sharedlib/jpegtran -outfile testouta.jpg "${CMAKE_SOURCE_DIR}/testimages/testimgari.jpg") ${dir}djpeg${suffix} -fast -ppm -outfile testout_420m_ifast_ari.ppm
add_test(jpegtran-fromari-cmp "${CMAKE_COMMAND}" -DMD5=${MD5_JPEG_INT} -DFILE=testouta.jpg -P "${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake") ${CMAKE_SOURCE_DIR}/testimages/testimgari.jpg)
add_test(cjpeg${suffix}-420m-ifast-ari-cmp
${CMAKE_COMMAND} -DMD5=${MD5_PPM_420M_IFAST_ARI}
-DFILE=testout_420m_ifast_ari.ppm
-P ${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake)
add_test(jpegtran${suffix}-420-islow
${dir}jpegtran${suffix} -revert -outfile testout_420_islow.jpg
${CMAKE_SOURCE_DIR}/testimages/testimgari.jpg)
add_test(jpegtran${suffix}-420-islow-cmp
${CMAKE_COMMAND} -DMD5=${MD5_JPEG_420_ISLOW}
-DFILE=testout_420_islow.jpg
-P ${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake)
endif() endif()
add_test(jpegtran-crop sharedlib/jpegtran -crop 120x90+20+50 -transpose -perfect -outfile testoutcrop.jpg "${CMAKE_SOURCE_DIR}/testimages/testorig.jpg")
add_test(jpegtran-crop-cmp "${CMAKE_COMMAND}" -DMD5=${MD5_JPEG_CROP} -DFILE=testoutcrop.jpg -P "${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake")
add_test(tjunittest-static tjunittest-static) # 2/1-- CC: YCC->RGB SAMP: h2v2 merged IDCT: 16x16 islow ENT: huff
add_test(tjunittest-static-alloc tjunittest-static -alloc) # 15/8-- CC: YCC->RGB SAMP: h2v2 merged IDCT: 15x15 islow ENT: huff
add_test(tjunittest-static-yuv tjunittest-static -yuv) # 13/8-- CC: YCC->RGB SAMP: h2v2 merged IDCT: 13x13 islow ENT: huff
add_test(tjunittest-static-yuv-alloc tjunittest-static -yuv -alloc) # 11/8-- CC: YCC->RGB SAMP: h2v2 merged IDCT: 11x11 islow ENT: huff
add_test(tjunittest-static-yuv-nopad tjunittest-static -yuv -noyuvpad) # 9/8-- CC: YCC->RGB SAMP: h2v2 merged IDCT: 9x9 islow ENT: huff
add_test(cjpeg-static-int cjpeg-static -dct int -outfile testoutint.jpg "${CMAKE_SOURCE_DIR}/testimages/testorig.ppm") # 7/8-- CC: YCC->RGB SAMP: h2v2 merged IDCT: 7x7 islow/14x14 islow
add_test(cjpeg-static-int-cmp "${CMAKE_COMMAND}" -DMD5=${MD5_JPEG_INT} -DFILE=testoutint.jpg -P "${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake") # ENT: huff
add_test(cjpeg-static-fast cjpeg-static -dct fast -opt -outfile testoutfst.jpg "${CMAKE_SOURCE_DIR}/testimages/testorig.ppm") # 3/4-- CC: YCC->RGB SAMP: h2v2 merged IDCT: 6x6 islow/12x12 islow
add_test(cjpeg-static-fast-cmp "${CMAKE_COMMAND}" -DMD5=${MD5_JPEG_FAST} -DFILE=testoutfst.jpg -P "${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake") # ENT: huff
add_test(cjpeg-static-fast-100 cjpeg-static -dct fast -quality 100 -opt -outfile testoutfst100.jpg "${CMAKE_SOURCE_DIR}/testimages/testorig.ppm") # 5/8-- CC: YCC->RGB SAMP: h2v2 merged IDCT: 5x5 islow/10x10 islow
add_test(cjpeg-static-fast-100-cmp "${CMAKE_COMMAND}" -DMD5=${MD5_JPEG_FAST_100} -DFILE=testoutfst100.jpg -P "${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake") # ENT: huff
add_test(cjpeg-static-float cjpeg-static -dct float -outfile testoutflt.jpg "${CMAKE_SOURCE_DIR}/testimages/testorig.ppm") # 1/2-- CC: YCC->RGB SAMP: h2v2 merged IDCT: 4x4 islow/8x8 islow
if(WITH_SIMD) # ENT: huff
add_test(cjpeg-static-float-cmp "${CMAKE_COMMAND}" -DMD5=${MD5_JPEG_FLOAT} -DFILE=testoutflt.jpg -P "${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake") # 3/8-- CC: YCC->RGB SAMP: h2v2 merged IDCT: 3x3 islow/6x6 islow
else() # ENT: huff
add_test(cjpeg-static-float-cmp "${CMAKE_COMMAND}" -DMD5=${MD5_JPEG_FLOAT_NOSIMD} -DFILE=testoutflt.jpg -P "${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake") # 1/4-- CC: YCC->RGB SAMP: h2v2 merged IDCT: 2x2 islow/4x4 islow
endif() # ENT: huff
add_test(cjpeg-static-int-gray cjpeg-static -dct int -grayscale -outfile testoutgray.jpg "${CMAKE_SOURCE_DIR}/testimages/testorig.ppm") # 1/8-- CC: YCC->RGB SAMP: h2v2 merged IDCT: 1x1 islow/2x2 islow
add_test(cjpeg-static-int-gray-cmp "${CMAKE_COMMAND}" -DMD5=${MD5_JPEG_INT_GRAY} -DFILE=testoutgray.jpg -P "${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake") # ENT: huff
add_test(djpeg-static-int djpeg-static -dct int -fast -ppm -outfile testoutint.ppm "${CMAKE_SOURCE_DIR}/testimages/testorig.jpg") foreach(scale 2_1 15_8 13_8 11_8 9_8 7_8 3_4 5_8 1_2 3_8 1_4 1_8)
add_test(djpeg-static-int-cmp "${CMAKE_COMMAND}" -DMD5=${MD5_PPM_INT} -DFILE=testoutint.ppm -P "${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake")
add_test(djpeg-static-fast djpeg-static -dct fast -ppm -outfile testoutfst.ppm "${CMAKE_SOURCE_DIR}/testimages/testorig.jpg")
add_test(djpeg-static-fast-cmp "${CMAKE_COMMAND}" -DMD5=${MD5_PPM_FAST} -DFILE=testoutfst.ppm -P "${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake")
add_test(djpeg-static-float djpeg-static -dct float -ppm -outfile testoutflt.ppm "${CMAKE_SOURCE_DIR}/testimages/testorig.jpg")
if(WITH_SIMD)
add_test(djpeg-static-float-cmp "${CMAKE_COMMAND}" -DMD5=${MD5_PPM_FLOAT} -DFILE=testoutflt.ppm -P "${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake")
else()
add_test(djpeg-static-float-cmp "${CMAKE_COMMAND}" -DMD5=${MD5_PPM_FLOAT_NOSIMD} -DFILE=testoutflt.ppm -P "${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake")
endif()
foreach(scale 2_1 15_8 7_4 13_8 3_2 11_8 5_4 9_8 7_8 3_4 5_8 1_2 3_8 1_4 1_8)
string(REGEX REPLACE "_" "/" scalearg ${scale}) string(REGEX REPLACE "_" "/" scalearg ${scale})
add_test(djpeg-static-int-${scale} djpeg-static -dct int -nosmooth -scale ${scalearg} -ppm -outfile testoutint${scale}.ppm "${CMAKE_SOURCE_DIR}/testimages/testorig.jpg") add_test(djpeg${suffix}-420m-islow-${scale}
add_test(djpeg-static-int-${scale}-cmp "${CMAKE_COMMAND}" -DMD5=${MD5_PPM_INT_${scale}} -DFILE=testoutint${scale}.ppm -P "${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake") ${dir}djpeg${suffix} -dct int -scale ${scalearg} -nosmooth -ppm
-outfile testout_420m_islow_${scale}.ppm
${CMAKE_SOURCE_DIR}/testimages/${TESTORIG})
add_test(djpeg${suffix}-420m-islow-${scale}-cmp
${CMAKE_COMMAND} -DMD5=${MD5_PPM_420M_ISLOW_${scale}}
-DFILE=testout_420m_islow_${scale}.ppm
-P ${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake)
endforeach() endforeach()
add_test(djpeg-static-fast-1_2 djpeg-static -dct fast -scale 1/2 -ppm -outfile testoutfst1_2.ppm "${CMAKE_SOURCE_DIR}/testimages/testorig.jpg")
add_test(djpeg-static-fast-1_2-cmp "${CMAKE_COMMAND}" -DMD5=${MD5_PPM_FAST_1_2} -DFILE=testoutfst1_2.ppm -P "${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake")
add_test(djpeg-static-256 djpeg-static -dct int -bmp -colors 256 -outfile testout.bmp "${CMAKE_SOURCE_DIR}/testimages/testorig.jpg")
add_test(djpeg-static-256-cmp "${CMAKE_COMMAND}" -DMD5=${MD5_BMP_256} -DFILE=testout.bmp -P "${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake")
add_test(cjpeg-static-prog cjpeg-static -dct int -progressive -outfile testoutp.jpg "${CMAKE_SOURCE_DIR}/testimages/testorig.ppm")
add_test(cjpeg-static-prog-cmp "${CMAKE_COMMAND}" -DMD5=${MD5_JPEG_PROG} -DFILE=testoutp.jpg -P "${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake")
add_test(jpegtran-static-prog jpegtran-static -outfile testoutt.jpg testoutp.jpg")
add_test(jpegtran-static-prog-cmp "${CMAKE_COMMAND}" -DMD5=${MD5_JPEG_INT} -DFILE=testoutt.jpg -P "${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake")
if(WITH_ARITH_ENC)
add_test(cjpeg-static-ari cjpeg-static -dct int -arithmetic -outfile testoutari.jpg "${CMAKE_SOURCE_DIR}/testimages/testorig.ppm")
add_test(cjpeg-static-ari-cmp "${CMAKE_COMMAND}" -DMD5=${MD5_JPEG_ARI} -DFILE=testoutari.jpg -P "${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake")
add_test(jpegtran-static-toari jpegtran-static -arithmetic -outfile testouta.jpg "${CMAKE_SOURCE_DIR}/testimages/testimgint.jpg")
add_test(jpegtran-static-toari-cmp "${CMAKE_COMMAND}" -DMD5=${MD5_JPEG_ARI} -DFILE=testouta.jpg -P "${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake")
add_test(cjpeg-static-prog-ari cjpeg-static -dct int -progressive -arithmetic -sample 1x1 -outfile testoutpa.jpg "${CMAKE_SOURCE_DIR}/testimages/testorig.ppm")
add_test(cjpeg-static-prog-ari-cmp "${CMAKE_COMMAND}" -DMD5=${MD5_JPEG_PROG_ARI} -DFILE=testoutpa.jpg -P "${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake")
endif()
if(WITH_ARITH_DEC)
add_test(djpeg-static-ari djpeg-static -dct int -fast -ppm -outfile testoutari.ppm "${CMAKE_SOURCE_DIR}/testimages/testimgari.jpg")
add_test(djpeg-static-ari-cmp "${CMAKE_COMMAND}" -DMD5=${MD5_PPM_ARI} -DFILE=testoutari.ppm -P "${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake")
add_test(jpegtran-static-fromari jpegtran-static -outfile testouta.jpg "${CMAKE_SOURCE_DIR}/testimages/testimgari.jpg")
add_test(jpegtran-static-fromari-cmp "${CMAKE_COMMAND}" -DMD5=${MD5_JPEG_INT} -DFILE=testouta.jpg -P "${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake")
endif()
add_test(jpegtran-static-crop jpegtran-static -crop 120x90+20+50 -transpose -perfect -outfile testoutcrop.jpg "${CMAKE_SOURCE_DIR}/testimages/testorig.jpg")
add_test(jpegtran-static-crop-cmp "${CMAKE_COMMAND}" -DMD5=${MD5_JPEG_CROP} -DFILE=testoutcrop.jpg -P "${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake")
add_custom_target(testclean COMMAND "${CMAKE_COMMAND}" -P if(NOT WITH_12BIT)
"${CMAKE_SOURCE_DIR}/cmakescripts/testclean.cmake" VERBATIM) # CC: YCC->RGB (dithered) SAMP: h2v2 fancy IDCT: islow ENT: huff
add_test(djpeg${suffix}-420-islow-256
${dir}djpeg${suffix} -dct int -colors 256 -bmp
-outfile testout_420_islow_256.bmp
${CMAKE_SOURCE_DIR}/testimages/${TESTORIG})
add_test(djpeg${suffix}-420-islow-256-cmp
${CMAKE_COMMAND} -DMD5=${MD5_BMP_420_ISLOW_256}
-DFILE=testout_420_islow_256.bmp
-P ${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake)
# CC: YCC->RGB565 SAMP: h2v2 fancy IDCT: islow ENT: huff
add_test(djpeg${suffix}-420-islow-565
${dir}djpeg${suffix} -dct int -rgb565 -dither none -bmp
-outfile testout_420_islow_565.bmp
${CMAKE_SOURCE_DIR}/testimages/${TESTORIG})
add_test(djpeg${suffix}-420-islow-565-cmp
${CMAKE_COMMAND} -DMD5=${MD5_BMP_420_ISLOW_565}
-DFILE=testout_420_islow_565.bmp
-P ${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake)
# CC: YCC->RGB565 (dithered) SAMP: h2v2 fancy IDCT: islow ENT: huff
add_test(djpeg${suffix}-420-islow-565D
${dir}djpeg${suffix} -dct int -rgb565 -bmp
-outfile testout_420_islow_565D.bmp
${CMAKE_SOURCE_DIR}/testimages/${TESTORIG})
add_test(djpeg${suffix}-420-islow-565D-cmp
${CMAKE_COMMAND} -DMD5=${MD5_BMP_420_ISLOW_565D}
-DFILE=testout_420_islow_565D.bmp
-P ${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake)
# CC: YCC->RGB565 SAMP: h2v2 merged IDCT: islow ENT: huff
add_test(djpeg${suffix}-420m-islow-565
${dir}djpeg${suffix} -dct int -nosmooth -rgb565 -dither none -bmp
-outfile testout_420m_islow_565.bmp
${CMAKE_SOURCE_DIR}/testimages/${TESTORIG})
add_test(djpeg${suffix}-420m-islow-565-cmp
${CMAKE_COMMAND} -DMD5=${MD5_BMP_420M_ISLOW_565}
-DFILE=testout_420m_islow_565.bmp
-P ${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake)
# CC: YCC->RGB565 (dithered) SAMP: h2v2 merged IDCT: islow ENT: huff
add_test(djpeg${suffix}-420m-islow-565D
${dir}djpeg${suffix} -dct int -nosmooth -rgb565 -bmp
-outfile testout_420m_islow_565D.bmp
${CMAKE_SOURCE_DIR}/testimages/${TESTORIG})
add_test(djpeg${suffix}-420m-islow-565D-cmp
${CMAKE_COMMAND} -DMD5=${MD5_BMP_420M_ISLOW_565D}
-DFILE=testout_420m_islow_565D.bmp
-P ${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake)
endif()
add_test(jpegtran${suffix}-crop
${dir}jpegtran${suffix} -revert -crop 120x90+20+50 -transpose -perfect
-outfile testout_crop.jpg ${CMAKE_SOURCE_DIR}/testimages/${TESTORIG})
add_test(jpegtran${suffix}-crop-cmp
${CMAKE_COMMAND} -DMD5=${MD5_JPEG_CROP} -DFILE=testout_crop.jpg
-P ${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake)
endforeach()
add_custom_target(testclean COMMAND ${CMAKE_COMMAND} -P
${CMAKE_SOURCE_DIR}/cmakescripts/testclean.cmake)
# #
@@ -476,18 +778,21 @@ endif()
STRING(REGEX REPLACE "/" "\\\\" INST_DIR "${CMAKE_INSTALL_PREFIX}") STRING(REGEX REPLACE "/" "\\\\" INST_DIR "${CMAKE_INSTALL_PREFIX}")
configure_file(release/libmozjpeg.nsi.in libmozjpeg.nsi @ONLY) configure_file(release/mozjpeg.nsi.in mozjpeg.nsi @ONLY)
if(WITH_JAVA) if(WITH_JAVA)
set(JAVA_DEPEND java) set(JAVA_DEPEND java)
endif() endif()
add_custom_target(installer add_custom_target(installer
makensis -nocd ${INST_DEFS} libmozjpeg.nsi makensis -nocd ${INST_DEFS} mozjpeg.nsi
DEPENDS jpeg jpeg-static turbojpeg turbojpeg-static rdjpgcom wrjpgcom DEPENDS jpeg jpeg-static turbojpeg turbojpeg-static rdjpgcom wrjpgcom
cjpeg djpeg jpegtran tjbench ${JAVA_DEPEND} cjpeg djpeg jpegtran tjbench ${JAVA_DEPEND}
SOURCES libmozjpeg.nsi) SOURCES mozjpeg.nsi)
install(TARGETS jpeg-static turbojpeg turbojpeg-static rdjpgcom wrjpgcom tjbench if(WITH_TURBOJPEG)
set(TURBOJPEG_TARGETS turbojpeg turbojpeg-static tjbench)
endif()
install(TARGETS jpeg-static rdjpgcom wrjpgcom ${TURBOJPEG_TARGETS}
ARCHIVE DESTINATION lib ARCHIVE DESTINATION lib
LIBRARY DESTINATION lib LIBRARY DESTINATION lib
RUNTIME DESTINATION bin RUNTIME DESTINATION bin

View File

@@ -1,27 +1,151 @@
1.4 pre-beta 1.4.0
============ =====
[1] The TurboJPEG API can now be used to generate YUV images with an arbitrary [1] Fixed a build issue on OS X PowerPC platforms (md5cmp failed to build
line padding (previously, it only supported 4-byte padding, which was because OS X does not provide the le32toh() and htole32() functions.)
compatible with X Video.) Also, the decompress-to-YUV function has been
extended to support image scaling. [2] The non-SIMD RGB565 color conversion code did not work correctly on big
endian machines. This has been fixed.
[3] Fixed an issue in tjPlaneSizeYUV() whereby it would erroneously return 1
instead of -1 if componentID was > 0 and subsamp was TJSAMP_GRAY.
[3] Fixed an issue in tjBufSizeYUV2() wherby it would erroneously return 0
instead of -1 if width was < 1.
[8] cjpeg, djpeg, and jpegtran now accept an argument of -version, which will
print the library version and exit.
[9] Referring to 1.4 beta1 [15], another extremely rare circumstance was
discovered under which the Huffman encoder's local buffer can be overrun
when a buffered destination manager is being used and an
extremely-high-frequency block (basically junk image data) is being encoded.
Even though the Huffman local buffer was increased from 128 bytes to 136 bytes
to address the previous issue, the new issue caused even the larger buffer to
be overrun. Further analysis reveals that, in the absolute worst case (such as
setting alternating AC coefficients to 32767 and -32768 in the JPEG scanning
order), the Huffman encoder can produce encoded blocks that approach double the
size of the unencoded blocks. Thus, the Huffman local buffer was increased to
256 bytes, which should prevent any such issue from re-occurring in the future.
1.3.90 (1.4 beta1)
==================
[1] New features in the TurboJPEG API:
-- YUV planar images can now be generated with an arbitrary line padding
(previously only 4-byte padding, which was compatible with X Video, was
supported.)
-- The decompress-to-YUV function has been extended to support image scaling.
-- JPEG images can now be compressed from YUV planar source images.
-- YUV planar images can now be decoded into RGB or grayscale images.
-- 4:1:1 subsampling is now supported. This is mainly included for
compatibility, since 4:1:1 is not fully accelerated in libjpeg-turbo and has no
significant advantages relative to 4:2:0.
-- CMYK images are now supported. This feature allows CMYK source images to be
compressed to YCCK JPEGs and YCCK or CMYK JPEGs to be decompressed to CMYK
destination images. Conversion between CMYK/YCCK and RGB or YUV images is not
supported. Such conversion requires a color management system and is thus out
of scope for a codec library.
-- The handling of YUV images in the Java API has been significantly refactored
and should now be much more intuitive.
-- The Java API now supports encoding a YUV image from an arbitrary position in
a large image buffer.
-- All of the YUV functions now have a corresponding function that operates on
separate image planes instead of a unified image buffer. This allows for
compressing/decoding from or decompressing/encoding to a subregion of a larger
YUV image. It also allows for handling YUV formats that swap the order of the
U and V planes.
[2] Added SIMD acceleration for DSPr2-capable MIPS platforms. This speeds up [2] Added SIMD acceleration for DSPr2-capable MIPS platforms. This speeds up
the compression of full-color JPEGs by 70-80% on such platforms and the compression of full-color JPEGs by 70-80% on such platforms and
decompression by 25-35%. decompression by 25-35%.
[3] Added support for 4:1:1 subsampling to the TurboJPEG API. This is mainly [3] If an application attempts to decompress a Huffman-coded JPEG image whose
included for compatibility, since 4:1:1 is not fully accelerated in header does not contain Huffman tables, libjpeg-turbo will now insert the
libjpeg-turbo and has no significant advantages relative to 4:2:0. default Huffman tables. In order to save space, many motion JPEG video frames
are encoded without the default Huffman tables, so these frames can now be
successfully decompressed by libjpeg-turbo without additional work on the part
of the application. An application can still override the Huffman tables, for
instance to re-use tables from a previous frame of the same video.
[4] Added support for CMYK images to the TurboJPEG API. This feature allows [4] The Mac packaging system now uses pkgbuild and productbuild rather than
CMYK source images to be compressed to YCCK JPEGs and YCCK or CMYK JPEGs to be PackageMaker (which is obsolete and no longer supported.) This means that
decompressed to CMYK destination images. Conversion between CMYK and RGB OS X 10.6 "Snow Leopard" or later must be used when packaging libjpeg-turbo,
images is not supported. Such conversion requires a color management system although the packages produced can be installed on OS X 10.5 "Leopard" or
and is out of scope for a codec library. later. OS X 10.4 "Tiger" is no longer supported.
[5] The TurboJPEG API can now be used to compress JPEG images from YUV planar [5] The Huffman encoder now uses clz and bsr instructions for bit counting on
source images. ARM platforms rather than a lookup table. This reduces the memory footprint
by 64k, which may be important for some mobile applications. Out of four
Android devices that were tested, two demonstrated a small overall performance
loss (~3-4% on average) with ARMv6 code and a small gain (also ~3-4%) with
ARMv7 code when enabling this new feature, but the other two devices
demonstrated a significant overall performance gain with both ARMv6 and ARMv7
code (~10-20%) when enabling the feature. Actual mileage may vary.
[6] Worked around an issue with Visual C++ 2010 and later that caused incorrect
pixels to be generated when decompressing a JPEG image to a 256-color bitmap,
if compiler optimization was enabled when libjpeg-turbo was built. This caused
the regression tests to fail when doing a release build under Visual C++ 2010
and later.
[7] Improved the accuracy and performance of the non-SIMD implementation of the
floating point inverse DCT (using code borrowed from libjpeg v8a and later.)
The accuracy of this implementation now matches the accuracy of the SSE/SSE2
implementation. Note, however, that the floating point DCT/IDCT algorithms are
mainly a legacy feature. They generally do not produce significantly better
accuracy than the slow integer DCT/IDCT algorithms, and they are quite a bit
slower.
[8] Added a new output colorspace (JCS_RGB565) to the libjpeg API that allows
for decompressing JPEG images into RGB565 (16-bit) pixels. If dithering is not
used, then this code path is SIMD-accelerated on ARM platforms.
[9] Numerous obsolete features, such as support for non-ANSI compilers and
support for the MS-DOS memory model, were removed from the libjpeg code,
greatly improving its readability and making it easier to maintain and extend.
[10] Fixed a segfault that occurred when calling output_message() with msg_code
set to JMSG_COPYRIGHT.
[11] Fixed an issue whereby wrjpgcom was allowing comments longer than 65k
characters to be passed on the command line, which was causing it to generate
incorrect JPEG files.
[12] Fixed a bug in the build system that was causing the Windows version of
wrjpgcom to be built using the rdjpgcom source code.
[13] Restored 12-bit-per-component JPEG support. A 12-bit version of
libjpeg-turbo can now be built by passing an argument of --with-12bit to
configure (Unix) or -DWITH_12BIT=1 to cmake (Windows.) 12-bit JPEG support is
included only for convenience. Enabling this feature disables all of the
performance features in libjpeg-turbo, as well as arithmetic coding and the
TurboJPEG API. The resulting library still contains the other libjpeg-turbo
features (such as the colorspace extensions), but in general, it performs no
faster than libjpeg v6b.
[14] Added ARM 64-bit SIMD acceleration for the YCC-to-RGB color conversion
and IDCT algorithms (both are used during JPEG decompression.) For unknown
reasons (probably related to clang), this code cannot currently be compiled for
iOS.
[15] Fixed an extremely rare bug that could cause the Huffman encoder's local
buffer to overrun when a very high-frequency MCU is compressed using quality
100 and no subsampling, and when the JPEG output buffer is being dynamically
resized by the destination manager. This issue was so rare that, even with a
test program specifically designed to make the bug occur (by injecting random
high-frequency YUV data into the compressor), it was reproducible only once in
about every 25 million iterations.
[16] Fixed an oversight in the TurboJPEG C wrapper: if any of the JPEG
compression functions was called repeatedly with the same
automatically-allocated destination buffer, then TurboJPEG would erroneously
assume that the jpegSize parameter was equal to the size of the buffer, when in
fact that parameter was probably equal to the size of the most recently
compressed JPEG image. If the size of the previous JPEG image was not as large
as the current JPEG image, then TurboJPEG would unnecessarily reallocate the
destination buffer.
1.3.1 1.3.1
@@ -48,6 +172,20 @@ omitted at compile time".
[4] Fixed a couple of issues whereby malformed JPEG images would cause [4] Fixed a couple of issues whereby malformed JPEG images would cause
libjpeg-turbo to use uninitialized memory during decompression. libjpeg-turbo to use uninitialized memory during decompression.
[5] Fixed an error ("Buffer passed to JPEG library is too small") that occurred
when calling the TurboJPEG YUV encoding function with a very small (< 5x5)
source image, and added a unit test to check for this error.
[6] The Java classes should now build properly under Visual Studio 2010 and
later.
[7] Fixed an issue that prevented SRPMs generated using the in-tree packaging
tools from being rebuilt on certain newer Linux distributions.
[8] Numerous minor fixes to eliminate compilation and build/packaging system
warnings, fix cosmetic issues, improve documentation clarity, and other general
source cleanup.
1.3.0 1.3.0
===== =====

View File

@@ -2,6 +2,6 @@ Redistribution and use in source and binary forms, with or without modification,
* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
* Neither the name of the libmozjpeg Project nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. * Neither the name of the mozjpeg Project nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT HOLDERS OR CONTRIBUTORS 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. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT HOLDERS OR CONTRIBUTORS 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.

View File

@@ -11,17 +11,18 @@ endif
nodist_include_HEADERS = jconfig.h nodist_include_HEADERS = jconfig.h
HDRS = jchuff.h jdct.h jdhuff.h jerror.h jinclude.h jmemsys.h jmorecfg.h \ HDRS = jchuff.h jcmaster.h jdct.h jdhuff.h jerror.h jinclude.h jmemsys.h \
jpegint.h jpeglib.h jversion.h jsimd.h jsimddct.h jpegcomp.h jmorecfg.h jpegint.h jpeglib.h jversion.h jsimd.h jsimddct.h jpegcomp.h \
jpeg_nbits_table.h
libjpeg_la_SOURCES = $(HDRS) jcapimin.c jcapistd.c jccoefct.c jccolor.c \ libjpeg_la_SOURCES = $(HDRS) jcapimin.c jcapistd.c jccoefct.c jccolor.c \
jcdctmgr.c jchuff.c jcinit.c jcmainct.c jcmarker.c jcmaster.c \ jcdctmgr.c jcext.c jchuff.c jcinit.c jcmainct.c jcmarker.c \
jcomapi.c jcparam.c jcphuff.c jcprepct.c jcsample.c jctrans.c \ jcmaster.c jcomapi.c jcparam.c jcphuff.c jcprepct.c jcsample.c \
jdapimin.c jdapistd.c jdatadst.c jdatasrc.c jdcoefct.c jdcolor.c \ jctrans.c jdapimin.c jdapistd.c jdatadst.c jdatasrc.c jdcoefct.c \
jddctmgr.c jdhuff.c jdinput.c jdmainct.c jdmarker.c jdmaster.c \ jdcolor.c jddctmgr.c jdhuff.c jdinput.c jdmainct.c jdmarker.c \
jdmerge.c jdphuff.c jdpostct.c jdsample.c jdtrans.c jerror.c \ jdmaster.c jdmerge.c jdphuff.c jdpostct.c jdsample.c jdtrans.c \
jfdctflt.c jfdctfst.c jfdctint.c jidctflt.c jidctfst.c jidctint.c \ jerror.c jfdctflt.c jfdctfst.c jfdctint.c jidctflt.c jidctfst.c \
jidctred.c jquant1.c jquant2.c jutils.c jmemmgr.c jmemnobs.c jidctint.c jidctred.c jquant1.c jquant2.c jutils.c jmemmgr.c jmemnobs.c
if WITH_ARITH if WITH_ARITH
libjpeg_la_SOURCES += jaricom.c libjpeg_la_SOURCES += jaricom.c
@@ -107,21 +108,40 @@ tjunittest_LDADD = libturbojpeg.la
endif endif
cjpeg_SOURCES = cdjpeg.h cderror.h cdjpeg.c cjpeg.c rdbmp.c rdgif.c \ cjpeg_SOURCES = cdjpeg.h cderror.h cdjpeg.c cjpeg.c rdgif.c rdppm.c rdswitch.c rdjpeg.c
rdppm.c rdswitch.c rdtarga.c rdjpeg.c if WITH_12BIT
else
cjpeg_SOURCES += rdbmp.c rdtarga.c
endif
cjpeg_LDADD = libjpeg.la cjpeg_LDADD = libjpeg.la
cjpeg_CFLAGS = -DBMP_SUPPORTED -DGIF_SUPPORTED -DPPM_SUPPORTED \ cjpeg_CFLAGS = -DGIF_SUPPORTED -DPPM_SUPPORTED
-DTARGA_SUPPORTED if WITH_12BIT
else
cjpeg_CFLAGS += -DBMP_SUPPORTED -DTARGA_SUPPORTED
endif
if HAVE_LIBPNG
cjpeg_CFLAGS += -DPNG_SUPPORTED $(libpng_CFLAGS)
cjpeg_LDADD += $(libpng_LIBS)
cjpeg_SOURCES += rdpng.c
endif
djpeg_SOURCES = cdjpeg.h cderror.h cdjpeg.c djpeg.c rdcolmap.c rdswitch.c \ djpeg_SOURCES = cdjpeg.h cderror.h cdjpeg.c djpeg.c rdcolmap.c rdswitch.c \
wrbmp.c wrgif.c wrppm.c wrtarga.c wrgif.c wrppm.c
if WITH_12BIT
else
djpeg_SOURCES += wrbmp.c wrtarga.c
endif
djpeg_LDADD = libjpeg.la djpeg_LDADD = libjpeg.la
djpeg_CFLAGS = -DBMP_SUPPORTED -DGIF_SUPPORTED -DPPM_SUPPORTED \ djpeg_CFLAGS = -DGIF_SUPPORTED -DPPM_SUPPORTED
-DTARGA_SUPPORTED if WITH_12BIT
else
djpeg_CFLAGS += -DBMP_SUPPORTED -DTARGA_SUPPORTED
endif
jpegtran_SOURCES = jpegtran.c rdswitch.c cdjpeg.c transupp.c transupp.h jpegtran_SOURCES = jpegtran.c rdswitch.c cdjpeg.c transupp.c transupp.h
@@ -162,7 +182,8 @@ dist_example_DATA = example.c
EXTRA_DIST = win release $(DOCS) testimages CMakeLists.txt \ EXTRA_DIST = win release $(DOCS) testimages CMakeLists.txt \
sharedlib/CMakeLists.txt cmakescripts libjpeg.map.in doc doxygen.config \ sharedlib/CMakeLists.txt cmakescripts libjpeg.map.in doc doxygen.config \
jccolext.c jdcolext.c jdmrgext.c doxygen-extra.css jccolext.c jdcolext.c jdcol565.c jdmrgext.c jdmrg565.c \
jstdhuff.c
dist-hook: dist-hook:
rm -rf `find $(distdir) -name .svn` rm -rf `find $(distdir) -name .svn`
@@ -170,40 +191,93 @@ dist-hook:
SUBDIRS += md5 SUBDIRS += md5
MD5_JPEG_INT = 9a68f56bc76e466aa7e52f415d0f4a5f if WITH_12BIT
MD5_JPEG_FAST = 0e1502e7fa421835e376a314fac2a39f
MD5_JPEG_FAST_100 = 7bf72a8e741d64eecb960c97323af77c TESTORIG = testorig12.jpg
MD5_JPEG_FLOAT = d1623885ffafcd40c684af09e3d65cd5 MD5_JPEG_RGB_ISLOW = 9620f424569594bb9242b48498ad801f
MD5_JPEG_FLOAT_NOSIMD = fb4884c35f8273f498cb32879de5c455 MD5_PPM_RGB_ISLOW = f3301d2219783b8b3d942b7239fa50c0
MD5_JPEG_INT_GRAY = 72b51f894b8f4a10b3ee3066770aa38d MD5_JPEG_422_IFAST_OPT = 7322e3bd2f127f7de4b40d4480ce60e4
MD5_PPM_INT = d1ed0d11f076b842525271647716aeb8 MD5_PPM_422_IFAST = 79807fa552899e66a04708f533e16950
MD5_PPM_FAST = 048298a2d2410261c0533cb97bcfef23 MD5_PPM_422M_IFAST = 07737bfe8a7c1c87aaa393a0098d16b0
MD5_PPM_FLOAT = 7f5b446ee36b2630e06785b8d42af15f MD5_JPEG_420_IFAST_Q100_PROG = a1da220b5604081863a504297ed59e55
MD5_PPM_FLOAT_NOSIMD = 64072f1dbdc5b3a187777788604971a5 MD5_PPM_420_Q100_IFAST = 1b3730122709f53d007255e8dfd3305e
MD5_PPM_INT_2_1 = 9f9de8c0612f8d06869b960b05abf9c9 MD5_PPM_420M_Q100_IFAST = 980a1a3c5bf9510022869d30b7d26566
MD5_PPM_INT_15_8 = b6875bc070720b899566cc06459b63b7 MD5_JPEG_GRAY_ISLOW = 235c90707b16e2e069f37c888b2636d9
MD5_PPM_INT_7_4 = 06a177eae05f164fac57f7a2c346ee87 MD5_PPM_GRAY_ISLOW = 7213c10af507ad467da5578ca5ee1fca
MD5_PPM_INT_13_8 = bc3452573c8152f6ae552939ee19f82f MD5_PPM_GRAY_ISLOW_RGB = e96ee81c30a6ed422d466338bd3de65d
MD5_PPM_INT_3_2 = f5a8b88a8a7f96016f04d259cf82ed67 MD5_JPEG_420S_IFAST_OPT = 7af8e60be4d9c227ec63ac9b6630855e
MD5_PPM_INT_11_8 = d8cc73c0aaacd4556569b59437ba00a5 MD5_JPEG_3x2_FLOAT_PROG = a8c17daf77b457725ec929e215b603f8
MD5_PPM_INT_5_4 = 32775dd9ad2ab90f4c5b219b53e0c86c MD5_PPM_3x2_FLOAT = 42876ab9e5c2f76a87d08db5fbd57956
MD5_PPM_INT_9_8 = d25e61bc7eac0002f5b393aa223747b6 MD5_PPM_420M_ISLOW_2_1 = 4ca6be2a6f326ff9eaab63e70a8259c0
MD5_PPM_INT_7_8 = ddb564b7c74a09494016d6cd7502a946 MD5_PPM_420M_ISLOW_15_8 = 12aa9f9534c1b3d7ba047322226365eb
MD5_PPM_INT_3_4 = 8ed8e68808c3fbc4ea764fc9d2968646 MD5_PPM_420M_ISLOW_13_8 = f7e22817c7b25e1393e4ec101e9d4e96
MD5_PPM_INT_5_8 = a3363274999da2366a024efae6d16c9b MD5_PPM_420M_ISLOW_11_8 = 800a16f9f4dc9b293197bfe11be10a82
MD5_PPM_INT_1_2 = e692a315cea26b988c8e8b29a5dbcd81 MD5_PPM_420M_ISLOW_9_8 = 06b7a92a9bc69f4dc36ec40f1937d55c
MD5_PPM_INT_3_8 = 79eca9175652ced755155c90e785a996 MD5_PPM_420M_ISLOW_7_8 = 3ec444a14a4ab4eab88ffc49c48eca43
MD5_PPM_INT_1_4 = 79cd778f8bf1a117690052cacdd54eca MD5_PPM_420M_ISLOW_3_4 = 3e726b7ea872445b19437d1c1d4f0d93
MD5_PPM_INT_1_8 = 391b3d4aca640c8567d6f8745eb2142f MD5_PPM_420M_ISLOW_5_8 = a8a771abdc94301d20ffac119b2caccd
MD5_PPM_FAST_1_2 = f30bcf6d32ccd44cbdd9aeaacbd9454f MD5_PPM_420M_ISLOW_1_2 = b419124dd5568b085787234866102866
MD5_BMP_256 = 4980185e3776e89bd931736e1cddeee6 MD5_PPM_420M_ISLOW_3_8 = 343d19015531b7bbe746124127244fa8
MD5_JPEG_ARI = e986fb0a637a8d833d96e8a6d6d84ea1 MD5_PPM_420M_ISLOW_1_4 = 35fd59d866e44659edfa3c18db2a3edb
MD5_PPM_ARI = 72b59a99bcf1de24c5b27d151bde2437 MD5_PPM_420M_ISLOW_1_8 = ccaed48ac0aedefda5d4abe4013f4ad7
MD5_JPEG_PROG = 1c4afddc05c0a43489ee54438a482d92 MD5_JPEG_CROP = cdb35ff4b4519392690ea040c56ea99c
MD5_JPEG_PROG_ARI = 0a8f1c8f66e113c3cf635df0a475a617
else
TESTORIG = testorig.jpg
MD5_JPEG_RGB_ISLOW = 768e970dd57b340ff1b83c9d3d47c77b
MD5_PPM_RGB_ISLOW = 00a257f5393fef8821f2b88ac7421291
MD5_BMP_RGB_ISLOW_565 = f07d2e75073e4bb10f6c6f4d36e2e3be
MD5_BMP_RGB_ISLOW_565D = 4cfa0928ef3e6bb626d7728c924cfda4
MD5_JPEG_422_IFAST_OPT = 2540287b79d913f91665e660303ab2c8
MD5_PPM_422_IFAST = 35bd6b3f833bad23de82acea847129fa
MD5_PPM_422M_IFAST = 8dbc65323d62cca7c91ba02dd1cfa81d
MD5_BMP_422M_IFAST_565 = 3294bd4d9a1f2b3d08ea6020d0db7065
MD5_BMP_422M_IFAST_565D = da98c9c7b6039511be4a79a878a9abc1
MD5_JPEG_420_IFAST_Q100_PROG = 990cbe0329c882420a2094da7e5adade
MD5_PPM_420_Q100_IFAST = 5a732542015c278ff43635e473a8a294
MD5_PPM_420M_Q100_IFAST = ff692ee9323a3b424894862557c092f1
MD5_JPEG_GRAY_ISLOW = 72b51f894b8f4a10b3ee3066770aa38d
MD5_PPM_GRAY_ISLOW = 8d3596c56eace32f205deccc229aa5ed
MD5_PPM_GRAY_ISLOW_RGB = 116424ac07b79e5e801f00508eab48ec
MD5_BMP_GRAY_ISLOW_565 = 12f78118e56a2f48b966f792fedf23cc
MD5_BMP_GRAY_ISLOW_565D = bdbbd616441a24354c98553df5dc82db
MD5_JPEG_420S_IFAST_OPT = 388708217ac46273ca33086b22827ed8
# See README-turbo.txt for more details on why this next bit is necessary.
if WITH_SSE_FLOAT_DCT
MD5_JPEG_3x2_FLOAT_PROG = 343e3f8caf8af5986ebaf0bdc13b5c71
MD5_PPM_3x2_FLOAT = 1a75f36e5904d6fc3a85a43da9ad89bb
else
MD5_JPEG_3x2_FLOAT_PROG = 9bca803d2042bd1eb03819e2bf92b3e5
MD5_PPM_3x2_FLOAT = f6bfab038438ed8f5522fbd33595dcdc
endif
MD5_JPEG_420_ISLOW_ARI = e986fb0a637a8d833d96e8a6d6d84ea1
MD5_JPEG_444_ISLOW_PROGARI = 0a8f1c8f66e113c3cf635df0a475a617
MD5_PPM_420M_IFAST_ARI = 72b59a99bcf1de24c5b27d151bde2437
MD5_JPEG_420_ISLOW = 9a68f56bc76e466aa7e52f415d0f4a5f
MD5_PPM_420M_ISLOW_2_1 = 9f9de8c0612f8d06869b960b05abf9c9
MD5_PPM_420M_ISLOW_15_8 = b6875bc070720b899566cc06459b63b7
MD5_PPM_420M_ISLOW_13_8 = bc3452573c8152f6ae552939ee19f82f
MD5_PPM_420M_ISLOW_11_8 = d8cc73c0aaacd4556569b59437ba00a5
MD5_PPM_420M_ISLOW_9_8 = d25e61bc7eac0002f5b393aa223747b6
MD5_PPM_420M_ISLOW_7_8 = ddb564b7c74a09494016d6cd7502a946
MD5_PPM_420M_ISLOW_3_4 = 8ed8e68808c3fbc4ea764fc9d2968646
MD5_PPM_420M_ISLOW_5_8 = a3363274999da2366a024efae6d16c9b
MD5_PPM_420M_ISLOW_1_2 = e692a315cea26b988c8e8b29a5dbcd81
MD5_PPM_420M_ISLOW_3_8 = 79eca9175652ced755155c90e785a996
MD5_PPM_420M_ISLOW_1_4 = 79cd778f8bf1a117690052cacdd54eca
MD5_PPM_420M_ISLOW_1_8 = 391b3d4aca640c8567d6f8745eb2142f
MD5_BMP_420_ISLOW_256 = 4980185e3776e89bd931736e1cddeee6
MD5_BMP_420_ISLOW_565 = bf9d13e16c4923b92e1faa604d7922cb
MD5_BMP_420_ISLOW_565D = 6bde71526acc44bcff76f696df8638d2
MD5_BMP_420M_ISLOW_565 = 8dc0185245353cfa32ad97027342216f
MD5_BMP_420M_ISLOW_565D =d1be3a3339166255e76fa50a0d70d73e
MD5_JPEG_CROP = b4197f377e621c4e9b1d20471432610d MD5_JPEG_CROP = b4197f377e621c4e9b1d20471432610d
endif
test: testclean all test: testclean all
if WITH_TURBOJPEG if WITH_TURBOJPEG
if WITH_JAVA if WITH_JAVA
$(JAVA) -cp java/turbojpeg.jar -Djava.library.path=.libs TJUnitTest $(JAVA) -cp java/turbojpeg.jar -Djava.library.path=.libs TJUnitTest
@@ -219,84 +293,203 @@ endif
./tjunittest -yuv -alloc ./tjunittest -yuv -alloc
./tjunittest -yuv -noyuvpad ./tjunittest -yuv -noyuvpad
endif endif
./cjpeg -dct int -outfile testoutint.jpg $(srcdir)/testimages/testorig.ppm
md5/md5cmp $(MD5_JPEG_INT) testoutint.jpg # These tests are carefully crafted to provide full coverage of as many of the
./cjpeg -dct fast -opt -outfile testoutfst.jpg $(srcdir)/testimages/testorig.ppm # underlying algorithms as possible (including all of the SIMD-accelerated
md5/md5cmp $(MD5_JPEG_FAST) testoutfst.jpg # ones.)
./cjpeg -dct fast -quality 100 -opt -outfile testoutfst100.jpg $(srcdir)/testimages/testorig.ppm
md5/md5cmp $(MD5_JPEG_FAST_100) testoutfst100.jpg # CC: null SAMP: fullsize FDCT: islow ENT: huff
./cjpeg -dct float -outfile testoutflt.jpg $(srcdir)/testimages/testorig.ppm ./cjpeg -revert -rgb -dct int -outfile testout_rgb_islow.jpg $(srcdir)/testimages/testorig.ppm
if WITH_SSE_FLOAT_DCT md5/md5cmp $(MD5_JPEG_RGB_ISLOW) testout_rgb_islow.jpg
md5/md5cmp $(MD5_JPEG_FLOAT) testoutflt.jpg # CC: null SAMP: fullsize IDCT: islow ENT: huff
./djpeg -dct int -ppm -outfile testout_rgb_islow.ppm testout_rgb_islow.jpg
md5/md5cmp $(MD5_PPM_RGB_ISLOW) testout_rgb_islow.ppm
rm testout_rgb_islow.ppm
if WITH_12BIT
rm testout_rgb_islow.jpg
else else
md5/md5cmp $(MD5_JPEG_FLOAT_NOSIMD) testoutflt.jpg # CC: RGB->RGB565 SAMP: fullsize IDCT: islow ENT: huff
./djpeg -dct int -rgb565 -dither none -bmp -outfile testout_rgb_islow_565.bmp testout_rgb_islow.jpg
md5/md5cmp $(MD5_BMP_RGB_ISLOW_565) testout_rgb_islow_565.bmp
rm testout_rgb_islow_565.bmp
# CC: RGB->RGB565 (dithered) SAMP: fullsize IDCT: islow ENT: huff
./djpeg -dct int -rgb565 -bmp -outfile testout_rgb_islow_565D.bmp testout_rgb_islow.jpg
md5/md5cmp $(MD5_BMP_RGB_ISLOW_565D) testout_rgb_islow_565D.bmp
rm testout_rgb_islow_565D.bmp testout_rgb_islow.jpg
endif endif
./cjpeg -dct int -grayscale -outfile testoutgray.jpg $(srcdir)/testimages/testorig.ppm
md5/md5cmp $(MD5_JPEG_INT_GRAY) testoutgray.jpg # CC: RGB->YCC SAMP: fullsize/h2v1 FDCT: ifast ENT: 2-pass huff
./djpeg -dct int -fast -ppm -outfile testoutint.ppm $(srcdir)/testimages/testorig.jpg ./cjpeg -revert -sample 2x1 -dct fast -opt -outfile testout_422_ifast_opt.jpg $(srcdir)/testimages/testorig.ppm
md5/md5cmp $(MD5_PPM_INT) testoutint.ppm md5/md5cmp $(MD5_JPEG_422_IFAST_OPT) testout_422_ifast_opt.jpg
./djpeg -dct fast -ppm -outfile testoutfst.ppm $(srcdir)/testimages/testorig.jpg # CC: YCC->RGB SAMP: fullsize/h2v1 fancy IDCT: ifast ENT: huff
md5/md5cmp $(MD5_PPM_FAST) testoutfst.ppm ./djpeg -dct fast -outfile testout_422_ifast.ppm testout_422_ifast_opt.jpg
./djpeg -dct float -ppm -outfile testoutflt.ppm $(srcdir)/testimages/testorig.jpg md5/md5cmp $(MD5_PPM_422_IFAST) testout_422_ifast.ppm
if WITH_SSE_FLOAT_DCT rm testout_422_ifast.ppm
md5/md5cmp $(MD5_PPM_FLOAT) testoutflt.ppm # CC: YCC->RGB SAMP: h2v1 merged IDCT: ifast ENT: huff
./djpeg -dct fast -nosmooth -outfile testout_422m_ifast.ppm testout_422_ifast_opt.jpg
md5/md5cmp $(MD5_PPM_422M_IFAST) testout_422m_ifast.ppm
rm testout_422m_ifast.ppm
if WITH_12BIT
rm testout_422_ifast_opt.jpg
else else
md5/md5cmp $(MD5_PPM_FLOAT_NOSIMD) testoutflt.ppm # CC: YCC->RGB565 SAMP: h2v1 merged IDCT: ifast ENT: huff
./djpeg -dct int -nosmooth -rgb565 -dither none -bmp -outfile testout_422m_ifast_565.bmp testout_422_ifast_opt.jpg
md5/md5cmp $(MD5_BMP_422M_IFAST_565) testout_422m_ifast_565.bmp
rm testout_422m_ifast_565.bmp
# CC: YCC->RGB565 (dithered) SAMP: h2v1 merged IDCT: ifast ENT: huff
./djpeg -dct int -nosmooth -rgb565 -bmp -outfile testout_422m_ifast_565D.bmp testout_422_ifast_opt.jpg
md5/md5cmp $(MD5_BMP_422M_IFAST_565D) testout_422m_ifast_565D.bmp
rm testout_422m_ifast_565D.bmp testout_422_ifast_opt.jpg
endif endif
./djpeg -dct int -nosmooth -scale 2/1 -ppm -outfile testoutint2_1.ppm $(srcdir)/testimages/testorig.jpg;
md5/md5cmp $(MD5_PPM_INT_2_1) testoutint2_1.ppm; # CC: RGB->YCC SAMP: fullsize/h2v2 FDCT: ifast ENT: prog huff
./djpeg -dct int -nosmooth -scale 15/8 -ppm -outfile testoutint15_8.ppm $(srcdir)/testimages/testorig.jpg; ./cjpeg -revert -sample 2x2 -quality 100 -dct fast -prog -outfile testout_420_q100_ifast_prog.jpg $(srcdir)/testimages/testorig.ppm
md5/md5cmp $(MD5_PPM_INT_15_8) testoutint15_8.ppm; md5/md5cmp $(MD5_JPEG_420_IFAST_Q100_PROG) testout_420_q100_ifast_prog.jpg
./djpeg -dct int -nosmooth -scale 7/4 -ppm -outfile testoutint7_4.ppm $(srcdir)/testimages/testorig.jpg; # CC: YCC->RGB SAMP: fullsize/h2v2 fancy IDCT: ifast ENT: prog huff
md5/md5cmp $(MD5_PPM_INT_7_4) testoutint7_4.ppm; ./djpeg -dct fast -outfile testout_420_q100_ifast.ppm testout_420_q100_ifast_prog.jpg
./djpeg -dct int -nosmooth -scale 13/8 -ppm -outfile testoutint13_8.ppm $(srcdir)/testimages/testorig.jpg; md5/md5cmp $(MD5_PPM_420_Q100_IFAST) testout_420_q100_ifast.ppm
md5/md5cmp $(MD5_PPM_INT_13_8) testoutint13_8.ppm; rm testout_420_q100_ifast.ppm
./djpeg -dct int -nosmooth -scale 3/2 -ppm -outfile testoutint3_2.ppm $(srcdir)/testimages/testorig.jpg; # CC: YCC->RGB SAMP: h2v2 merged IDCT: ifast ENT: prog huff
md5/md5cmp $(MD5_PPM_INT_3_2) testoutint3_2.ppm; ./djpeg -dct fast -nosmooth -outfile testout_420m_q100_ifast.ppm testout_420_q100_ifast_prog.jpg
./djpeg -dct int -nosmooth -scale 11/8 -ppm -outfile testoutint11_8.ppm $(srcdir)/testimages/testorig.jpg; md5/md5cmp $(MD5_PPM_420M_Q100_IFAST) testout_420m_q100_ifast.ppm
md5/md5cmp $(MD5_PPM_INT_11_8) testoutint11_8.ppm; rm testout_420m_q100_ifast.ppm testout_420_q100_ifast_prog.jpg
./djpeg -dct int -nosmooth -scale 5/4 -ppm -outfile testoutint5_4.ppm $(srcdir)/testimages/testorig.jpg;
md5/md5cmp $(MD5_PPM_INT_5_4) testoutint5_4.ppm; # CC: RGB->Gray SAMP: fullsize FDCT: islow ENT: huff
./djpeg -dct int -nosmooth -scale 9/8 -ppm -outfile testoutint9_8.ppm $(srcdir)/testimages/testorig.jpg; ./cjpeg -revert -gray -dct int -outfile testout_gray_islow.jpg $(srcdir)/testimages/testorig.ppm
md5/md5cmp $(MD5_PPM_INT_9_8) testoutint9_8.ppm; md5/md5cmp $(MD5_JPEG_GRAY_ISLOW) testout_gray_islow.jpg
./djpeg -dct int -nosmooth -scale 7/8 -ppm -outfile testoutint7_8.ppm $(srcdir)/testimages/testorig.jpg; # CC: Gray->Gray SAMP: fullsize IDCT: islow ENT: huff
md5/md5cmp $(MD5_PPM_INT_7_8) testoutint7_8.ppm; ./djpeg -dct int -outfile testout_gray_islow.ppm testout_gray_islow.jpg
./djpeg -dct int -nosmooth -scale 3/4 -ppm -outfile testoutint3_4.ppm $(srcdir)/testimages/testorig.jpg; md5/md5cmp $(MD5_PPM_GRAY_ISLOW) testout_gray_islow.ppm
md5/md5cmp $(MD5_PPM_INT_3_4) testoutint3_4.ppm; rm testout_gray_islow.ppm
./djpeg -dct int -nosmooth -scale 5/8 -ppm -outfile testoutint5_8.ppm $(srcdir)/testimages/testorig.jpg; # CC: Gray->RGB SAMP: fullsize IDCT: islow ENT: huff
md5/md5cmp $(MD5_PPM_INT_5_8) testoutint5_8.ppm; ./djpeg -dct int -rgb -outfile testout_gray_islow_rgb.ppm testout_gray_islow.jpg
./djpeg -dct int -nosmooth -scale 1/2 -ppm -outfile testoutint1_2.ppm $(srcdir)/testimages/testorig.jpg; md5/md5cmp $(MD5_PPM_GRAY_ISLOW_RGB) testout_gray_islow_rgb.ppm
md5/md5cmp $(MD5_PPM_INT_1_2) testoutint1_2.ppm; rm testout_gray_islow_rgb.ppm
./djpeg -dct int -nosmooth -scale 3/8 -ppm -outfile testoutint3_8.ppm $(srcdir)/testimages/testorig.jpg; if WITH_12BIT
md5/md5cmp $(MD5_PPM_INT_3_8) testoutint3_8.ppm; rm testout_gray_islow.jpg
./djpeg -dct int -nosmooth -scale 1/4 -ppm -outfile testoutint1_4.ppm $(srcdir)/testimages/testorig.jpg; else
md5/md5cmp $(MD5_PPM_INT_1_4) testoutint1_4.ppm; # CC: Gray->RGB565 SAMP: fullsize IDCT: islow ENT: huff
./djpeg -dct int -nosmooth -scale 1/8 -ppm -outfile testoutint1_8.ppm $(srcdir)/testimages/testorig.jpg; ./djpeg -dct int -rgb565 -dither none -bmp -outfile testout_gray_islow_565.bmp testout_gray_islow.jpg
md5/md5cmp $(MD5_PPM_INT_1_8) testoutint1_8.ppm; md5/md5cmp $(MD5_BMP_GRAY_ISLOW_565) testout_gray_islow_565.bmp
./djpeg -dct fast -scale 1/2 -ppm -outfile testoutfst1_2.ppm $(srcdir)/testimages/testorig.jpg rm testout_gray_islow_565.bmp
md5/md5cmp $(MD5_PPM_FAST_1_2) testoutfst1_2.ppm # CC: Gray->RGB565 (dithered) SAMP: fullsize IDCT: islow ENT: huff
./djpeg -dct int -bmp -colors 256 -outfile testout.bmp $(srcdir)/testimages/testorig.jpg ./djpeg -dct int -rgb565 -bmp -outfile testout_gray_islow_565D.bmp testout_gray_islow.jpg
md5/md5cmp $(MD5_BMP_256) testout.bmp md5/md5cmp $(MD5_BMP_GRAY_ISLOW_565D) testout_gray_islow_565D.bmp
rm testout_gray_islow_565D.bmp testout_gray_islow.jpg
endif
# CC: RGB->YCC SAMP: fullsize smooth/h2v2 smooth FDCT: islow
# ENT: 2-pass huff
./cjpeg -revert -sample 2x2 -smooth 1 -dct int -opt -outfile testout_420s_ifast_opt.jpg $(srcdir)/testimages/testorig.ppm
md5/md5cmp $(MD5_JPEG_420S_IFAST_OPT) testout_420s_ifast_opt.jpg
rm testout_420s_ifast_opt.jpg
# CC: RGB->YCC SAMP: fullsize/int FDCT: float ENT: prog huff
./cjpeg -revert -sample 3x2 -dct float -prog -outfile testout_3x2_float_prog.jpg $(srcdir)/testimages/testorig.ppm
md5/md5cmp $(MD5_JPEG_3x2_FLOAT_PROG) testout_3x2_float_prog.jpg
# CC: YCC->RGB SAMP: fullsize/int IDCT: float ENT: prog huff
./djpeg -dct float -outfile testout_3x2_float.ppm testout_3x2_float_prog.jpg
md5/md5cmp $(MD5_PPM_3x2_FLOAT) testout_3x2_float.ppm
rm testout_3x2_float.ppm testout_3x2_float_prog.jpg
if WITH_ARITH_ENC if WITH_ARITH_ENC
./cjpeg -dct int -arithmetic -outfile testoutari.jpg $(srcdir)/testimages/testorig.ppm # CC: YCC->RGB SAMP: fullsize/h2v2 FDCT: islow ENT: arith
md5/md5cmp $(MD5_JPEG_ARI) testoutari.jpg ./cjpeg -revert -dct int -arithmetic -outfile testout_420_islow_ari.jpg $(srcdir)/testimages/testorig.ppm
./jpegtran -arithmetic -outfile testouta.jpg $(srcdir)/testimages/testimgint.jpg md5/md5cmp $(MD5_JPEG_420_ISLOW_ARI) testout_420_islow_ari.jpg
md5/md5cmp $(MD5_JPEG_ARI) testouta.jpg rm testout_420_islow_ari.jpg
./cjpeg -dct int -progressive -arithmetic -sample 1x1 -outfile testoutpa.jpg $(srcdir)/testimages/testorig.ppm ./jpegtran -revert -arithmetic -outfile testout_420_islow_ari.jpg $(srcdir)/testimages/testimgint.jpg
md5/md5cmp $(MD5_JPEG_PROG_ARI) testoutpa.jpg md5/md5cmp $(MD5_JPEG_420_ISLOW_ARI) testout_420_islow_ari.jpg
rm testout_420_islow_ari.jpg
# CC: YCC->RGB SAMP: fullsize FDCT: islow ENT: prog arith
./cjpeg -revert -sample 1x1 -dct int -progressive -arithmetic -outfile testout_444_islow_progari.jpg $(srcdir)/testimages/testorig.ppm
md5/md5cmp $(MD5_JPEG_444_ISLOW_PROGARI) testout_444_islow_progari.jpg
rm testout_444_islow_progari.jpg
endif endif
if WITH_ARITH_DEC if WITH_ARITH_DEC
./djpeg -dct int -fast -ppm -outfile testoutari.ppm $(srcdir)/testimages/testimgari.jpg # CC: RGB->YCC SAMP: h2v2 merged IDCT: ifast ENT: arith
md5/md5cmp $(MD5_PPM_ARI) testoutari.ppm ./djpeg -fast -ppm -outfile testout_420m_ifast_ari.ppm $(srcdir)/testimages/testimgari.jpg
./jpegtran -outfile testouta.jpg $(srcdir)/testimages/testimgari.jpg md5/md5cmp $(MD5_PPM_420M_IFAST_ARI) testout_420m_ifast_ari.ppm
md5/md5cmp $(MD5_JPEG_INT) testouta.jpg rm testout_420m_ifast_ari.ppm
./jpegtran -revert -outfile testout_420_islow.jpg $(srcdir)/testimages/testimgari.jpg
md5/md5cmp $(MD5_JPEG_420_ISLOW) testout_420_islow.jpg
rm testout_420_islow.jpg
endif endif
./cjpeg -dct int -progressive -outfile testoutp.jpg $(srcdir)/testimages/testorig.ppm
md5/md5cmp $(MD5_JPEG_PROG) testoutp.jpg # CC: YCC->RGB SAMP: h2v2 merged IDCT: 16x16 islow ENT: huff
./jpegtran -outfile testoutt.jpg testoutp.jpg ./djpeg -dct int -scale 2/1 -nosmooth -ppm -outfile testout_420m_islow_2_1.ppm $(srcdir)/testimages/$(TESTORIG)
md5/md5cmp $(MD5_JPEG_INT) testoutt.jpg md5/md5cmp $(MD5_PPM_420M_ISLOW_2_1) testout_420m_islow_2_1.ppm
./jpegtran -crop 120x90+20+50 -transpose -perfect -outfile testoutcrop.jpg $(srcdir)/testimages/testorig.jpg rm testout_420m_islow_2_1.ppm
md5/md5cmp $(MD5_JPEG_CROP) testoutcrop.jpg # CC: YCC->RGB SAMP: h2v2 merged IDCT: 15x15 islow ENT: huff
./djpeg -dct int -scale 15/8 -nosmooth -ppm -outfile testout_420m_islow_15_8.ppm $(srcdir)/testimages/$(TESTORIG)
md5/md5cmp $(MD5_PPM_420M_ISLOW_15_8) testout_420m_islow_15_8.ppm
rm testout_420m_islow_15_8.ppm
# CC: YCC->RGB SAMP: h2v2 merged IDCT: 13x13 islow ENT: huff
./djpeg -dct int -scale 13/8 -nosmooth -ppm -outfile testout_420m_islow_13_8.ppm $(srcdir)/testimages/$(TESTORIG)
md5/md5cmp $(MD5_PPM_420M_ISLOW_13_8) testout_420m_islow_13_8.ppm
rm testout_420m_islow_13_8.ppm
# CC: YCC->RGB SAMP: h2v2 merged IDCT: 11x11 islow ENT: huff
./djpeg -dct int -scale 11/8 -nosmooth -ppm -outfile testout_420m_islow_11_8.ppm $(srcdir)/testimages/$(TESTORIG)
md5/md5cmp $(MD5_PPM_420M_ISLOW_11_8) testout_420m_islow_11_8.ppm
rm testout_420m_islow_11_8.ppm
# CC: YCC->RGB SAMP: h2v2 merged IDCT: 9x9 islow ENT: huff
./djpeg -dct int -scale 9/8 -nosmooth -ppm -outfile testout_420m_islow_9_8.ppm $(srcdir)/testimages/$(TESTORIG)
md5/md5cmp $(MD5_PPM_420M_ISLOW_9_8) testout_420m_islow_9_8.ppm
rm testout_420m_islow_9_8.ppm
# CC: YCC->RGB SAMP: h2v2 merged IDCT: 7x7 islow/14x14 islow ENT: huff
./djpeg -dct int -scale 7/8 -nosmooth -ppm -outfile testout_420m_islow_7_8.ppm $(srcdir)/testimages/$(TESTORIG)
md5/md5cmp $(MD5_PPM_420M_ISLOW_7_8) testout_420m_islow_7_8.ppm
rm testout_420m_islow_7_8.ppm
# CC: YCC->RGB SAMP: h2v2 merged IDCT: 6x6 islow/12x12 islow ENT: huff
./djpeg -dct int -scale 3/4 -nosmooth -ppm -outfile testout_420m_islow_3_4.ppm $(srcdir)/testimages/$(TESTORIG)
md5/md5cmp $(MD5_PPM_420M_ISLOW_3_4) testout_420m_islow_3_4.ppm
rm testout_420m_islow_3_4.ppm
# CC: YCC->RGB SAMP: h2v2 merged IDCT: 5x5 islow/10x10 islow ENT: huff
./djpeg -dct int -scale 5/8 -nosmooth -ppm -outfile testout_420m_islow_5_8.ppm $(srcdir)/testimages/$(TESTORIG)
md5/md5cmp $(MD5_PPM_420M_ISLOW_5_8) testout_420m_islow_5_8.ppm
rm testout_420m_islow_5_8.ppm
# CC: YCC->RGB SAMP: h2v2 merged IDCT: 4x4 islow/8x8 islow ENT: huff
./djpeg -dct int -scale 1/2 -nosmooth -ppm -outfile testout_420m_islow_1_2.ppm $(srcdir)/testimages/$(TESTORIG)
md5/md5cmp $(MD5_PPM_420M_ISLOW_1_2) testout_420m_islow_1_2.ppm
rm testout_420m_islow_1_2.ppm
# CC: YCC->RGB SAMP: h2v2 merged IDCT: 3x3 islow/6x6 islow ENT: huff
./djpeg -dct int -scale 3/8 -nosmooth -ppm -outfile testout_420m_islow_3_8.ppm $(srcdir)/testimages/$(TESTORIG)
md5/md5cmp $(MD5_PPM_420M_ISLOW_3_8) testout_420m_islow_3_8.ppm
rm testout_420m_islow_3_8.ppm
# CC: YCC->RGB SAMP: h2v2 merged IDCT: 2x2 islow/4x4 islow ENT: huff
./djpeg -dct int -scale 1/4 -nosmooth -ppm -outfile testout_420m_islow_1_4.ppm $(srcdir)/testimages/$(TESTORIG)
md5/md5cmp $(MD5_PPM_420M_ISLOW_1_4) testout_420m_islow_1_4.ppm
rm testout_420m_islow_1_4.ppm
# CC: YCC->RGB SAMP: h2v2 merged IDCT: 1x1 islow/2x2 islow ENT: huff
./djpeg -dct int -scale 1/8 -nosmooth -ppm -outfile testout_420m_islow_1_8.ppm $(srcdir)/testimages/$(TESTORIG)
md5/md5cmp $(MD5_PPM_420M_ISLOW_1_8) testout_420m_islow_1_8.ppm
rm testout_420m_islow_1_8.ppm
if WITH_12BIT
else
# CC: YCC->RGB (dithered) SAMP: h2v2 fancy IDCT: islow ENT: huff
./djpeg -dct int -colors 256 -bmp -outfile testout_420_islow_256.bmp $(srcdir)/testimages/$(TESTORIG)
md5/md5cmp $(MD5_BMP_420_ISLOW_256) testout_420_islow_256.bmp
rm testout_420_islow_256.bmp
# CC: YCC->RGB565 SAMP: h2v2 fancy IDCT: islow ENT: huff
./djpeg -dct int -rgb565 -dither none -bmp -outfile testout_420_islow_565.bmp $(srcdir)/testimages/$(TESTORIG)
md5/md5cmp $(MD5_BMP_420_ISLOW_565) testout_420_islow_565.bmp
rm testout_420_islow_565.bmp
# CC: YCC->RGB565 (dithered) SAMP: h2v2 fancy IDCT: islow ENT: huff
./djpeg -dct int -rgb565 -bmp -outfile testout_420_islow_565D.bmp $(srcdir)/testimages/$(TESTORIG)
md5/md5cmp $(MD5_BMP_420_ISLOW_565D) testout_420_islow_565D.bmp
rm testout_420_islow_565D.bmp
# CC: YCC->RGB565 SAMP: h2v2 merged IDCT: islow ENT: huff
./djpeg -dct int -nosmooth -rgb565 -dither none -bmp -outfile testout_420m_islow_565.bmp $(srcdir)/testimages/$(TESTORIG)
md5/md5cmp $(MD5_BMP_420M_ISLOW_565) testout_420m_islow_565.bmp
rm testout_420m_islow_565.bmp
# CC: YCC->RGB565 (dithered) SAMP: h2v2 merged IDCT: islow ENT: huff
./djpeg -dct int -nosmooth -rgb565 -bmp -outfile testout_420m_islow_565D.bmp $(srcdir)/testimages/$(TESTORIG)
md5/md5cmp $(MD5_BMP_420M_ISLOW_565D) testout_420m_islow_565D.bmp
rm testout_420m_islow_565D.bmp
endif
./jpegtran -revert -crop 120x90+20+50 -transpose -perfect -outfile testout_crop.jpg $(srcdir)/testimages/$(TESTORIG)
md5/md5cmp $(MD5_JPEG_CROP) testout_crop.jpg
rm testout_crop.jpg
testclean: testclean:
@@ -335,31 +528,35 @@ testclean:
tjtest: tjtest:
sh ./tjbenchtest sh ./tjbenchtest
sh ./tjbenchtest -alloc
sh ./tjbenchtest -yuv
sh ./tjbenchtest -yuv -alloc
if WITH_JAVA if WITH_JAVA
sh ./tjbenchtest.java sh ./tjbenchtest.java
sh ./tjbenchtest.java -yuv
endif endif
pkgscripts/libmozjpeg.spec: pkgscripts/libmozjpeg.spec.tmpl pkgscripts/mozjpeg.spec: pkgscripts/mozjpeg.spec.tmpl
cat pkgscripts/libmozjpeg.spec.tmpl | sed s@%{__prefix}@$(prefix)@g | \ cat pkgscripts/mozjpeg.spec.tmpl | sed s@%{__prefix}@$(prefix)@g | \
sed s@%{__bindir}@$(bindir)@g | sed s@%{__datadir}@$(datadir)@g | \ sed s@%{__bindir}@$(bindir)@g | sed s@%{__datadir}@$(datadir)@g | \
sed s@%{__docdir}@$(docdir)@g | sed s@%{__includedir}@$(includedir)@g | \ sed s@%{__docdir}@$(docdir)@g | sed s@%{__includedir}@$(includedir)@g | \
sed s@%{__libdir}@$(libdir)@g | sed s@%{__mandir}@$(mandir)@g \ sed s@%{__libdir}@$(libdir)@g | sed s@%{__mandir}@$(mandir)@g \
> pkgscripts/libmozjpeg.spec > pkgscripts/mozjpeg.spec
rpm: all pkgscripts/libmozjpeg.spec rpm: all pkgscripts/mozjpeg.spec
TMPDIR=`mktemp -d /tmp/${PACKAGE_NAME}-build.XXXXXX`; \ TMPDIR=`mktemp -d /tmp/${PACKAGE_NAME}-build.XXXXXX`; \
mkdir -p $$TMPDIR/RPMS; \ mkdir -p $$TMPDIR/RPMS; \
ln -fs `pwd` $$TMPDIR/BUILD; \ ln -fs `pwd` $$TMPDIR/BUILD; \
rm -f ${PKGNAME}-${VERSION}.${RPMARCH}.rpm; \ rm -f ${PKGNAME}-${VERSION}.${RPMARCH}.rpm; \
rpmbuild -bb --define "_blddir $$TMPDIR/buildroot" \ rpmbuild -bb --define "_blddir $$TMPDIR/buildroot" \
--define "_topdir $$TMPDIR" \ --define "_topdir $$TMPDIR" \
--target ${RPMARCH} pkgscripts/libmozjpeg.spec; \ --target ${RPMARCH} pkgscripts/mozjpeg.spec; \
cp $$TMPDIR/RPMS/${RPMARCH}/${PKGNAME}-${VERSION}-${BUILD}.${RPMARCH}.rpm \ cp $$TMPDIR/RPMS/${RPMARCH}/${PKGNAME}-${VERSION}-${BUILD}.${RPMARCH}.rpm \
${PKGNAME}-${VERSION}.${RPMARCH}.rpm; \ ${PKGNAME}-${VERSION}.${RPMARCH}.rpm; \
rm -rf $$TMPDIR rm -rf $$TMPDIR
srpm: dist-gzip pkgscripts/libmozjpeg.spec srpm: dist-gzip pkgscripts/mozjpeg.spec
TMPDIR=`mktemp -d /tmp/${PACKAGE_NAME}-build.XXXXXX`; \ TMPDIR=`mktemp -d /tmp/${PACKAGE_NAME}-build.XXXXXX`; \
mkdir -p $$TMPDIR/RPMS; \ mkdir -p $$TMPDIR/RPMS; \
mkdir -p $$TMPDIR/SRPMS; \ mkdir -p $$TMPDIR/SRPMS; \
@@ -368,10 +565,10 @@ srpm: dist-gzip pkgscripts/libmozjpeg.spec
mkdir -p $$TMPDIR/SPECS; \ mkdir -p $$TMPDIR/SPECS; \
rm -f ${PKGNAME}-${VERSION}.src.rpm; \ rm -f ${PKGNAME}-${VERSION}.src.rpm; \
cp ${PACKAGE_NAME}-${VERSION}.tar.gz $$TMPDIR/SOURCES; \ cp ${PACKAGE_NAME}-${VERSION}.tar.gz $$TMPDIR/SOURCES; \
cat pkgscripts/libmozjpeg.spec | sed s/%{_blddir}/%{_tmppath}/g \ cat pkgscripts/mozjpeg.spec | sed s/%{_blddir}/%{_tmppath}/g \
| sed s/#--\>//g \ | sed s/#--\>//g \
> $$TMPDIR/SPECS/libmozjpeg.spec; \ > $$TMPDIR/SPECS/mozjpeg.spec; \
rpmbuild -bs --define "_topdir $$TMPDIR" $$TMPDIR/SPECS/libmozjpeg.spec; \ rpmbuild -bs --define "_topdir $$TMPDIR" $$TMPDIR/SPECS/mozjpeg.spec; \
cp $$TMPDIR/SRPMS/${PKGNAME}-${VERSION}-${BUILD}.src.rpm \ cp $$TMPDIR/SRPMS/${PKGNAME}-${VERSION}-${BUILD}.src.rpm \
${PKGNAME}-${VERSION}.src.rpm; \ ${PKGNAME}-${VERSION}.src.rpm; \
rm -rf $$TMPDIR rm -rf $$TMPDIR

9
README
View File

@@ -36,7 +36,6 @@ TO DO Plans for future IJG releases.
Other documentation files in the distribution are: Other documentation files in the distribution are:
User documentation: User documentation:
install.txt How to configure and install the IJG software.
usage.txt Usage instructions for cjpeg, djpeg, jpegtran, usage.txt Usage instructions for cjpeg, djpeg, jpegtran,
rdjpgcom, and wrjpgcom. rdjpgcom, and wrjpgcom.
*.1 Unix-style man pages for programs (same info as usage.txt). *.1 Unix-style man pages for programs (same info as usage.txt).
@@ -48,9 +47,9 @@ Programmer and internal documentation:
structure.txt Overview of the JPEG library's internal structure. structure.txt Overview of the JPEG library's internal structure.
coderules.txt Coding style rules --- please read if you contribute code. coderules.txt Coding style rules --- please read if you contribute code.
Please read at least the files install.txt and usage.txt. Some information Please read at least usage.txt. Some information can also be found in the JPEG
can also be found in the JPEG FAQ (Frequently Asked Questions) article. See FAQ (Frequently Asked Questions) article. See ARCHIVE LOCATIONS below to find
ARCHIVE LOCATIONS below to find out where to obtain the FAQ article. out where to obtain the FAQ article.
If you want to understand how the JPEG code works, we suggest reading one or 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 more of the REFERENCES, then looking at the documentation files (in roughly
@@ -62,7 +61,7 @@ OVERVIEW
This package contains C software to implement JPEG image encoding, decoding, This package contains C software to implement JPEG image encoding, decoding,
and transcoding. JPEG (pronounced "jay-peg") is a standardized compression and transcoding. JPEG (pronounced "jay-peg") is a standardized compression
method for full-color and gray-scale images. JPEG's strong suit is compressing method for full-color and grayscale images. JPEG's strong suit is compressing
photographic images or other types of images that have smooth color and photographic images or other types of images that have smooth color and
brightness transitions between neighboring pixels. Images with sharp lines or brightness transitions between neighboring pixels. Images with sharp lines or
other abrupt features may not compress well with JPEG, and a higher JPEG other abrupt features may not compress well with JPEG, and a higher JPEG

View File

@@ -0,0 +1,194 @@
Mozilla JPEG Encoder Project
============================
mozjpeg is a fork of libjpeg-turbo that aims to speed up load times of web
pages by reducing the size (and, by extension, the transmission time) of JPEG
files. It accomplishes this by enabling optimized Huffman trees and
progressive entropy coding by default in the JPEG compressor, as well as
splitting the spectrum of DCT coefficients into separate scans and using
Trellis quantisation.
Although it is based on libjpeg-turbo, mozjpeg is not intended to be a
general-purpose or high-performance JPEG library. Its performance is highly
"asymmetric". That is, the JPEG files it generates require much more time to
compress than to decompress. When the default settings are used, mozjpeg is
considerably slower than libjpeg-turbo or even libjpeg at compressing images.
Thus, it is not generally suitable for real-time compression. It is best used
as part of a web encoding workflow.
libjpeg API Extensibility Framework
===================================
mozjpeg's implementation of the libjpeg API includes an extensibility framework
that allows new features to be added without modifying the transparent libjpeg
compress/decompress structures (which would break backward ABI compatibility.)
Extension parameters are placed into the opaque jpeg_comp_master structure, and
a set of accessor functions and globally unique tokens allows for
getting/setting those parameters without directly accessing the structure.
Currently, only the accessor functions necessary to support the mozjpeg
extensions are implemented, but the framework can be easily extended in the
future to accommodate additional simple parameter types, complex or
multi-valued parameters, or decompressor extensions.
The currently-implemented accessor functions are as follows:
boolean jpeg_c_bool_param_supported (j_compress_ptr cinfo,
J_BOOLEAN_PARAM param)
Returns TRUE if the given boolean extension parameter is supported by
this implementation of the libjpeg API, or FALSE otherwise.
void jpeg_c_set_bool_param (j_compress_ptr cinfo,
J_BOOLEAN_PARAM param, boolean value);
Set the given boolean extension parameter to the given value (TRUE or
FALSE.)
boolean jpeg_c_get_bool_param (j_compress_ptr cinfo, J_BOOLEAN_PARAM param)
Get the value of the given boolean extension parameter (TRUE or FALSE.)
boolean jpeg_c_float_param_supported (j_compress_ptr cinfo,
J_FLOAT_PARAM param)
Returns TRUE if the given floating point extension parameter is
supported by this implementation of the libjpeg API, or FALSE
otherwise.
void jpeg_c_set_float_param (j_compress_ptr cinfo, J_FLOAT_PARAM param,
float value)
Set the given floating point extension parameter to the given value.
float jpeg_c_get_float_param (j_compress_ptr cinfo, J_FLOAT_PARAM param);
Get the value of the given floating point extension parameter.
boolean jpeg_c_int_param_supported (j_compress_ptr cinfo,
J_INT_PARAM param)
Returns TRUE if the given integer extension parameter is supported by
this implementation of the libjpeg API, or FALSE otherwise.
void jpeg_c_set_int_param (j_compress_ptr cinfo, J_INT_PARAM param,
int value)
Set the given integer extension parameter to the given value.
int jpeg_c_get_int_param (j_compress_ptr cinfo, J_INT_PARAM param)
Get the value of the given integer extension parameter.
Boolean Extension Parameters Supported by mozjpeg
-------------------------------------------------
* JBOOLEAN_OPTIMIZE_SCANS (default: TRUE)
Specifies whether scan parameters should be optimized. Parameter
optimization is done as in jpgcrush. jpeg_simple_progression() should be called
after setting JBOOLEAN_OPTIMIZE_SCANS.
When disabling JBOOLEAN_OPTIMIZE_SCANS, cinfo.scan_info should additionally be
set to NULL to disable use of the progressive coding mode, if so desired.
* JBOOLEAN_TRELLIS_QUANT (default: TRUE)
Specifies whether to apply trellis quantization. For each 8x8 block, trellis
quantization determines the best tradeoff between rate and distortion.
* JBOOLEAN_TRELLIS_QUANT_DC (default: TRUE)
Specifies whether to apply trellis quantization to DC coefficients.
* JBOOLEAN_TRELLIS_EOB_OPT (default: FALSE)
Specifies whether to optimize runs of zero blocks in trellis quantization.
This is applicable only when JBOOLEAN_USE_SCANS_IN_TRELLIS is enabled.
* JBOOLEAN_USE_LAMBDA_WEIGHT_TBL currently has no effect.
* JBOOLEAN_USE_SCANS_IN_TRELLIS (default: FALSE)
Specifies whether multiple scans should be considered during trellis
quantization.
* JBOOLEAN_TRELLIS_Q_OPT (default: FALSE)
Specifies whether to optimize the quantization table after trellis
quantization. If enabled, then a revised quantization table is derived so
as to minimize the reconstruction error of the quantized coefficients.
* JBOOLEAN_OVERSHOOT_DERINGING (default: TRUE)
Specifies whether overshooting is applied to samples with extreme values
(for example, 0 and 255 for 8-bit samples). Overshooting may reduce ringing
artifacts from compression, in particular in areas where black text appears
on a white background.
Floating Point Extension Parameters Supported by mozjpeg
--------------------------------------------------------
* JFLOAT_LAMBDA_LOG_SCALE1 (default: 14.75)
JFLOAT_LAMBDA_LOG_SCALE2 (default: 16.5)
These parameters specify the lambda value used in trellis quantization. The
lambda value (Lagrange multiplier) in the
R + lambda * D
equation is derived from
lambda = 2^s1 / ((2^s2 + n) * q^2),
where s1 and s2 are the values of JFLOAT_LAMBDA_LOG_SCALE1 and
JFLOAT_LAMBDA_LOG_SCALE2, n is the average of the squared unquantized AC
coefficients within the current 8x8 block, and q is the quantization table
entry associated with the current coefficient frequency. If
JFLOAT_LAMBDA_LOG_SCALE2 is 0, then an alternate form is used that does not
rely on n:
lambda = 2^(s1-12) / q^2.
* JFLOAT_TRELLIS_DELTA_DC_WEIGHT (default: 0.0)
This parameter controls how distortion is calculated in DC trellis quantization
(enabled with JBOOLEAN_TRELLIS_QUANT_DC). It defines weighting between distortion
of the DC coefficient and distortion of the vertical gradient of DC coefficients.
The value of the parameter corresponds to the weight applied to the distortion
of the vertical gradient.
Integer Extension Parameters Supported by mozjpeg
-------------------------------------------------
* JINT_COMPRESS_PROFILE (default: JCP_MAX_COMPRESSION)
Select a compression profile, which is a set of default parameters that will
achieve a desired compression goal. This parameter controls the behavior of
the jpeg_set_defaults() function. Thus, setting JINT_COMPRESS_PROFILE does
not cause any other parameters to be modified until jpeg_set_defaults() is
called. The following compression profiles are supported:
- JCP_MAX_COMPRESSION (default)
Increase the compression ratio as much as possible, at the expense of
increased encoding time. This enables progressive entropy coding and all
mozjpeg extensions.
- JCP_FASTEST
Use the libjpeg[-turbo] defaults (baseline entropy coding, no mozjpeg
extensions enabled.)
* JINT_TRELLIS_FREQ_SPLIT (default: 8)
Specifies the position within the zigzag scan at which the split between
scans is positioned in the context of trellis quantization.
JBOOLEAN_USE_SCANS_IN_TRELLIS must be enabled for this parameter to have any
effect.
* JINT_TRELLIS_NUM_LOOPS (default: 1)
Specifies the number of trellis quantization passes. Huffman tables are
updated between passes.
* JINT_BASE_QUANT_TBL_IDX (default: 3)
Specifies which quantization table set to use. The following options are
available:
0 = Tables from JPEG Annex K
1 = Flat table
2 = Table tuned for MSSIM on Kodak image set
3 = Table from http://www.imagemagick.org/discourse-server/viewtopic.php?f=22&t=20333&p=98008#p98008
4 = Table tuned for PSNR-HVS-M on Kodak image set
5 = Table from: Relevance of Human Vision to JPEG-DCT Compression
(1992) Klein, Silverstein and Carney
6 = Table from: DCTune Perceptual Optimization of Compressed Dental X-Rays
(1997) Watson, Taylor, Borthwick
7 = Table from: A Visual Detection Model for DCT Coefficient Quantization
(12/9/93) Ahumada, Watson, Peterson
8 = Table from: An Improved Detection Model for DCT Coefficient Quantization
(1993) Peterson, Ahumada and Watson
* JINT_DC_SCAN_OPT_MODE (default: 1)
Specifies the DC scan optimization mode. The following options are
available:
0 = One scan for all components
1 = One scan per component
2 = Optimize between one scan for all components and one scan for the first
component plus one scan for the remaining components

162
README-turbo.txt Executable file → Normal file
View File

@@ -81,131 +81,6 @@ JPEG images:
There is no significant performance advantage to either API when both are used There is no significant performance advantage to either API when both are used
to perform similar operations. to perform similar operations.
======================
Installation Directory
======================
This document assumes that libjpeg-turbo will be installed in the default
directory (/opt/libjpeg-turbo on Un*x and Mac systems and
c:\libjpeg-turbo[-gcc][64] on Windows systems. If your installation of
libjpeg-turbo resides in a different directory, then adjust the instructions
accordingly.
=============================
Replacing libjpeg at Run Time
=============================
Un*x
----
If a Un*x application is dynamically linked with libjpeg, then you can replace
libjpeg with libjpeg-turbo at run time by manipulating LD_LIBRARY_PATH.
For instance:
[Using libjpeg]
> time cjpeg <vgl_5674_0098.ppm >vgl_5674_0098.jpg
real 0m0.392s
user 0m0.074s
sys 0m0.020s
[Using libjpeg-turbo]
> export LD_LIBRARY_PATH=/opt/libjpeg-turbo/{lib}:$LD_LIBRARY_PATH
> time cjpeg <vgl_5674_0098.ppm >vgl_5674_0098.jpg
real 0m0.109s
user 0m0.029s
sys 0m0.010s
({lib} = lib32 or lib64, depending on whether you wish to use the 32-bit or the
64-bit version of libjpeg-turbo.)
System administrators can also replace the libjpeg symlinks in /usr/lib* with
links to the libjpeg-turbo dynamic library located in /opt/libjpeg-turbo/{lib}.
This will effectively accelerate every application that uses the libjpeg
dynamic library on the system.
Windows
-------
If a Windows application is dynamically linked with libjpeg, then you can
replace libjpeg with libjpeg-turbo at run time by backing up the application's
copy of jpeg62.dll, jpeg7.dll, or jpeg8.dll (assuming the application has its
own local copy of this library) and copying the corresponding DLL from
libjpeg-turbo into the application's install directory. The official
libjpeg-turbo binary packages only provide jpeg62.dll. If the application uses
jpeg7.dll or jpeg8.dll instead, then it will be necessary to build
libjpeg-turbo from source (see "libjpeg v7 and v8 API/ABI Emulation" below.)
The following information is specific to the official libjpeg-turbo binary
packages for Visual C++:
-- jpeg62.dll requires the Visual C++ 2008 C run-time DLL (msvcr90.dll).
msvcr90.dll ships with more recent versions of Windows, but users of older
Windows releases can obtain it from the Visual C++ 2008 Redistributable
Package, which is available as a free download from Microsoft's web site.
-- Features of the libjpeg API that require passing a C run-time structure,
such as a file handle, from an application to the library will probably not
work with jpeg62.dll, unless the application is also built to use the Visual
C++ 2008 C run-time DLL. In particular, this affects jpeg_stdio_dest() and
jpeg_stdio_src().
Mac
---
Mac applications typically embed their own copies of the libjpeg dylib inside
the (hidden) application bundle, so it is not possible to globally replace
libjpeg on OS X systems. Replacing the application's version of the libjpeg
dylib would generally involve copying libjpeg.*.dylib from libjpeg-turbo into
the appropriate place in the application bundle and using install_name_tool to
repoint the libjpeg-turbo dylib to its new directory. This requires an
advanced knowledge of OS X and would not survive an upgrade or a re-install of
the application. Thus, it is not recommended for most users.
========================================
Using libjpeg-turbo in Your Own Programs
========================================
For the most part, libjpeg-turbo should work identically to libjpeg, so in
most cases, an application can be built against libjpeg and then run against
libjpeg-turbo. On Un*x systems and Cygwin, you can build against libjpeg-turbo
instead of libjpeg by setting
CPATH=/opt/libjpeg-turbo/include
and
LIBRARY_PATH=/opt/libjpeg-turbo/{lib}
({lib} = lib32 or lib64, depending on whether you are building a 32-bit or a
64-bit application.)
If using MinGW, then set
CPATH=/c/libjpeg-turbo-gcc[64]/include
and
LIBRARY_PATH=/c/libjpeg-turbo-gcc[64]/lib
Building against libjpeg-turbo is useful, for instance, if you want to build an
application that leverages the libjpeg-turbo colorspace extensions (see below.)
On Un*x systems, you would still need to manipulate LD_LIBRARY_PATH or create
appropriate symlinks to use libjpeg-turbo at run time. On such systems, you
can pass -R /opt/libjpeg-turbo/{lib} to the linker to force the use of
libjpeg-turbo at run time rather than libjpeg (also useful if you want to
leverage the colorspace extensions), or you can link against the libjpeg-turbo
static library.
To force a Un*x or MinGW application to link against the static version of
libjpeg-turbo, you can use the following linker options:
-Wl,-Bstatic -ljpeg -Wl,-Bdynamic
On OS X, simply add /opt/libjpeg-turbo/lib/libjpeg.a to the linker command
line.
To build Visual C++ applications using libjpeg-turbo, add
c:\libjpeg-turbo[64]\include to the system or user INCLUDE environment
variable and c:\libjpeg-turbo[64]\lib to the system or user LIB environment
variable, and then link against either jpeg.lib (to use the DLL version of
libjpeg-turbo) or jpeg-static.lib (to use the static version of libjpeg-turbo.)
===================== =====================
Colorspace Extensions Colorspace Extensions
===================== =====================
@@ -265,7 +140,7 @@ compression and decompression structures. Unfortunately, due to the exposed
nature of those structures, extending them also necessitated breaking backward nature of those structures, extending them also necessitated breaking backward
ABI compatibility with previous libjpeg releases. Thus, programs that were ABI compatibility with previous libjpeg releases. Thus, programs that were
built to use libjpeg v7 or v8 did not work with libjpeg-turbo, since it is built to use libjpeg v7 or v8 did not work with libjpeg-turbo, since it is
based on the libjpeg v6b code base. Although libjpeg v7 and v8 are still not based on the libjpeg v6b code base. Although libjpeg v7 and v8 are not
as widely used as v6b, enough programs (including a few Linux distros) made as widely used as v6b, enough programs (including a few Linux distros) made
the switch that there was a demand to emulate the libjpeg v7 and v8 ABIs the switch that there was a demand to emulate the libjpeg v7 and v8 ABIs
in libjpeg-turbo. It should be noted, however, that this feature was added in libjpeg-turbo. It should be noted, however, that this feature was added
@@ -419,10 +294,25 @@ details.
For the most part, libjpeg-turbo should produce identical output to libjpeg For the most part, libjpeg-turbo should produce identical output to libjpeg
v6b. The one exception to this is when using the floating point DCT/IDCT, in v6b. The one exception to this is when using the floating point DCT/IDCT, in
which case the outputs of libjpeg v6b and libjpeg-turbo are not guaranteed to which case the outputs of libjpeg v6b and libjpeg-turbo can differ for the
be identical (the accuracy of the floating point DCT/IDCT is constant when following reasons:
using libjpeg-turbo's SIMD extensions, but otherwise, it can depend heavily on
the compiler and compiler settings.) -- The SSE/SSE2 floating point DCT implementation in libjpeg-turbo is ever so
slightly more accurate than the implementation in libjpeg v6b, but not by
any amount perceptible to human vision (generally in the range of 0.01 to
0.08 dB gain in PNSR.)
-- When not using the SIMD extensions, libjpeg-turbo uses the more accurate
(and slightly faster) floating point IDCT algorithm introduced in libjpeg
v8a as opposed to the algorithm used in libjpeg v6b. It should be noted,
however, that this algorithm basically brings the accuracy of the floating
point IDCT in line with the accuracy of the slow integer IDCT. The floating
point DCT/IDCT algorithms are mainly a legacy feature, and they do not
produce significantly more accuracy than the slow integer algorithms (to put
numbers on this, the typical difference in PNSR between the two algorithms
is less than 0.10 dB, whereas changing the quality level by 1 in the upper
range of the quality scale is typically more like a 1.0 dB difference.)
-- When not using the SIMD extensions, then the accuracy of the floating point
DCT/IDCT can depend on the compiler and compiler settings.
While libjpeg-turbo does emulate the libjpeg v8 API/ABI, under the hood, it is While libjpeg-turbo does emulate the libjpeg v8 API/ABI, under the hood, it is
still using the same algorithms as libjpeg v6b, so there are several specific still using the same algorithms as libjpeg v6b, so there are several specific
@@ -430,16 +320,14 @@ cases in which libjpeg-turbo cannot be expected to produce the same output as
libjpeg v8: libjpeg v8:
-- When decompressing using scaling factors of 1/2 and 1/4, because libjpeg v8 -- When decompressing using scaling factors of 1/2 and 1/4, because libjpeg v8
implements those scaling algorithms a bit differently than libjpeg v6b does, implements those scaling algorithms differently than libjpeg v6b does, and
and libjpeg-turbo's SIMD extensions are based on the libjpeg v6b behavior. libjpeg-turbo's SIMD extensions are based on the libjpeg v6b behavior.
-- When using chrominance subsampling, because libjpeg v8 implements this -- When using chrominance subsampling, because libjpeg v8 implements this
with its DCT/IDCT scaling algorithms rather than with a separate with its DCT/IDCT scaling algorithms rather than with a separate
downsampling/upsampling algorithm. downsampling/upsampling algorithm. In our testing, the subsampled/upsampled
output of libjpeg v8 is less accurate than that of libjpeg v6b for this
-- When using the floating point IDCT, for the reasons stated above and also reason.
because the floating point IDCT algorithm was modified in libjpeg v8a to
improve accuracy.
-- When decompressing using a scaling factor > 1 and merged (AKA "non-fancy" or -- When decompressing using a scaling factor > 1 and merged (AKA "non-fancy" or
"non-smooth") chrominance upsampling, because libjpeg v8 does not support "non-smooth") chrominance upsampling, because libjpeg v8 does not support

View File

@@ -7,6 +7,8 @@ The idea is to reduce transfer times for JPEGs on the Web, thus reducing page lo
'mozjpeg' is not intended to be a general JPEG library replacement. It makes tradeoffs that are intended to benefit Web use cases and focuses solely on improving encoding. It is best used as part of a Web encoding workflow. For a general JPEG library (e.g. your system libjpeg), especially if you care about decoding, we recommend libjpeg-turbo. 'mozjpeg' is not intended to be a general JPEG library replacement. It makes tradeoffs that are intended to benefit Web use cases and focuses solely on improving encoding. It is best used as part of a Web encoding workflow. For a general JPEG library (e.g. your system libjpeg), especially if you care about decoding, we recommend libjpeg-turbo.
For more information, see the project announcement: More information:
https://blog.mozilla.org/research/2014/03/05/introducing-the-mozjpeg-project/ * [Version 1.0 Announcement](https://blog.mozilla.org/research/2014/03/05/introducing-the-mozjpeg-project/)
* [Version 2.0 Announcement](https://blog.mozilla.org/research/2014/07/15/mozilla-advances-jpeg-encoding-with-mozjpeg-2-0/)
* [Mailing List](https://lists.mozilla.org/listinfo/dev-mozjpeg)</a>

View File

@@ -184,7 +184,7 @@ AC_DEFUN([AC_CHECK_COMPATIBLE_ARM_ASSEMBLER_IFELSE],[
# AC_CHECK_COMPATIBLE_MIPSEL_ASSEMBLER_IFELSE # AC_CHECK_COMPATIBLE_MIPSEL_ASSEMBLER_IFELSE
# -------------------------- # --------------------------
# Test whether the assembler is suitable and supports MIPS instructions # Test whether the assembler is suitable and supports MIPS instructions
AC_DEFUN([AC_CHECK_COMPATIBLE_MIPSEL_ASSEMBLER_IFELSE],[ AC_DEFUN([AC_CHECK_COMPATIBLE_MIPS_ASSEMBLER_IFELSE],[
have_mips_dspr2=no have_mips_dspr2=no
ac_save_CFLAGS="$CFLAGS" ac_save_CFLAGS="$CFLAGS"
CFLAGS="$CCASFLAGS -mdspr2" CFLAGS="$CCASFLAGS -mdspr2"
@@ -210,3 +210,38 @@ AC_DEFUN([AC_CHECK_COMPATIBLE_MIPSEL_ASSEMBLER_IFELSE],[
$2 $2
fi fi
]) ])
AC_DEFUN([AC_CHECK_COMPATIBLE_ARM64_ASSEMBLER_IFELSE],[
ac_good_gnu_arm_assembler=no
ac_save_CC="$CC"
ac_save_CFLAGS="$CFLAGS"
CFLAGS="$CCASFLAGS -x assembler-with-cpp"
CC="$CCAS"
AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
.text
.arch armv8-a+fp+simd
movi v0.16b, #100]])], ac_good_gnu_arm_assembler=yes)
ac_use_gas_preprocessor=no
if test "x$ac_good_gnu_arm_assembler" = "xno" ; then
CC="gas-preprocessor.pl $CCAS"
AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
.text
.arch armv8-a+fp+simd
movi v0.16b, #100]])], ac_use_gas_preprocessor=yes)
fi
CFLAGS="$ac_save_CFLAGS"
CC="$ac_save_CC"
if test "x$ac_use_gas_preprocessor" = "xyes" ; then
CCAS="gas-preprocessor.pl $CCAS"
AC_SUBST([CCAS])
ac_good_gnu_arm_assembler=yes
fi
if test "x$ac_good_gnu_arm_assembler" = "xyes" ; then
$1
else
$2
fi
])

View File

@@ -122,6 +122,10 @@ JMESSAGE(JERR_UNKNOWN_FORMAT, "Unrecognized input file format")
#endif #endif
JMESSAGE(JERR_UNSUPPORTED_FORMAT, "Unsupported output file format") JMESSAGE(JERR_UNSUPPORTED_FORMAT, "Unsupported output file format")
#ifdef PNG_SUPPORTED
JMESSAGE(JERR_PNG_ERROR, "Unable to read PNG file: %s")
#endif
#ifdef JMAKE_ENUM_LIST #ifdef JMAKE_ENUM_LIST
JMSG_LASTADDONCODE JMSG_LASTADDONCODE

View File

@@ -1,8 +1,10 @@
/* /*
* cdjpeg.c * cdjpeg.c
* *
* This file was part of the Independent JPEG Group's software:
* Copyright (C) 1991-1997, Thomas G. Lane. * Copyright (C) 1991-1997, Thomas G. Lane.
* This file is part of the Independent JPEG Group's software. * It was modified by The libjpeg-turbo Project to include only code relevant
* to libjpeg-turbo.
* For conditions of distribution and use, see the accompanying README file. * For conditions of distribution and use, see the accompanying README file.
* *
* This file contains common support routines used by the IJG application * This file contains common support routines used by the IJG application
@@ -11,9 +13,6 @@
#include "cdjpeg.h" /* Common decls for cjpeg/djpeg applications */ #include "cdjpeg.h" /* Common decls for cjpeg/djpeg applications */
#include <ctype.h> /* to declare isupper(), tolower() */ #include <ctype.h> /* to declare isupper(), tolower() */
#ifdef NEED_SIGNAL_CATCHER
#include <signal.h> /* to declare signal() */
#endif
#ifdef USE_SETMODE #ifdef USE_SETMODE
#include <fcntl.h> /* to declare setmode()'s parameter macros */ #include <fcntl.h> /* to declare setmode()'s parameter macros */
/* If you have setmode() but not <io.h>, just delete this line: */ /* If you have setmode() but not <io.h>, just delete this line: */
@@ -21,43 +20,6 @@
#endif #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. * Optional progress monitor: display a percent-done figure on stderr.
*/ */

119
cdjpeg.h
View File

@@ -1,8 +1,10 @@
/* /*
* cdjpeg.h * cdjpeg.h
* *
* This file was part of the Independent JPEG Group's software:
* Copyright (C) 1994-1997, Thomas G. Lane. * Copyright (C) 1994-1997, Thomas G. Lane.
* This file is part of the Independent JPEG Group's software. * It was modified by The libjpeg-turbo Project to include only code relevant
* to libjpeg-turbo.
* mozjpeg Modifications: * mozjpeg Modifications:
* Copyright (C) 2014, Mozilla Corporation. * Copyright (C) 2014, Mozilla Corporation.
* For conditions of distribution and use, see the accompanying README file. * For conditions of distribution and use, see the accompanying README file.
@@ -27,12 +29,9 @@
typedef struct cjpeg_source_struct * cjpeg_source_ptr; typedef struct cjpeg_source_struct * cjpeg_source_ptr;
struct cjpeg_source_struct { struct cjpeg_source_struct {
JMETHOD(void, start_input, (j_compress_ptr cinfo, void (*start_input) (j_compress_ptr cinfo, cjpeg_source_ptr sinfo);
cjpeg_source_ptr sinfo)); JDIMENSION (*get_pixel_rows) (j_compress_ptr cinfo, cjpeg_source_ptr sinfo);
JMETHOD(JDIMENSION, get_pixel_rows, (j_compress_ptr cinfo, void (*finish_input) (j_compress_ptr cinfo, cjpeg_source_ptr sinfo);
cjpeg_source_ptr sinfo));
JMETHOD(void, finish_input, (j_compress_ptr cinfo,
cjpeg_source_ptr sinfo));
FILE *input_file; FILE *input_file;
@@ -58,15 +57,12 @@ struct djpeg_dest_struct {
/* start_output is called after jpeg_start_decompress finishes. /* start_output is called after jpeg_start_decompress finishes.
* The color map will be ready at this time, if one is needed. * The color map will be ready at this time, if one is needed.
*/ */
JMETHOD(void, start_output, (j_decompress_ptr cinfo, void (*start_output) (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo);
djpeg_dest_ptr dinfo));
/* Emit the specified number of pixel rows from the buffer. */ /* Emit the specified number of pixel rows from the buffer. */
JMETHOD(void, put_pixel_rows, (j_decompress_ptr cinfo, void (*put_pixel_rows) (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo,
djpeg_dest_ptr dinfo, JDIMENSION rows_supplied);
JDIMENSION rows_supplied));
/* Finish up at the end of the image. */ /* Finish up at the end of the image. */
JMETHOD(void, finish_output, (j_decompress_ptr cinfo, void (*finish_output) (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo);
djpeg_dest_ptr dinfo));
/* Target file spec; filled in by djpeg.c after object is created. */ /* Target file spec; filled in by djpeg.c after object is created. */
FILE * output_file; FILE * output_file;
@@ -99,71 +95,45 @@ struct cdjpeg_progress_mgr {
typedef struct cdjpeg_progress_mgr * cd_progress_ptr; 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_jpeg jIRdJPG
#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. */ /* Module selection routines for I/O modules. */
EXTERN(cjpeg_source_ptr) jinit_read_bmp JPP((j_compress_ptr cinfo)); EXTERN(cjpeg_source_ptr) jinit_read_bmp (j_compress_ptr cinfo);
EXTERN(djpeg_dest_ptr) jinit_write_bmp JPP((j_decompress_ptr cinfo, EXTERN(djpeg_dest_ptr) jinit_write_bmp (j_decompress_ptr cinfo,
boolean is_os2)); boolean is_os2);
EXTERN(cjpeg_source_ptr) jinit_read_gif JPP((j_compress_ptr cinfo)); EXTERN(cjpeg_source_ptr) jinit_read_gif (j_compress_ptr cinfo);
EXTERN(djpeg_dest_ptr) jinit_write_gif JPP((j_decompress_ptr cinfo)); EXTERN(djpeg_dest_ptr) jinit_write_gif (j_decompress_ptr cinfo);
EXTERN(cjpeg_source_ptr) jinit_read_jpeg JPP((j_compress_ptr cinfo)); EXTERN(cjpeg_source_ptr) jinit_read_jpeg (j_compress_ptr cinfo);
EXTERN(cjpeg_source_ptr) jinit_read_ppm JPP((j_compress_ptr cinfo)); EXTERN(cjpeg_source_ptr) jinit_read_ppm (j_compress_ptr cinfo);
EXTERN(djpeg_dest_ptr) jinit_write_ppm JPP((j_decompress_ptr cinfo)); EXTERN(cjpeg_source_ptr) jinit_read_png (j_compress_ptr cinfo);
EXTERN(cjpeg_source_ptr) jinit_read_rle JPP((j_compress_ptr cinfo)); EXTERN(djpeg_dest_ptr) jinit_write_ppm (j_decompress_ptr cinfo);
EXTERN(djpeg_dest_ptr) jinit_write_rle JPP((j_decompress_ptr cinfo)); EXTERN(cjpeg_source_ptr) jinit_read_rle (j_compress_ptr cinfo);
EXTERN(cjpeg_source_ptr) jinit_read_targa JPP((j_compress_ptr cinfo)); EXTERN(djpeg_dest_ptr) jinit_write_rle (j_decompress_ptr cinfo);
EXTERN(djpeg_dest_ptr) jinit_write_targa JPP((j_decompress_ptr cinfo)); EXTERN(cjpeg_source_ptr) jinit_read_targa (j_compress_ptr cinfo);
EXTERN(djpeg_dest_ptr) jinit_write_targa (j_decompress_ptr cinfo);
/* cjpeg support routines (in rdswitch.c) */ /* cjpeg support routines (in rdswitch.c) */
EXTERN(boolean) read_quant_tables JPP((j_compress_ptr cinfo, char * filename, EXTERN(boolean) read_quant_tables (j_compress_ptr cinfo, char * filename,
boolean force_baseline)); boolean force_baseline);
EXTERN(boolean) read_scan_script JPP((j_compress_ptr cinfo, char * filename)); EXTERN(boolean) read_scan_script (j_compress_ptr cinfo, char * filename);
EXTERN(boolean) set_quality_ratings JPP((j_compress_ptr cinfo, char *arg, EXTERN(boolean) set_quality_ratings (j_compress_ptr cinfo, char *arg,
boolean force_baseline)); boolean force_baseline);
EXTERN(boolean) set_quant_slots JPP((j_compress_ptr cinfo, char *arg)); EXTERN(boolean) set_quant_slots (j_compress_ptr cinfo, char *arg);
EXTERN(boolean) set_sample_factors JPP((j_compress_ptr cinfo, char *arg)); EXTERN(boolean) set_sample_factors (j_compress_ptr cinfo, char *arg);
/* djpeg support routines (in rdcolmap.c) */ /* djpeg support routines (in rdcolmap.c) */
EXTERN(void) read_color_map JPP((j_decompress_ptr cinfo, FILE * infile)); EXTERN(void) read_color_map (j_decompress_ptr cinfo, FILE * infile);
/* common support routines (in cdjpeg.c) */ /* common support routines (in cdjpeg.c) */
EXTERN(void) enable_signal_catcher JPP((j_common_ptr cinfo)); EXTERN(void) enable_signal_catcher (j_common_ptr cinfo);
EXTERN(void) start_progress_monitor JPP((j_common_ptr cinfo, EXTERN(void) start_progress_monitor (j_common_ptr cinfo,
cd_progress_ptr progress)); cd_progress_ptr progress);
EXTERN(void) end_progress_monitor JPP((j_common_ptr cinfo)); EXTERN(void) end_progress_monitor (j_common_ptr cinfo);
EXTERN(boolean) keymatch JPP((char * arg, const char * keyword, int minchars)); EXTERN(boolean) keymatch (char * arg, const char * keyword, int minchars);
EXTERN(FILE *) read_stdin JPP((void)); EXTERN(FILE *) read_stdin (void);
EXTERN(FILE *) write_stdout JPP((void)); EXTERN(FILE *) write_stdout (void);
/* miscellaneous useful macros */ /* miscellaneous useful macros */
@@ -171,29 +141,16 @@ EXTERN(FILE *) write_stdout JPP((void));
#define READ_BINARY "r" #define READ_BINARY "r"
#define WRITE_BINARY "w" #define WRITE_BINARY "w"
#else #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 READ_BINARY "rb"
#define WRITE_BINARY "wb" #define WRITE_BINARY "wb"
#endif #endif
#endif
#ifndef EXIT_FAILURE /* define exit() codes if not provided */ #ifndef EXIT_FAILURE /* define exit() codes if not provided */
#define EXIT_FAILURE 1 #define EXIT_FAILURE 1
#endif #endif
#ifndef EXIT_SUCCESS #ifndef EXIT_SUCCESS
#ifdef VMS
#define EXIT_SUCCESS 1 /* VMS is very nonstandard */
#else
#define EXIT_SUCCESS 0 #define EXIT_SUCCESS 0
#endif #endif
#endif
#ifndef EXIT_WARNING #ifndef EXIT_WARNING
#ifdef VMS
#define EXIT_WARNING 1 /* VMS is very nonstandard */
#else
#define EXIT_WARNING 2 #define EXIT_WARNING 2
#endif #endif
#endif

30
cjpeg.1
View File

@@ -1,4 +1,4 @@
.TH CJPEG 1 "18 January 2013" .TH CJPEG 1 "21 November 2014"
.SH NAME .SH NAME
cjpeg \- compress an image file to a JPEG file cjpeg \- compress an image file to a JPEG file
.SH SYNOPSIS .SH SYNOPSIS
@@ -16,7 +16,7 @@ cjpeg \- compress an image file to a JPEG file
compresses the named image file, or the standard input if no file is compresses the named image file, or the standard input if no file is
named, and produces a JPEG/JFIF file on the standard output. named, and produces a JPEG/JFIF file on the standard output.
The currently supported input file formats are: PPM (PBMPLUS color The currently supported input file formats are: PPM (PBMPLUS color
format), PGM (PBMPLUS gray-scale format), BMP, Targa, and RLE (Utah Raster format), PGM (PBMPLUS grayscale format), BMP, Targa, and RLE (Utah Raster
Toolkit format). (RLE is supported only if the URT library is available.) Toolkit format). (RLE is supported only if the URT library is available.)
.SH OPTIONS .SH OPTIONS
All switch names may be abbreviated; for example, All switch names may be abbreviated; for example,
@@ -166,14 +166,27 @@ Use integer DCT method (default).
.TP .TP
.B \-dct fast .B \-dct fast
Use fast integer DCT (less accurate). Use fast integer DCT (less accurate).
In libjpeg-turbo, the fast method is generally about 5-15% faster than the int
method when using the x86/x86-64 SIMD extensions (results may vary with other
SIMD implementations, or when using libjpeg-turbo without SIMD extensions.)
For quality levels of 90 and below, there should be little or no perceptible
difference between the two algorithms. For quality levels above 90, however,
the difference between the fast and the int methods becomes more pronounced.
With quality=97, for instance, the fast method incurs generally about a 1-3 dB
loss (in PSNR) relative to the int method, but this can be larger for some
images. Do not use the fast method with quality levels above 97. The
algorithm often degenerates at quality=98 and above and can actually produce a
more lossy image than if lower quality levels had been used. Also, in
libjpeg-turbo, the fast method is not fully accelerated for quality levels
above 97, so it will be slower than the int method.
.TP .TP
.B \-dct float .B \-dct float
Use floating-point DCT method. Use floating-point DCT method.
The float method is very slightly more accurate than the int method, but is The float method is mainly a legacy feature. It does not produce significantly
much slower unless your machine has very fast floating-point hardware. Also more accurate results than the int method, and it is much slower. The float
note that results of the floating-point method may vary slightly across method may also give different results on different machines due to varying
machines, while the integer methods should give the same results everywhere. roundoff behavior, whereas the integer methods should give the same results on
The fast integer method is much less accurate than the other two. all machines.
.TP .TP
.BI \-restart " N" .BI \-restart " N"
Emit a JPEG restart marker every N MCU rows, or every N MCU blocks if "B" is Emit a JPEG restart marker every N MCU rows, or every N MCU blocks if "B" is
@@ -208,6 +221,9 @@ give more output. Also, version information is printed at startup.
.B \-debug .B \-debug
Same as Same as
.BR \-verbose . .BR \-verbose .
.TP
.B \-version
Print version information and exit.
.PP .PP
The The
.B \-restart .B \-restart

162
cjpeg.c
View File

@@ -5,7 +5,7 @@
* Copyright (C) 1991-1998, Thomas G. Lane. * Copyright (C) 1991-1998, Thomas G. Lane.
* Modified 2003-2011 by Guido Vollbeding. * Modified 2003-2011 by Guido Vollbeding.
* libjpeg-turbo Modifications: * libjpeg-turbo Modifications:
* Copyright (C) 2010, 2013, D. R. Commander. * Copyright (C) 2010, 2013-2014, D. R. Commander.
* mozjpeg Modifications: * mozjpeg Modifications:
* Copyright (C) 2014, Mozilla Corporation. * Copyright (C) 2014, Mozilla Corporation.
* For conditions of distribution and use, see the accompanying README file. * For conditions of distribution and use, see the accompanying README file.
@@ -30,7 +30,7 @@
#include "cdjpeg.h" /* Common decls for cjpeg/djpeg applications */ #include "cdjpeg.h" /* Common decls for cjpeg/djpeg applications */
#include "jversion.h" /* for version message */ #include "jversion.h" /* for version message */
#include "config.h" #include "jconfigint.h"
#ifdef USE_CCOMMAND /* command-line reader for Macintosh */ #ifdef USE_CCOMMAND /* command-line reader for Macintosh */
#ifdef __MWERKS__ #ifdef __MWERKS__
@@ -113,6 +113,10 @@ select_file_type (j_compress_ptr cinfo, FILE * infile)
case 'P': case 'P':
return jinit_read_ppm(cinfo); return jinit_read_ppm(cinfo);
#endif #endif
#ifdef PNG_SUPPORTED
case 0x89:
return jinit_read_png(cinfo);
#endif
#ifdef RLE_SUPPORTED #ifdef RLE_SUPPORTED
case 'R': case 'R':
return jinit_read_rle(cinfo); return jinit_read_rle(cinfo);
@@ -168,18 +172,26 @@ usage (void)
#ifdef C_PROGRESSIVE_SUPPORTED #ifdef C_PROGRESSIVE_SUPPORTED
fprintf(stderr, " -progressive Create progressive JPEG file (enabled by default)\n"); fprintf(stderr, " -progressive Create progressive JPEG file (enabled by default)\n");
#endif #endif
fprintf(stderr, " -baseline Create baseline JPEG file (disable progressive coding)\n");
#ifdef TARGA_SUPPORTED #ifdef TARGA_SUPPORTED
fprintf(stderr, " -targa Input file is Targa format (usually not needed)\n"); fprintf(stderr, " -targa Input file is Targa format (usually not needed)\n");
#endif #endif
fprintf(stderr, " -revert Revert to standard defaults (instead of mozjpeg defaults)\n"); fprintf(stderr, " -revert Revert to standard defaults (instead of mozjpeg defaults)\n");
fprintf(stderr, " -fastcrush Disable progressive scan optimization\n"); fprintf(stderr, " -fastcrush Disable progressive scan optimization\n");
fprintf(stderr, " -multidcscan Use multiple DC scans (may be incompatible with some JPEG decoders)\n"); fprintf(stderr, " -dc-scan-opt DC scan optimization mode\n");
fprintf(stderr, " - 0 One scan for all components\n");
fprintf(stderr, " - 1 One scan per component (default)\n");
fprintf(stderr, " - 2 Optimize between one scan for all components and one scan for 1st component\n");
fprintf(stderr, " plus one scan for remaining components\n");
fprintf(stderr, " -notrellis Disable trellis optimization\n"); fprintf(stderr, " -notrellis Disable trellis optimization\n");
fprintf(stderr, " -trellis-dc Enable trellis optimization of DC coefficients (default)\n");
fprintf(stderr, " -notrellis-dc Disable trellis optimization of DC coefficients\n");
fprintf(stderr, " -tune-psnr Tune trellis optimization for PSNR\n"); fprintf(stderr, " -tune-psnr Tune trellis optimization for PSNR\n");
fprintf(stderr, " -tune-hvs-psnr Tune trellis optimization for PSNR-HVS (default)\n"); fprintf(stderr, " -tune-hvs-psnr Tune trellis optimization for PSNR-HVS (default)\n");
fprintf(stderr, " -tune-ssim Tune trellis optimization for SSIM\n"); fprintf(stderr, " -tune-ssim Tune trellis optimization for SSIM\n");
fprintf(stderr, " -tune-ms-ssim Tune trellis optimization for MS-SSIM\n"); fprintf(stderr, " -tune-ms-ssim Tune trellis optimization for MS-SSIM\n");
fprintf(stderr, "Switches for advanced users:\n"); fprintf(stderr, "Switches for advanced users:\n");
fprintf(stderr, " -noovershoot Disable black-on-white deringing via overshoot\n");
#ifdef C_ARITH_CODING_SUPPORTED #ifdef C_ARITH_CODING_SUPPORTED
fprintf(stderr, " -arithmetic Use arithmetic coding\n"); fprintf(stderr, " -arithmetic Use arithmetic coding\n");
#endif #endif
@@ -195,6 +207,13 @@ usage (void)
fprintf(stderr, " -dct float Use floating-point DCT method%s\n", fprintf(stderr, " -dct float Use floating-point DCT method%s\n",
(JDCT_DEFAULT == JDCT_FLOAT ? " (default)" : "")); (JDCT_DEFAULT == JDCT_FLOAT ? " (default)" : ""));
#endif #endif
fprintf(stderr, " -quant-table N Use predefined quantization table N:\n");
fprintf(stderr, " - 0 JPEG Annex K\n");
fprintf(stderr, " - 1 Flat\n");
fprintf(stderr, " - 2 Custom, tuned for MS-SSIM\n");
fprintf(stderr, " - 3 ImageMagick table by N. Robidoux\n");
fprintf(stderr, " - 4 Custom, tuned for PSNR-HVS\n");
fprintf(stderr, " - 5 Table from paper by Klein, Silverstein and Carney\n");
fprintf(stderr, " -restart N Set restart interval in rows, or in blocks with B\n"); fprintf(stderr, " -restart N Set restart interval in rows, or in blocks with B\n");
#ifdef INPUT_SMOOTHING_SUPPORTED #ifdef INPUT_SMOOTHING_SUPPORTED
fprintf(stderr, " -smooth N Smooth dithered input (N=1..100 is strength)\n"); fprintf(stderr, " -smooth N Smooth dithered input (N=1..100 is strength)\n");
@@ -205,8 +224,8 @@ usage (void)
fprintf(stderr, " -memdst Compress to memory instead of file (useful for benchmarking)\n"); fprintf(stderr, " -memdst Compress to memory instead of file (useful for benchmarking)\n");
#endif #endif
fprintf(stderr, " -verbose or -debug Emit debug output\n"); fprintf(stderr, " -verbose or -debug Emit debug output\n");
fprintf(stderr, " -version Print version information and exit\n");
fprintf(stderr, "Switches for wizards:\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, " -qtables file Use quantization tables given in file\n");
fprintf(stderr, " -qslots N[,...] Set component quantization tables\n"); fprintf(stderr, " -qslots N[,...] Set component quantization tables\n");
fprintf(stderr, " -sample HxV[,...] Set component sampling factors\n"); fprintf(stderr, " -sample HxV[,...] Set component sampling factors\n");
@@ -270,6 +289,9 @@ parse_switches (j_compress_ptr cinfo, int argc, char **argv,
/* Use arithmetic coding. */ /* Use arithmetic coding. */
#ifdef C_ARITH_CODING_SUPPORTED #ifdef C_ARITH_CODING_SUPPORTED
cinfo->arith_code = TRUE; cinfo->arith_code = TRUE;
/* No table optimization required for AC */
cinfo->optimize_coding = FALSE;
#else #else
fprintf(stderr, "%s: sorry, arithmetic coding not supported\n", fprintf(stderr, "%s: sorry, arithmetic coding not supported\n",
progname); progname);
@@ -279,19 +301,27 @@ parse_switches (j_compress_ptr cinfo, int argc, char **argv,
} else if (keymatch(arg, "baseline", 1)) { } else if (keymatch(arg, "baseline", 1)) {
/* Force baseline-compatible output (8-bit quantizer values). */ /* Force baseline-compatible output (8-bit quantizer values). */
force_baseline = TRUE; force_baseline = TRUE;
/* Disable multiple scans */
simple_progressive = FALSE;
cinfo->num_scans = 0;
cinfo->scan_info = NULL;
} else if (keymatch(arg, "dct", 2)) { } else if (keymatch(arg, "dct", 2)) {
/* Select DCT algorithm. */ /* Select DCT algorithm. */
if (++argn >= argc) /* advance to next argument */ if (++argn >= argc) { /* advance to next argument */
fprintf(stderr, "%s: missing argument for dct\n", progname);
usage(); usage();
}
if (keymatch(argv[argn], "int", 1)) { if (keymatch(argv[argn], "int", 1)) {
cinfo->dct_method = JDCT_ISLOW; cinfo->dct_method = JDCT_ISLOW;
} else if (keymatch(argv[argn], "fast", 2)) { } else if (keymatch(argv[argn], "fast", 2)) {
cinfo->dct_method = JDCT_IFAST; cinfo->dct_method = JDCT_IFAST;
} else if (keymatch(argv[argn], "float", 2)) { } else if (keymatch(argv[argn], "float", 2)) {
cinfo->dct_method = JDCT_FLOAT; cinfo->dct_method = JDCT_FLOAT;
} else } else {
fprintf(stderr, "%s: invalid argument for dct\n", progname);
usage(); usage();
}
} else if (keymatch(arg, "debug", 1) || keymatch(arg, "verbose", 1)) { } else if (keymatch(arg, "debug", 1) || keymatch(arg, "verbose", 1)) {
/* Enable debug printouts. */ /* Enable debug printouts. */
@@ -308,12 +338,13 @@ parse_switches (j_compress_ptr cinfo, int argc, char **argv,
} }
cinfo->err->trace_level++; cinfo->err->trace_level++;
} else if (keymatch(arg, "fastcrush", 4)) { } else if (keymatch(arg, "version", 4)) {
cinfo->optimize_scans = FALSE; fprintf(stderr, "%s version %s (build %s)\n",
PACKAGE_NAME, VERSION, BUILD);
exit(EXIT_SUCCESS);
} else if (keymatch(arg, "flat", 4)) { } else if (keymatch(arg, "fastcrush", 4)) {
cinfo->use_flat_quant_tbl = TRUE; jpeg_c_set_bool_param(cinfo, JBOOLEAN_OPTIMIZE_SCANS, FALSE);
jpeg_set_quality(cinfo, 75, TRUE);
} else if (keymatch(arg, "grayscale", 2) || keymatch(arg, "greyscale",2)) { } else if (keymatch(arg, "grayscale", 2) || keymatch(arg, "greyscale",2)) {
/* Force a monochrome JPEG file to be generated. */ /* Force a monochrome JPEG file to be generated. */
@@ -326,12 +357,14 @@ parse_switches (j_compress_ptr cinfo, int argc, char **argv,
} else if (keymatch(arg, "lambda1", 7)) { } else if (keymatch(arg, "lambda1", 7)) {
if (++argn >= argc) /* advance to next argument */ if (++argn >= argc) /* advance to next argument */
usage(); usage();
cinfo->lambda_log_scale1 = atof(argv[argn]); jpeg_c_set_float_param(cinfo, JFLOAT_LAMBDA_LOG_SCALE1,
atof(argv[argn]));
} else if (keymatch(arg, "lambda2", 7)) { } else if (keymatch(arg, "lambda2", 7)) {
if (++argn >= argc) /* advance to next argument */ if (++argn >= argc) /* advance to next argument */
usage(); usage();
cinfo->lambda_log_scale2 = atof(argv[argn]); jpeg_c_set_float_param(cinfo, JFLOAT_LAMBDA_LOG_SCALE2,
atof(argv[argn]));
} else if (keymatch(arg, "maxmemory", 3)) { } else if (keymatch(arg, "maxmemory", 3)) {
/* Maximum memory in Kb (or Mb with 'm'). */ /* Maximum memory in Kb (or Mb with 'm'). */
@@ -346,8 +379,12 @@ parse_switches (j_compress_ptr cinfo, int argc, char **argv,
lval *= 1000L; lval *= 1000L;
cinfo->mem->max_memory_to_use = lval * 1000L; cinfo->mem->max_memory_to_use = lval * 1000L;
} else if (keymatch(arg, "multidcscan", 3)) { } else if (keymatch(arg, "dc-scan-opt", 3)) {
cinfo->one_dc_scan = FALSE; if (++argn >= argc) { /* advance to next argument */
fprintf(stderr, "%s: missing argument for dc-scan-opt\n", progname);
usage();
}
jpeg_c_set_int_param(cinfo, JINT_DC_SCAN_OPT_MODE, atoi(argv[argn]));
} else if (keymatch(arg, "optimize", 1) || keymatch(arg, "optimise", 1)) { } else if (keymatch(arg, "optimize", 1) || keymatch(arg, "optimise", 1)) {
/* Enable entropy parm optimization. */ /* Enable entropy parm optimization. */
@@ -361,8 +398,10 @@ parse_switches (j_compress_ptr cinfo, int argc, char **argv,
} else if (keymatch(arg, "outfile", 4)) { } else if (keymatch(arg, "outfile", 4)) {
/* Set output file name. */ /* Set output file name. */
if (++argn >= argc) /* advance to next argument */ if (++argn >= argc) { /* advance to next argument */
fprintf(stderr, "%s: missing argument for outfile\n", progname);
usage(); usage();
}
outfilename = argv[argn]; /* save it away for later use */ outfilename = argv[argn]; /* save it away for later use */
} else if (keymatch(arg, "progressive", 1)) { } else if (keymatch(arg, "progressive", 1)) {
@@ -388,8 +427,10 @@ parse_switches (j_compress_ptr cinfo, int argc, char **argv,
} else if (keymatch(arg, "quality", 1)) { } else if (keymatch(arg, "quality", 1)) {
/* Quality ratings (quantization table scaling factors). */ /* Quality ratings (quantization table scaling factors). */
if (++argn >= argc) /* advance to next argument */ if (++argn >= argc) { /* advance to next argument */
fprintf(stderr, "%s: missing argument for quality\n", progname);
usage(); usage();
}
qualityarg = argv[argn]; qualityarg = argv[argn];
} else if (keymatch(arg, "qslots", 2)) { } else if (keymatch(arg, "qslots", 2)) {
@@ -409,6 +450,18 @@ parse_switches (j_compress_ptr cinfo, int argc, char **argv,
qtablefile = argv[argn]; qtablefile = argv[argn];
/* We postpone actually reading the file in case -quality comes later. */ /* We postpone actually reading the file in case -quality comes later. */
} else if (keymatch(arg, "quant-table", 2)) {
int val;
if (++argn >= argc) /* advance to next argument */
usage();
val = atoi(argv[argn]);
jpeg_c_set_int_param(cinfo, JINT_BASE_QUANT_TBL_IDX, val);
if (jpeg_c_get_int_param(cinfo, JINT_BASE_QUANT_TBL_IDX) != val) {
fprintf(stderr, "%s: %d is invalid argument for quant-table\n", progname, val);
usage();
}
jpeg_set_quality(cinfo, 75, TRUE);
} else if (keymatch(arg, "restart", 1)) { } else if (keymatch(arg, "restart", 1)) {
/* Restart interval in MCU rows (or in MCUs with 'b'). */ /* Restart interval in MCU rows (or in MCUs with 'b'). */
long lval; long lval;
@@ -430,7 +483,7 @@ parse_switches (j_compress_ptr cinfo, int argc, char **argv,
} else if (keymatch(arg, "revert", 3)) { } else if (keymatch(arg, "revert", 3)) {
/* revert to old JPEG default */ /* revert to old JPEG default */
cinfo->use_moz_defaults = FALSE; jpeg_c_set_int_param(cinfo, JINT_COMPRESS_PROFILE, JCP_FASTEST);
jpeg_set_defaults(cinfo); jpeg_set_defaults(cinfo);
} else if (keymatch(arg, "sample", 2)) { } else if (keymatch(arg, "sample", 2)) {
@@ -472,39 +525,57 @@ parse_switches (j_compress_ptr cinfo, int argc, char **argv,
/* Input file is Targa format. */ /* Input file is Targa format. */
is_targa = TRUE; is_targa = TRUE;
} else if (keymatch(arg, "notrellis-dc", 11)) {
/* disable trellis quantization */
jpeg_c_set_bool_param(cinfo, JBOOLEAN_TRELLIS_QUANT_DC, FALSE);
} else if (keymatch(arg, "notrellis", 1)) { } else if (keymatch(arg, "notrellis", 1)) {
/* disable trellis quantization */ /* disable trellis quantization */
cinfo->trellis_quant = FALSE; jpeg_c_set_bool_param(cinfo, JBOOLEAN_TRELLIS_QUANT, FALSE);
} else if (keymatch(arg, "trellis-dc-ver-weight", 12)) {
if (++argn >= argc) { /* advance to next argument */
fprintf(stderr, "%s: missing argument for trellis-dc-ver-weight\n", progname);
usage();
}
jpeg_c_set_float_param(cinfo, JFLOAT_TRELLIS_DELTA_DC_WEIGHT, atof(argv[argn]));
} else if (keymatch(arg, "trellis-dc", 9)) {
/* enable DC trellis quantization */
jpeg_c_set_bool_param(cinfo, JBOOLEAN_TRELLIS_QUANT_DC, TRUE);
} else if (keymatch(arg, "tune-psnr", 6)) { } else if (keymatch(arg, "tune-psnr", 6)) {
cinfo->use_flat_quant_tbl = TRUE; jpeg_c_set_int_param(cinfo, JINT_BASE_QUANT_TBL_IDX, 1);
cinfo->lambda_log_scale1 = 9.0; jpeg_c_set_float_param(cinfo, JFLOAT_LAMBDA_LOG_SCALE1, 9.0);
cinfo->lambda_log_scale2 = 0.0; jpeg_c_set_float_param(cinfo, JFLOAT_LAMBDA_LOG_SCALE2, 0.0);
cinfo->use_lambda_weight_tbl = FALSE; jpeg_c_set_bool_param(cinfo, JBOOLEAN_USE_LAMBDA_WEIGHT_TBL, FALSE);
jpeg_set_quality(cinfo, 75, TRUE); jpeg_set_quality(cinfo, 75, TRUE);
} else if (keymatch(arg, "tune-ssim", 6)) { } else if (keymatch(arg, "tune-ssim", 6)) {
cinfo->use_flat_quant_tbl = TRUE; jpeg_c_set_int_param(cinfo, JINT_BASE_QUANT_TBL_IDX, 1);
cinfo->lambda_log_scale1 = 12.0; jpeg_c_set_float_param(cinfo, JFLOAT_LAMBDA_LOG_SCALE1, 11.5);
cinfo->lambda_log_scale2 = 13.5; jpeg_c_set_float_param(cinfo, JFLOAT_LAMBDA_LOG_SCALE2, 12.75);
cinfo->use_lambda_weight_tbl = FALSE; jpeg_c_set_bool_param(cinfo, JBOOLEAN_USE_LAMBDA_WEIGHT_TBL, FALSE);
jpeg_set_quality(cinfo, 75, TRUE); jpeg_set_quality(cinfo, 75, TRUE);
} else if (keymatch(arg, "tune-ms-ssim", 6)) { } else if (keymatch(arg, "tune-ms-ssim", 6)) {
cinfo->use_flat_quant_tbl = FALSE; jpeg_c_set_int_param(cinfo, JINT_BASE_QUANT_TBL_IDX, 3);
cinfo->lambda_log_scale1 = 14.25; jpeg_c_set_float_param(cinfo, JFLOAT_LAMBDA_LOG_SCALE1, 12.0);
cinfo->lambda_log_scale2 = 12.75; jpeg_c_set_float_param(cinfo, JFLOAT_LAMBDA_LOG_SCALE2, 13.0);
cinfo->use_lambda_weight_tbl = TRUE; jpeg_c_set_bool_param(cinfo, JBOOLEAN_USE_LAMBDA_WEIGHT_TBL, TRUE);
jpeg_set_quality(cinfo, 75, TRUE); jpeg_set_quality(cinfo, 75, TRUE);
} else if (keymatch(arg, "tune-hvs-psnr", 6)) { } else if (keymatch(arg, "tune-hvs-psnr", 6)) {
cinfo->use_flat_quant_tbl = FALSE; jpeg_c_set_int_param(cinfo, JINT_BASE_QUANT_TBL_IDX, 3);
cinfo->lambda_log_scale1 = 16.0; jpeg_c_set_float_param(cinfo, JFLOAT_LAMBDA_LOG_SCALE1, 14.75);
cinfo->lambda_log_scale2 = 15.5; jpeg_c_set_float_param(cinfo, JFLOAT_LAMBDA_LOG_SCALE2, 16.5);
cinfo->use_lambda_weight_tbl = TRUE; jpeg_c_set_bool_param(cinfo, JBOOLEAN_USE_LAMBDA_WEIGHT_TBL, TRUE);
jpeg_set_quality(cinfo, 75, TRUE); jpeg_set_quality(cinfo, 75, TRUE);
} else if (keymatch(arg, "noovershoot", 11)) {
jpeg_c_set_bool_param(cinfo, JBOOLEAN_OVERSHOOT_DERINGING, FALSE);
} else { } else {
fprintf(stderr, "%s: unknown option '%s'\n", progname, arg);
usage(); /* bogus switch */ usage(); /* bogus switch */
} }
} }
@@ -516,20 +587,26 @@ parse_switches (j_compress_ptr cinfo, int argc, char **argv,
/* Set quantization tables for selected quality. */ /* Set quantization tables for selected quality. */
/* Some or all may be overridden if -qtables is present. */ /* Some or all may be overridden if -qtables is present. */
if (qualityarg != NULL) /* process -quality if it was present */ if (qualityarg != NULL) /* process -quality if it was present */
if (! set_quality_ratings(cinfo, qualityarg, force_baseline)) if (! set_quality_ratings(cinfo, qualityarg, force_baseline)) {
fprintf(stderr, "%s: can't set quality ratings\n", progname);
usage(); usage();
}
if (qtablefile != NULL) /* process -qtables if it was present */ if (qtablefile != NULL) /* process -qtables if it was present */
if (! read_quant_tables(cinfo, qtablefile, force_baseline)) if (! read_quant_tables(cinfo, qtablefile, force_baseline)) {
fprintf(stderr, "%s: can't read qtable file\n", progname);
usage(); usage();
}
if (qslotsarg != NULL) /* process -qslots if it was present */ if (qslotsarg != NULL) /* process -qslots if it was present */
if (! set_quant_slots(cinfo, qslotsarg)) if (! set_quant_slots(cinfo, qslotsarg))
usage(); usage();
if (samplearg != NULL) /* process -sample if it was present */ if (samplearg != NULL) /* process -sample if it was present */
if (! set_sample_factors(cinfo, samplearg)) if (! set_sample_factors(cinfo, samplearg)) {
fprintf(stderr, "%s: can't set sample factors\n", progname);
usage(); usage();
}
#ifdef C_PROGRESSIVE_SUPPORTED #ifdef C_PROGRESSIVE_SUPPORTED
if (simple_progressive) /* process -progressive; -scans can override */ if (simple_progressive) /* process -progressive; -scans can override */
@@ -584,11 +661,6 @@ main (int argc, char **argv)
jerr.first_addon_message = JMSG_FIRSTADDONCODE; jerr.first_addon_message = JMSG_FIRSTADDONCODE;
jerr.last_addon_message = JMSG_LASTADDONCODE; 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. /* Initialize JPEG parameters.
* Much of this may be overridden later. * Much of this may be overridden later.
* In particular, we don't yet know the input file's color space, * In particular, we don't yet know the input file's color space,
@@ -596,7 +668,6 @@ main (int argc, char **argv)
*/ */
cinfo.in_color_space = JCS_RGB; /* arbitrary guess */ cinfo.in_color_space = JCS_RGB; /* arbitrary guess */
cinfo.use_moz_defaults = TRUE;
jpeg_set_defaults(&cinfo); jpeg_set_defaults(&cinfo);
/* Scan command line to find file names. /* Scan command line to find file names.
@@ -714,7 +785,8 @@ main (int argc, char **argv)
GETJOCTET(marker->data[3]) == 0x62 && GETJOCTET(marker->data[3]) == 0x62 &&
GETJOCTET(marker->data[4]) == 0x65) GETJOCTET(marker->data[4]) == 0x65)
continue; /* reject duplicate Adobe */ continue; /* reject duplicate Adobe */
jpeg_write_marker(&cinfo, marker->marker, marker->data, marker->data_length); jpeg_write_marker(&cinfo, marker->marker, marker->data,
marker->data_length);
} }
} }

View File

@@ -1,7 +1,9 @@
IJG JPEG LIBRARY: CODING RULES IJG JPEG LIBRARY: CODING RULES
This file was part of the Independent JPEG Group's software:
Copyright (C) 1991-1996, Thomas G. Lane. Copyright (C) 1991-1996, Thomas G. Lane.
This file is part of the Independent JPEG Group's software. It was modified by The libjpeg-turbo Project to include only information
relevant to libjpeg-turbo.
For conditions of distribution and use, see the accompanying README file. For conditions of distribution and use, see the accompanying README file.
@@ -32,22 +34,7 @@ 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 names should be written in lower case with underscores, e.g.,
multi_word_name (not multiWordName). Preprocessor symbols and enum constants multi_word_name (not multiWordName). Preprocessor symbols and enum constants
are similar but upper case (MULTI_WORD_NAME). Names should be unique within 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 the first fifteen characters.
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), 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 or METHODDEF(type). These macros expand to "static type" or just "type" as
@@ -55,32 +42,8 @@ appropriate. They provide a readable indication of the routine's usage and
can readily be changed for special needs. (For instance, special linkage can readily be changed for special needs. (For instance, special linkage
keywords can be inserted for use in Windows DLLs.) keywords can be inserted for use in Windows DLLs.)
ansi2knr does not transform method declarations (function pointers in A similar solution is used for external function declarations (see the EXTERN
structs). We handle these with a macro JMETHOD, defined as macro.)
#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, The JPEG library is intended to be used within larger programs. Furthermore,
@@ -94,9 +57,7 @@ pass these through the common routines provided.
wherever possible. (Note that our method-based calling conventions help this 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 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 called directly, so only that function need be externally visible.) All
global function names should begin with "jpeg_", and should have an global function names should begin with "jpeg_".
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 3. Don't use global variables; anything that must be used in another module
should be in the common data structures. should be in the common data structures.
@@ -107,10 +68,9 @@ the system architecture document, structure.txt).
5. Source file names should begin with "j" for files that are part of the 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 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 and djpeg.c, do not begin with "j". Keep compression and decompression code in
characters (plus ".c" or ".h", etc) to make life easy for MS-DOSers. Keep separate source files --- some applications may want only one half of the
compression and decompression code in separate source files --- some library.
applications may want only one half of the library.
Note: these rules (particularly #4) are not followed religiously in the 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 modules that are used in cjpeg/djpeg but are not part of the JPEG library

View File

@@ -2,29 +2,27 @@
# Process this file with autoconf to produce a configure script. # Process this file with autoconf to produce a configure script.
AC_PREREQ([2.56]) AC_PREREQ([2.56])
AC_INIT([libmozjpeg], [2.0.1]) AC_INIT([mozjpeg], [3.0])
BUILD=`date +%Y%m%d` BUILD=`date +%Y%m%d`
AM_INIT_AUTOMAKE([-Wall foreign dist-bzip2]) AM_INIT_AUTOMAKE([-Wall foreign dist-bzip2])
m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES(yes)]) m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES(yes)])
AC_PREFIX_DEFAULT(/opt/libmozjpeg) AC_PREFIX_DEFAULT(/opt/mozjpeg)
# Always build with prototypes
AC_DEFINE([HAVE_PROTOTYPES], 1, [Define if your compiler supports prototypes])
# Checks for programs. # Checks for programs.
SAVED_CFLAGS=${CFLAGS} SAVED_CFLAGS=${CFLAGS}
SAVED_CPPFLAGS=${CPPFLAGS} SAVED_CPPFLAGS=${CPPFLAGS}
AC_PROG_CPP AC_PROG_CPP
AC_PROG_CC AC_PROG_CC
AM_PROG_CC_C_O m4_ifdef([AM_PROG_AR], [AM_PROG_AR])
AM_PROG_AS AM_PROG_AS
AM_PROG_CC_C_O
AC_PROG_INSTALL AC_PROG_INSTALL
AM_PROG_AR m4_ifdef([AM_PROG_AR], [AM_PROG_AR])
AC_PROG_LIBTOOL AC_PROG_LIBTOOL
AC_PROG_LN_S AC_PROG_LN_S
# When the prefix is /opt/libmozjpeg, we assume that an "official" binary is # When the prefix is /opt/mozjpeg, we assume that an "official" binary is
# being created, and thus we install things into specific locations. # being created, and thus we install things into specific locations.
old_prefix=${prefix} old_prefix=${prefix}
@@ -33,12 +31,12 @@ if test "x$prefix" = "xNONE" -a "x$ac_default_prefix" != "x"; then
fi fi
DATADIR=`eval echo ${datadir}` DATADIR=`eval echo ${datadir}`
DATADIR=`eval echo $DATADIR` DATADIR=`eval echo $DATADIR`
if test "$DATADIR" = "/opt/libmozjpeg/share"; then if test "$DATADIR" = "/opt/mozjpeg/share"; then
datadir='${prefix}' datadir='${prefix}'
fi fi
DATADIR=`eval echo ${datarootdir}` DATADIR=`eval echo ${datarootdir}`
DATADIR=`eval echo $DATADIR` DATADIR=`eval echo $DATADIR`
if test "$DATADIR" = "/opt/libmozjpeg/share"; then if test "$DATADIR" = "/opt/mozjpeg/share"; then
datarootdir='${prefix}' datarootdir='${prefix}'
fi fi
@@ -50,7 +48,7 @@ fi
if test "x${libdir}" = 'x${exec_prefix}/lib' -o "x${libdir}" = 'x${prefix}/lib'; then if test "x${libdir}" = 'x${exec_prefix}/lib' -o "x${libdir}" = 'x${prefix}/lib'; then
LIBDIR=`eval echo ${libdir}` LIBDIR=`eval echo ${libdir}`
LIBDIR=`eval echo $LIBDIR` LIBDIR=`eval echo $LIBDIR`
if test "$LIBDIR" = "/opt/libmozjpeg/lib"; then if test "$LIBDIR" = "/opt/mozjpeg/lib"; then
case $host_os in case $host_os in
darwin*) darwin*)
;; ;;
@@ -95,11 +93,16 @@ fi
# Checks for libraries. # Checks for libraries.
AC_CHECK_LIB([m],[pow]) AC_CHECK_LIB([m],[pow])
PKG_CHECK_MODULES([libpng], [libpng], [HAVE_LIBPNG=1], [
PKG_CHECK_MODULES([libpng], [libpng12], [HAVE_LIBPNG=1], [HAVE_LIBPNG=0])
])
AM_CONDITIONAL([HAVE_LIBPNG], [test "$HAVE_LIBPNG" -eq 1])
# Checks for header files. # Checks for header files.
AC_HEADER_STDC AC_HEADER_STDC
AC_CHECK_HEADERS([stddef.h stdlib.h string.h]) AC_CHECK_HEADERS([stddef.h stdlib.h locale.h string.h])
AC_CHECK_HEADER([sys/types.h], AC_CHECK_HEADER([sys/types.h],
AC_DEFINE([NEED_SYS_TYPES_H], 1, [Define if you have sys/types.h])) AC_DEFINE([NEED_SYS_TYPES_H], 1, [Define if you need to include <sys/types.h> to get size_t.]))
# Checks for typedefs, structures, and compiler characteristics. # Checks for typedefs, structures, and compiler characteristics.
AC_C_CONST AC_C_CONST
@@ -131,34 +134,25 @@ AC_TRY_RUN(
exit(is_shifting_signed(-0x7F7E80B1L)); exit(is_shifting_signed(-0x7F7E80B1L));
}], }],
[AC_MSG_RESULT(no) [AC_MSG_RESULT(no)
AC_DEFINE([RIGHT_SHIFT_IS_UNSIGNED], 1, [Define if shift is unsigned])], AC_DEFINE([RIGHT_SHIFT_IS_UNSIGNED], 1,
[Define if your (broken) compiler shifts signed values as if they were unsigned.])],
[AC_MSG_RESULT(yes)], [AC_MSG_RESULT(yes)],
[AC_MSG_RESULT(Assuming that right shift is signed on target machine.)]) [AC_MSG_RESULT(Assuming that right shift is signed on target machine.)])
# 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,
[Define if you need short function names])])
# Checks for library functions. # Checks for library functions.
AC_CHECK_FUNCS([memset memcpy], [], AC_CHECK_FUNCS([memset memcpy], [],
[AC_DEFINE([NEED_BSD_STRINGS], 1, [AC_DEFINE([NEED_BSD_STRINGS], 1,
[Define if you have BSD-like bzero and bcopy])]) [Define if you have BSD-like bzero and bcopy in <strings.h> rather than memset/memcpy in <string.h>.])])
AC_MSG_CHECKING([libjpeg API version]) AC_MSG_CHECKING([libjpeg API version])
AC_ARG_VAR(JPEG_LIB_VERSION, [libjpeg API version (62, 70, or 80)]) AC_ARG_VAR(JPEG_LIB_VERSION, [libjpeg API version (62, 70, or 80)])
if test "x$JPEG_LIB_VERSION" = "x"; then if test "x$JPEG_LIB_VERSION" = "x"; then
AC_ARG_WITH([jpeg7], AC_ARG_WITH([jpeg7],
AC_HELP_STRING([--with-jpeg7], AC_HELP_STRING([--with-jpeg7],
[Emulate libjpeg v7 API/ABI (this makes libmozjpeg backward incompatible with libjpeg v6b.)])) [Emulate libjpeg v7 API/ABI (this makes mozjpeg backward incompatible with libjpeg v6b.)]))
AC_ARG_WITH([jpeg8], AC_ARG_WITH([jpeg8],
AC_HELP_STRING([--with-jpeg8], AC_HELP_STRING([--with-jpeg8],
[Emulate libjpeg v8 API/ABI (this makes libmozjpeg backward incompatible with libjpeg v6b.)])) [Emulate libjpeg v8 API/ABI (this makes mozjpeg backward incompatible with libjpeg v6b.)]))
if test "x${with_jpeg8}" = "xyes"; then if test "x${with_jpeg8}" = "xyes"; then
JPEG_LIB_VERSION=80 JPEG_LIB_VERSION=80
else else
@@ -176,9 +170,9 @@ AC_DEFINE_UNQUOTED(JPEG_LIB_VERSION, [$JPEG_LIB_VERSION],
[libjpeg API version]) [libjpeg API version])
AC_ARG_VAR(SO_MAJOR_VERSION, AC_ARG_VAR(SO_MAJOR_VERSION,
[Major version of the libmozjpeg shared library (default is determined by the API version)]) [Major version of the mozjpeg shared library (default is determined by the API version)])
AC_ARG_VAR(SO_MINOR_VERSION, AC_ARG_VAR(SO_MINOR_VERSION,
[Minor version of the libmozjpeg shared library (default is determined by the API version)]) [Minor version of the mozjpeg shared library (default is determined by the API version)])
if test "x$SO_MAJOR_VERSION" = "x"; then if test "x$SO_MAJOR_VERSION" = "x"; then
case "$JPEG_LIB_VERSION" in case "$JPEG_LIB_VERSION" in
62) SO_MAJOR_VERSION=$JPEG_LIB_VERSION ;; 62) SO_MAJOR_VERSION=$JPEG_LIB_VERSION ;;
@@ -195,7 +189,7 @@ fi
RPM_CONFIG_ARGS= RPM_CONFIG_ARGS=
# Memory source/destination managers # Memory source/destination managers
SO_AGE=0 SO_AGE=1
MEM_SRCDST_FUNCTIONS= MEM_SRCDST_FUNCTIONS=
if test "x${with_jpeg8}" != "xyes"; then if test "x${with_jpeg8}" != "xyes"; then
AC_MSG_CHECKING([whether to include in-memory source/destination managers]) AC_MSG_CHECKING([whether to include in-memory source/destination managers])
@@ -206,7 +200,7 @@ if test "x${with_jpeg8}" != "xyes"; then
AC_MSG_RESULT(yes) AC_MSG_RESULT(yes)
AC_DEFINE([MEM_SRCDST_SUPPORTED], [1], AC_DEFINE([MEM_SRCDST_SUPPORTED], [1],
[Support in-memory source/destination managers]) [Support in-memory source/destination managers])
SO_AGE=1 SO_AGE=2
MEM_SRCDST_FUNCTIONS="global: jpeg_mem_dest; jpeg_mem_src;"; MEM_SRCDST_FUNCTIONS="global: jpeg_mem_dest; jpeg_mem_src;";
else else
AC_MSG_RESULT(no) AC_MSG_RESULT(no)
@@ -223,12 +217,12 @@ AC_SUBST(SO_MINOR_VERSION)
AC_SUBST(SO_AGE) AC_SUBST(SO_AGE)
AC_SUBST(MEM_SRCDST_FUNCTIONS) AC_SUBST(MEM_SRCDST_FUNCTIONS)
AC_DEFINE_UNQUOTED(LIBMOZJPEG_VERSION, [$VERSION], [libmozjpeg version]) AC_DEFINE_UNQUOTED(MOZJPEG_VERSION, [$VERSION], [mozjpeg version])
VERSION_SCRIPT=yes VERSION_SCRIPT=yes
AC_ARG_ENABLE([ld-version-script], AC_ARG_ENABLE([ld-version-script],
AS_HELP_STRING([--disable-ld-version-script], AS_HELP_STRING([--disable-ld-version-script],
[Disable linker version script for libmozjpeg (default is to use linker version script if the linker supports it)]), [Disable linker version script for mozjpeg (default is to use linker version script if the linker supports it)]),
[VERSION_SCRIPT=$enableval], []) [VERSION_SCRIPT=$enableval], [])
AC_MSG_CHECKING([whether the linker supports version scripts]) AC_MSG_CHECKING([whether the linker supports version scripts])
@@ -256,7 +250,7 @@ if test "x$VERSION_SCRIPT_FLAG" = "x"; then
fi fi
LDFLAGS="$SAVED_LDFLAGS" LDFLAGS="$SAVED_LDFLAGS"
AC_MSG_CHECKING([whether to use version script when building libmozjpeg]) AC_MSG_CHECKING([whether to use version script when building mozjpeg])
AC_MSG_RESULT($VERSION_SCRIPT) AC_MSG_RESULT($VERSION_SCRIPT)
AM_CONDITIONAL(VERSION_SCRIPT, test "x$VERSION_SCRIPT" = "xyes") AM_CONDITIONAL(VERSION_SCRIPT, test "x$VERSION_SCRIPT" = "xyes")
@@ -265,7 +259,7 @@ AC_SUBST(VERSION_SCRIPT_FLAG)
# Check for non-broken inline under various spellings # Check for non-broken inline under various spellings
AC_MSG_CHECKING(for inline) AC_MSG_CHECKING(for inline)
ljt_cv_inline="" ljt_cv_inline=""
AC_TRY_COMPILE(, [} __attribute__((always_inline)) int foo() { return 0; } AC_TRY_COMPILE(, [} inline __attribute__((always_inline)) int foo() { return 0; }
int bar() { return foo();], ljt_cv_inline="inline __attribute__((always_inline))", int bar() { return foo();], ljt_cv_inline="inline __attribute__((always_inline))",
AC_TRY_COMPILE(, [} __inline__ int foo() { return 0; } AC_TRY_COMPILE(, [} __inline__ int foo() { return 0; }
int bar() { return foo();], ljt_cv_inline="__inline__", int bar() { return foo();], ljt_cv_inline="__inline__",
@@ -274,13 +268,16 @@ int bar() { return foo();], ljt_cv_inline="__inline",
AC_TRY_COMPILE(, [} inline int foo() { return 0; } AC_TRY_COMPILE(, [} inline int foo() { return 0; }
int bar() { return foo();], ljt_cv_inline="inline")))) int bar() { return foo();], ljt_cv_inline="inline"))))
AC_MSG_RESULT($ljt_cv_inline) AC_MSG_RESULT($ljt_cv_inline)
AC_DEFINE_UNQUOTED([INLINE],[inline $ljt_cv_inline],[How to obtain function inlining.]) AC_DEFINE_UNQUOTED([INLINE],[$ljt_cv_inline],[How to obtain function inlining.])
# Arithmetic coding support # Arithmetic coding support
AC_MSG_CHECKING([whether to include arithmetic encoding support]) AC_MSG_CHECKING([whether to include arithmetic encoding support])
AC_ARG_WITH([arith-enc], AC_ARG_WITH([arith-enc],
AC_HELP_STRING([--without-arith-enc], AC_HELP_STRING([--without-arith-enc],
[Do not include arithmetic encoding support])) [Do not include arithmetic encoding support]))
if test "x$with_12bit" = "xyes"; then
with_arith_enc=no
fi
if test "x$with_arith_enc" = "xno"; then if test "x$with_arith_enc" = "xno"; then
AC_MSG_RESULT(no) AC_MSG_RESULT(no)
RPM_CONFIG_ARGS="$RPM_CONFIG_ARGS --without-arith-enc" RPM_CONFIG_ARGS="$RPM_CONFIG_ARGS --without-arith-enc"
@@ -294,6 +291,9 @@ AC_MSG_CHECKING([whether to include arithmetic decoding support])
AC_ARG_WITH([arith-dec], AC_ARG_WITH([arith-dec],
AC_HELP_STRING([--without-arith-dec], AC_HELP_STRING([--without-arith-dec],
[Do not include arithmetic decoding support])) [Do not include arithmetic decoding support]))
if test "x$with_12bit" = "xyes"; then
with_arith_dec=no
fi
if test "x$with_arith_dec" = "xno"; then if test "x$with_arith_dec" = "xno"; then
AC_MSG_RESULT(no) AC_MSG_RESULT(no)
RPM_CONFIG_ARGS="$RPM_CONFIG_ARGS --without-arith-dec" RPM_CONFIG_ARGS="$RPM_CONFIG_ARGS --without-arith-dec"
@@ -306,11 +306,26 @@ AM_CONDITIONAL([WITH_ARITH_DEC], [test "x$with_arith_dec" != "xno"])
AM_CONDITIONAL([WITH_ARITH], AM_CONDITIONAL([WITH_ARITH],
[test "x$with_arith_dec" != "xno" -o "x$with_arith_enc" != "xno"]) [test "x$with_arith_dec" != "xno" -o "x$with_arith_enc" != "xno"])
# 12-bit component support
AC_MSG_CHECKING([whether to use 12-bit samples])
AC_ARG_WITH([12bit],
AC_HELP_STRING([--with-12bit], [Encode/decode JPEG images with 12-bit samples (implies --without-simd --without-turbojpeg --without-arith-dec --without-arith-enc)]))
if test "x$with_12bit" = "xyes"; then
AC_DEFINE([BITS_IN_JSAMPLE], [12], [use 8 or 12])
AC_MSG_RESULT(yes)
else
AC_MSG_RESULT(no)
fi
AM_CONDITIONAL([WITH_12BIT], [test "x$with_12bit" = "xyes"])
# TurboJPEG support # TurboJPEG support
AC_MSG_CHECKING([whether to build TurboJPEG C wrapper]) AC_MSG_CHECKING([whether to build TurboJPEG C wrapper])
AC_ARG_WITH([turbojpeg], AC_ARG_WITH([turbojpeg],
AC_HELP_STRING([--without-turbojpeg], AC_HELP_STRING([--without-turbojpeg],
[Do not include the TurboJPEG wrapper library and associated test programs])) [Do not include the TurboJPEG wrapper library and associated test programs]))
if test "x$with_12bit" = "xyes"; then
with_turbojpeg=no
fi
if test "x$with_turbojpeg" = "xno"; then if test "x$with_turbojpeg" = "xno"; then
AC_MSG_RESULT(no) AC_MSG_RESULT(no)
RPM_CONFIG_ARGS="$RPM_CONFIG_ARGS --without-turbojpeg" RPM_CONFIG_ARGS="$RPM_CONFIG_ARGS --without-turbojpeg"
@@ -342,7 +357,7 @@ AC_ARG_VAR(JNI_CFLAGS,
AC_MSG_CHECKING([whether to build TurboJPEG Java wrapper]) AC_MSG_CHECKING([whether to build TurboJPEG Java wrapper])
AC_ARG_WITH([java], AC_ARG_WITH([java],
AC_HELP_STRING([--with-java], [Build Java wrapper for the TurboJPEG library])) AC_HELP_STRING([--with-java], [Build Java wrapper for the TurboJPEG library]))
if test "x$with_turbojpeg" = "xno"; then if test "x$with_12bit" = "xyes" -o "x$with_turbojpeg" = "xno"; then
with_java=no with_java=no
fi fi
@@ -403,6 +418,9 @@ fi
# SIMD is optional # SIMD is optional
AC_ARG_WITH([simd], AC_ARG_WITH([simd],
AC_HELP_STRING([--without-simd], [Do not include SIMD extensions])) AC_HELP_STRING([--without-simd], [Do not include SIMD extensions]))
if test "x$with_12bit" = "xyes"; then
with_simd=no
fi
if test "x${with_simd}" != "xno"; then if test "x${with_simd}" != "xno"; then
require_simd=no require_simd=no
if test "x${with_simd}" = "xyes"; then if test "x${with_simd}" = "xyes"; then
@@ -437,12 +455,12 @@ if test "x${with_simd}" != "xno"; then
fi fi
fi fi
;; ;;
mipsel*) aarch64*)
AC_MSG_RESULT([yes (mipsel)]) AC_MSG_RESULT([yes (arm64)])
AC_MSG_CHECKING([if the assembler is GNU-compatible and can be used]) AC_MSG_CHECKING([if the assembler is GNU-compatible and can be used])
AC_CHECK_COMPATIBLE_MIPSEL_ASSEMBLER_IFELSE( AC_CHECK_COMPATIBLE_ARM64_ASSEMBLER_IFELSE(
[AC_MSG_RESULT([yes]) [AC_MSG_RESULT([yes])
simd_arch=mipsel], simd_arch=aarch64],
[AC_MSG_RESULT([no]) [AC_MSG_RESULT([no])
with_simd=no]) with_simd=no])
if test "x${with_simd}" = "xno"; then if test "x${with_simd}" = "xno"; then
@@ -453,6 +471,26 @@ if test "x${with_simd}" != "xno"; then
fi fi
fi fi
;; ;;
mips*)
AC_MSG_RESULT([yes (mips)])
AC_MSG_CHECKING([if the assembler is GNU-compatible and can be used])
AC_CHECK_COMPATIBLE_MIPS_ASSEMBLER_IFELSE(
[AC_MSG_RESULT([yes])
simd_arch=mips],
[AC_MSG_RESULT([no])
with_simd=no])
if test "x${with_simd}" = "xno"; then
if test "x${require_simd}" = "xyes"; then
AC_MSG_ERROR([SIMD support can't be enabled.])
else
AC_MSG_WARN([SIMD support can't be enabled. Performance will suffer.])
fi
fi
;;
powerpc*)
AC_MSG_RESULT([yes (powerpc)])
simd_arch=powerpc
;;
*) *)
AC_MSG_RESULT([no ("$host_cpu")]) AC_MSG_RESULT([no ("$host_cpu")])
with_simd=no; with_simd=no;
@@ -476,11 +514,13 @@ AM_CONDITIONAL([WITH_SSE_FLOAT_DCT], [test "x$simd_arch" = "xx86_64" -o "x$simd_
AM_CONDITIONAL([SIMD_I386], [test "x$simd_arch" = "xi386"]) AM_CONDITIONAL([SIMD_I386], [test "x$simd_arch" = "xi386"])
AM_CONDITIONAL([SIMD_X86_64], [test "x$simd_arch" = "xx86_64"]) AM_CONDITIONAL([SIMD_X86_64], [test "x$simd_arch" = "xx86_64"])
AM_CONDITIONAL([SIMD_ARM], [test "x$simd_arch" = "xarm"]) AM_CONDITIONAL([SIMD_ARM], [test "x$simd_arch" = "xarm"])
AM_CONDITIONAL([SIMD_MIPSEL], [test "x$simd_arch" = "xmipsel"]) AM_CONDITIONAL([SIMD_ARM_64], [test "x$simd_arch" = "xaarch64"])
AM_CONDITIONAL([SIMD_MIPS], [test "x$simd_arch" = "xmips"])
AM_CONDITIONAL([SIMD_POWERPC], [test "x$simd_arch" = "xpowerpc"])
AM_CONDITIONAL([X86_64], [test "x$host_cpu" = "xx86_64" -o "x$host_cpu" = "xamd64"]) AM_CONDITIONAL([X86_64], [test "x$host_cpu" = "xx86_64" -o "x$host_cpu" = "xamd64"])
AM_CONDITIONAL([WITH_TURBOJPEG], [test "x$with_turbojpeg" != "xno"]) AM_CONDITIONAL([WITH_TURBOJPEG], [test "x$with_turbojpeg" != "xno"])
AC_ARG_VAR(PKGNAME, [distribution package name (default: libmozjpeg)]) AC_ARG_VAR(PKGNAME, [distribution package name (default: mozjpeg)])
if test "x$PKGNAME" = "x"; then if test "x$PKGNAME" = "x"; then
PKGNAME=$PACKAGE_NAME PKGNAME=$PACKAGE_NAME
fi fi
@@ -501,20 +541,20 @@ AC_SUBST(RPMARCH)
AC_SUBST(RPM_CONFIG_ARGS) AC_SUBST(RPM_CONFIG_ARGS)
AC_SUBST(DEBARCH) AC_SUBST(DEBARCH)
AC_SUBST(BUILD) AC_SUBST(BUILD)
AC_DEFINE_UNQUOTED([BUILD], "$BUILD", [Build number]) AC_DEFINE_UNQUOTED([BUILD], "$BUILD", [libjpeg-turbo build number])
# jconfig.h is the file we use, but we have another before that to # NOTE: autoheader automatically modifies the input file of the first
# fool autoheader. the reason is that we include this header in our # invocation of AC_CONFIG_HEADERS, so we put config.h first to prevent
# API headers, which can screw things up for users of the lib. # jconfig.h.in from being clobbered. config.h is used only internally, whereas
# jconfig.h is a minimal version that allows this package to be built # jconfig.h contains macros that are relevant to external programs (macros that
# specify which features were built into the library.)
AC_CONFIG_HEADERS([config.h]) AC_CONFIG_HEADERS([config.h])
AC_CONFIG_HEADERS([jconfig.h]) AC_CONFIG_HEADERS([jconfig.h])
AC_CONFIG_FILES([pkgscripts/libmozjpeg.spec.tmpl:release/libmozjpeg.spec.in]) AC_CONFIG_HEADERS([jconfigint.h])
AC_CONFIG_FILES([pkgscripts/mozjpeg.spec.tmpl:release/mozjpeg.spec.in])
AC_CONFIG_FILES([pkgscripts/makecygwinpkg.tmpl:release/makecygwinpkg.in]) AC_CONFIG_FILES([pkgscripts/makecygwinpkg.tmpl:release/makecygwinpkg.in])
AC_CONFIG_FILES([pkgscripts/makedpkg.tmpl:release/makedpkg.in]) AC_CONFIG_FILES([pkgscripts/makedpkg.tmpl:release/makedpkg.in])
AC_CONFIG_FILES([pkgscripts/makemacpkg.tmpl:release/makemacpkg.in]) AC_CONFIG_FILES([pkgscripts/makemacpkg.tmpl:release/makemacpkg.in])
AC_CONFIG_FILES([pkgscripts/Description.plist:release/Description.plist.in])
AC_CONFIG_FILES([pkgscripts/Info.plist:release/Info.plist.in])
AC_CONFIG_FILES([pkgscripts/uninstall.tmpl:release/uninstall.in]) AC_CONFIG_FILES([pkgscripts/uninstall.tmpl:release/uninstall.in])
if test "x$with_turbojpeg" != "xno"; then if test "x$with_turbojpeg" != "xno"; then
AC_CONFIG_FILES([tjbenchtest]) AC_CONFIG_FILES([tjbenchtest])

46
djpeg.1
View File

@@ -1,4 +1,4 @@
.TH DJPEG 1 "18 January 2013" .TH DJPEG 1 "21 November 2014"
.SH NAME .SH NAME
djpeg \- decompress a JPEG file to an image file djpeg \- decompress a JPEG file to an image file
.SH SYNOPSIS .SH SYNOPSIS
@@ -55,11 +55,14 @@ default options are chosen for highest quality output.) Currently, this is
equivalent to \fB\-dct fast \-nosmooth \-onepass \-dither ordered\fR. equivalent to \fB\-dct fast \-nosmooth \-onepass \-dither ordered\fR.
.TP .TP
.B \-grayscale .B \-grayscale
Force gray-scale output even if JPEG file is color. Useful for viewing on Force grayscale output even if JPEG file is color. Useful for viewing on
monochrome displays; also, monochrome displays; also,
.B djpeg .B djpeg
runs noticeably faster in this mode. runs noticeably faster in this mode.
.TP .TP
.B \-rgb
Force RGB output even if JPEG file is grayscale.
.TP
.BI \-scale " M/N" .BI \-scale " M/N"
Scale the output image by a factor M/N. Currently the scale factor must be Scale the output image by a factor M/N. Currently the scale factor must be
M/8, where M is an integer between 1 and 16 inclusive, or any reduced fraction M/8, where M is an integer between 1 and 16 inclusive, or any reduced fraction
@@ -74,7 +77,7 @@ emitted if
.B \-colors .B \-colors
or or
.B \-grayscale .B \-grayscale
is specified, or if the JPEG file is gray-scale; otherwise, 24-bit full-color is specified, or if the JPEG file is grayscale; otherwise, 24-bit full-color
format is emitted. format is emitted.
.TP .TP
.B \-gif .B \-gif
@@ -88,12 +91,12 @@ emitted if
.B \-colors .B \-colors
or or
.B \-grayscale .B \-grayscale
is specified, or if the JPEG file is gray-scale; otherwise, 24-bit full-color is specified, or if the JPEG file is grayscale; otherwise, 24-bit full-color
format is emitted. format is emitted.
.TP .TP
.B \-pnm .B \-pnm
Select PBMPLUS (PPM/PGM) output format (this is the default format). Select PBMPLUS (PPM/PGM) output format (this is the default format).
PGM is emitted if the JPEG file is gray-scale or if PGM is emitted if the JPEG file is grayscale or if
.B \-grayscale .B \-grayscale
is specified; otherwise PPM is emitted. is specified; otherwise PPM is emitted.
.TP .TP
@@ -101,8 +104,8 @@ is specified; otherwise PPM is emitted.
Select RLE output format. (Requires URT library.) Select RLE output format. (Requires URT library.)
.TP .TP
.B \-targa .B \-targa
Select Targa output format. Gray-scale format is emitted if the JPEG file is Select Targa output format. Grayscale format is emitted if the JPEG file is
gray-scale or if grayscale or if
.B \-grayscale .B \-grayscale
is specified; otherwise, colormapped format is emitted if is specified; otherwise, colormapped format is emitted if
.B \-colors .B \-colors
@@ -115,14 +118,28 @@ Use integer DCT method (default).
.TP .TP
.B \-dct fast .B \-dct fast
Use fast integer DCT (less accurate). Use fast integer DCT (less accurate).
In libjpeg-turbo, the fast method is generally about 5-15% faster than the int
method when using the x86/x86-64 SIMD extensions (results may vary with other
SIMD implementations, or when using libjpeg-turbo without SIMD extensions.) If
the JPEG image was compressed using a quality level of 85 or below, then there
should be little or no perceptible difference between the two algorithms. When
decompressing images that were compressed using quality levels above 85,
however, the difference between the fast and int methods becomes more
pronounced. With images compressed using quality=97, for instance, the fast
method incurs generally about a 4-6 dB loss (in PSNR) relative to the int
method, but this can be larger for some images. If you can avoid it, do not
use the fast method when decompressing images that were compressed using
quality levels above 97. The algorithm often degenerates for such images and
can actually produce a more lossy output image than if the JPEG image had been
compressed using lower quality levels.
.TP .TP
.B \-dct float .B \-dct float
Use floating-point DCT method. Use floating-point DCT method.
The float method is very slightly more accurate than the int method, but is The float method is mainly a legacy feature. It does not produce significantly
much slower unless your machine has very fast floating-point hardware. Also more accurate results than the int method, and it is much slower. The float
note that results of the floating-point method may vary slightly across method may also give different results on different machines due to varying
machines, while the integer methods should give the same results everywhere. roundoff behavior, whereas the integer methods should give the same results on
The fast integer method is much less accurate than the other two. all machines.
.TP .TP
.B \-dither fs .B \-dither fs
Use Floyd-Steinberg dithering in color quantization. Use Floyd-Steinberg dithering in color quantization.
@@ -160,7 +177,7 @@ faster and needs less memory, but it produces a lower-quality image.
is ignored unless you also say is ignored unless you also say
.B \-colors .B \-colors
.IR N . .IR N .
Also, the one-pass method is always used for gray-scale output (the two-pass Also, the one-pass method is always used for grayscale output (the two-pass
method is no improvement then). method is no improvement then).
.TP .TP
.BI \-maxmemory " N" .BI \-maxmemory " N"
@@ -185,6 +202,9 @@ give more output. Also, version information is printed at startup.
.B \-debug .B \-debug
Same as Same as
.BR \-verbose . .BR \-verbose .
.TP
.B \-version
Print version information and exit.
.SH EXAMPLES .SH EXAMPLES
.LP .LP
This example decompresses the JPEG file foo.jpg, quantizes it to This example decompresses the JPEG file foo.jpg, quantizes it to

20
djpeg.c
View File

@@ -4,7 +4,7 @@
* This file was part of the Independent JPEG Group's software: * This file was part of the Independent JPEG Group's software:
* Copyright (C) 1991-1997, Thomas G. Lane. * Copyright (C) 1991-1997, Thomas G. Lane.
* libjpeg-turbo Modifications: * libjpeg-turbo Modifications:
* Copyright (C) 2010-2011, 2013, D. R. Commander. * Copyright (C) 2010-2011, 2013-2014, D. R. Commander.
* For conditions of distribution and use, see the accompanying README file. * For conditions of distribution and use, see the accompanying README file.
* *
* This file contains a command-line user interface for the JPEG decompressor. * This file contains a command-line user interface for the JPEG decompressor.
@@ -27,7 +27,7 @@
#include "cdjpeg.h" /* Common decls for cjpeg/djpeg applications */ #include "cdjpeg.h" /* Common decls for cjpeg/djpeg applications */
#include "jversion.h" /* for version message */ #include "jversion.h" /* for version message */
#include "config.h" #include "jconfigint.h"
#include <ctype.h> /* to declare isprint() */ #include <ctype.h> /* to declare isprint() */
@@ -107,6 +107,7 @@ usage (void)
fprintf(stderr, " -fast Fast, low-quality processing\n"); fprintf(stderr, " -fast Fast, low-quality processing\n");
fprintf(stderr, " -grayscale Force grayscale output\n"); fprintf(stderr, " -grayscale Force grayscale output\n");
fprintf(stderr, " -rgb Force RGB output\n"); fprintf(stderr, " -rgb Force RGB output\n");
fprintf(stderr, " -rgb565 Force RGB565 output\n");
#ifdef IDCT_SCALING_SUPPORTED #ifdef IDCT_SCALING_SUPPORTED
fprintf(stderr, " -scale M/N Scale output image by fraction M/N, eg, 1/8\n"); fprintf(stderr, " -scale M/N Scale output image by fraction M/N, eg, 1/8\n");
#endif #endif
@@ -164,6 +165,7 @@ usage (void)
#endif #endif
fprintf(stderr, " -verbose or -debug Emit debug output\n"); fprintf(stderr, " -verbose or -debug Emit debug output\n");
fprintf(stderr, " -version Print version information and exit\n");
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
@@ -260,6 +262,11 @@ parse_switches (j_decompress_ptr cinfo, int argc, char **argv,
} }
cinfo->err->trace_level++; cinfo->err->trace_level++;
} else if (keymatch(arg, "version", 4)) {
fprintf(stderr, "%s version %s (build %s)\n",
PACKAGE_NAME, VERSION, BUILD);
exit(EXIT_SUCCESS);
} else if (keymatch(arg, "fast", 1)) { } else if (keymatch(arg, "fast", 1)) {
/* Select recommended processing options for quick-and-dirty output. */ /* Select recommended processing options for quick-and-dirty output. */
cinfo->two_pass_quantize = FALSE; cinfo->two_pass_quantize = FALSE;
@@ -281,6 +288,10 @@ parse_switches (j_decompress_ptr cinfo, int argc, char **argv,
/* Force RGB output. */ /* Force RGB output. */
cinfo->out_color_space = JCS_RGB; cinfo->out_color_space = JCS_RGB;
} else if (keymatch(arg, "rgb565", 2)) {
/* Force RGB565 output. */
cinfo->out_color_space = JCS_RGB565;
} else if (keymatch(arg, "map", 3)) { } else if (keymatch(arg, "map", 3)) {
/* Quantize to a color map taken from an input file. */ /* Quantize to a color map taken from an input file. */
if (++argn >= argc) /* advance to next argument */ if (++argn >= argc) /* advance to next argument */
@@ -490,11 +501,6 @@ main (int argc, char **argv)
jpeg_set_marker_processor(&cinfo, JPEG_COM, print_text_marker); jpeg_set_marker_processor(&cinfo, JPEG_COM, print_text_marker);
jpeg_set_marker_processor(&cinfo, JPEG_APP0+12, 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. */ /* Scan command line to find file names. */
/* It is convenient to use just one switch-parsing routine, but the switch /* 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 * values read here are ignored; we will rescan the switches after opening

View File

@@ -14,6 +14,7 @@
$(document).ready(function() { searchBox.OnSelectItem(0); }); $(document).ready(function() { searchBox.OnSelectItem(0); });
</script> </script>
<link href="doxygen.css" rel="stylesheet" type="text/css" /> <link href="doxygen.css" rel="stylesheet" type="text/css" />
<link href="doxygen-extra.css" rel="stylesheet" type="text/css"/>
</head> </head>
<body> <body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! --> <div id="top"><!-- do not remove this div, it is closed by doxygen! -->

View File

@@ -14,6 +14,7 @@
$(document).ready(function() { searchBox.OnSelectItem(0); }); $(document).ready(function() { searchBox.OnSelectItem(0); });
</script> </script>
<link href="doxygen.css" rel="stylesheet" type="text/css" /> <link href="doxygen.css" rel="stylesheet" type="text/css" />
<link href="doxygen-extra.css" rel="stylesheet" type="text/css"/>
</head> </head>
<body> <body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! --> <div id="top"><!-- do not remove this div, it is closed by doxygen! -->

View File

@@ -0,0 +1,3 @@
code {
color: #4665A2;
}

View File

@@ -14,6 +14,7 @@
$(document).ready(function() { searchBox.OnSelectItem(0); }); $(document).ready(function() { searchBox.OnSelectItem(0); });
</script> </script>
<link href="doxygen.css" rel="stylesheet" type="text/css" /> <link href="doxygen.css" rel="stylesheet" type="text/css" />
<link href="doxygen-extra.css" rel="stylesheet" type="text/css"/>
</head> </head>
<body> <body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! --> <div id="top"><!-- do not remove this div, it is closed by doxygen! -->

View File

@@ -14,6 +14,7 @@
$(document).ready(function() { searchBox.OnSelectItem(0); }); $(document).ready(function() { searchBox.OnSelectItem(0); });
</script> </script>
<link href="doxygen.css" rel="stylesheet" type="text/css" /> <link href="doxygen.css" rel="stylesheet" type="text/css" />
<link href="doxygen-extra.css" rel="stylesheet" type="text/css"/>
</head> </head>
<body> <body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! --> <div id="top"><!-- do not remove this div, it is closed by doxygen! -->

View File

@@ -14,6 +14,7 @@
$(document).ready(function() { searchBox.OnSelectItem(0); }); $(document).ready(function() { searchBox.OnSelectItem(0); });
</script> </script>
<link href="doxygen.css" rel="stylesheet" type="text/css" /> <link href="doxygen.css" rel="stylesheet" type="text/css" />
<link href="doxygen-extra.css" rel="stylesheet" type="text/css"/>
</head> </head>
<body> <body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! --> <div id="top"><!-- do not remove this div, it is closed by doxygen! -->
@@ -231,15 +232,30 @@ Functions</h2></td></tr>
<tr class="memitem:ga0b931126c7a615ddc3bbd0cca6698d67"><td class="memItemLeft" align="right" valign="top">DLLEXPORT int DLLCALL&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___turbo_j_p_e_g.html#ga0b931126c7a615ddc3bbd0cca6698d67">tjCompressFromYUV</a> (<a class="el" href="group___turbo_j_p_e_g.html#ga758d2634ecb4949de7815cba621f5763">tjhandle</a> handle, unsigned char *srcBuf, int width, int pad, int height, int subsamp, unsigned char **jpegBuf, unsigned long *jpegSize, int jpegQual, int flags)</td></tr> <tr class="memitem:ga0b931126c7a615ddc3bbd0cca6698d67"><td class="memItemLeft" align="right" valign="top">DLLEXPORT int DLLCALL&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___turbo_j_p_e_g.html#ga0b931126c7a615ddc3bbd0cca6698d67">tjCompressFromYUV</a> (<a class="el" href="group___turbo_j_p_e_g.html#ga758d2634ecb4949de7815cba621f5763">tjhandle</a> handle, unsigned char *srcBuf, int width, int pad, int height, int subsamp, unsigned char **jpegBuf, unsigned long *jpegSize, int jpegQual, int flags)</td></tr>
<tr class="memdesc:ga0b931126c7a615ddc3bbd0cca6698d67"><td class="mdescLeft">&#160;</td><td class="mdescRight">Compress a YUV planar image into a JPEG image. <a href="#ga0b931126c7a615ddc3bbd0cca6698d67">More...</a><br/></td></tr> <tr class="memdesc:ga0b931126c7a615ddc3bbd0cca6698d67"><td class="mdescLeft">&#160;</td><td class="mdescRight">Compress a YUV planar image into a JPEG image. <a href="#ga0b931126c7a615ddc3bbd0cca6698d67">More...</a><br/></td></tr>
<tr class="separator:ga0b931126c7a615ddc3bbd0cca6698d67"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:ga0b931126c7a615ddc3bbd0cca6698d67"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gaa89a1982cb4556b12ae7af4439991af6"><td class="memItemLeft" align="right" valign="top">DLLEXPORT int DLLCALL&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___turbo_j_p_e_g.html#gaa89a1982cb4556b12ae7af4439991af6">tjCompressFromYUVPlanes</a> (<a class="el" href="group___turbo_j_p_e_g.html#ga758d2634ecb4949de7815cba621f5763">tjhandle</a> handle, unsigned char **srcPlanes, int width, int *strides, int height, int subsamp, unsigned char **jpegBuf, unsigned long *jpegSize, int jpegQual, int flags)</td></tr>
<tr class="memdesc:gaa89a1982cb4556b12ae7af4439991af6"><td class="mdescLeft">&#160;</td><td class="mdescRight">Compress a set of Y, U (Cb), and V (Cr) image planes into a JPEG image. <a href="#gaa89a1982cb4556b12ae7af4439991af6">More...</a><br/></td></tr>
<tr class="separator:gaa89a1982cb4556b12ae7af4439991af6"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gaccc5bca7f12fcdcc302e6e1c6d4b311b"><td class="memItemLeft" align="right" valign="top">DLLEXPORT unsigned long DLLCALL&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___turbo_j_p_e_g.html#gaccc5bca7f12fcdcc302e6e1c6d4b311b">tjBufSize</a> (int width, int height, int jpegSubsamp)</td></tr> <tr class="memitem:gaccc5bca7f12fcdcc302e6e1c6d4b311b"><td class="memItemLeft" align="right" valign="top">DLLEXPORT unsigned long DLLCALL&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___turbo_j_p_e_g.html#gaccc5bca7f12fcdcc302e6e1c6d4b311b">tjBufSize</a> (int width, int height, int jpegSubsamp)</td></tr>
<tr class="memdesc:gaccc5bca7f12fcdcc302e6e1c6d4b311b"><td class="mdescLeft">&#160;</td><td class="mdescRight">The maximum size of the buffer (in bytes) required to hold a JPEG image with the given parameters. <a href="#gaccc5bca7f12fcdcc302e6e1c6d4b311b">More...</a><br/></td></tr> <tr class="memdesc:gaccc5bca7f12fcdcc302e6e1c6d4b311b"><td class="mdescLeft">&#160;</td><td class="mdescRight">The maximum size of the buffer (in bytes) required to hold a JPEG image with the given parameters. <a href="#gaccc5bca7f12fcdcc302e6e1c6d4b311b">More...</a><br/></td></tr>
<tr class="separator:gaccc5bca7f12fcdcc302e6e1c6d4b311b"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:gaccc5bca7f12fcdcc302e6e1c6d4b311b"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gaf451664a62c1f6c7cc5a6401f32908c9"><td class="memItemLeft" align="right" valign="top">DLLEXPORT unsigned long DLLCALL&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___turbo_j_p_e_g.html#gaf451664a62c1f6c7cc5a6401f32908c9">tjBufSizeYUV2</a> (int width, int pad, int height, int subsamp)</td></tr> <tr class="memitem:gaf451664a62c1f6c7cc5a6401f32908c9"><td class="memItemLeft" align="right" valign="top">DLLEXPORT unsigned long DLLCALL&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___turbo_j_p_e_g.html#gaf451664a62c1f6c7cc5a6401f32908c9">tjBufSizeYUV2</a> (int width, int pad, int height, int subsamp)</td></tr>
<tr class="memdesc:gaf451664a62c1f6c7cc5a6401f32908c9"><td class="mdescLeft">&#160;</td><td class="mdescRight">The size of the buffer (in bytes) required to hold a YUV planar image with the given parameters. <a href="#gaf451664a62c1f6c7cc5a6401f32908c9">More...</a><br/></td></tr> <tr class="memdesc:gaf451664a62c1f6c7cc5a6401f32908c9"><td class="mdescLeft">&#160;</td><td class="mdescRight">The size of the buffer (in bytes) required to hold a YUV planar image with the given parameters. <a href="#gaf451664a62c1f6c7cc5a6401f32908c9">More...</a><br/></td></tr>
<tr class="separator:gaf451664a62c1f6c7cc5a6401f32908c9"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:gaf451664a62c1f6c7cc5a6401f32908c9"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga6f98d977bfa9d167c97172e876ba61e2"><td class="memItemLeft" align="right" valign="top">DLLEXPORT unsigned long DLLCALL&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___turbo_j_p_e_g.html#ga6f98d977bfa9d167c97172e876ba61e2">tjPlaneSizeYUV</a> (int componentID, int width, int stride, int height, int subsamp)</td></tr>
<tr class="memdesc:ga6f98d977bfa9d167c97172e876ba61e2"><td class="mdescLeft">&#160;</td><td class="mdescRight">The size of the buffer (in bytes) required to hold a YUV image plane with the given parameters. <a href="#ga6f98d977bfa9d167c97172e876ba61e2">More...</a><br/></td></tr>
<tr class="separator:ga6f98d977bfa9d167c97172e876ba61e2"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga63fb66bb1e36c74008c4634360becbb1"><td class="memItemLeft" align="right" valign="top">DLLEXPORT int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___turbo_j_p_e_g.html#ga63fb66bb1e36c74008c4634360becbb1">tjPlaneWidth</a> (int componentID, int width, int subsamp)</td></tr>
<tr class="memdesc:ga63fb66bb1e36c74008c4634360becbb1"><td class="mdescLeft">&#160;</td><td class="mdescRight">The plane width of a YUV image plane with the given parameters. <a href="#ga63fb66bb1e36c74008c4634360becbb1">More...</a><br/></td></tr>
<tr class="separator:ga63fb66bb1e36c74008c4634360becbb1"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga1a209696c6a80748f20e134b3c64789f"><td class="memItemLeft" align="right" valign="top">DLLEXPORT int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___turbo_j_p_e_g.html#ga1a209696c6a80748f20e134b3c64789f">tjPlaneHeight</a> (int componentID, int height, int subsamp)</td></tr>
<tr class="memdesc:ga1a209696c6a80748f20e134b3c64789f"><td class="mdescLeft">&#160;</td><td class="mdescRight">The plane height of a YUV image plane with the given parameters. <a href="#ga1a209696c6a80748f20e134b3c64789f">More...</a><br/></td></tr>
<tr class="separator:ga1a209696c6a80748f20e134b3c64789f"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga0a5ffbf7cb58a5b6a8201114fe889360"><td class="memItemLeft" align="right" valign="top">DLLEXPORT int DLLCALL&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___turbo_j_p_e_g.html#ga0a5ffbf7cb58a5b6a8201114fe889360">tjEncodeYUV3</a> (<a class="el" href="group___turbo_j_p_e_g.html#ga758d2634ecb4949de7815cba621f5763">tjhandle</a> handle, unsigned char *srcBuf, int width, int pitch, int height, int pixelFormat, unsigned char *dstBuf, int pad, int subsamp, int flags)</td></tr> <tr class="memitem:ga0a5ffbf7cb58a5b6a8201114fe889360"><td class="memItemLeft" align="right" valign="top">DLLEXPORT int DLLCALL&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___turbo_j_p_e_g.html#ga0a5ffbf7cb58a5b6a8201114fe889360">tjEncodeYUV3</a> (<a class="el" href="group___turbo_j_p_e_g.html#ga758d2634ecb4949de7815cba621f5763">tjhandle</a> handle, unsigned char *srcBuf, int width, int pitch, int height, int pixelFormat, unsigned char *dstBuf, int pad, int subsamp, int flags)</td></tr>
<tr class="memdesc:ga0a5ffbf7cb58a5b6a8201114fe889360"><td class="mdescLeft">&#160;</td><td class="mdescRight">Encode an RGB or grayscale image into a YUV planar image. <a href="#ga0a5ffbf7cb58a5b6a8201114fe889360">More...</a><br/></td></tr> <tr class="memdesc:ga0a5ffbf7cb58a5b6a8201114fe889360"><td class="mdescLeft">&#160;</td><td class="mdescRight">Encode an RGB or grayscale image into a YUV planar image. <a href="#ga0a5ffbf7cb58a5b6a8201114fe889360">More...</a><br/></td></tr>
<tr class="separator:ga0a5ffbf7cb58a5b6a8201114fe889360"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:ga0a5ffbf7cb58a5b6a8201114fe889360"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gaa791db8598853ddcad24e42897ef1269"><td class="memItemLeft" align="right" valign="top">DLLEXPORT int DLLCALL&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___turbo_j_p_e_g.html#gaa791db8598853ddcad24e42897ef1269">tjEncodeYUVPlanes</a> (<a class="el" href="group___turbo_j_p_e_g.html#ga758d2634ecb4949de7815cba621f5763">tjhandle</a> handle, unsigned char *srcBuf, int width, int pitch, int height, int pixelFormat, unsigned char **dstPlanes, int *strides, int subsamp, int flags)</td></tr>
<tr class="memdesc:gaa791db8598853ddcad24e42897ef1269"><td class="mdescLeft">&#160;</td><td class="mdescRight">Encode an RGB or grayscale image into separate Y, U (Cb), and V (Cr) image planes. <a href="#gaa791db8598853ddcad24e42897ef1269">More...</a><br/></td></tr>
<tr class="separator:gaa791db8598853ddcad24e42897ef1269"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gae5408179d041e2a2f7199c8283cf649e"><td class="memItemLeft" align="right" valign="top">DLLEXPORT <a class="el" href="group___turbo_j_p_e_g.html#ga758d2634ecb4949de7815cba621f5763">tjhandle</a> DLLCALL&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___turbo_j_p_e_g.html#gae5408179d041e2a2f7199c8283cf649e">tjInitDecompress</a> (void)</td></tr> <tr class="memitem:gae5408179d041e2a2f7199c8283cf649e"><td class="memItemLeft" align="right" valign="top">DLLEXPORT <a class="el" href="group___turbo_j_p_e_g.html#ga758d2634ecb4949de7815cba621f5763">tjhandle</a> DLLCALL&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___turbo_j_p_e_g.html#gae5408179d041e2a2f7199c8283cf649e">tjInitDecompress</a> (void)</td></tr>
<tr class="memdesc:gae5408179d041e2a2f7199c8283cf649e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Create a TurboJPEG decompressor instance. <a href="#gae5408179d041e2a2f7199c8283cf649e">More...</a><br/></td></tr> <tr class="memdesc:gae5408179d041e2a2f7199c8283cf649e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Create a TurboJPEG decompressor instance. <a href="#gae5408179d041e2a2f7199c8283cf649e">More...</a><br/></td></tr>
<tr class="separator:gae5408179d041e2a2f7199c8283cf649e"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:gae5408179d041e2a2f7199c8283cf649e"><td class="memSeparator" colspan="2">&#160;</td></tr>
@@ -255,6 +271,15 @@ Functions</h2></td></tr>
<tr class="memitem:ga7c08b340ad7f8e85d407bd9e81d44d07"><td class="memItemLeft" align="right" valign="top">DLLEXPORT int DLLCALL&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___turbo_j_p_e_g.html#ga7c08b340ad7f8e85d407bd9e81d44d07">tjDecompressToYUV2</a> (<a class="el" href="group___turbo_j_p_e_g.html#ga758d2634ecb4949de7815cba621f5763">tjhandle</a> handle, unsigned char *jpegBuf, unsigned long jpegSize, unsigned char *dstBuf, int width, int pad, int height, int flags)</td></tr> <tr class="memitem:ga7c08b340ad7f8e85d407bd9e81d44d07"><td class="memItemLeft" align="right" valign="top">DLLEXPORT int DLLCALL&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___turbo_j_p_e_g.html#ga7c08b340ad7f8e85d407bd9e81d44d07">tjDecompressToYUV2</a> (<a class="el" href="group___turbo_j_p_e_g.html#ga758d2634ecb4949de7815cba621f5763">tjhandle</a> handle, unsigned char *jpegBuf, unsigned long jpegSize, unsigned char *dstBuf, int width, int pad, int height, int flags)</td></tr>
<tr class="memdesc:ga7c08b340ad7f8e85d407bd9e81d44d07"><td class="mdescLeft">&#160;</td><td class="mdescRight">Decompress a JPEG image to a YUV planar image. <a href="#ga7c08b340ad7f8e85d407bd9e81d44d07">More...</a><br/></td></tr> <tr class="memdesc:ga7c08b340ad7f8e85d407bd9e81d44d07"><td class="mdescLeft">&#160;</td><td class="mdescRight">Decompress a JPEG image to a YUV planar image. <a href="#ga7c08b340ad7f8e85d407bd9e81d44d07">More...</a><br/></td></tr>
<tr class="separator:ga7c08b340ad7f8e85d407bd9e81d44d07"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:ga7c08b340ad7f8e85d407bd9e81d44d07"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga0828a38ae29631ac28b6857cefb0eebf"><td class="memItemLeft" align="right" valign="top">DLLEXPORT int DLLCALL&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___turbo_j_p_e_g.html#ga0828a38ae29631ac28b6857cefb0eebf">tjDecompressToYUVPlanes</a> (<a class="el" href="group___turbo_j_p_e_g.html#ga758d2634ecb4949de7815cba621f5763">tjhandle</a> handle, unsigned char *jpegBuf, unsigned long jpegSize, unsigned char **dstPlanes, int width, int *strides, int height, int flags)</td></tr>
<tr class="memdesc:ga0828a38ae29631ac28b6857cefb0eebf"><td class="mdescLeft">&#160;</td><td class="mdescRight">Decompress a JPEG image into separate Y, U (Cb), and V (Cr) image planes. <a href="#ga0828a38ae29631ac28b6857cefb0eebf">More...</a><br/></td></tr>
<tr class="separator:ga0828a38ae29631ac28b6857cefb0eebf"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga132ae2c2cadcf64c8bb0f3bdf69da3ed"><td class="memItemLeft" align="right" valign="top">DLLEXPORT int DLLCALL&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___turbo_j_p_e_g.html#ga132ae2c2cadcf64c8bb0f3bdf69da3ed">tjDecodeYUV</a> (<a class="el" href="group___turbo_j_p_e_g.html#ga758d2634ecb4949de7815cba621f5763">tjhandle</a> handle, unsigned char *srcBuf, int pad, int subsamp, unsigned char *dstBuf, int width, int pitch, int height, int pixelFormat, int flags)</td></tr>
<tr class="memdesc:ga132ae2c2cadcf64c8bb0f3bdf69da3ed"><td class="mdescLeft">&#160;</td><td class="mdescRight">Decode a YUV planar image into an RGB or grayscale image. <a href="#ga132ae2c2cadcf64c8bb0f3bdf69da3ed">More...</a><br/></td></tr>
<tr class="separator:ga132ae2c2cadcf64c8bb0f3bdf69da3ed"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga6cb5b0e1101a2b20edea576e11faf93d"><td class="memItemLeft" align="right" valign="top">DLLEXPORT int DLLCALL&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___turbo_j_p_e_g.html#ga6cb5b0e1101a2b20edea576e11faf93d">tjDecodeYUVPlanes</a> (<a class="el" href="group___turbo_j_p_e_g.html#ga758d2634ecb4949de7815cba621f5763">tjhandle</a> handle, unsigned char **srcPlanes, int *strides, int subsamp, unsigned char *dstBuf, int width, int pitch, int height, int pixelFormat, int flags)</td></tr>
<tr class="memdesc:ga6cb5b0e1101a2b20edea576e11faf93d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Decode a set of Y, U (Cb), and V (Cr) image planes into an RGB or grayscale image. <a href="#ga6cb5b0e1101a2b20edea576e11faf93d">More...</a><br/></td></tr>
<tr class="separator:ga6cb5b0e1101a2b20edea576e11faf93d"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga3155b775bfbac9dbba869b95a0367902"><td class="memItemLeft" align="right" valign="top">DLLEXPORT <a class="el" href="group___turbo_j_p_e_g.html#ga758d2634ecb4949de7815cba621f5763">tjhandle</a> DLLCALL&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___turbo_j_p_e_g.html#ga3155b775bfbac9dbba869b95a0367902">tjInitTransform</a> (void)</td></tr> <tr class="memitem:ga3155b775bfbac9dbba869b95a0367902"><td class="memItemLeft" align="right" valign="top">DLLEXPORT <a class="el" href="group___turbo_j_p_e_g.html#ga758d2634ecb4949de7815cba621f5763">tjhandle</a> DLLCALL&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___turbo_j_p_e_g.html#ga3155b775bfbac9dbba869b95a0367902">tjInitTransform</a> (void)</td></tr>
<tr class="memdesc:ga3155b775bfbac9dbba869b95a0367902"><td class="mdescLeft">&#160;</td><td class="mdescRight">Create a new TurboJPEG transformer instance. <a href="#ga3155b775bfbac9dbba869b95a0367902">More...</a><br/></td></tr> <tr class="memdesc:ga3155b775bfbac9dbba869b95a0367902"><td class="mdescLeft">&#160;</td><td class="mdescRight">Create a new TurboJPEG transformer instance. <a href="#ga3155b775bfbac9dbba869b95a0367902">More...</a><br/></td></tr>
<tr class="separator:ga3155b775bfbac9dbba869b95a0367902"><td class="memSeparator" colspan="2">&#160;</td></tr> <tr class="separator:ga3155b775bfbac9dbba869b95a0367902"><td class="memSeparator" colspan="2">&#160;</td></tr>
@@ -298,6 +323,11 @@ Variables</h2></td></tr>
<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2> <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
<p>TurboJPEG API. </p> <p>TurboJPEG API. </p>
<p>This API provides an interface for generating, decoding, and transforming planar YUV and JPEG images in memory.</p> <p>This API provides an interface for generating, decoding, and transforming planar YUV and JPEG images in memory.</p>
<p><a class="anchor" id="YUVnotes"></a></p>
<h2>YUV Image Format Notes</h2>
<p>Technically, the JPEG format uses the YCbCr colorspace (which is technically not a colorspace but a color transform), but per the convention of the digital video community, the TurboJPEG API uses "YUV" to refer to an image format consisting of Y, Cb, and Cr image planes.</p>
<p>Each plane is simply a 2D array of bytes, each byte representing the value of one of the components (Y, Cb, or Cr) at a particular location in the image. The width and height of each plane are determined by the image width, height, and level of chrominance subsampling. The luminance plane width is the image width padded to the nearest multiple of the horizontal subsampling factor (2 in the case of 4:2:0 and 4:2:2, 4 in the case of 4:1:1, 1 in the case of 4:4:4 or grayscale.) Similarly, the luminance plane height is the image height padded to the nearest multiple of the vertical subsampling factor (2 in the case of 4:2:0 or 4:4:0, 1 in the case of 4:4:4 or grayscale.) This is irrespective of any additional padding that may be specified as an argument to the various YUV functions. The chrominance plane width is equal to the luminance plane width divided by the horizontal subsampling factor, and the chrominance plane height is equal to the luminance plane height divided by the vertical subsampling factor.</p>
<p>For example, if the source image is 35 x 35 pixels and 4:2:2 subsampling is used, then the luminance plane would be 36 x 35 bytes, and each of the chrominance planes would be 18 x 35 bytes. If you specify a line padding of 4 bytes on top of this, then the luminance plane would be 36 x 35 bytes, and each of the chrominance planes would be 20 x 35 bytes. </p>
<h2 class="groupheader">Macro Definition Documentation</h2> <h2 class="groupheader">Macro Definition Documentation</h2>
<a class="anchor" id="ga39f57a6fb02d9cf32e7b6890099b5a71"></a> <a class="anchor" id="ga39f57a6fb02d9cf32e7b6890099b5a71"></a>
<div class="memitem"> <div class="memitem">
@@ -690,7 +720,6 @@ Variables</h2></td></tr>
<p>Chrominance subsampling options. </p> <p>Chrominance subsampling options. </p>
<p>When pixels are converted from RGB to YCbCr (see <a class="el" href="group___turbo_j_p_e_g.html#gga4f83ad3368e0e29d1957be0efa7c3720a7389b8f65bb387ffedce3efd0d78ec75" title="YCbCr colorspace.">TJCS_YCbCr</a>) or from CMYK to YCCK (see <a class="el" href="group___turbo_j_p_e_g.html#gga4f83ad3368e0e29d1957be0efa7c3720a53839e0fe867b76b58d16b0a1a7c598e" title="YCCK colorspace.">TJCS_YCCK</a>) as part of the JPEG compression process, some of the Cb and Cr (chrominance) components can be discarded or averaged together to produce a smaller image with little perceptible loss of image clarity (the human eye is more sensitive to small changes in brightness than to small changes in color.) This is called "chrominance subsampling". </p> <p>When pixels are converted from RGB to YCbCr (see <a class="el" href="group___turbo_j_p_e_g.html#gga4f83ad3368e0e29d1957be0efa7c3720a7389b8f65bb387ffedce3efd0d78ec75" title="YCbCr colorspace.">TJCS_YCbCr</a>) or from CMYK to YCCK (see <a class="el" href="group___turbo_j_p_e_g.html#gga4f83ad3368e0e29d1957be0efa7c3720a53839e0fe867b76b58d16b0a1a7c598e" title="YCCK colorspace.">TJCS_YCCK</a>) as part of the JPEG compression process, some of the Cb and Cr (chrominance) components can be discarded or averaged together to produce a smaller image with little perceptible loss of image clarity (the human eye is more sensitive to small changes in brightness than to small changes in color.) This is called "chrominance subsampling". </p>
<p>NOTE: Technically, the JPEG format uses the YCbCr colorspace, but per the convention of the digital video community, the TurboJPEG API uses "YUV" to refer to an image format consisting of Y, Cb, and Cr image planes. </p>
<table class="fieldtable"> <table class="fieldtable">
<tr><th colspan="2">Enumerator</th></tr><tr><td class="fieldname"><em><a class="anchor" id="gga1d047060ea80bb9820d540bb928e9074afb8da4f44197837bdec0a4f593dacae3"></a>TJSAMP_444</em>&nbsp;</td><td class="fielddoc"> <tr><th colspan="2">Enumerator</th></tr><tr><td class="fieldname"><em><a class="anchor" id="gga1d047060ea80bb9820d540bb928e9074afb8da4f44197837bdec0a4f593dacae3"></a>TJSAMP_444</em>&nbsp;</td><td class="fielddoc">
<p>4:4:4 chrominance subsampling (no chrominance subsampling). </p> <p>4:4:4 chrominance subsampling (no chrominance subsampling). </p>
@@ -710,11 +739,13 @@ Variables</h2></td></tr>
</td></tr> </td></tr>
<tr><td class="fieldname"><em><a class="anchor" id="gga1d047060ea80bb9820d540bb928e9074accf740e6f3aa6ba20ba922cad13cb974"></a>TJSAMP_440</em>&nbsp;</td><td class="fielddoc"> <tr><td class="fieldname"><em><a class="anchor" id="gga1d047060ea80bb9820d540bb928e9074accf740e6f3aa6ba20ba922cad13cb974"></a>TJSAMP_440</em>&nbsp;</td><td class="fielddoc">
<p>4:4:0 chrominance subsampling. </p> <p>4:4:0 chrominance subsampling. </p>
<p>The JPEG or YUV image will contain one chrominance component for every 1x2 block of pixels in the source image. Note that 4:4:0 subsampling is not fully accelerated in libjpeg-turbo. </p> <p>The JPEG or YUV image will contain one chrominance component for every 1x2 block of pixels in the source image.</p>
<dl class="section note"><dt>Note</dt><dd>4:4:0 subsampling is not fully accelerated in libjpeg-turbo. </dd></dl>
</td></tr> </td></tr>
<tr><td class="fieldname"><em><a class="anchor" id="gga1d047060ea80bb9820d540bb928e9074a28ec62575e5ea295c3fde3001dc628e2"></a>TJSAMP_411</em>&nbsp;</td><td class="fielddoc"> <tr><td class="fieldname"><em><a class="anchor" id="gga1d047060ea80bb9820d540bb928e9074a28ec62575e5ea295c3fde3001dc628e2"></a>TJSAMP_411</em>&nbsp;</td><td class="fielddoc">
<p>4:1:1 chrominance subsampling. </p> <p>4:1:1 chrominance subsampling. </p>
<p>The JPEG or YUV image will contain one chrominance component for every 4x1 block of pixels in the source image. JPEG images compressed with 4:1:1 subsampling will be almost exactly the same size as those compressed with 4:2:0 subsampling, and in the aggregate, both subsampling methods produce approximately the same perceptual quality. However, 4:1:1 is better able to reproduce sharp horizontal features. Note that 4:1:1 subsampling is not fully accelerated in libjpeg-turbo. </p> <p>The JPEG or YUV image will contain one chrominance component for every 4x1 block of pixels in the source image. JPEG images compressed with 4:1:1 subsampling will be almost exactly the same size as those compressed with 4:2:0 subsampling, and in the aggregate, both subsampling methods produce approximately the same perceptual quality. However, 4:1:1 is better able to reproduce sharp horizontal features.</p>
<dl class="section note"><dt>Note</dt><dd>4:1:1 subsampling is not fully accelerated in libjpeg-turbo. </dd></dl>
</td></tr> </td></tr>
</table> </table>
@@ -788,7 +819,7 @@ Variables</h2></td></tr>
</table> </table>
</dd> </dd>
</dl> </dl>
<dl class="section return"><dt>Returns</dt><dd>a pointer to a newly-allocated buffer with the specified number of bytes</dd></dl> <dl class="section return"><dt>Returns</dt><dd>a pointer to a newly-allocated buffer with the specified number of bytes.</dd></dl>
<dl class="section see"><dt>See Also</dt><dd><a class="el" href="group___turbo_j_p_e_g.html#ga8c4a1231dc06a450514c835f6471f137" title="Free an image buffer previously allocated by TurboJPEG.">tjFree()</a> </dd></dl> <dl class="section see"><dt>See Also</dt><dd><a class="el" href="group___turbo_j_p_e_g.html#ga8c4a1231dc06a450514c835f6471f137" title="Free an image buffer previously allocated by TurboJPEG.">tjFree()</a> </dd></dl>
</div> </div>
@@ -827,8 +858,8 @@ Variables</h2></td></tr>
<p>The number of bytes returned by this function is larger than the size of the uncompressed source image. The reason for this is that the JPEG format uses 16-bit coefficients, and it is thus possible for a very high-quality JPEG image with very high-frequency content to expand rather than compress when converted to the JPEG format. Such images represent a very rare corner case, but since there is no way to predict the size of a JPEG image prior to compression, the corner case has to be handled.</p> <p>The number of bytes returned by this function is larger than the size of the uncompressed source image. The reason for this is that the JPEG format uses 16-bit coefficients, and it is thus possible for a very high-quality JPEG image with very high-frequency content to expand rather than compress when converted to the JPEG format. Such images represent a very rare corner case, but since there is no way to predict the size of a JPEG image prior to compression, the corner case has to be handled.</p>
<dl class="params"><dt>Parameters</dt><dd> <dl class="params"><dt>Parameters</dt><dd>
<table class="params"> <table class="params">
<tr><td class="paramname">width</td><td>width of the image (in pixels) </td></tr> <tr><td class="paramname">width</td><td>width (in pixels) of the image</td></tr>
<tr><td class="paramname">height</td><td>height of the image (in pixels) </td></tr> <tr><td class="paramname">height</td><td>height (in pixels) of the image</td></tr>
<tr><td class="paramname">jpegSubsamp</td><td>the level of chrominance subsampling to be used when generating the JPEG image (see <a class="el" href="group___turbo_j_p_e_g.html#ga1d047060ea80bb9820d540bb928e9074">Chrominance subsampling options</a>.)</td></tr> <tr><td class="paramname">jpegSubsamp</td><td>the level of chrominance subsampling to be used when generating the JPEG image (see <a class="el" href="group___turbo_j_p_e_g.html#ga1d047060ea80bb9820d540bb928e9074">Chrominance subsampling options</a>.)</td></tr>
</table> </table>
</dd> </dd>
@@ -876,9 +907,9 @@ Variables</h2></td></tr>
<p>The size of the buffer (in bytes) required to hold a YUV planar image with the given parameters. </p> <p>The size of the buffer (in bytes) required to hold a YUV planar image with the given parameters. </p>
<dl class="params"><dt>Parameters</dt><dd> <dl class="params"><dt>Parameters</dt><dd>
<table class="params"> <table class="params">
<tr><td class="paramname">width</td><td>width of the image (in pixels) </td></tr> <tr><td class="paramname">width</td><td>width (in pixels) of the image</td></tr>
<tr><td class="paramname">pad</td><td>the width of each line in each plane of the image is padded to the nearest multiple of this number of bytes (must be a power of 2.)</td></tr> <tr><td class="paramname">pad</td><td>the width of each line in each plane of the image is padded to the nearest multiple of this number of bytes (must be a power of 2.)</td></tr>
<tr><td class="paramname">height</td><td>height of the image (in pixels) </td></tr> <tr><td class="paramname">height</td><td>height (in pixels) of the image</td></tr>
<tr><td class="paramname">subsamp</td><td>level of chrominance subsampling in the image (see <a class="el" href="group___turbo_j_p_e_g.html#ga1d047060ea80bb9820d540bb928e9074">Chrominance subsampling options</a>.)</td></tr> <tr><td class="paramname">subsamp</td><td>level of chrominance subsampling in the image (see <a class="el" href="group___turbo_j_p_e_g.html#ga1d047060ea80bb9820d540bb928e9074">Chrominance subsampling options</a>.)</td></tr>
</table> </table>
</dd> </dd>
@@ -971,7 +1002,7 @@ Variables</h2></td></tr>
<tr><td class="paramname">handle</td><td>a handle to a TurboJPEG compressor or transformer instance</td></tr> <tr><td class="paramname">handle</td><td>a handle to a TurboJPEG compressor or transformer instance</td></tr>
<tr><td class="paramname">srcBuf</td><td>pointer to an image buffer containing RGB, grayscale, or CMYK pixels to be compressed</td></tr> <tr><td class="paramname">srcBuf</td><td>pointer to an image buffer containing RGB, grayscale, or CMYK pixels to be compressed</td></tr>
<tr><td class="paramname">width</td><td>width (in pixels) of the source image</td></tr> <tr><td class="paramname">width</td><td>width (in pixels) of the source image</td></tr>
<tr><td class="paramname">pitch</td><td>bytes per line of the source image. Normally, this should be <code>width * <a class="el" href="group___turbo_j_p_e_g.html#gad77cf8fe5b2bfd3cb3f53098146abb4c" title="Pixel size (in bytes) for a given pixel format.">tjPixelSize</a>[pixelFormat]</code> if the image is unpadded, or <code><a class="el" href="group___turbo_j_p_e_g.html#ga0aba955473315e405295d978f0c16511" title="Pad the given width to the nearest 32-bit boundary.">TJPAD</a>(width * <a class="el" href="group___turbo_j_p_e_g.html#gad77cf8fe5b2bfd3cb3f53098146abb4c" title="Pixel size (in bytes) for a given pixel format.">tjPixelSize</a>[pixelFormat])</code> if each line of the image is padded to the nearest 32-bit boundary, as is the case for Windows bitmaps. You can also be clever and use this parameter to skip lines, etc. Setting this parameter to 0 is the equivalent of setting it to <code>width * <a class="el" href="group___turbo_j_p_e_g.html#gad77cf8fe5b2bfd3cb3f53098146abb4c" title="Pixel size (in bytes) for a given pixel format.">tjPixelSize</a>[pixelFormat]</code>. </td></tr> <tr><td class="paramname">pitch</td><td>bytes per line in the source image. Normally, this should be <code>width * <a class="el" href="group___turbo_j_p_e_g.html#gad77cf8fe5b2bfd3cb3f53098146abb4c" title="Pixel size (in bytes) for a given pixel format.">tjPixelSize</a>[pixelFormat]</code> if the image is unpadded, or <code><a class="el" href="group___turbo_j_p_e_g.html#ga0aba955473315e405295d978f0c16511" title="Pad the given width to the nearest 32-bit boundary.">TJPAD</a>(width * <a class="el" href="group___turbo_j_p_e_g.html#gad77cf8fe5b2bfd3cb3f53098146abb4c" title="Pixel size (in bytes) for a given pixel format.">tjPixelSize</a>[pixelFormat])</code> if each line of the image is padded to the nearest 32-bit boundary, as is the case for Windows bitmaps. You can also be clever and use this parameter to skip lines, etc. Setting this parameter to 0 is the equivalent of setting it to <code>width * <a class="el" href="group___turbo_j_p_e_g.html#gad77cf8fe5b2bfd3cb3f53098146abb4c" title="Pixel size (in bytes) for a given pixel format.">tjPixelSize</a>[pixelFormat]</code>.</td></tr>
<tr><td class="paramname">height</td><td>height (in pixels) of the source image</td></tr> <tr><td class="paramname">height</td><td>height (in pixels) of the source image</td></tr>
<tr><td class="paramname">pixelFormat</td><td>pixel format of the source image (see <a class="el" href="group___turbo_j_p_e_g.html#gac916144e26c3817ac514e64ae5d12e2a">Pixel formats</a>.)</td></tr> <tr><td class="paramname">pixelFormat</td><td>pixel format of the source image (see <a class="el" href="group___turbo_j_p_e_g.html#gac916144e26c3817ac514e64ae5d12e2a">Pixel formats</a>.)</td></tr>
<tr><td class="paramname">jpegBuf</td><td>address of a pointer to an image buffer that will receive the JPEG image. TurboJPEG has the ability to reallocate the JPEG buffer to accommodate the size of the JPEG image. Thus, you can choose to:<ol type="1"> <tr><td class="paramname">jpegBuf</td><td>address of a pointer to an image buffer that will receive the JPEG image. TurboJPEG has the ability to reallocate the JPEG buffer to accommodate the size of the JPEG image. Thus, you can choose to:<ol type="1">
@@ -980,10 +1011,10 @@ Variables</h2></td></tr>
<li>pre-allocate the buffer to a "worst case" size determined by calling <a class="el" href="group___turbo_j_p_e_g.html#gaccc5bca7f12fcdcc302e6e1c6d4b311b" title="The maximum size of the buffer (in bytes) required to hold a JPEG image with the given parameters...">tjBufSize()</a>. This should ensure that the buffer never has to be re-allocated (setting <a class="el" href="group___turbo_j_p_e_g.html#ga8808d403c68b62aaa58a4c1e58e98963" title="Disable buffer (re)allocation.">TJFLAG_NOREALLOC</a> guarantees this.)</li> <li>pre-allocate the buffer to a "worst case" size determined by calling <a class="el" href="group___turbo_j_p_e_g.html#gaccc5bca7f12fcdcc302e6e1c6d4b311b" title="The maximum size of the buffer (in bytes) required to hold a JPEG image with the given parameters...">tjBufSize()</a>. This should ensure that the buffer never has to be re-allocated (setting <a class="el" href="group___turbo_j_p_e_g.html#ga8808d403c68b62aaa58a4c1e58e98963" title="Disable buffer (re)allocation.">TJFLAG_NOREALLOC</a> guarantees this.)</li>
</ol> </ol>
If you choose option 1, <code>*jpegSize</code> should be set to the size of your pre-allocated buffer. In any case, unless you have set <a class="el" href="group___turbo_j_p_e_g.html#ga8808d403c68b62aaa58a4c1e58e98963" title="Disable buffer (re)allocation.">TJFLAG_NOREALLOC</a>, you should always check <code>*jpegBuf</code> upon return from this function, as it may have changed.</td></tr> If you choose option 1, <code>*jpegSize</code> should be set to the size of your pre-allocated buffer. In any case, unless you have set <a class="el" href="group___turbo_j_p_e_g.html#ga8808d403c68b62aaa58a4c1e58e98963" title="Disable buffer (re)allocation.">TJFLAG_NOREALLOC</a>, you should always check <code>*jpegBuf</code> upon return from this function, as it may have changed.</td></tr>
<tr><td class="paramname">jpegSize</td><td>pointer to an unsigned long variable that holds the size of the JPEG image buffer. If <code>*jpegBuf</code> points to a pre-allocated buffer, then <code>*jpegSize</code> should be set to the size of the buffer. Upon return, <code>*jpegSize</code> will contain the size of the JPEG image (in bytes.) </td></tr> <tr><td class="paramname">jpegSize</td><td>pointer to an unsigned long variable that holds the size of the JPEG image buffer. If <code>*jpegBuf</code> points to a pre-allocated buffer, then <code>*jpegSize</code> should be set to the size of the buffer. Upon return, <code>*jpegSize</code> will contain the size of the JPEG image (in bytes.) If <code>*jpegBuf</code> points to a JPEG image buffer that is being reused from a previous call to one of the JPEG compression functions, then <code>*jpegSize</code> is ignored.</td></tr>
<tr><td class="paramname">jpegSubsamp</td><td>the level of chrominance subsampling to be used when generating the JPEG image (see <a class="el" href="group___turbo_j_p_e_g.html#ga1d047060ea80bb9820d540bb928e9074">Chrominance subsampling options</a>.)</td></tr> <tr><td class="paramname">jpegSubsamp</td><td>the level of chrominance subsampling to be used when generating the JPEG image (see <a class="el" href="group___turbo_j_p_e_g.html#ga1d047060ea80bb9820d540bb928e9074">Chrominance subsampling options</a>.)</td></tr>
<tr><td class="paramname">jpegQual</td><td>the image quality of the generated JPEG image (1 = worst, 100 = best)</td></tr> <tr><td class="paramname">jpegQual</td><td>the image quality of the generated JPEG image (1 = worst, 100 = best)</td></tr>
<tr><td class="paramname">flags</td><td>the bitwise OR of one or more of the <a class="el" href="group___turbo_j_p_e_g.html#ga72ecf4ebe6eb702d3c6f5ca27455e1ec">flags</a>.</td></tr> <tr><td class="paramname">flags</td><td>the bitwise OR of one or more of the <a class="el" href="group___turbo_j_p_e_g.html#ga72ecf4ebe6eb702d3c6f5ca27455e1ec">flags</a></td></tr>
</table> </table>
</dd> </dd>
</dl> </dl>
@@ -1067,10 +1098,10 @@ If you choose option 1, <code>*jpegSize</code> should be set to the size of your
<dl class="params"><dt>Parameters</dt><dd> <dl class="params"><dt>Parameters</dt><dd>
<table class="params"> <table class="params">
<tr><td class="paramname">handle</td><td>a handle to a TurboJPEG compressor or transformer instance</td></tr> <tr><td class="paramname">handle</td><td>a handle to a TurboJPEG compressor or transformer instance</td></tr>
<tr><td class="paramname">srcBuf</td><td>pointer to an image buffer containing a YUV planar image to be compressed. The Y, U (Cb), and V (Cr) image planes should be stored sequentially in the buffer, and the size of each plane is determined by the specified width, height, padding, and level of chrominance subsampling. If the chrominance components are subsampled along the horizontal dimension, then the width of the luminance plane should be padded to the nearest multiple of 2 (same goes for the height of the luminance plane, if the chrominance components are subsampled along the vertical dimension.) This is irrespective of any additional padding specified in the <code>pad</code> parameter. </td></tr> <tr><td class="paramname">srcBuf</td><td>pointer to an image buffer containing a YUV planar image to be compressed. The size of this buffer should match the value returned by <a class="el" href="group___turbo_j_p_e_g.html#gaf451664a62c1f6c7cc5a6401f32908c9" title="The size of the buffer (in bytes) required to hold a YUV planar image with the given parameters...">tjBufSizeYUV2()</a> for the given image width, height, padding, and level of chrominance subsampling. The Y, U (Cb), and V (Cr) image planes should be stored sequentially in the source buffer (refer to <a class="el" href="group___turbo_j_p_e_g.html#YUVnotes">YUV Image Format Notes</a>.)</td></tr>
<tr><td class="paramname">width</td><td>width (in pixels) of the source image </td></tr> <tr><td class="paramname">width</td><td>width (in pixels) of the source image. If the width is not an even multiple of the MCU block width (see <a class="el" href="group___turbo_j_p_e_g.html#ga9e61e7cd47a15a173283ba94e781308c" title="MCU block width (in pixels) for a given level of chrominance subsampling.">tjMCUWidth</a>), then an intermediate buffer copy will be performed within TurboJPEG.</td></tr>
<tr><td class="paramname">pad</td><td>the line padding used in the source image. For instance, if each line in each plane of the YUV image is padded to the nearest multiple of 4 bytes, then <code>pad</code> should be set to 4.</td></tr> <tr><td class="paramname">pad</td><td>the line padding used in the source image. For instance, if each line in each plane of the YUV image is padded to the nearest multiple of 4 bytes, then <code>pad</code> should be set to 4.</td></tr>
<tr><td class="paramname">height</td><td>height (in pixels) of the source image </td></tr> <tr><td class="paramname">height</td><td>height (in pixels) of the source image. If the height is not an even multiple of the MCU block height (see <a class="el" href="group___turbo_j_p_e_g.html#gabd247bb9fecb393eca57366feb8327bf" title="MCU block height (in pixels) for a given level of chrominance subsampling.">tjMCUHeight</a>), then an intermediate buffer copy will be performed within TurboJPEG.</td></tr>
<tr><td class="paramname">subsamp</td><td>the level of chrominance subsampling used in the source image (see <a class="el" href="group___turbo_j_p_e_g.html#ga1d047060ea80bb9820d540bb928e9074">Chrominance subsampling options</a>.)</td></tr> <tr><td class="paramname">subsamp</td><td>the level of chrominance subsampling used in the source image (see <a class="el" href="group___turbo_j_p_e_g.html#ga1d047060ea80bb9820d540bb928e9074">Chrominance subsampling options</a>.)</td></tr>
<tr><td class="paramname">jpegBuf</td><td>address of a pointer to an image buffer that will receive the JPEG image. TurboJPEG has the ability to reallocate the JPEG buffer to accommodate the size of the JPEG image. Thus, you can choose to:<ol type="1"> <tr><td class="paramname">jpegBuf</td><td>address of a pointer to an image buffer that will receive the JPEG image. TurboJPEG has the ability to reallocate the JPEG buffer to accommodate the size of the JPEG image. Thus, you can choose to:<ol type="1">
<li>pre-allocate the JPEG buffer with an arbitrary size using <a class="el" href="group___turbo_j_p_e_g.html#ga5c9234bda6d993cdaffdd89bf81a00ff" title="Allocate an image buffer for use with TurboJPEG.">tjAlloc()</a> and let TurboJPEG grow the buffer as needed,</li> <li>pre-allocate the JPEG buffer with an arbitrary size using <a class="el" href="group___turbo_j_p_e_g.html#ga5c9234bda6d993cdaffdd89bf81a00ff" title="Allocate an image buffer for use with TurboJPEG.">tjAlloc()</a> and let TurboJPEG grow the buffer as needed,</li>
@@ -1078,9 +1109,292 @@ If you choose option 1, <code>*jpegSize</code> should be set to the size of your
<li>pre-allocate the buffer to a "worst case" size determined by calling <a class="el" href="group___turbo_j_p_e_g.html#gaccc5bca7f12fcdcc302e6e1c6d4b311b" title="The maximum size of the buffer (in bytes) required to hold a JPEG image with the given parameters...">tjBufSize()</a>. This should ensure that the buffer never has to be re-allocated (setting <a class="el" href="group___turbo_j_p_e_g.html#ga8808d403c68b62aaa58a4c1e58e98963" title="Disable buffer (re)allocation.">TJFLAG_NOREALLOC</a> guarantees this.)</li> <li>pre-allocate the buffer to a "worst case" size determined by calling <a class="el" href="group___turbo_j_p_e_g.html#gaccc5bca7f12fcdcc302e6e1c6d4b311b" title="The maximum size of the buffer (in bytes) required to hold a JPEG image with the given parameters...">tjBufSize()</a>. This should ensure that the buffer never has to be re-allocated (setting <a class="el" href="group___turbo_j_p_e_g.html#ga8808d403c68b62aaa58a4c1e58e98963" title="Disable buffer (re)allocation.">TJFLAG_NOREALLOC</a> guarantees this.)</li>
</ol> </ol>
If you choose option 1, <code>*jpegSize</code> should be set to the size of your pre-allocated buffer. In any case, unless you have set <a class="el" href="group___turbo_j_p_e_g.html#ga8808d403c68b62aaa58a4c1e58e98963" title="Disable buffer (re)allocation.">TJFLAG_NOREALLOC</a>, you should always check <code>*jpegBuf</code> upon return from this function, as it may have changed.</td></tr> If you choose option 1, <code>*jpegSize</code> should be set to the size of your pre-allocated buffer. In any case, unless you have set <a class="el" href="group___turbo_j_p_e_g.html#ga8808d403c68b62aaa58a4c1e58e98963" title="Disable buffer (re)allocation.">TJFLAG_NOREALLOC</a>, you should always check <code>*jpegBuf</code> upon return from this function, as it may have changed.</td></tr>
<tr><td class="paramname">jpegSize</td><td>pointer to an unsigned long variable that holds the size of the JPEG image buffer. If <code>*jpegBuf</code> points to a pre-allocated buffer, then <code>*jpegSize</code> should be set to the size of the buffer. Upon return, <code>*jpegSize</code> will contain the size of the JPEG image (in bytes.) </td></tr> <tr><td class="paramname">jpegSize</td><td>pointer to an unsigned long variable that holds the size of the JPEG image buffer. If <code>*jpegBuf</code> points to a pre-allocated buffer, then <code>*jpegSize</code> should be set to the size of the buffer. Upon return, <code>*jpegSize</code> will contain the size of the JPEG image (in bytes.) If <code>*jpegBuf</code> points to a JPEG image buffer that is being reused from a previous call to one of the JPEG compression functions, then <code>*jpegSize</code> is ignored.</td></tr>
<tr><td class="paramname">jpegQual</td><td>the image quality of the generated JPEG image (1 = worst, 100 = best)</td></tr> <tr><td class="paramname">jpegQual</td><td>the image quality of the generated JPEG image (1 = worst, 100 = best)</td></tr>
<tr><td class="paramname">flags</td><td>the bitwise OR of one or more of the <a class="el" href="group___turbo_j_p_e_g.html#ga72ecf4ebe6eb702d3c6f5ca27455e1ec">flags</a>.</td></tr> <tr><td class="paramname">flags</td><td>the bitwise OR of one or more of the <a class="el" href="group___turbo_j_p_e_g.html#ga72ecf4ebe6eb702d3c6f5ca27455e1ec">flags</a></td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>0 if successful, or -1 if an error occurred (see <a class="el" href="group___turbo_j_p_e_g.html#ga9af79c908ec131b1ae8d52fe40375abf" title="Returns a descriptive error message explaining why the last command failed.">tjGetErrorStr()</a>.) </dd></dl>
</div>
</div>
<a class="anchor" id="gaa89a1982cb4556b12ae7af4439991af6"></a>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">DLLEXPORT int DLLCALL tjCompressFromYUVPlanes </td>
<td>(</td>
<td class="paramtype"><a class="el" href="group___turbo_j_p_e_g.html#ga758d2634ecb4949de7815cba621f5763">tjhandle</a>&#160;</td>
<td class="paramname"><em>handle</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">unsigned char **&#160;</td>
<td class="paramname"><em>srcPlanes</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>width</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int *&#160;</td>
<td class="paramname"><em>strides</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>height</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>subsamp</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">unsigned char **&#160;</td>
<td class="paramname"><em>jpegBuf</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">unsigned long *&#160;</td>
<td class="paramname"><em>jpegSize</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>jpegQual</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>flags</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Compress a set of Y, U (Cb), and V (Cr) image planes into a JPEG image. </p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">handle</td><td>a handle to a TurboJPEG compressor or transformer instance</td></tr>
<tr><td class="paramname">srcPlanes</td><td>an array of pointers to Y, U (Cb), and V (Cr) image planes (or just a Y plane, if compressing a grayscale image) that contain a YUV image to be compressed. These planes can be contiguous or non-contiguous in memory. The size of each plane should match the value returned by <a class="el" href="group___turbo_j_p_e_g.html#ga6f98d977bfa9d167c97172e876ba61e2" title="The size of the buffer (in bytes) required to hold a YUV image plane with the given parameters...">tjPlaneSizeYUV()</a> for the given image width, height, strides, and level of chrominance subsampling. Refer to <a class="el" href="group___turbo_j_p_e_g.html#YUVnotes">YUV Image Format Notes</a> for more details.</td></tr>
<tr><td class="paramname">width</td><td>width (in pixels) of the source image. If the width is not an even multiple of the MCU block width (see <a class="el" href="group___turbo_j_p_e_g.html#ga9e61e7cd47a15a173283ba94e781308c" title="MCU block width (in pixels) for a given level of chrominance subsampling.">tjMCUWidth</a>), then an intermediate buffer copy will be performed within TurboJPEG.</td></tr>
<tr><td class="paramname">strides</td><td>an array of integers, each specifying the number of bytes per line in the corresponding plane of the YUV source image. Setting the stride for any plane to 0 is the same as setting it to the plane width (see <a class="el" href="group___turbo_j_p_e_g.html#YUVnotes">YUV Image Format Notes</a>.) If <code>strides</code> is NULL, then the strides for all planes will be set to their respective plane widths. You can adjust the strides in order to specify an arbitrary amount of line padding in each plane or to create a JPEG image from a subregion of a larger YUV planar image.</td></tr>
<tr><td class="paramname">height</td><td>height (in pixels) of the source image. If the height is not an even multiple of the MCU block height (see <a class="el" href="group___turbo_j_p_e_g.html#gabd247bb9fecb393eca57366feb8327bf" title="MCU block height (in pixels) for a given level of chrominance subsampling.">tjMCUHeight</a>), then an intermediate buffer copy will be performed within TurboJPEG.</td></tr>
<tr><td class="paramname">subsamp</td><td>the level of chrominance subsampling used in the source image (see <a class="el" href="group___turbo_j_p_e_g.html#ga1d047060ea80bb9820d540bb928e9074">Chrominance subsampling options</a>.)</td></tr>
<tr><td class="paramname">jpegBuf</td><td>address of a pointer to an image buffer that will receive the JPEG image. TurboJPEG has the ability to reallocate the JPEG buffer to accommodate the size of the JPEG image. Thus, you can choose to:<ol type="1">
<li>pre-allocate the JPEG buffer with an arbitrary size using <a class="el" href="group___turbo_j_p_e_g.html#ga5c9234bda6d993cdaffdd89bf81a00ff" title="Allocate an image buffer for use with TurboJPEG.">tjAlloc()</a> and let TurboJPEG grow the buffer as needed,</li>
<li>set <code>*jpegBuf</code> to NULL to tell TurboJPEG to allocate the buffer for you, or</li>
<li>pre-allocate the buffer to a "worst case" size determined by calling <a class="el" href="group___turbo_j_p_e_g.html#gaccc5bca7f12fcdcc302e6e1c6d4b311b" title="The maximum size of the buffer (in bytes) required to hold a JPEG image with the given parameters...">tjBufSize()</a>. This should ensure that the buffer never has to be re-allocated (setting <a class="el" href="group___turbo_j_p_e_g.html#ga8808d403c68b62aaa58a4c1e58e98963" title="Disable buffer (re)allocation.">TJFLAG_NOREALLOC</a> guarantees this.)</li>
</ol>
If you choose option 1, <code>*jpegSize</code> should be set to the size of your pre-allocated buffer. In any case, unless you have set <a class="el" href="group___turbo_j_p_e_g.html#ga8808d403c68b62aaa58a4c1e58e98963" title="Disable buffer (re)allocation.">TJFLAG_NOREALLOC</a>, you should always check <code>*jpegBuf</code> upon return from this function, as it may have changed.</td></tr>
<tr><td class="paramname">jpegSize</td><td>pointer to an unsigned long variable that holds the size of the JPEG image buffer. If <code>*jpegBuf</code> points to a pre-allocated buffer, then <code>*jpegSize</code> should be set to the size of the buffer. Upon return, <code>*jpegSize</code> will contain the size of the JPEG image (in bytes.) If <code>*jpegBuf</code> points to a JPEG image buffer that is being reused from a previous call to one of the JPEG compression functions, then <code>*jpegSize</code> is ignored.</td></tr>
<tr><td class="paramname">jpegQual</td><td>the image quality of the generated JPEG image (1 = worst, 100 = best)</td></tr>
<tr><td class="paramname">flags</td><td>the bitwise OR of one or more of the <a class="el" href="group___turbo_j_p_e_g.html#ga72ecf4ebe6eb702d3c6f5ca27455e1ec">flags</a></td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>0 if successful, or -1 if an error occurred (see <a class="el" href="group___turbo_j_p_e_g.html#ga9af79c908ec131b1ae8d52fe40375abf" title="Returns a descriptive error message explaining why the last command failed.">tjGetErrorStr()</a>.) </dd></dl>
</div>
</div>
<a class="anchor" id="ga132ae2c2cadcf64c8bb0f3bdf69da3ed"></a>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">DLLEXPORT int DLLCALL tjDecodeYUV </td>
<td>(</td>
<td class="paramtype"><a class="el" href="group___turbo_j_p_e_g.html#ga758d2634ecb4949de7815cba621f5763">tjhandle</a>&#160;</td>
<td class="paramname"><em>handle</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">unsigned char *&#160;</td>
<td class="paramname"><em>srcBuf</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>pad</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>subsamp</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">unsigned char *&#160;</td>
<td class="paramname"><em>dstBuf</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>width</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>pitch</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>height</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>pixelFormat</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>flags</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Decode a YUV planar image into an RGB or grayscale image. </p>
<p>This function uses the accelerated color conversion routines in the underlying codec but does not execute any of the other steps in the JPEG decompression process.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">handle</td><td>a handle to a TurboJPEG decompressor or transformer instance</td></tr>
<tr><td class="paramname">srcBuf</td><td>pointer to an image buffer containing a YUV planar image to be decoded. The size of this buffer should match the value returned by <a class="el" href="group___turbo_j_p_e_g.html#gaf451664a62c1f6c7cc5a6401f32908c9" title="The size of the buffer (in bytes) required to hold a YUV planar image with the given parameters...">tjBufSizeYUV2()</a> for the given image width, height, padding, and level of chrominance subsampling. The Y, U (Cb), and V (Cr) image planes should be stored sequentially in the source buffer (refer to <a class="el" href="group___turbo_j_p_e_g.html#YUVnotes">YUV Image Format Notes</a>.)</td></tr>
<tr><td class="paramname">pad</td><td>Use this parameter to specify that the width of each line in each plane of the YUV source image is padded to the nearest multiple of this number of bytes (must be a power of 2.)</td></tr>
<tr><td class="paramname">subsamp</td><td>the level of chrominance subsampling used in the YUV source image (see <a class="el" href="group___turbo_j_p_e_g.html#ga1d047060ea80bb9820d540bb928e9074">Chrominance subsampling options</a>.)</td></tr>
<tr><td class="paramname">dstBuf</td><td>pointer to an image buffer that will receive the decoded image. This buffer should normally be <code>pitch * height</code> bytes in size, but the <code>dstBuf</code> pointer can also be used to decode into a specific region of a larger buffer.</td></tr>
<tr><td class="paramname">width</td><td>width (in pixels) of the source and destination images</td></tr>
<tr><td class="paramname">pitch</td><td>bytes per line in the destination image. Normally, this should be <code>width * <a class="el" href="group___turbo_j_p_e_g.html#gad77cf8fe5b2bfd3cb3f53098146abb4c" title="Pixel size (in bytes) for a given pixel format.">tjPixelSize</a>[pixelFormat]</code> if the destination image is unpadded, or <code><a class="el" href="group___turbo_j_p_e_g.html#ga0aba955473315e405295d978f0c16511" title="Pad the given width to the nearest 32-bit boundary.">TJPAD</a>(width * <a class="el" href="group___turbo_j_p_e_g.html#gad77cf8fe5b2bfd3cb3f53098146abb4c" title="Pixel size (in bytes) for a given pixel format.">tjPixelSize</a>[pixelFormat])</code> if each line of the destination image should be padded to the nearest 32-bit boundary, as is the case for Windows bitmaps. You can also be clever and use the pitch parameter to skip lines, etc. Setting this parameter to 0 is the equivalent of setting it to <code>width * <a class="el" href="group___turbo_j_p_e_g.html#gad77cf8fe5b2bfd3cb3f53098146abb4c" title="Pixel size (in bytes) for a given pixel format.">tjPixelSize</a>[pixelFormat]</code>.</td></tr>
<tr><td class="paramname">height</td><td>height (in pixels) of the source and destination images</td></tr>
<tr><td class="paramname">pixelFormat</td><td>pixel format of the destination image (see <a class="el" href="group___turbo_j_p_e_g.html#gac916144e26c3817ac514e64ae5d12e2a">Pixel formats</a>.)</td></tr>
<tr><td class="paramname">flags</td><td>the bitwise OR of one or more of the <a class="el" href="group___turbo_j_p_e_g.html#ga72ecf4ebe6eb702d3c6f5ca27455e1ec">flags</a></td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>0 if successful, or -1 if an error occurred (see <a class="el" href="group___turbo_j_p_e_g.html#ga9af79c908ec131b1ae8d52fe40375abf" title="Returns a descriptive error message explaining why the last command failed.">tjGetErrorStr()</a>.) </dd></dl>
</div>
</div>
<a class="anchor" id="ga6cb5b0e1101a2b20edea576e11faf93d"></a>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">DLLEXPORT int DLLCALL tjDecodeYUVPlanes </td>
<td>(</td>
<td class="paramtype"><a class="el" href="group___turbo_j_p_e_g.html#ga758d2634ecb4949de7815cba621f5763">tjhandle</a>&#160;</td>
<td class="paramname"><em>handle</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">unsigned char **&#160;</td>
<td class="paramname"><em>srcPlanes</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int *&#160;</td>
<td class="paramname"><em>strides</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>subsamp</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">unsigned char *&#160;</td>
<td class="paramname"><em>dstBuf</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>width</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>pitch</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>height</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>pixelFormat</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>flags</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Decode a set of Y, U (Cb), and V (Cr) image planes into an RGB or grayscale image. </p>
<p>This function uses the accelerated color conversion routines in the underlying codec but does not execute any of the other steps in the JPEG decompression process.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">handle</td><td>a handle to a TurboJPEG decompressor or transformer instance</td></tr>
<tr><td class="paramname">srcPlanes</td><td>an array of pointers to Y, U (Cb), and V (Cr) image planes (or just a Y plane, if decoding a grayscale image) that contain a YUV image to be decoded. These planes can be contiguous or non-contiguous in memory. The size of each plane should match the value returned by <a class="el" href="group___turbo_j_p_e_g.html#ga6f98d977bfa9d167c97172e876ba61e2" title="The size of the buffer (in bytes) required to hold a YUV image plane with the given parameters...">tjPlaneSizeYUV()</a> for the given image width, height, strides, and level of chrominance subsampling. Refer to <a class="el" href="group___turbo_j_p_e_g.html#YUVnotes">YUV Image Format Notes</a> for more details.</td></tr>
<tr><td class="paramname">strides</td><td>an array of integers, each specifying the number of bytes per line in the corresponding plane of the YUV source image. Setting the stride for any plane to 0 is the same as setting it to the plane width (see <a class="el" href="group___turbo_j_p_e_g.html#YUVnotes">YUV Image Format Notes</a>.) If <code>strides</code> is NULL, then the strides for all planes will be set to their respective plane widths. You can adjust the strides in order to specify an arbitrary amount of line padding in each plane or to decode a subregion of a larger YUV planar image.</td></tr>
<tr><td class="paramname">subsamp</td><td>the level of chrominance subsampling used in the YUV source image (see <a class="el" href="group___turbo_j_p_e_g.html#ga1d047060ea80bb9820d540bb928e9074">Chrominance subsampling options</a>.)</td></tr>
<tr><td class="paramname">dstBuf</td><td>pointer to an image buffer that will receive the decoded image. This buffer should normally be <code>pitch * height</code> bytes in size, but the <code>dstBuf</code> pointer can also be used to decode into a specific region of a larger buffer.</td></tr>
<tr><td class="paramname">width</td><td>width (in pixels) of the source and destination images</td></tr>
<tr><td class="paramname">pitch</td><td>bytes per line in the destination image. Normally, this should be <code>width * <a class="el" href="group___turbo_j_p_e_g.html#gad77cf8fe5b2bfd3cb3f53098146abb4c" title="Pixel size (in bytes) for a given pixel format.">tjPixelSize</a>[pixelFormat]</code> if the destination image is unpadded, or <code><a class="el" href="group___turbo_j_p_e_g.html#ga0aba955473315e405295d978f0c16511" title="Pad the given width to the nearest 32-bit boundary.">TJPAD</a>(width * <a class="el" href="group___turbo_j_p_e_g.html#gad77cf8fe5b2bfd3cb3f53098146abb4c" title="Pixel size (in bytes) for a given pixel format.">tjPixelSize</a>[pixelFormat])</code> if each line of the destination image should be padded to the nearest 32-bit boundary, as is the case for Windows bitmaps. You can also be clever and use the pitch parameter to skip lines, etc. Setting this parameter to 0 is the equivalent of setting it to <code>width * <a class="el" href="group___turbo_j_p_e_g.html#gad77cf8fe5b2bfd3cb3f53098146abb4c" title="Pixel size (in bytes) for a given pixel format.">tjPixelSize</a>[pixelFormat]</code>.</td></tr>
<tr><td class="paramname">height</td><td>height (in pixels) of the source and destination images</td></tr>
<tr><td class="paramname">pixelFormat</td><td>pixel format of the destination image (see <a class="el" href="group___turbo_j_p_e_g.html#gac916144e26c3817ac514e64ae5d12e2a">Pixel formats</a>.)</td></tr>
<tr><td class="paramname">flags</td><td>the bitwise OR of one or more of the <a class="el" href="group___turbo_j_p_e_g.html#ga72ecf4ebe6eb702d3c6f5ca27455e1ec">flags</a></td></tr>
</table> </table>
</dd> </dd>
</dl> </dl>
@@ -1162,10 +1476,10 @@ If you choose option 1, <code>*jpegSize</code> should be set to the size of your
<tr><td class="paramname">jpegSize</td><td>size of the JPEG image (in bytes)</td></tr> <tr><td class="paramname">jpegSize</td><td>size of the JPEG image (in bytes)</td></tr>
<tr><td class="paramname">dstBuf</td><td>pointer to an image buffer that will receive the decompressed image. This buffer should normally be <code>pitch * scaledHeight</code> bytes in size, where <code>scaledHeight</code> can be determined by calling <a class="el" href="group___turbo_j_p_e_g.html#ga84878bb65404204743aa18cac02781df" title="Compute the scaled value of dimension using the given scaling factor.">TJSCALED()</a> with the JPEG image height and one of the scaling factors returned by <a class="el" href="group___turbo_j_p_e_g.html#ga6449044b9af402999ccf52f401333be8" title="Returns a list of fractional scaling factors that the JPEG decompressor in this implementation of Tur...">tjGetScalingFactors()</a>. The <code>dstBuf</code> pointer may also be used to decompress into a specific region of a larger buffer.</td></tr> <tr><td class="paramname">dstBuf</td><td>pointer to an image buffer that will receive the decompressed image. This buffer should normally be <code>pitch * scaledHeight</code> bytes in size, where <code>scaledHeight</code> can be determined by calling <a class="el" href="group___turbo_j_p_e_g.html#ga84878bb65404204743aa18cac02781df" title="Compute the scaled value of dimension using the given scaling factor.">TJSCALED()</a> with the JPEG image height and one of the scaling factors returned by <a class="el" href="group___turbo_j_p_e_g.html#ga6449044b9af402999ccf52f401333be8" title="Returns a list of fractional scaling factors that the JPEG decompressor in this implementation of Tur...">tjGetScalingFactors()</a>. The <code>dstBuf</code> pointer may also be used to decompress into a specific region of a larger buffer.</td></tr>
<tr><td class="paramname">width</td><td>desired width (in pixels) of the destination image. If this is different than the width of the JPEG image being decompressed, then TurboJPEG will use scaling in the JPEG decompressor to generate the largest possible image that will fit within the desired width. If <code>width</code> is set to 0, then only the height will be considered when determining the scaled image size.</td></tr> <tr><td class="paramname">width</td><td>desired width (in pixels) of the destination image. If this is different than the width of the JPEG image being decompressed, then TurboJPEG will use scaling in the JPEG decompressor to generate the largest possible image that will fit within the desired width. If <code>width</code> is set to 0, then only the height will be considered when determining the scaled image size.</td></tr>
<tr><td class="paramname">pitch</td><td>bytes per line of the destination image. Normally, this is <code>scaledWidth * <a class="el" href="group___turbo_j_p_e_g.html#gad77cf8fe5b2bfd3cb3f53098146abb4c" title="Pixel size (in bytes) for a given pixel format.">tjPixelSize</a>[pixelFormat]</code> if the decompressed image is unpadded, else <code><a class="el" href="group___turbo_j_p_e_g.html#ga0aba955473315e405295d978f0c16511" title="Pad the given width to the nearest 32-bit boundary.">TJPAD</a>(scaledWidth * <a class="el" href="group___turbo_j_p_e_g.html#gad77cf8fe5b2bfd3cb3f53098146abb4c" title="Pixel size (in bytes) for a given pixel format.">tjPixelSize</a>[pixelFormat])</code> if each line of the decompressed image is padded to the nearest 32-bit boundary, as is the case for Windows bitmaps. (NOTE: <code>scaledWidth</code> can be determined by calling <a class="el" href="group___turbo_j_p_e_g.html#ga84878bb65404204743aa18cac02781df" title="Compute the scaled value of dimension using the given scaling factor.">TJSCALED()</a> with the JPEG image width and one of the scaling factors returned by <a class="el" href="group___turbo_j_p_e_g.html#ga6449044b9af402999ccf52f401333be8" title="Returns a list of fractional scaling factors that the JPEG decompressor in this implementation of Tur...">tjGetScalingFactors()</a>.) You can also be clever and use the pitch parameter to skip lines, etc. Setting this parameter to 0 is the equivalent of setting it to <code>scaledWidth * <a class="el" href="group___turbo_j_p_e_g.html#gad77cf8fe5b2bfd3cb3f53098146abb4c" title="Pixel size (in bytes) for a given pixel format.">tjPixelSize</a>[pixelFormat]</code>. </td></tr> <tr><td class="paramname">pitch</td><td>bytes per line in the destination image. Normally, this is <code>scaledWidth * <a class="el" href="group___turbo_j_p_e_g.html#gad77cf8fe5b2bfd3cb3f53098146abb4c" title="Pixel size (in bytes) for a given pixel format.">tjPixelSize</a>[pixelFormat]</code> if the decompressed image is unpadded, else <code><a class="el" href="group___turbo_j_p_e_g.html#ga0aba955473315e405295d978f0c16511" title="Pad the given width to the nearest 32-bit boundary.">TJPAD</a>(scaledWidth * <a class="el" href="group___turbo_j_p_e_g.html#gad77cf8fe5b2bfd3cb3f53098146abb4c" title="Pixel size (in bytes) for a given pixel format.">tjPixelSize</a>[pixelFormat])</code> if each line of the decompressed image is padded to the nearest 32-bit boundary, as is the case for Windows bitmaps. (NOTE: <code>scaledWidth</code> can be determined by calling <a class="el" href="group___turbo_j_p_e_g.html#ga84878bb65404204743aa18cac02781df" title="Compute the scaled value of dimension using the given scaling factor.">TJSCALED()</a> with the JPEG image width and one of the scaling factors returned by <a class="el" href="group___turbo_j_p_e_g.html#ga6449044b9af402999ccf52f401333be8" title="Returns a list of fractional scaling factors that the JPEG decompressor in this implementation of Tur...">tjGetScalingFactors()</a>.) You can also be clever and use the pitch parameter to skip lines, etc. Setting this parameter to 0 is the equivalent of setting it to <code>scaledWidth * <a class="el" href="group___turbo_j_p_e_g.html#gad77cf8fe5b2bfd3cb3f53098146abb4c" title="Pixel size (in bytes) for a given pixel format.">tjPixelSize</a>[pixelFormat]</code>.</td></tr>
<tr><td class="paramname">height</td><td>desired height (in pixels) of the destination image. If this is different than the height of the JPEG image being decompressed, then TurboJPEG will use scaling in the JPEG decompressor to generate the largest possible image that will fit within the desired height. If <code>height</code> is set to 0, then only the width will be considered when determining the scaled image size.</td></tr> <tr><td class="paramname">height</td><td>desired height (in pixels) of the destination image. If this is different than the height of the JPEG image being decompressed, then TurboJPEG will use scaling in the JPEG decompressor to generate the largest possible image that will fit within the desired height. If <code>height</code> is set to 0, then only the width will be considered when determining the scaled image size.</td></tr>
<tr><td class="paramname">pixelFormat</td><td>pixel format of the destination image (see <a class="el" href="group___turbo_j_p_e_g.html#gac916144e26c3817ac514e64ae5d12e2a">Pixel formats</a>.)</td></tr> <tr><td class="paramname">pixelFormat</td><td>pixel format of the destination image (see <a class="el" href="group___turbo_j_p_e_g.html#gac916144e26c3817ac514e64ae5d12e2a">Pixel formats</a>.)</td></tr>
<tr><td class="paramname">flags</td><td>the bitwise OR of one or more of the <a class="el" href="group___turbo_j_p_e_g.html#ga72ecf4ebe6eb702d3c6f5ca27455e1ec">flags</a>.</td></tr> <tr><td class="paramname">flags</td><td>the bitwise OR of one or more of the <a class="el" href="group___turbo_j_p_e_g.html#ga72ecf4ebe6eb702d3c6f5ca27455e1ec">flags</a></td></tr>
</table> </table>
</dd> </dd>
</dl> </dl>
@@ -1235,7 +1549,7 @@ If you choose option 1, <code>*jpegSize</code> should be set to the size of your
<tr><td class="paramname">jpegSize</td><td>size of the JPEG image (in bytes)</td></tr> <tr><td class="paramname">jpegSize</td><td>size of the JPEG image (in bytes)</td></tr>
<tr><td class="paramname">width</td><td>pointer to an integer variable that will receive the width (in pixels) of the JPEG image</td></tr> <tr><td class="paramname">width</td><td>pointer to an integer variable that will receive the width (in pixels) of the JPEG image</td></tr>
<tr><td class="paramname">height</td><td>pointer to an integer variable that will receive the height (in pixels) of the JPEG image</td></tr> <tr><td class="paramname">height</td><td>pointer to an integer variable that will receive the height (in pixels) of the JPEG image</td></tr>
<tr><td class="paramname">jpegSubsamp</td><td>pointer to an integer variable that will receive the level of chrominance subsampling used when compressing the JPEG image (see <a class="el" href="group___turbo_j_p_e_g.html#ga1d047060ea80bb9820d540bb928e9074">Chrominance subsampling options</a>.) </td></tr> <tr><td class="paramname">jpegSubsamp</td><td>pointer to an integer variable that will receive the level of chrominance subsampling used when the JPEG image was compressed (see <a class="el" href="group___turbo_j_p_e_g.html#ga1d047060ea80bb9820d540bb928e9074">Chrominance subsampling options</a>.)</td></tr>
<tr><td class="paramname">jpegColorspace</td><td>pointer to an integer variable that will receive one of the JPEG colorspace constants, indicating the colorspace of the JPEG image (see <a class="el" href="group___turbo_j_p_e_g.html#ga4f83ad3368e0e29d1957be0efa7c3720">JPEG colorspaces</a>.)</td></tr> <tr><td class="paramname">jpegColorspace</td><td>pointer to an integer variable that will receive one of the JPEG colorspace constants, indicating the colorspace of the JPEG image (see <a class="el" href="group___turbo_j_p_e_g.html#ga4f83ad3368e0e29d1957be0efa7c3720">JPEG colorspaces</a>.)</td></tr>
</table> </table>
</dd> </dd>
@@ -1305,18 +1619,96 @@ If you choose option 1, <code>*jpegSize</code> should be set to the size of your
</div><div class="memdoc"> </div><div class="memdoc">
<p>Decompress a JPEG image to a YUV planar image. </p> <p>Decompress a JPEG image to a YUV planar image. </p>
<p>This function performs JPEG decompression but leaves out the color conversion step, so a planar YUV image is generated instead of an RGB image. The structure of the planes in this image is the same as in the images generated by <a class="el" href="group___turbo_j_p_e_g.html#ga0a5ffbf7cb58a5b6a8201114fe889360" title="Encode an RGB or grayscale image into a YUV planar image.">tjEncodeYUV3()</a>. Note that, if the width or height of the JPEG image is not an even multiple of the MCU block size (see <a class="el" href="group___turbo_j_p_e_g.html#ga9e61e7cd47a15a173283ba94e781308c" title="MCU block width (in pixels) for a given level of chrominance subsampling.">tjMCUWidth</a> and <a class="el" href="group___turbo_j_p_e_g.html#gabd247bb9fecb393eca57366feb8327bf" title="MCU block height (in pixels) for a given level of chrominance subsampling.">tjMCUHeight</a>), then an intermediate buffer copy will be performed within TurboJPEG. </p> <p>This function performs JPEG decompression but leaves out the color conversion step, so a planar YUV image is generated instead of an RGB image.</p>
<p>NOTE: Technically, the JPEG format uses the YCbCr colorspace, but per the convention of the digital video community, the TurboJPEG API uses "YUV" to refer to an image format consisting of Y, Cb, and Cr image planes.</p>
<dl class="params"><dt>Parameters</dt><dd> <dl class="params"><dt>Parameters</dt><dd>
<table class="params"> <table class="params">
<tr><td class="paramname">handle</td><td>a handle to a TurboJPEG decompressor or transformer instance</td></tr> <tr><td class="paramname">handle</td><td>a handle to a TurboJPEG decompressor or transformer instance</td></tr>
<tr><td class="paramname">jpegBuf</td><td>pointer to a buffer containing the JPEG image to decompress</td></tr> <tr><td class="paramname">jpegBuf</td><td>pointer to a buffer containing the JPEG image to decompress</td></tr>
<tr><td class="paramname">jpegSize</td><td>size of the JPEG image (in bytes)</td></tr> <tr><td class="paramname">jpegSize</td><td>size of the JPEG image (in bytes)</td></tr>
<tr><td class="paramname">dstBuf</td><td>pointer to an image buffer that will receive the YUV image. Use <a class="el" href="group___turbo_j_p_e_g.html#gaf451664a62c1f6c7cc5a6401f32908c9" title="The size of the buffer (in bytes) required to hold a YUV planar image with the given parameters...">tjBufSizeYUV2()</a> to determine the appropriate size for this buffer based on the image width, height, padding, and level of subsampling. </td></tr> <tr><td class="paramname">dstBuf</td><td>pointer to an image buffer that will receive the YUV image. Use <a class="el" href="group___turbo_j_p_e_g.html#gaf451664a62c1f6c7cc5a6401f32908c9" title="The size of the buffer (in bytes) required to hold a YUV planar image with the given parameters...">tjBufSizeYUV2()</a> to determine the appropriate size for this buffer based on the image width, height, padding, and level of subsampling. The Y, U (Cb), and V (Cr) image planes will be stored sequentially in the buffer (refer to <a class="el" href="group___turbo_j_p_e_g.html#YUVnotes">YUV Image Format Notes</a>.)</td></tr>
<tr><td class="paramname">width</td><td>desired width (in pixels) of the YUV image. If this is different than the width of the JPEG image being decompressed, then TurboJPEG will use scaling in the JPEG decompressor to generate the largest possible image that will fit within the desired width. If <code>width</code> is set to 0, then only the height will be considered when determining the scaled image size. </td></tr> <tr><td class="paramname">width</td><td>desired width (in pixels) of the YUV image. If this is different than the width of the JPEG image being decompressed, then TurboJPEG will use scaling in the JPEG decompressor to generate the largest possible image that will fit within the desired width. If <code>width</code> is set to 0, then only the height will be considered when determining the scaled image size. If the scaled width is not an even multiple of the MCU block width (see <a class="el" href="group___turbo_j_p_e_g.html#ga9e61e7cd47a15a173283ba94e781308c" title="MCU block width (in pixels) for a given level of chrominance subsampling.">tjMCUWidth</a>), then an intermediate buffer copy will be performed within TurboJPEG.</td></tr>
<tr><td class="paramname">pad</td><td>the width of each line in each plane of the YUV image will be padded to the nearest multiple of this number of bytes (must be a power of 2.) To generate images suitable for X Video, <code>pad</code> should be set to 4.</td></tr> <tr><td class="paramname">pad</td><td>the width of each line in each plane of the YUV image will be padded to the nearest multiple of this number of bytes (must be a power of 2.) To generate images suitable for X Video, <code>pad</code> should be set to 4.</td></tr>
<tr><td class="paramname">height</td><td>desired height (in pixels) of the YUV image. If this is different than the height of the JPEG image being decompressed, then TurboJPEG will use scaling in the JPEG decompressor to generate the largest possible image that will fit within the desired height. If <code>height</code> is set to 0, then only the width will be considered when determining the scaled image size. </td></tr> <tr><td class="paramname">height</td><td>desired height (in pixels) of the YUV image. If this is different than the height of the JPEG image being decompressed, then TurboJPEG will use scaling in the JPEG decompressor to generate the largest possible image that will fit within the desired height. If <code>height</code> is set to 0, then only the width will be considered when determining the scaled image size. If the scaled height is not an even multiple of the MCU block height (see <a class="el" href="group___turbo_j_p_e_g.html#gabd247bb9fecb393eca57366feb8327bf" title="MCU block height (in pixels) for a given level of chrominance subsampling.">tjMCUHeight</a>), then an intermediate buffer copy will be performed within TurboJPEG.</td></tr>
<tr><td class="paramname">flags</td><td>the bitwise OR of one or more of the <a class="el" href="group___turbo_j_p_e_g.html#ga72ecf4ebe6eb702d3c6f5ca27455e1ec">flags</a>.</td></tr> <tr><td class="paramname">flags</td><td>the bitwise OR of one or more of the <a class="el" href="group___turbo_j_p_e_g.html#ga72ecf4ebe6eb702d3c6f5ca27455e1ec">flags</a></td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>0 if successful, or -1 if an error occurred (see <a class="el" href="group___turbo_j_p_e_g.html#ga9af79c908ec131b1ae8d52fe40375abf" title="Returns a descriptive error message explaining why the last command failed.">tjGetErrorStr()</a>.) </dd></dl>
</div>
</div>
<a class="anchor" id="ga0828a38ae29631ac28b6857cefb0eebf"></a>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">DLLEXPORT int DLLCALL tjDecompressToYUVPlanes </td>
<td>(</td>
<td class="paramtype"><a class="el" href="group___turbo_j_p_e_g.html#ga758d2634ecb4949de7815cba621f5763">tjhandle</a>&#160;</td>
<td class="paramname"><em>handle</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">unsigned char *&#160;</td>
<td class="paramname"><em>jpegBuf</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">unsigned long&#160;</td>
<td class="paramname"><em>jpegSize</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">unsigned char **&#160;</td>
<td class="paramname"><em>dstPlanes</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>width</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int *&#160;</td>
<td class="paramname"><em>strides</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>height</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>flags</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Decompress a JPEG image into separate Y, U (Cb), and V (Cr) image planes. </p>
<p>This function performs JPEG decompression but leaves out the color conversion step, so a planar YUV image is generated instead of an RGB image.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">handle</td><td>a handle to a TurboJPEG decompressor or transformer instance</td></tr>
<tr><td class="paramname">jpegBuf</td><td>pointer to a buffer containing the JPEG image to decompress</td></tr>
<tr><td class="paramname">jpegSize</td><td>size of the JPEG image (in bytes)</td></tr>
<tr><td class="paramname">dstPlanes</td><td>an array of pointers to Y, U (Cb), and V (Cr) image planes (or just a Y plane, if decompressing a grayscale image) that will receive the YUV image. These planes can be contiguous or non-contiguous in memory. Use <a class="el" href="group___turbo_j_p_e_g.html#ga6f98d977bfa9d167c97172e876ba61e2" title="The size of the buffer (in bytes) required to hold a YUV image plane with the given parameters...">tjPlaneSizeYUV()</a> to determine the appropriate size for each plane based on the scaled image width, scaled image height, strides, and level of chrominance subsampling. Refer to <a class="el" href="group___turbo_j_p_e_g.html#YUVnotes">YUV Image Format Notes</a> for more details.</td></tr>
<tr><td class="paramname">width</td><td>desired width (in pixels) of the YUV image. If this is different than the width of the JPEG image being decompressed, then TurboJPEG will use scaling in the JPEG decompressor to generate the largest possible image that will fit within the desired width. If <code>width</code> is set to 0, then only the height will be considered when determining the scaled image size. If the scaled width is not an even multiple of the MCU block width (see <a class="el" href="group___turbo_j_p_e_g.html#ga9e61e7cd47a15a173283ba94e781308c" title="MCU block width (in pixels) for a given level of chrominance subsampling.">tjMCUWidth</a>), then an intermediate buffer copy will be performed within TurboJPEG.</td></tr>
<tr><td class="paramname">strides</td><td>an array of integers, each specifying the number of bytes per line in the corresponding plane of the output image. Setting the stride for any plane to 0 is the same as setting it to the scaled plane width (see <a class="el" href="group___turbo_j_p_e_g.html#YUVnotes">YUV Image Format Notes</a>.) If <code>strides</code> is NULL, then the strides for all planes will be set to their respective scaled plane widths. You can adjust the strides in order to add an arbitrary amount of line padding to each plane or to decompress the JPEG image into a subregion of a larger YUV planar image.</td></tr>
<tr><td class="paramname">height</td><td>desired height (in pixels) of the YUV image. If this is different than the height of the JPEG image being decompressed, then TurboJPEG will use scaling in the JPEG decompressor to generate the largest possible image that will fit within the desired height. If <code>height</code> is set to 0, then only the width will be considered when determining the scaled image size. If the scaled height is not an even multiple of the MCU block height (see <a class="el" href="group___turbo_j_p_e_g.html#gabd247bb9fecb393eca57366feb8327bf" title="MCU block height (in pixels) for a given level of chrominance subsampling.">tjMCUHeight</a>), then an intermediate buffer copy will be performed within TurboJPEG.</td></tr>
<tr><td class="paramname">flags</td><td>the bitwise OR of one or more of the <a class="el" href="group___turbo_j_p_e_g.html#ga72ecf4ebe6eb702d3c6f5ca27455e1ec">flags</a></td></tr>
</table> </table>
</dd> </dd>
</dl> </dl>
@@ -1422,20 +1814,112 @@ If you choose option 1, <code>*jpegSize</code> should be set to the size of your
</div><div class="memdoc"> </div><div class="memdoc">
<p>Encode an RGB or grayscale image into a YUV planar image. </p> <p>Encode an RGB or grayscale image into a YUV planar image. </p>
<p>This function uses the accelerated color conversion routines in TurboJPEG's underlying codec but does not execute any of the other steps in the JPEG compression process. The Y, U (Cb), and V (Cr) image planes are stored sequentially into the destination buffer, and the size of each plane is determined by the width and height of the source image, as well as the specified padding and level of chrominance subsampling. If the chrominance components are subsampled along the horizontal dimension, then the width of the luminance plane is padded to the nearest multiple of 2 in the output image (same goes for the height of the luminance plane, if the chrominance components are subsampled along the vertical dimension.) </p> <p>This function uses the accelerated color conversion routines in the underlying codec but does not execute any of the other steps in the JPEG compression process.</p>
<p>NOTE: Technically, the JPEG format uses the YCbCr colorspace, but per the convention of the digital video community, the TurboJPEG API uses "YUV" to refer to an image format consisting of Y, Cb, and Cr image planes.</p>
<dl class="params"><dt>Parameters</dt><dd> <dl class="params"><dt>Parameters</dt><dd>
<table class="params"> <table class="params">
<tr><td class="paramname">handle</td><td>a handle to a TurboJPEG compressor or transformer instance</td></tr> <tr><td class="paramname">handle</td><td>a handle to a TurboJPEG compressor or transformer instance</td></tr>
<tr><td class="paramname">srcBuf</td><td>pointer to an image buffer containing RGB or grayscale pixels to be encoded</td></tr> <tr><td class="paramname">srcBuf</td><td>pointer to an image buffer containing RGB or grayscale pixels to be encoded</td></tr>
<tr><td class="paramname">width</td><td>width (in pixels) of the source image</td></tr> <tr><td class="paramname">width</td><td>width (in pixels) of the source image</td></tr>
<tr><td class="paramname">pitch</td><td>bytes per line of the source image. Normally, this should be <code>width * <a class="el" href="group___turbo_j_p_e_g.html#gad77cf8fe5b2bfd3cb3f53098146abb4c" title="Pixel size (in bytes) for a given pixel format.">tjPixelSize</a>[pixelFormat]</code> if the image is unpadded, or <code><a class="el" href="group___turbo_j_p_e_g.html#ga0aba955473315e405295d978f0c16511" title="Pad the given width to the nearest 32-bit boundary.">TJPAD</a>(width * <a class="el" href="group___turbo_j_p_e_g.html#gad77cf8fe5b2bfd3cb3f53098146abb4c" title="Pixel size (in bytes) for a given pixel format.">tjPixelSize</a>[pixelFormat])</code> if each line of the image is padded to the nearest 32-bit boundary, as is the case for Windows bitmaps. You can also be clever and use this parameter to skip lines, etc. Setting this parameter to 0 is the equivalent of setting it to <code>width * <a class="el" href="group___turbo_j_p_e_g.html#gad77cf8fe5b2bfd3cb3f53098146abb4c" title="Pixel size (in bytes) for a given pixel format.">tjPixelSize</a>[pixelFormat]</code>. </td></tr> <tr><td class="paramname">pitch</td><td>bytes per line in the source image. Normally, this should be <code>width * <a class="el" href="group___turbo_j_p_e_g.html#gad77cf8fe5b2bfd3cb3f53098146abb4c" title="Pixel size (in bytes) for a given pixel format.">tjPixelSize</a>[pixelFormat]</code> if the image is unpadded, or <code><a class="el" href="group___turbo_j_p_e_g.html#ga0aba955473315e405295d978f0c16511" title="Pad the given width to the nearest 32-bit boundary.">TJPAD</a>(width * <a class="el" href="group___turbo_j_p_e_g.html#gad77cf8fe5b2bfd3cb3f53098146abb4c" title="Pixel size (in bytes) for a given pixel format.">tjPixelSize</a>[pixelFormat])</code> if each line of the image is padded to the nearest 32-bit boundary, as is the case for Windows bitmaps. You can also be clever and use this parameter to skip lines, etc. Setting this parameter to 0 is the equivalent of setting it to <code>width * <a class="el" href="group___turbo_j_p_e_g.html#gad77cf8fe5b2bfd3cb3f53098146abb4c" title="Pixel size (in bytes) for a given pixel format.">tjPixelSize</a>[pixelFormat]</code>.</td></tr>
<tr><td class="paramname">height</td><td>height (in pixels) of the source image</td></tr> <tr><td class="paramname">height</td><td>height (in pixels) of the source image</td></tr>
<tr><td class="paramname">pixelFormat</td><td>pixel format of the source image (see <a class="el" href="group___turbo_j_p_e_g.html#gac916144e26c3817ac514e64ae5d12e2a">Pixel formats</a>.)</td></tr> <tr><td class="paramname">pixelFormat</td><td>pixel format of the source image (see <a class="el" href="group___turbo_j_p_e_g.html#gac916144e26c3817ac514e64ae5d12e2a">Pixel formats</a>.)</td></tr>
<tr><td class="paramname">dstBuf</td><td>pointer to an image buffer that will receive the YUV image. Use <a class="el" href="group___turbo_j_p_e_g.html#gaf451664a62c1f6c7cc5a6401f32908c9" title="The size of the buffer (in bytes) required to hold a YUV planar image with the given parameters...">tjBufSizeYUV2()</a> to determine the appropriate size for this buffer based on the image width, height, padding, and level of chrominance subsampling. </td></tr> <tr><td class="paramname">dstBuf</td><td>pointer to an image buffer that will receive the YUV image. Use <a class="el" href="group___turbo_j_p_e_g.html#gaf451664a62c1f6c7cc5a6401f32908c9" title="The size of the buffer (in bytes) required to hold a YUV planar image with the given parameters...">tjBufSizeYUV2()</a> to determine the appropriate size for this buffer based on the image width, height, padding, and level of chrominance subsampling. The Y, U (Cb), and V (Cr) image planes will be stored sequentially in the buffer (refer to <a class="el" href="group___turbo_j_p_e_g.html#YUVnotes">YUV Image Format Notes</a>.)</td></tr>
<tr><td class="paramname">pad</td><td>the width of each line in each plane of the YUV image will be padded to the nearest multiple of this number of bytes (must be a power of 2.) To generate images suitable for X Video, <code>pad</code> should be set to 4.</td></tr> <tr><td class="paramname">pad</td><td>the width of each line in each plane of the YUV image will be padded to the nearest multiple of this number of bytes (must be a power of 2.) To generate images suitable for X Video, <code>pad</code> should be set to 4.</td></tr>
<tr><td class="paramname">subsamp</td><td>the level of chrominance subsampling to be used when generating the YUV image (see <a class="el" href="group___turbo_j_p_e_g.html#ga1d047060ea80bb9820d540bb928e9074">Chrominance subsampling options</a>.) To generate images suitable for X Video, <code>subsamp</code> should be set to <a class="el" href="group___turbo_j_p_e_g.html#gga1d047060ea80bb9820d540bb928e9074a63085dbf683cfe39e513cdb6343e3737">TJSAMP_420</a>. This produces an image compatible with the I420 (AKA "YUV420P") format.</td></tr> <tr><td class="paramname">subsamp</td><td>the level of chrominance subsampling to be used when generating the YUV image (see <a class="el" href="group___turbo_j_p_e_g.html#ga1d047060ea80bb9820d540bb928e9074">Chrominance subsampling options</a>.) To generate images suitable for X Video, <code>subsamp</code> should be set to <a class="el" href="group___turbo_j_p_e_g.html#gga1d047060ea80bb9820d540bb928e9074a63085dbf683cfe39e513cdb6343e3737">TJSAMP_420</a>. This produces an image compatible with the I420 (AKA "YUV420P") format.</td></tr>
<tr><td class="paramname">flags</td><td>the bitwise OR of one or more of the <a class="el" href="group___turbo_j_p_e_g.html#ga72ecf4ebe6eb702d3c6f5ca27455e1ec">flags</a>.</td></tr> <tr><td class="paramname">flags</td><td>the bitwise OR of one or more of the <a class="el" href="group___turbo_j_p_e_g.html#ga72ecf4ebe6eb702d3c6f5ca27455e1ec">flags</a></td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>0 if successful, or -1 if an error occurred (see <a class="el" href="group___turbo_j_p_e_g.html#ga9af79c908ec131b1ae8d52fe40375abf" title="Returns a descriptive error message explaining why the last command failed.">tjGetErrorStr()</a>.) </dd></dl>
</div>
</div>
<a class="anchor" id="gaa791db8598853ddcad24e42897ef1269"></a>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">DLLEXPORT int DLLCALL tjEncodeYUVPlanes </td>
<td>(</td>
<td class="paramtype"><a class="el" href="group___turbo_j_p_e_g.html#ga758d2634ecb4949de7815cba621f5763">tjhandle</a>&#160;</td>
<td class="paramname"><em>handle</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">unsigned char *&#160;</td>
<td class="paramname"><em>srcBuf</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>width</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>pitch</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>height</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>pixelFormat</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">unsigned char **&#160;</td>
<td class="paramname"><em>dstPlanes</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int *&#160;</td>
<td class="paramname"><em>strides</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>subsamp</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>flags</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Encode an RGB or grayscale image into separate Y, U (Cb), and V (Cr) image planes. </p>
<p>This function uses the accelerated color conversion routines in the underlying codec but does not execute any of the other steps in the JPEG compression process.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">handle</td><td>a handle to a TurboJPEG compressor or transformer instance</td></tr>
<tr><td class="paramname">srcBuf</td><td>pointer to an image buffer containing RGB or grayscale pixels to be encoded</td></tr>
<tr><td class="paramname">width</td><td>width (in pixels) of the source image</td></tr>
<tr><td class="paramname">pitch</td><td>bytes per line in the source image. Normally, this should be <code>width * <a class="el" href="group___turbo_j_p_e_g.html#gad77cf8fe5b2bfd3cb3f53098146abb4c" title="Pixel size (in bytes) for a given pixel format.">tjPixelSize</a>[pixelFormat]</code> if the image is unpadded, or <code><a class="el" href="group___turbo_j_p_e_g.html#ga0aba955473315e405295d978f0c16511" title="Pad the given width to the nearest 32-bit boundary.">TJPAD</a>(width * <a class="el" href="group___turbo_j_p_e_g.html#gad77cf8fe5b2bfd3cb3f53098146abb4c" title="Pixel size (in bytes) for a given pixel format.">tjPixelSize</a>[pixelFormat])</code> if each line of the image is padded to the nearest 32-bit boundary, as is the case for Windows bitmaps. You can also be clever and use this parameter to skip lines, etc. Setting this parameter to 0 is the equivalent of setting it to <code>width * <a class="el" href="group___turbo_j_p_e_g.html#gad77cf8fe5b2bfd3cb3f53098146abb4c" title="Pixel size (in bytes) for a given pixel format.">tjPixelSize</a>[pixelFormat]</code>.</td></tr>
<tr><td class="paramname">height</td><td>height (in pixels) of the source image</td></tr>
<tr><td class="paramname">pixelFormat</td><td>pixel format of the source image (see <a class="el" href="group___turbo_j_p_e_g.html#gac916144e26c3817ac514e64ae5d12e2a">Pixel formats</a>.)</td></tr>
<tr><td class="paramname">dstPlanes</td><td>an array of pointers to Y, U (Cb), and V (Cr) image planes (or just a Y plane, if generating a grayscale image) that will receive the encoded image. These planes can be contiguous or non-contiguous in memory. Use <a class="el" href="group___turbo_j_p_e_g.html#ga6f98d977bfa9d167c97172e876ba61e2" title="The size of the buffer (in bytes) required to hold a YUV image plane with the given parameters...">tjPlaneSizeYUV()</a> to determine the appropriate size for each plane based on the image width, height, strides, and level of chrominance subsampling. Refer to <a class="el" href="group___turbo_j_p_e_g.html#YUVnotes">YUV Image Format Notes</a> for more details.</td></tr>
<tr><td class="paramname">strides</td><td>an array of integers, each specifying the number of bytes per line in the corresponding plane of the output image. Setting the stride for any plane to 0 is the same as setting it to the plane width (see <a class="el" href="group___turbo_j_p_e_g.html#YUVnotes">YUV Image Format Notes</a>.) If <code>strides</code> is NULL, then the strides for all planes will be set to their respective plane widths. You can adjust the strides in order to add an arbitrary amount of line padding to each plane or to encode an RGB or grayscale image into a subregion of a larger YUV planar image.</td></tr>
<tr><td class="paramname">subsamp</td><td>the level of chrominance subsampling to be used when generating the YUV image (see <a class="el" href="group___turbo_j_p_e_g.html#ga1d047060ea80bb9820d540bb928e9074">Chrominance subsampling options</a>.) To generate images suitable for X Video, <code>subsamp</code> should be set to <a class="el" href="group___turbo_j_p_e_g.html#gga1d047060ea80bb9820d540bb928e9074a63085dbf683cfe39e513cdb6343e3737">TJSAMP_420</a>. This produces an image compatible with the I420 (AKA "YUV420P") format.</td></tr>
<tr><td class="paramname">flags</td><td>the bitwise OR of one or more of the <a class="el" href="group___turbo_j_p_e_g.html#ga72ecf4ebe6eb702d3c6f5ca27455e1ec">flags</a></td></tr>
</table> </table>
</dd> </dd>
</dl> </dl>
@@ -1568,6 +2052,151 @@ If you choose option 1, <code>*jpegSize</code> should be set to the size of your
<p>Create a new TurboJPEG transformer instance. </p> <p>Create a new TurboJPEG transformer instance. </p>
<dl class="section return"><dt>Returns</dt><dd>a handle to the newly-created instance, or NULL if an error occurred (see <a class="el" href="group___turbo_j_p_e_g.html#ga9af79c908ec131b1ae8d52fe40375abf" title="Returns a descriptive error message explaining why the last command failed.">tjGetErrorStr()</a>.) </dd></dl> <dl class="section return"><dt>Returns</dt><dd>a handle to the newly-created instance, or NULL if an error occurred (see <a class="el" href="group___turbo_j_p_e_g.html#ga9af79c908ec131b1ae8d52fe40375abf" title="Returns a descriptive error message explaining why the last command failed.">tjGetErrorStr()</a>.) </dd></dl>
</div>
</div>
<a class="anchor" id="ga1a209696c6a80748f20e134b3c64789f"></a>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">DLLEXPORT int tjPlaneHeight </td>
<td>(</td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>componentID</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>height</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>subsamp</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>The plane height of a YUV image plane with the given parameters. </p>
<p>Refer to <a class="el" href="group___turbo_j_p_e_g.html#YUVnotes">YUV Image Format Notes</a> for a description of plane height.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">componentID</td><td>ID number of the image plane (0 = Y, 1 = U/Cb, 2 = V/Cr)</td></tr>
<tr><td class="paramname">height</td><td>height (in pixels) of the YUV image</td></tr>
<tr><td class="paramname">subsamp</td><td>level of chrominance subsampling in the image (see <a class="el" href="group___turbo_j_p_e_g.html#ga1d047060ea80bb9820d540bb928e9074">Chrominance subsampling options</a>.)</td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>the plane height of a YUV image plane with the given parameters, or -1 if the arguments are out of bounds. </dd></dl>
</div>
</div>
<a class="anchor" id="ga6f98d977bfa9d167c97172e876ba61e2"></a>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">DLLEXPORT unsigned long DLLCALL tjPlaneSizeYUV </td>
<td>(</td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>componentID</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>width</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>stride</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>height</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>subsamp</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>The size of the buffer (in bytes) required to hold a YUV image plane with the given parameters. </p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">componentID</td><td>ID number of the image plane (0 = Y, 1 = U/Cb, 2 = V/Cr)</td></tr>
<tr><td class="paramname">width</td><td>width (in pixels) of the YUV image. NOTE: this is the width of the whole image, not the plane width.</td></tr>
<tr><td class="paramname">stride</td><td>bytes per line in the image plane. Setting this to 0 is the equivalent of setting it to the plane width.</td></tr>
<tr><td class="paramname">height</td><td>height (in pixels) of the YUV image. NOTE: this is the height of the whole image, not the plane height.</td></tr>
<tr><td class="paramname">subsamp</td><td>level of chrominance subsampling in the image (see <a class="el" href="group___turbo_j_p_e_g.html#ga1d047060ea80bb9820d540bb928e9074">Chrominance subsampling options</a>.)</td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>the size of the buffer (in bytes) required to hold the YUV image plane, or -1 if the arguments are out of bounds. </dd></dl>
</div>
</div>
<a class="anchor" id="ga63fb66bb1e36c74008c4634360becbb1"></a>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">DLLEXPORT int tjPlaneWidth </td>
<td>(</td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>componentID</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>width</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>subsamp</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>The plane width of a YUV image plane with the given parameters. </p>
<p>Refer to <a class="el" href="group___turbo_j_p_e_g.html#YUVnotes">YUV Image Format Notes</a> for a description of plane width.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">componentID</td><td>ID number of the image plane (0 = Y, 1 = U/Cb, 2 = V/Cr)</td></tr>
<tr><td class="paramname">width</td><td>width (in pixels) of the YUV image</td></tr>
<tr><td class="paramname">subsamp</td><td>level of chrominance subsampling in the image (see <a class="el" href="group___turbo_j_p_e_g.html#ga1d047060ea80bb9820d540bb928e9074">Chrominance subsampling options</a>.)</td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>the plane width of a YUV image plane with the given parameters, or -1 if the arguments are out of bounds. </dd></dl>
</div> </div>
</div> </div>
<a class="anchor" id="gae403193ceb4aafb7e0f56ab587b48616"></a> <a class="anchor" id="gae403193ceb4aafb7e0f56ab587b48616"></a>
@@ -1631,12 +2260,12 @@ If you choose option 1, <code>*jpegSize</code> should be set to the size of your
</div><div class="memdoc"> </div><div class="memdoc">
<p>Losslessly transform a JPEG image into another JPEG image. </p> <p>Losslessly transform a JPEG image into another JPEG image. </p>
<p>Lossless transforms work by moving the raw coefficients from one JPEG image structure to another without altering the values of the coefficients. While this is typically faster than decompressing the image, transforming it, and re-compressing it, lossless transforms are not free. Each lossless transform requires reading and performing Huffman decoding on all of the coefficients in the source image, regardless of the size of the destination image. Thus, this function provides a means of generating multiple transformed images from the same source or applying multiple transformations simultaneously, in order to eliminate the need to read the source coefficients multiple times.</p> <p>Lossless transforms work by moving the raw DCT coefficients from one JPEG image structure to another without altering the values of the coefficients. While this is typically faster than decompressing the image, transforming it, and re-compressing it, lossless transforms are not free. Each lossless transform requires reading and performing Huffman decoding on all of the coefficients in the source image, regardless of the size of the destination image. Thus, this function provides a means of generating multiple transformed images from the same source or applying multiple transformations simultaneously, in order to eliminate the need to read the source coefficients multiple times.</p>
<dl class="params"><dt>Parameters</dt><dd> <dl class="params"><dt>Parameters</dt><dd>
<table class="params"> <table class="params">
<tr><td class="paramname">handle</td><td>a handle to a TurboJPEG transformer instance</td></tr> <tr><td class="paramname">handle</td><td>a handle to a TurboJPEG transformer instance</td></tr>
<tr><td class="paramname">jpegBuf</td><td>pointer to a buffer containing the JPEG image to transform </td></tr> <tr><td class="paramname">jpegBuf</td><td>pointer to a buffer containing the JPEG source image to transform</td></tr>
<tr><td class="paramname">jpegSize</td><td>size of the JPEG image (in bytes) </td></tr> <tr><td class="paramname">jpegSize</td><td>size of the JPEG source image (in bytes)</td></tr>
<tr><td class="paramname">n</td><td>the number of transformed JPEG images to generate</td></tr> <tr><td class="paramname">n</td><td>the number of transformed JPEG images to generate</td></tr>
<tr><td class="paramname">dstBufs</td><td>pointer to an array of n image buffers. <code>dstBufs[i]</code> will receive a JPEG image that has been transformed using the parameters in <code>transforms[i]</code>. TurboJPEG has the ability to reallocate the JPEG buffer to accommodate the size of the JPEG image. Thus, you can choose to:<ol type="1"> <tr><td class="paramname">dstBufs</td><td>pointer to an array of n image buffers. <code>dstBufs[i]</code> will receive a JPEG image that has been transformed using the parameters in <code>transforms[i]</code>. TurboJPEG has the ability to reallocate the JPEG buffer to accommodate the size of the JPEG image. Thus, you can choose to:<ol type="1">
<li>pre-allocate the JPEG buffer with an arbitrary size using <a class="el" href="group___turbo_j_p_e_g.html#ga5c9234bda6d993cdaffdd89bf81a00ff" title="Allocate an image buffer for use with TurboJPEG.">tjAlloc()</a> and let TurboJPEG grow the buffer as needed,</li> <li>pre-allocate the JPEG buffer with an arbitrary size using <a class="el" href="group___turbo_j_p_e_g.html#ga5c9234bda6d993cdaffdd89bf81a00ff" title="Allocate an image buffer for use with TurboJPEG.">tjAlloc()</a> and let TurboJPEG grow the buffer as needed,</li>
@@ -1646,7 +2275,7 @@ If you choose option 1, <code>*jpegSize</code> should be set to the size of your
If you choose option 1, <code>dstSizes[i]</code> should be set to the size of your pre-allocated buffer. In any case, unless you have set <a class="el" href="group___turbo_j_p_e_g.html#ga8808d403c68b62aaa58a4c1e58e98963" title="Disable buffer (re)allocation.">TJFLAG_NOREALLOC</a>, you should always check <code>dstBufs[i]</code> upon return from this function, as it may have changed.</td></tr> If you choose option 1, <code>dstSizes[i]</code> should be set to the size of your pre-allocated buffer. In any case, unless you have set <a class="el" href="group___turbo_j_p_e_g.html#ga8808d403c68b62aaa58a4c1e58e98963" title="Disable buffer (re)allocation.">TJFLAG_NOREALLOC</a>, you should always check <code>dstBufs[i]</code> upon return from this function, as it may have changed.</td></tr>
<tr><td class="paramname">dstSizes</td><td>pointer to an array of n unsigned long variables that will receive the actual sizes (in bytes) of each transformed JPEG image. If <code>dstBufs[i]</code> points to a pre-allocated buffer, then <code>dstSizes[i]</code> should be set to the size of the buffer. Upon return, <code>dstSizes[i]</code> will contain the size of the JPEG image (in bytes.)</td></tr> <tr><td class="paramname">dstSizes</td><td>pointer to an array of n unsigned long variables that will receive the actual sizes (in bytes) of each transformed JPEG image. If <code>dstBufs[i]</code> points to a pre-allocated buffer, then <code>dstSizes[i]</code> should be set to the size of the buffer. Upon return, <code>dstSizes[i]</code> will contain the size of the JPEG image (in bytes.)</td></tr>
<tr><td class="paramname">transforms</td><td>pointer to an array of n <a class="el" href="structtjtransform.html" title="Lossless transform.">tjtransform</a> structures, each of which specifies the transform parameters and/or cropping region for the corresponding transformed output image.</td></tr> <tr><td class="paramname">transforms</td><td>pointer to an array of n <a class="el" href="structtjtransform.html" title="Lossless transform.">tjtransform</a> structures, each of which specifies the transform parameters and/or cropping region for the corresponding transformed output image.</td></tr>
<tr><td class="paramname">flags</td><td>the bitwise OR of one or more of the <a class="el" href="group___turbo_j_p_e_g.html#ga72ecf4ebe6eb702d3c6f5ca27455e1ec">flags</a>.</td></tr> <tr><td class="paramname">flags</td><td>the bitwise OR of one or more of the <a class="el" href="group___turbo_j_p_e_g.html#ga72ecf4ebe6eb702d3c6f5ca27455e1ec">flags</a></td></tr>
</table> </table>
</dd> </dd>
</dl> </dl>

View File

@@ -14,6 +14,7 @@
$(document).ready(function() { searchBox.OnSelectItem(0); }); $(document).ready(function() { searchBox.OnSelectItem(0); });
</script> </script>
<link href="doxygen.css" rel="stylesheet" type="text/css" /> <link href="doxygen.css" rel="stylesheet" type="text/css" />
<link href="doxygen-extra.css" rel="stylesheet" type="text/css"/>
</head> </head>
<body> <body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! --> <div id="top"><!-- do not remove this div, it is closed by doxygen! -->

View File

@@ -14,6 +14,7 @@
$(document).ready(function() { searchBox.OnSelectItem(0); }); $(document).ready(function() { searchBox.OnSelectItem(0); });
</script> </script>
<link href="doxygen.css" rel="stylesheet" type="text/css" /> <link href="doxygen.css" rel="stylesheet" type="text/css" />
<link href="doxygen-extra.css" rel="stylesheet" type="text/css"/>
</head> </head>
<body> <body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! --> <div id="top"><!-- do not remove this div, it is closed by doxygen! -->

View File

@@ -10,17 +10,22 @@ var searchData=
['tjbufsizeyuv2',['tjBufSizeYUV2',['../group___turbo_j_p_e_g.html#gaf451664a62c1f6c7cc5a6401f32908c9',1,'turbojpeg.h']]], ['tjbufsizeyuv2',['tjBufSizeYUV2',['../group___turbo_j_p_e_g.html#gaf451664a62c1f6c7cc5a6401f32908c9',1,'turbojpeg.h']]],
['tjcompress2',['tjCompress2',['../group___turbo_j_p_e_g.html#gaba62b7a98f960839b588579898495cf2',1,'turbojpeg.h']]], ['tjcompress2',['tjCompress2',['../group___turbo_j_p_e_g.html#gaba62b7a98f960839b588579898495cf2',1,'turbojpeg.h']]],
['tjcompressfromyuv',['tjCompressFromYUV',['../group___turbo_j_p_e_g.html#ga0b931126c7a615ddc3bbd0cca6698d67',1,'turbojpeg.h']]], ['tjcompressfromyuv',['tjCompressFromYUV',['../group___turbo_j_p_e_g.html#ga0b931126c7a615ddc3bbd0cca6698d67',1,'turbojpeg.h']]],
['tjcompressfromyuvplanes',['tjCompressFromYUVPlanes',['../group___turbo_j_p_e_g.html#gaa89a1982cb4556b12ae7af4439991af6',1,'turbojpeg.h']]],
['tjcs',['TJCS',['../group___turbo_j_p_e_g.html#ga4f83ad3368e0e29d1957be0efa7c3720',1,'turbojpeg.h']]], ['tjcs',['TJCS',['../group___turbo_j_p_e_g.html#ga4f83ad3368e0e29d1957be0efa7c3720',1,'turbojpeg.h']]],
['tjcs_5fcmyk',['TJCS_CMYK',['../group___turbo_j_p_e_g.html#gga4f83ad3368e0e29d1957be0efa7c3720a6c8b636152ac8195b869587db315ee53',1,'turbojpeg.h']]], ['tjcs_5fcmyk',['TJCS_CMYK',['../group___turbo_j_p_e_g.html#gga4f83ad3368e0e29d1957be0efa7c3720a6c8b636152ac8195b869587db315ee53',1,'turbojpeg.h']]],
['tjcs_5fgray',['TJCS_GRAY',['../group___turbo_j_p_e_g.html#gga4f83ad3368e0e29d1957be0efa7c3720ab3e7d6a87f695e45b81c1b5262b5a50a',1,'turbojpeg.h']]], ['tjcs_5fgray',['TJCS_GRAY',['../group___turbo_j_p_e_g.html#gga4f83ad3368e0e29d1957be0efa7c3720ab3e7d6a87f695e45b81c1b5262b5a50a',1,'turbojpeg.h']]],
['tjcs_5frgb',['TJCS_RGB',['../group___turbo_j_p_e_g.html#gga4f83ad3368e0e29d1957be0efa7c3720a677cb7ccb85c4038ac41964a2e09e555',1,'turbojpeg.h']]], ['tjcs_5frgb',['TJCS_RGB',['../group___turbo_j_p_e_g.html#gga4f83ad3368e0e29d1957be0efa7c3720a677cb7ccb85c4038ac41964a2e09e555',1,'turbojpeg.h']]],
['tjcs_5fycbcr',['TJCS_YCbCr',['../group___turbo_j_p_e_g.html#gga4f83ad3368e0e29d1957be0efa7c3720a7389b8f65bb387ffedce3efd0d78ec75',1,'turbojpeg.h']]], ['tjcs_5fycbcr',['TJCS_YCbCr',['../group___turbo_j_p_e_g.html#gga4f83ad3368e0e29d1957be0efa7c3720a7389b8f65bb387ffedce3efd0d78ec75',1,'turbojpeg.h']]],
['tjcs_5fycck',['TJCS_YCCK',['../group___turbo_j_p_e_g.html#gga4f83ad3368e0e29d1957be0efa7c3720a53839e0fe867b76b58d16b0a1a7c598e',1,'turbojpeg.h']]], ['tjcs_5fycck',['TJCS_YCCK',['../group___turbo_j_p_e_g.html#gga4f83ad3368e0e29d1957be0efa7c3720a53839e0fe867b76b58d16b0a1a7c598e',1,'turbojpeg.h']]],
['tjdecodeyuv',['tjDecodeYUV',['../group___turbo_j_p_e_g.html#ga132ae2c2cadcf64c8bb0f3bdf69da3ed',1,'turbojpeg.h']]],
['tjdecodeyuvplanes',['tjDecodeYUVPlanes',['../group___turbo_j_p_e_g.html#ga6cb5b0e1101a2b20edea576e11faf93d',1,'turbojpeg.h']]],
['tjdecompress2',['tjDecompress2',['../group___turbo_j_p_e_g.html#gada69cc6443d1bb493b40f1626259e5e9',1,'turbojpeg.h']]], ['tjdecompress2',['tjDecompress2',['../group___turbo_j_p_e_g.html#gada69cc6443d1bb493b40f1626259e5e9',1,'turbojpeg.h']]],
['tjdecompressheader3',['tjDecompressHeader3',['../group___turbo_j_p_e_g.html#gacd0fac3af74b3511d39b4781b7103086',1,'turbojpeg.h']]], ['tjdecompressheader3',['tjDecompressHeader3',['../group___turbo_j_p_e_g.html#gacd0fac3af74b3511d39b4781b7103086',1,'turbojpeg.h']]],
['tjdecompresstoyuv2',['tjDecompressToYUV2',['../group___turbo_j_p_e_g.html#ga7c08b340ad7f8e85d407bd9e81d44d07',1,'turbojpeg.h']]], ['tjdecompresstoyuv2',['tjDecompressToYUV2',['../group___turbo_j_p_e_g.html#ga7c08b340ad7f8e85d407bd9e81d44d07',1,'turbojpeg.h']]],
['tjdecompresstoyuvplanes',['tjDecompressToYUVPlanes',['../group___turbo_j_p_e_g.html#ga0828a38ae29631ac28b6857cefb0eebf',1,'turbojpeg.h']]],
['tjdestroy',['tjDestroy',['../group___turbo_j_p_e_g.html#ga674adee917b95ad4a896f1ba39e12540',1,'turbojpeg.h']]], ['tjdestroy',['tjDestroy',['../group___turbo_j_p_e_g.html#ga674adee917b95ad4a896f1ba39e12540',1,'turbojpeg.h']]],
['tjencodeyuv3',['tjEncodeYUV3',['../group___turbo_j_p_e_g.html#ga0a5ffbf7cb58a5b6a8201114fe889360',1,'turbojpeg.h']]], ['tjencodeyuv3',['tjEncodeYUV3',['../group___turbo_j_p_e_g.html#ga0a5ffbf7cb58a5b6a8201114fe889360',1,'turbojpeg.h']]],
['tjencodeyuvplanes',['tjEncodeYUVPlanes',['../group___turbo_j_p_e_g.html#gaa791db8598853ddcad24e42897ef1269',1,'turbojpeg.h']]],
['tjflag_5faccuratedct',['TJFLAG_ACCURATEDCT',['../group___turbo_j_p_e_g.html#gacb233cfd722d66d1ccbf48a7de81f0e0',1,'turbojpeg.h']]], ['tjflag_5faccuratedct',['TJFLAG_ACCURATEDCT',['../group___turbo_j_p_e_g.html#gacb233cfd722d66d1ccbf48a7de81f0e0',1,'turbojpeg.h']]],
['tjflag_5fbottomup',['TJFLAG_BOTTOMUP',['../group___turbo_j_p_e_g.html#ga72ecf4ebe6eb702d3c6f5ca27455e1ec',1,'turbojpeg.h']]], ['tjflag_5fbottomup',['TJFLAG_BOTTOMUP',['../group___turbo_j_p_e_g.html#ga72ecf4ebe6eb702d3c6f5ca27455e1ec',1,'turbojpeg.h']]],
['tjflag_5ffastdct',['TJFLAG_FASTDCT',['../group___turbo_j_p_e_g.html#gaabce235db80d3f698b27f36cbd453da2',1,'turbojpeg.h']]], ['tjflag_5ffastdct',['TJFLAG_FASTDCT',['../group___turbo_j_p_e_g.html#gaabce235db80d3f698b27f36cbd453da2',1,'turbojpeg.h']]],
@@ -51,6 +56,9 @@ var searchData=
['tjpf_5fxbgr',['TJPF_XBGR',['../group___turbo_j_p_e_g.html#ggac916144e26c3817ac514e64ae5d12e2aaf6603b27147de47e212e75dac027b2af',1,'turbojpeg.h']]], ['tjpf_5fxbgr',['TJPF_XBGR',['../group___turbo_j_p_e_g.html#ggac916144e26c3817ac514e64ae5d12e2aaf6603b27147de47e212e75dac027b2af',1,'turbojpeg.h']]],
['tjpf_5fxrgb',['TJPF_XRGB',['../group___turbo_j_p_e_g.html#ggac916144e26c3817ac514e64ae5d12e2aadae996905efcfa3b42a0bb3bea7f9d84',1,'turbojpeg.h']]], ['tjpf_5fxrgb',['TJPF_XRGB',['../group___turbo_j_p_e_g.html#ggac916144e26c3817ac514e64ae5d12e2aadae996905efcfa3b42a0bb3bea7f9d84',1,'turbojpeg.h']]],
['tjpixelsize',['tjPixelSize',['../group___turbo_j_p_e_g.html#gad77cf8fe5b2bfd3cb3f53098146abb4c',1,'turbojpeg.h']]], ['tjpixelsize',['tjPixelSize',['../group___turbo_j_p_e_g.html#gad77cf8fe5b2bfd3cb3f53098146abb4c',1,'turbojpeg.h']]],
['tjplaneheight',['tjPlaneHeight',['../group___turbo_j_p_e_g.html#ga1a209696c6a80748f20e134b3c64789f',1,'turbojpeg.h']]],
['tjplanesizeyuv',['tjPlaneSizeYUV',['../group___turbo_j_p_e_g.html#ga6f98d977bfa9d167c97172e876ba61e2',1,'turbojpeg.h']]],
['tjplanewidth',['tjPlaneWidth',['../group___turbo_j_p_e_g.html#ga63fb66bb1e36c74008c4634360becbb1',1,'turbojpeg.h']]],
['tjredoffset',['tjRedOffset',['../group___turbo_j_p_e_g.html#gadd9b446742ac8a3923f7992c7988fea8',1,'turbojpeg.h']]], ['tjredoffset',['tjRedOffset',['../group___turbo_j_p_e_g.html#gadd9b446742ac8a3923f7992c7988fea8',1,'turbojpeg.h']]],
['tjregion',['tjregion',['../structtjregion.html',1,'']]], ['tjregion',['tjregion',['../structtjregion.html',1,'']]],
['tjsamp',['TJSAMP',['../group___turbo_j_p_e_g.html#ga1d047060ea80bb9820d540bb928e9074',1,'turbojpeg.h']]], ['tjsamp',['TJSAMP',['../group___turbo_j_p_e_g.html#ga1d047060ea80bb9820d540bb928e9074',1,'turbojpeg.h']]],

View File

@@ -5,16 +5,24 @@ var searchData=
['tjbufsizeyuv2',['tjBufSizeYUV2',['../group___turbo_j_p_e_g.html#gaf451664a62c1f6c7cc5a6401f32908c9',1,'turbojpeg.h']]], ['tjbufsizeyuv2',['tjBufSizeYUV2',['../group___turbo_j_p_e_g.html#gaf451664a62c1f6c7cc5a6401f32908c9',1,'turbojpeg.h']]],
['tjcompress2',['tjCompress2',['../group___turbo_j_p_e_g.html#gaba62b7a98f960839b588579898495cf2',1,'turbojpeg.h']]], ['tjcompress2',['tjCompress2',['../group___turbo_j_p_e_g.html#gaba62b7a98f960839b588579898495cf2',1,'turbojpeg.h']]],
['tjcompressfromyuv',['tjCompressFromYUV',['../group___turbo_j_p_e_g.html#ga0b931126c7a615ddc3bbd0cca6698d67',1,'turbojpeg.h']]], ['tjcompressfromyuv',['tjCompressFromYUV',['../group___turbo_j_p_e_g.html#ga0b931126c7a615ddc3bbd0cca6698d67',1,'turbojpeg.h']]],
['tjcompressfromyuvplanes',['tjCompressFromYUVPlanes',['../group___turbo_j_p_e_g.html#gaa89a1982cb4556b12ae7af4439991af6',1,'turbojpeg.h']]],
['tjdecodeyuv',['tjDecodeYUV',['../group___turbo_j_p_e_g.html#ga132ae2c2cadcf64c8bb0f3bdf69da3ed',1,'turbojpeg.h']]],
['tjdecodeyuvplanes',['tjDecodeYUVPlanes',['../group___turbo_j_p_e_g.html#ga6cb5b0e1101a2b20edea576e11faf93d',1,'turbojpeg.h']]],
['tjdecompress2',['tjDecompress2',['../group___turbo_j_p_e_g.html#gada69cc6443d1bb493b40f1626259e5e9',1,'turbojpeg.h']]], ['tjdecompress2',['tjDecompress2',['../group___turbo_j_p_e_g.html#gada69cc6443d1bb493b40f1626259e5e9',1,'turbojpeg.h']]],
['tjdecompressheader3',['tjDecompressHeader3',['../group___turbo_j_p_e_g.html#gacd0fac3af74b3511d39b4781b7103086',1,'turbojpeg.h']]], ['tjdecompressheader3',['tjDecompressHeader3',['../group___turbo_j_p_e_g.html#gacd0fac3af74b3511d39b4781b7103086',1,'turbojpeg.h']]],
['tjdecompresstoyuv2',['tjDecompressToYUV2',['../group___turbo_j_p_e_g.html#ga7c08b340ad7f8e85d407bd9e81d44d07',1,'turbojpeg.h']]], ['tjdecompresstoyuv2',['tjDecompressToYUV2',['../group___turbo_j_p_e_g.html#ga7c08b340ad7f8e85d407bd9e81d44d07',1,'turbojpeg.h']]],
['tjdecompresstoyuvplanes',['tjDecompressToYUVPlanes',['../group___turbo_j_p_e_g.html#ga0828a38ae29631ac28b6857cefb0eebf',1,'turbojpeg.h']]],
['tjdestroy',['tjDestroy',['../group___turbo_j_p_e_g.html#ga674adee917b95ad4a896f1ba39e12540',1,'turbojpeg.h']]], ['tjdestroy',['tjDestroy',['../group___turbo_j_p_e_g.html#ga674adee917b95ad4a896f1ba39e12540',1,'turbojpeg.h']]],
['tjencodeyuv3',['tjEncodeYUV3',['../group___turbo_j_p_e_g.html#ga0a5ffbf7cb58a5b6a8201114fe889360',1,'turbojpeg.h']]], ['tjencodeyuv3',['tjEncodeYUV3',['../group___turbo_j_p_e_g.html#ga0a5ffbf7cb58a5b6a8201114fe889360',1,'turbojpeg.h']]],
['tjencodeyuvplanes',['tjEncodeYUVPlanes',['../group___turbo_j_p_e_g.html#gaa791db8598853ddcad24e42897ef1269',1,'turbojpeg.h']]],
['tjfree',['tjFree',['../group___turbo_j_p_e_g.html#ga8c4a1231dc06a450514c835f6471f137',1,'turbojpeg.h']]], ['tjfree',['tjFree',['../group___turbo_j_p_e_g.html#ga8c4a1231dc06a450514c835f6471f137',1,'turbojpeg.h']]],
['tjgeterrorstr',['tjGetErrorStr',['../group___turbo_j_p_e_g.html#ga9af79c908ec131b1ae8d52fe40375abf',1,'turbojpeg.h']]], ['tjgeterrorstr',['tjGetErrorStr',['../group___turbo_j_p_e_g.html#ga9af79c908ec131b1ae8d52fe40375abf',1,'turbojpeg.h']]],
['tjgetscalingfactors',['tjGetScalingFactors',['../group___turbo_j_p_e_g.html#ga6449044b9af402999ccf52f401333be8',1,'turbojpeg.h']]], ['tjgetscalingfactors',['tjGetScalingFactors',['../group___turbo_j_p_e_g.html#ga6449044b9af402999ccf52f401333be8',1,'turbojpeg.h']]],
['tjinitcompress',['tjInitCompress',['../group___turbo_j_p_e_g.html#ga3d10c47fbe4a2489a2b30c931551d01a',1,'turbojpeg.h']]], ['tjinitcompress',['tjInitCompress',['../group___turbo_j_p_e_g.html#ga3d10c47fbe4a2489a2b30c931551d01a',1,'turbojpeg.h']]],
['tjinitdecompress',['tjInitDecompress',['../group___turbo_j_p_e_g.html#gae5408179d041e2a2f7199c8283cf649e',1,'turbojpeg.h']]], ['tjinitdecompress',['tjInitDecompress',['../group___turbo_j_p_e_g.html#gae5408179d041e2a2f7199c8283cf649e',1,'turbojpeg.h']]],
['tjinittransform',['tjInitTransform',['../group___turbo_j_p_e_g.html#ga3155b775bfbac9dbba869b95a0367902',1,'turbojpeg.h']]], ['tjinittransform',['tjInitTransform',['../group___turbo_j_p_e_g.html#ga3155b775bfbac9dbba869b95a0367902',1,'turbojpeg.h']]],
['tjplaneheight',['tjPlaneHeight',['../group___turbo_j_p_e_g.html#ga1a209696c6a80748f20e134b3c64789f',1,'turbojpeg.h']]],
['tjplanesizeyuv',['tjPlaneSizeYUV',['../group___turbo_j_p_e_g.html#ga6f98d977bfa9d167c97172e876ba61e2',1,'turbojpeg.h']]],
['tjplanewidth',['tjPlaneWidth',['../group___turbo_j_p_e_g.html#ga63fb66bb1e36c74008c4634360becbb1',1,'turbojpeg.h']]],
['tjtransform',['tjTransform',['../group___turbo_j_p_e_g.html#gae403193ceb4aafb7e0f56ab587b48616',1,'turbojpeg.h']]] ['tjtransform',['tjTransform',['../group___turbo_j_p_e_g.html#gae403193ceb4aafb7e0f56ab587b48616',1,'turbojpeg.h']]]
]; ];

View File

@@ -14,6 +14,7 @@
$(document).ready(function() { searchBox.OnSelectItem(0); }); $(document).ready(function() { searchBox.OnSelectItem(0); });
</script> </script>
<link href="doxygen.css" rel="stylesheet" type="text/css" /> <link href="doxygen.css" rel="stylesheet" type="text/css" />
<link href="doxygen-extra.css" rel="stylesheet" type="text/css"/>
</head> </head>
<body> <body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! --> <div id="top"><!-- do not remove this div, it is closed by doxygen! -->

View File

@@ -14,6 +14,7 @@
$(document).ready(function() { searchBox.OnSelectItem(0); }); $(document).ready(function() { searchBox.OnSelectItem(0); });
</script> </script>
<link href="doxygen.css" rel="stylesheet" type="text/css" /> <link href="doxygen.css" rel="stylesheet" type="text/css" />
<link href="doxygen-extra.css" rel="stylesheet" type="text/css"/>
</head> </head>
<body> <body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! --> <div id="top"><!-- do not remove this div, it is closed by doxygen! -->

View File

@@ -14,6 +14,7 @@
$(document).ready(function() { searchBox.OnSelectItem(0); }); $(document).ready(function() { searchBox.OnSelectItem(0); });
</script> </script>
<link href="doxygen.css" rel="stylesheet" type="text/css" /> <link href="doxygen.css" rel="stylesheet" type="text/css" />
<link href="doxygen-extra.css" rel="stylesheet" type="text/css"/>
</head> </head>
<body> <body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! --> <div id="top"><!-- do not remove this div, it is closed by doxygen! -->

3
doxygen-extra.css Normal file
View File

@@ -0,0 +1,3 @@
code {
color: #4665A2;
}

View File

@@ -13,3 +13,4 @@ JAVADOC_AUTOBRIEF = YES
MAX_INITIALIZER_LINES = 0 MAX_INITIALIZER_LINES = 0
ALWAYS_DETAILED_SEC = YES ALWAYS_DETAILED_SEC = YES
HTML_TIMESTAMP = NO HTML_TIMESTAMP = NO
HTML_EXTRA_STYLESHEET = doxygen-extra.css

View File

@@ -126,8 +126,6 @@ write_JPEG_file (char * filename, int quality)
cinfo.image_height = image_height; cinfo.image_height = image_height;
cinfo.input_components = 3; /* # of color components per pixel */ cinfo.input_components = 3; /* # of color components per pixel */
cinfo.in_color_space = JCS_RGB; /* colorspace of input image */ cinfo.in_color_space = JCS_RGB; /* colorspace of input image */
cinfo.use_moz_defaults = TRUE; /* use Mozilla defaults for improved compression */
/* Now use the library's routine to set default compression parameters. /* Now use the library's routine to set default compression parameters.
* (You must set at least cinfo.in_color_space before calling this, * (You must set at least cinfo.in_color_space before calling this,
* since the defaults depend on the source color space.) * since the defaults depend on the source color space.)

26
git-init-svn.sh Executable file
View File

@@ -0,0 +1,26 @@
#!/bin/sh
set -e
# Make a local, clean libjpeg-turbo branch that tracks the remote libjpeg-turbo.
# This will allow pushing of imported libjpeg-turbo commits to the mozjpeg repository.
# The libjpeg-turbo branch must only contain imported SVN commits (with git-svn-id: in the message).
git branch -f -t libjpeg-turbo origin/libjpeg-turbo
# Configure git-svn. "git svn fetch" will rebuild remaining git-svn metadata.
git config svn-remote.svn.url svn://svn.code.sf.net/p/libjpeg-turbo/code
git config svn-remote.svn.fetch trunk:refs/heads/libjpeg-turbo
# Enable mapping of SVN usernames to git authors.
git config svn.authorsfile .gitauthors
# Mark which libjpeg-turbo commit has been used to start mozjpeg.
# Required for accurate merging and blame.
echo > .git/info/grafts "72b66f9c77b3e4ae363b21e48145f635cec0b193 540789427ccae8e9e778151cbc16ab8ee88ac6a8"
# To get changes from SVN:
# git svn fetch
# git push origin libjpeg-turbo
#
# To merge SVN changes with mozjpeg:
# git checkout master
# git merge libjpeg-turbo

View File

@@ -8,12 +8,13 @@ set(JAVA_CLASSNAMES org/libjpegturbo/turbojpeg/TJ
org/libjpegturbo/turbojpeg/TJScalingFactor org/libjpegturbo/turbojpeg/TJScalingFactor
org/libjpegturbo/turbojpeg/TJTransform org/libjpegturbo/turbojpeg/TJTransform
org/libjpegturbo/turbojpeg/TJTransformer org/libjpegturbo/turbojpeg/TJTransformer
org/libjpegturbo/turbojpeg/YUVImage
TJUnitTest TJUnitTest
TJExample TJExample
TJBench) TJBench)
if(MSVC_IDE) if(MSVC_IDE)
set(OBJDIR "${CMAKE_CURRENT_BINARY_DIR}/$(OutDir)") set(OBJDIR "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}")
else() else()
set(OBJDIR "${CMAKE_CURRENT_BINARY_DIR}") set(OBJDIR "${CMAKE_CURRENT_BINARY_DIR}")
endif() endif()

View File

@@ -13,6 +13,7 @@ JAVASOURCES = org/libjpegturbo/turbojpeg/TJ.java \
org/libjpegturbo/turbojpeg/TJScalingFactor.java \ org/libjpegturbo/turbojpeg/TJScalingFactor.java \
org/libjpegturbo/turbojpeg/TJTransform.java \ org/libjpegturbo/turbojpeg/TJTransform.java \
org/libjpegturbo/turbojpeg/TJTransformer.java \ org/libjpegturbo/turbojpeg/TJTransformer.java \
org/libjpegturbo/turbojpeg/YUVImage.java \
TJExample.java \ TJExample.java \
TJUnitTest.java \ TJUnitTest.java \
TJBench.java TJBench.java
@@ -34,6 +35,7 @@ JAVA_CLASSES = org/libjpegturbo/turbojpeg/TJ.class \
org/libjpegturbo/turbojpeg/TJScalingFactor.class \ org/libjpegturbo/turbojpeg/TJScalingFactor.class \
org/libjpegturbo/turbojpeg/TJTransform.class \ org/libjpegturbo/turbojpeg/TJTransform.class \
org/libjpegturbo/turbojpeg/TJTransformer.class \ org/libjpegturbo/turbojpeg/TJTransformer.class \
org/libjpegturbo/turbojpeg/YUVImage.class \
TJExample.class \ TJExample.class \
TJUnitTest.class \ TJUnitTest.class \
TJBench.class TJBench.class

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (C)2009-2013 D. R. Commander. All Rights Reserved. * Copyright (C)2009-2014 D. R. Commander. All Rights Reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met: * modification, are permitted provided that the following conditions are met:
@@ -34,12 +34,8 @@ import org.libjpegturbo.turbojpeg.*;
class TJBench { class TJBench {
static final int YUVENCODE = 1; static int flags = 0, quiet = 0, pf = TJ.PF_BGR, yuvpad = 1, warmup = 1;
static final int YUVDECODE = 2; static boolean compOnly, decompOnly, doTile, doYUV;
static final int YUVCOMPRESS = 3;
static int flags = 0, yuv = 0, quiet = 0, pf = TJ.PF_BGR, yuvpad = 1;
static boolean compOnly, decompOnly, doTile;
static final String[] pixFormatStr = { static final String[] pixFormatStr = {
"RGB", "BGR", "RGBX", "BGRX", "XBGR", "XRGB", "GRAY" "RGB", "BGR", "RGBX", "BGRX", "XBGR", "XRGB", "GRAY"
@@ -134,68 +130,97 @@ class TJBench {
/* Decompression test */ /* Decompression test */
static void decompTest(byte[] srcBuf, byte[][] jpegBuf, int[] jpegSize, static void decomp(byte[] srcBuf, byte[][] jpegBuf, int[] jpegSize,
byte[] dstBuf, int w, int h, int subsamp, byte[] dstBuf, int w, int h, int subsamp, int jpegQual,
int jpegQual, String fileName, int tilew, int tileh) String fileName, int tilew, int tileh) throws Exception {
throws Exception {
String qualStr = new String(""), sizeStr, tempStr; String qualStr = new String(""), sizeStr, tempStr;
TJDecompressor tjd; TJDecompressor tjd;
double start, elapsed; double elapsed, elapsedDecode;
int ps = TJ.getPixelSize(pf), i; int ps = TJ.getPixelSize(pf), i, iter = 0;
int scaledw = sf.getScaled(w); int scaledw = sf.getScaled(w);
int scaledh = sf.getScaled(h); int scaledh = sf.getScaled(h);
int yuvSize = TJ.bufSizeYUV(scaledw, yuvpad, scaledh, subsamp), bufsize;
int pitch = scaledw * ps; int pitch = scaledw * ps;
YUVImage yuvImage = null;
if (jpegQual > 0) if (jpegQual > 0)
qualStr = new String("_Q" + jpegQual); qualStr = new String("_Q" + jpegQual);
tjd = new TJDecompressor(); tjd = new TJDecompressor();
int bufSize = (yuv == YUVDECODE ? yuvSize : pitch * scaledh);
if (dstBuf == null) if (dstBuf == null)
dstBuf = new byte[bufSize]; dstBuf = new byte[pitch * scaledh];
/* Set the destination buffer to gray so we know whether the decompressor /* Set the destination buffer to gray so we know whether the decompressor
attempted to write to it */ attempted to write to it */
Arrays.fill(dstBuf, (byte)127); Arrays.fill(dstBuf, (byte)127);
/* Execute once to preload cache */ if (doYUV) {
tjd.setJPEGImage(jpegBuf[0], jpegSize[0]); int width = doTile ? tilew : scaledw;
if (yuv == YUVDECODE) int height = doTile ? tileh : scaledh;
tjd.decompressToYUV(dstBuf, scaledw, yuvpad, scaledh, flags); yuvImage = new YUVImage(width, yuvpad, height, subsamp);
else Arrays.fill(yuvImage.getBuf(), (byte)127);
tjd.decompress(dstBuf, scaledw, pitch, scaledh, pf, flags); }
/* Benchmark */ /* Benchmark */
for (i = 0, start = getTime(); (elapsed = getTime() - start) < benchTime; iter -= warmup;
i++) { elapsed = elapsedDecode = 0.0;
while (true) {
int tile = 0; int tile = 0;
if (yuv == YUVDECODE) double start = getTime();
tjd.decompressToYUV(dstBuf, scaledw, yuvpad, scaledh, flags);
else {
for (int y = 0; y < h; y += tileh) { for (int y = 0; y < h; y += tileh) {
for (int x = 0; x < w; x += tilew, tile++) { for (int x = 0; x < w; x += tilew, tile++) {
int width = doTile ? Math.min(tilew, w - x) : scaledw; int width = doTile ? Math.min(tilew, w - x) : scaledw;
int height = doTile ? Math.min(tileh, h - y) : scaledh; int height = doTile ? Math.min(tileh, h - y) : scaledh;
tjd.setJPEGImage(jpegBuf[tile], jpegSize[tile]); tjd.setSourceImage(jpegBuf[tile], jpegSize[tile]);
if (doYUV) {
yuvImage.setBuf(yuvImage.getBuf(), width, yuvpad, height, subsamp);
tjd.decompressToYUV(yuvImage, flags);
double startDecode = getTime();
tjd.setSourceImage(yuvImage);
tjd.decompress(dstBuf, x, y, width, pitch, height, pf, flags);
if (iter >= 0)
elapsedDecode += getTime() - startDecode;
} else
tjd.decompress(dstBuf, x, y, width, pitch, height, pf, flags); tjd.decompress(dstBuf, x, y, width, pitch, height, pf, flags);
} }
} }
iter++;
if (iter >= 1) {
elapsed += getTime() - start;
if (elapsed >= benchTime)
break;
} }
} }
if(doYUV)
elapsed -= elapsedDecode;
tjd = null; tjd = null;
for (i = 0; i < jpegBuf.length; i++)
jpegBuf[i] = null;
jpegBuf = null; jpegSize = null;
System.gc(); System.gc();
if (quiet != 0) if (quiet != 0) {
System.out.println( System.out.format("%-6s%s",
sigFig((double)(w * h) / 1000000. * (double)i / elapsed, 4)); sigFig((double)(w * h) / 1000000. * (double)iter / elapsed, 4),
else { quiet == 2 ? "\n" : " ");
System.out.format("D--> Frame rate: %f fps\n", if (doYUV)
(double)i / elapsed); System.out.format("%s\n",
System.out.format(" Dest. throughput: %f Megapixels/sec\n", sigFig((double)(w * h) / 1000000. * (double)iter / elapsedDecode, 4));
(double)(w * h) / 1000000. * (double)i / elapsed); else if (quiet != 2)
System.out.print("\n");
} else {
System.out.format("%s --> Frame rate: %f fps\n",
(doYUV ? "Decomp to YUV":"Decompress "),
(double)iter / elapsed);
System.out.format(" Throughput: %f Megapixels/sec\n",
(double)(w * h) / 1000000. * (double)iter / elapsed);
if (doYUV) {
System.out.format("YUV Decode --> Frame rate: %f fps\n",
(double)iter / elapsedDecode);
System.out.format(" Throughput: %f Megapixels/sec\n",
(double)(w * h) / 1000000. * (double)iter / elapsedDecode);
}
} }
if (sf.getNum() != 1 || sf.getDenom() != 1) if (sf.getNum() != 1 || sf.getDenom() != 1)
@@ -205,19 +230,13 @@ class TJBench {
else else
sizeStr = new String("full"); sizeStr = new String("full");
if (decompOnly) if (decompOnly)
tempStr = new String(fileName + "_" + sizeStr + tempStr = new String(fileName + "_" + sizeStr + ".bmp");
(yuv != 0 ? ".yuv" : ".bmp"));
else else
tempStr = new String(fileName + "_" + subName[subsamp] + qualStr + tempStr = new String(fileName + "_" + subName[subsamp] + qualStr +
"_" + sizeStr + (yuv != 0 ? ".yuv" : ".bmp")); "_" + sizeStr + ".bmp");
if (yuv == YUVDECODE) {
FileOutputStream fos = new FileOutputStream(tempStr);
fos.write(dstBuf, 0, yuvSize);
fos.close();
} else {
saveImage(tempStr, dstBuf, scaledw, scaledh, pf); saveImage(tempStr, dstBuf, scaledw, scaledh, pf);
int ndx = tempStr.indexOf('.'); int ndx = tempStr.lastIndexOf('.');
tempStr = new String(tempStr.substring(0, ndx) + "-err.bmp"); tempStr = new String(tempStr.substring(0, ndx) + "-err.bmp");
if (srcBuf != null && sf.getNum() == 1 && sf.getDenom() == 1) { if (srcBuf != null && sf.getNum() == 1 && sf.getDenom() == 1) {
if (quiet == 0) if (quiet == 0)
@@ -248,87 +267,20 @@ class TJBench {
saveImage(tempStr, dstBuf, w, h, pf); saveImage(tempStr, dstBuf, w, h, pf);
} }
} }
}
static void doTestYUV(byte[] srcBuf, int w, int h, int subsamp, static void fullTest(byte[] srcBuf, int w, int h, int subsamp, int jpegQual,
String fileName) throws Exception {
TJCompressor tjc;
byte[] dstBuf;
double start, elapsed;
int ps = TJ.getPixelSize(pf), i;
int yuvSize = 0;
yuvSize = TJ.bufSizeYUV(w, h, subsamp);
dstBuf = new byte[yuvSize];
if (quiet == 0)
System.out.format(">>>>> %s (%s) <--> YUV %s <<<<<\n",
pixFormatStr[pf],
(flags & TJ.FLAG_BOTTOMUP) != 0 ? "Bottom-up" : "Top-down",
subNameLong[subsamp]);
if (quiet == 1)
System.out.format("%s\t%s\t%s\tN/A\t", pixFormatStr[pf],
(flags & TJ.FLAG_BOTTOMUP) != 0 ? "BU" : "TD",
subNameLong[subsamp]);
tjc = new TJCompressor(srcBuf, w, 0, h, pf);
tjc.setSubsamp(subsamp);
/* Execute once to preload cache */
tjc.encodeYUV(dstBuf, flags);
/* Benchmark */
for (i = 0, start = getTime();
(elapsed = getTime() - start) < benchTime; i++)
tjc.encodeYUV(dstBuf, flags);
if (quiet == 1)
System.out.format("%-4d %-4d\t", w, h);
if (quiet != 0) {
System.out.format("%s%c%s%c",
sigFig((double)(w * h) / 1000000. * (double) i / elapsed, 4),
quiet == 2 ? '\n' : '\t',
sigFig((double)(w * h * ps) / (double)yuvSize, 4),
quiet == 2 ? '\n' : '\t');
} else {
System.out.format("\n%s size: %d x %d\n", "Image", w, h);
System.out.format("C--> Frame rate: %f fps\n",
(double)i / elapsed);
System.out.format(" Output image size: %d bytes\n", yuvSize);
System.out.format(" Compression ratio: %f:1\n",
(double)(w * h * ps) / (double)yuvSize);
System.out.format(" Source throughput: %f Megapixels/sec\n",
(double)(w * h) / 1000000. * (double)i / elapsed);
System.out.format(" Output bit stream: %f Megabits/sec\n",
(double)yuvSize * 8. / 1000000. * (double)i / elapsed);
}
String tempStr = fileName + "_" + subName[subsamp] + ".yuv";
FileOutputStream fos = new FileOutputStream(tempStr);
fos.write(dstBuf, 0, yuvSize);
fos.close();
if (quiet == 0)
System.out.println("Reference image written to " + tempStr);
}
static void doTest(byte[] srcBuf, int w, int h, int subsamp, int jpegQual,
String fileName) throws Exception { String fileName) throws Exception {
TJCompressor tjc; TJCompressor tjc;
byte[] tmpBuf; byte[] tmpBuf;
byte[][] jpegBuf; byte[][] jpegBuf;
int[] jpegSize; int[] jpegSize;
double start, elapsed; double start, elapsed, elapsedEncode;
int totalJpegSize = 0, tilew, tileh, i; int totalJpegSize = 0, tilew, tileh, i, iter;
int ps = (yuv == YUVCOMPRESS ? 3 : TJ.getPixelSize(pf)); int ps = TJ.getPixelSize(pf);
int ntilesw = 1, ntilesh = 1, pitch = w * ps; int ntilesw = 1, ntilesh = 1, pitch = w * ps;
String pfStr = (yuv == YUVCOMPRESS ? "YUV" : pixFormatStr[pf]); String pfStr = pixFormatStr[pf];
YUVImage yuvImage = null;
if (yuv == YUVENCODE) {
doTestYUV(srcBuf, w, h, subsamp, fileName);
return;
}
tmpBuf = new byte[pitch * h]; tmpBuf = new byte[pitch * h];
@@ -353,61 +305,94 @@ class TJBench {
/* Compression test */ /* Compression test */
if (quiet == 1) if (quiet == 1)
System.out.format("%s\t%s\t%s\t%d\t", pfStr, System.out.format("%-4s (%s) %-5s %-3d ", pfStr,
(flags & TJ.FLAG_BOTTOMUP) != 0 ? "BU" : "TD", (flags & TJ.FLAG_BOTTOMUP) != 0 ? "BU" : "TD",
subNameLong[subsamp], jpegQual); subNameLong[subsamp], jpegQual);
if (yuv != YUVCOMPRESS)
for (i = 0; i < h; i++) for (i = 0; i < h; i++)
System.arraycopy(srcBuf, w * ps * i, tmpBuf, pitch * i, w * ps); System.arraycopy(srcBuf, w * ps * i, tmpBuf, pitch * i, w * ps);
if (yuv == YUVCOMPRESS)
tjc.setSourceImageYUV(srcBuf, tilew, yuvpad, tileh);
else
tjc.setSourceImage(srcBuf, tilew, pitch, tileh, pf);
tjc.setJPEGQuality(jpegQual); tjc.setJPEGQuality(jpegQual);
tjc.setSubsamp(subsamp); tjc.setSubsamp(subsamp);
/* Execute once to preload cache */ if (doYUV) {
tjc.compress(jpegBuf[0], flags); yuvImage = new YUVImage(tilew, yuvpad, tileh, subsamp);
Arrays.fill(yuvImage.getBuf(), (byte)127);
}
/* Benchmark */ /* Benchmark */
for (i = 0, start = getTime(); iter = -warmup;
(elapsed = getTime() - start) < benchTime; i++) { elapsed = elapsedEncode = 0.0;
while (true) {
int tile = 0; int tile = 0;
totalJpegSize = 0; totalJpegSize = 0;
start = getTime();
for (int y = 0; y < h; y += tileh) { for (int y = 0; y < h; y += tileh) {
for (int x = 0; x < w; x += tilew, tile++) { for (int x = 0; x < w; x += tilew, tile++) {
int width = Math.min(tilew, w - x); int width = Math.min(tilew, w - x);
int height = Math.min(tileh, h - y); int height = Math.min(tileh, h - y);
if (yuv != YUVCOMPRESS)
tjc.setSourceImage(srcBuf, x, y, width, pitch, height, pf); tjc.setSourceImage(srcBuf, x, y, width, pitch, height, pf);
if (doYUV) {
double startEncode = getTime();
yuvImage.setBuf(yuvImage.getBuf(), width, yuvpad, height,
subsamp);
tjc.encodeYUV(yuvImage, flags);
if (iter >= 0)
elapsedEncode += getTime() - startEncode;
tjc.setSourceImage(yuvImage);
}
tjc.compress(jpegBuf[tile], flags); tjc.compress(jpegBuf[tile], flags);
jpegSize[tile] = tjc.getCompressedSize(); jpegSize[tile] = tjc.getCompressedSize();
totalJpegSize += jpegSize[tile]; totalJpegSize += jpegSize[tile];
} }
} }
iter++;
if (iter >= 1) {
elapsed += getTime() - start;
if (elapsed >= benchTime)
break;
} }
}
if (doYUV)
elapsed -= elapsedEncode;
if (quiet == 1) if (quiet == 1)
System.out.format("%-4d %-4d\t", tilew, tileh); System.out.format("%-5d %-5d ", tilew, tileh);
if (quiet != 0) { if (quiet != 0) {
System.out.format("%s%c%s%c", if (doYUV)
sigFig((double)(w * h) / 1000000. * (double) i / elapsed, 4), System.out.format("%-6s%s",
quiet == 2 ? '\n' : '\t', sigFig((double)(w * h) / 1000000. * (double)iter / elapsedEncode, 4),
quiet == 2 ? "\n" : " ");
System.out.format("%-6s%s",
sigFig((double)(w * h) / 1000000. * (double)iter / elapsed, 4),
quiet == 2 ? "\n" : " ");
System.out.format("%-6s%s",
sigFig((double)(w * h * ps) / (double)totalJpegSize, 4), sigFig((double)(w * h * ps) / (double)totalJpegSize, 4),
quiet == 2 ? '\n' : '\t'); quiet == 2 ? "\n" : " ");
} else { } else {
System.out.format("\n%s size: %d x %d\n", doTile ? "Tile" : "Image", System.out.format("\n%s size: %d x %d\n", doTile ? "Tile" : "Image",
tilew, tileh); tilew, tileh);
System.out.format("C--> Frame rate: %f fps\n", if (doYUV) {
(double)i / elapsed); System.out.format("Encode YUV --> Frame rate: %f fps\n",
(double)iter / elapsedEncode);
System.out.format(" Output image size: %d bytes\n",
yuvImage.getSize());
System.out.format(" Compression ratio: %f:1\n",
(double)(w * h * ps) / (double)yuvImage.getSize());
System.out.format(" Throughput: %f Megapixels/sec\n",
(double)(w * h) / 1000000. * (double)iter / elapsedEncode);
System.out.format(" Output bit stream: %f Megabits/sec\n",
(double)yuvImage.getSize() * 8. / 1000000. * (double)iter / elapsedEncode);
}
System.out.format("%s --> Frame rate: %f fps\n",
doYUV ? "Comp from YUV" : "Compress ",
(double)iter / elapsed);
System.out.format(" Output image size: %d bytes\n", System.out.format(" Output image size: %d bytes\n",
totalJpegSize); totalJpegSize);
System.out.format(" Compression ratio: %f:1\n", System.out.format(" Compression ratio: %f:1\n",
(double)(w * h * ps) / (double)totalJpegSize); (double)(w * h * ps) / (double)totalJpegSize);
System.out.format(" Source throughput: %f Megapixels/sec\n", System.out.format(" Throughput: %f Megapixels/sec\n",
(double)(w * h) / 1000000. * (double)i / elapsed); (double)(w * h) / 1000000. * (double)iter / elapsed);
System.out.format(" Output bit stream: %f Megabits/sec\n", System.out.format(" Output bit stream: %f Megabits/sec\n",
(double)totalJpegSize * 8. / 1000000. * (double)i / elapsed); (double)totalJpegSize * 8. / 1000000. * (double)iter / elapsed);
} }
if (tilew == w && tileh == h) { if (tilew == w && tileh == h) {
String tempStr = fileName + "_" + subName[subsamp] + "_" + "Q" + String tempStr = fileName + "_" + subName[subsamp] + "_" + "Q" +
@@ -421,27 +406,22 @@ class TJBench {
/* Decompression test */ /* Decompression test */
if (!compOnly) if (!compOnly)
decompTest(srcBuf, jpegBuf, jpegSize, tmpBuf, w, h, subsamp, jpegQual, decomp(srcBuf, jpegBuf, jpegSize, tmpBuf, w, h, subsamp, jpegQual,
fileName, tilew, tileh); fileName, tilew, tileh);
for (i = 0; i < ntilesw * ntilesh; i++)
jpegBuf[i] = null;
jpegBuf = null; jpegSize = null;
System.gc();
if (tilew == w && tileh == h) break; if (tilew == w && tileh == h) break;
} }
} }
static void doDecompTest(String fileName) throws Exception { static void decompTest(String fileName) throws Exception {
TJTransformer tjt; TJTransformer tjt;
byte[][] jpegBuf; byte[][] jpegBuf = null;
byte[] srcBuf; byte[] srcBuf;
int[] jpegSize; int[] jpegSize = null;
int totalJpegSize; int totalJpegSize;
int w = 0, h = 0, subsamp = -1, cs = -1, _w, _h, _tilew, _tileh, int w = 0, h = 0, subsamp = -1, cs = -1, _w, _h, _tilew, _tileh,
_ntilesw, _ntilesh, _subsamp, x, y; _ntilesw, _ntilesh, _subsamp, x, y, iter;
int ntilesw = 1, ntilesh = 1; int ntilesw = 1, ntilesh = 1;
double start, elapsed; double start, elapsed;
int ps = TJ.getPixelSize(pf), tile; int ps = TJ.getPixelSize(pf), tile;
@@ -452,13 +432,13 @@ class TJBench {
fis.read(srcBuf, 0, srcSize); fis.read(srcBuf, 0, srcSize);
fis.close(); fis.close();
int index = fileName.indexOf('.'); int index = fileName.lastIndexOf('.');
if (index >= 0) if (index >= 0)
fileName = new String(fileName.substring(0, index)); fileName = new String(fileName.substring(0, index));
tjt = new TJTransformer(); tjt = new TJTransformer();
tjt.setJPEGImage(srcBuf, srcSize); tjt.setSourceImage(srcBuf, srcSize);
w = tjt.getWidth(); w = tjt.getWidth();
h = tjt.getHeight(); h = tjt.getHeight();
subsamp = tjt.getSubsamp(); subsamp = tjt.getSubsamp();
@@ -466,19 +446,20 @@ class TJBench {
if (quiet == 1) { if (quiet == 1) {
System.out.println("All performance values in Mpixels/sec\n"); System.out.println("All performance values in Mpixels/sec\n");
System.out.format("Bitmap\tBitmap\tJPEG\tJPEG\t%s %s \tXform\tComp\tDecomp\n", System.out.format("Bitmap JPEG JPEG %s %s Xform Comp Decomp ",
(doTile ? "Tile " : "Image"), (doTile ? "Tile " : "Image"),
(doTile ? "Tile " : "Image")); (doTile ? "Tile " : "Image"));
System.out.println("Format\tOrder\tCS\tSubsamp\tWidth Height\tPerf \tRatio\tPerf\n"); if (doYUV)
} else if (quiet == 0) { System.out.print("Decode");
if (yuv == YUVDECODE) System.out.print("\n");
System.out.format(">>>>> JPEG %s --> YUV <<<<<", System.out.print("Format CS Subsamp Width Height Perf Ratio Perf ");
formatName(subsamp, cs)); if (doYUV)
else System.out.print("Perf");
System.out.format(">>>>> JPEG %s --> %s (%s) <<<<<", System.out.println("\n");
} else if (quiet == 0)
System.out.format(">>>>> JPEG %s --> %s (%s) <<<<<\n",
formatName(subsamp, cs), pixFormatStr[pf], formatName(subsamp, cs), pixFormatStr[pf],
(flags & TJ.FLAG_BOTTOMUP) != 0 ? "Bottom-up" : "Top-down"); (flags & TJ.FLAG_BOTTOMUP) != 0 ? "Bottom-up" : "Top-down");
}
for (int tilew = doTile ? 16 : w, tileh = doTile ? 16 : h; ; for (int tilew = doTile ? 16 : w, tileh = doTile ? 16 : h; ;
tilew *= 2, tileh *= 2) { tilew *= 2, tileh *= 2) {
@@ -498,10 +479,10 @@ class TJBench {
sf.getScaled(_h)); sf.getScaled(_h));
System.out.println(""); System.out.println("");
} else if (quiet == 1) { } else if (quiet == 1) {
System.out.format("%s\t%s\t%s\t%s\t", pixFormatStr[pf], System.out.format("%-4s (%s) %-5s %-5s ", pixFormatStr[pf],
(flags & TJ.FLAG_BOTTOMUP) != 0 ? "BU" : "TD", (flags & TJ.FLAG_BOTTOMUP) != 0 ? "BU" : "TD",
csName[cs], subNameLong[subsamp]); csName[cs], subNameLong[subsamp]);
System.out.format("%-4d %-4d\t", tilew, tileh); System.out.format("%-5d %-5d ", tilew, tileh);
} }
_subsamp = subsamp; _subsamp = subsamp;
@@ -530,6 +511,16 @@ class TJBench {
_ntilesw = (_w + _tilew - 1) / _tilew; _ntilesw = (_w + _tilew - 1) / _tilew;
_ntilesh = (_h + _tileh - 1) / _tileh; _ntilesh = (_h + _tileh - 1) / _tileh;
if (xformOp == TJTransform.OP_TRANSPOSE ||
xformOp == TJTransform.OP_TRANSVERSE ||
xformOp == TJTransform.OP_ROT90 ||
xformOp == TJTransform.OP_ROT270) {
if (_subsamp == TJ.SAMP_422)
_subsamp = TJ.SAMP_440;
else if (_subsamp == TJ.SAMP_440)
_subsamp = TJ.SAMP_422;
}
TJTransform[] t = new TJTransform[_ntilesw * _ntilesh]; TJTransform[] t = new TJTransform[_ntilesw * _ntilesh];
jpegBuf = new byte[_ntilesw * _ntilesh][TJ.bufSize(_tilew, _tileh, subsamp)]; jpegBuf = new byte[_ntilesw * _ntilesh][TJ.bufSize(_tilew, _tileh, subsamp)];
@@ -548,37 +539,45 @@ class TJBench {
} }
} }
iter = -warmup;
elapsed = 0.;
while (true) {
start = getTime(); start = getTime();
tjt.transform(jpegBuf, t, flags); tjt.transform(jpegBuf, t, flags);
jpegSize = tjt.getTransformedSizes(); jpegSize = tjt.getTransformedSizes();
elapsed = getTime() - start; iter++;
if (iter >= 1) {
elapsed += getTime() - start;
if (elapsed >= benchTime)
break;
}
}
t = null; t = null;
for (tile = 0, totalJpegSize = 0; tile < _ntilesw * _ntilesh; tile++) for (tile = 0, totalJpegSize = 0; tile < _ntilesw * _ntilesh; tile++)
totalJpegSize += jpegSize[tile]; totalJpegSize += jpegSize[tile];
if (quiet != 0) { if (quiet != 0) {
System.out.format("%s%c%s%c", System.out.format("%-6s%s%-6s%s",
sigFig((double)(w * h) / 1000000. / elapsed, 4), sigFig((double)(w * h) / 1000000. / elapsed, 4),
quiet == 2 ? '\n' : '\t', quiet == 2 ? "\n" : " ",
sigFig((double)(w * h * ps) / (double)totalJpegSize, 4), sigFig((double)(w * h * ps) / (double)totalJpegSize, 4),
quiet == 2 ? '\n' : '\t'); quiet == 2 ? "\n" : " ");
} else if (quiet == 0) { } else if (quiet == 0) {
System.out.format("X--> Frame rate: %f fps\n", System.out.format("Transform --> Frame rate: %f fps\n",
1.0 / elapsed); 1.0 / elapsed);
System.out.format(" Output image size: %lu bytes\n", System.out.format(" Output image size: %d bytes\n",
totalJpegSize); totalJpegSize);
System.out.format(" Compression ratio: %f:1\n", System.out.format(" Compression ratio: %f:1\n",
(double)(w * h * ps) / (double)totalJpegSize); (double)(w * h * ps) / (double)totalJpegSize);
System.out.format(" Source throughput: %f Megapixels/sec\n", System.out.format(" Throughput: %f Megapixels/sec\n",
(double)(w * h) / 1000000. / elapsed); (double)(w * h) / 1000000. / elapsed);
System.out.format(" Output bit stream: %f Megabits/sec\n", System.out.format(" Output bit stream: %f Megabits/sec\n",
(double)totalJpegSize * 8. / 1000000. / elapsed); (double)totalJpegSize * 8. / 1000000. / elapsed);
} }
} else { } else {
if (quiet == 1) if (quiet == 1)
System.out.print("N/A\tN/A\t"); System.out.print("N/A N/A ");
jpegBuf = new byte[1][TJ.bufSize(_tilew, _tileh, subsamp)]; jpegBuf = new byte[1][TJ.bufSize(_tilew, _tileh, subsamp)];
jpegSize = new int[1]; jpegSize = new int[1];
jpegSize[0] = srcSize; jpegSize[0] = srcSize;
@@ -590,7 +589,7 @@ class TJBench {
if (h == tileh) if (h == tileh)
_tileh = _h; _tileh = _h;
if ((xformOpt & TJTransform.OPT_NOOUTPUT) == 0) if ((xformOpt & TJTransform.OPT_NOOUTPUT) == 0)
decompTest(null, jpegBuf, jpegSize, null, _w, _h, _subsamp, 0, decomp(null, jpegBuf, jpegSize, null, _w, _h, _subsamp, 0,
fileName, _tilew, _tileh); fileName, _tilew, _tileh);
else if (quiet == 1) else if (quiet == 1)
System.out.println("N/A"); System.out.println("N/A");
@@ -610,7 +609,7 @@ class TJBench {
String className = new TJBench().getClass().getName(); String className = new TJBench().getClass().getName();
System.out.println("\nUSAGE: java " + className); System.out.println("\nUSAGE: java " + className);
System.out.println(" <Inputfile (BMP|YUV)> <Quality> [options]\n"); System.out.println(" <Inputfile (BMP)> <Quality> [options]\n");
System.out.println(" java " + className); System.out.println(" java " + className);
System.out.println(" <Inputfile (JPG)> [options]\n"); System.out.println(" <Inputfile (JPG)> [options]\n");
System.out.println("Options:\n"); System.out.println("Options:\n");
@@ -618,32 +617,24 @@ class TJBench {
System.out.println("-bottomup = Test bottom-up compression/decompression"); System.out.println("-bottomup = Test bottom-up compression/decompression");
System.out.println("-tile = Test performance of the codec when the image is encoded as separate"); System.out.println("-tile = Test performance of the codec when the image is encoded as separate");
System.out.println(" tiles of varying sizes."); System.out.println(" tiles of varying sizes.");
System.out.println("-forcemmx, -forcesse, -forcesse2, -forcesse3 =");
System.out.println(" Force MMX, SSE, SSE2, or SSE3 code paths in the underlying codec");
System.out.println("-rgb, -bgr, -rgbx, -bgrx, -xbgr, -xrgb ="); System.out.println("-rgb, -bgr, -rgbx, -bgrx, -xbgr, -xrgb =");
System.out.println(" Test the specified color conversion path in the codec (default: BGR)"); System.out.println(" Test the specified color conversion path in the codec (default = BGR)");
System.out.println("-fastupsample = Use the fastest chrominance upsampling algorithm available in"); System.out.println("-fastupsample = Use the fastest chrominance upsampling algorithm available in");
System.out.println(" the underlying codec"); System.out.println(" the underlying codec");
System.out.println("-fastdct = Use the fastest DCT/IDCT algorithms available in the underlying"); System.out.println("-fastdct = Use the fastest DCT/IDCT algorithms available in the underlying");
System.out.println(" codec"); System.out.println(" codec");
System.out.println("-accuratedct = Use the most accurate DCT/IDCT algorithms available in the"); System.out.println("-accuratedct = Use the most accurate DCT/IDCT algorithms available in the");
System.out.println(" underlying codec"); System.out.println(" underlying codec");
System.out.println("-subsamp <s> = if compressing a JPEG image from a YUV planar source image,"); System.out.println("-subsamp <s> = When testing JPEG compression, this option specifies the level");
System.out.println(" this specifies the level of chrominance subsampling used in the source"); System.out.println(" of chrominance subsampling to use (<s> = 444, 422, 440, 420, 411, or");
System.out.println(" image. Otherwise, this specifies the level of chrominance subsampling"); System.out.println(" GRAY). The default is to test Grayscale, 4:2:0, 4:2:2, and 4:4:4 in");
System.out.println(" to use in the JPEG destination image. <s> = 444, 422, 440, 420, 411,"); System.out.println(" sequence.");
System.out.println(" or GRAY");
System.out.println("-quiet = Output results in tabular rather than verbose format"); System.out.println("-quiet = Output results in tabular rather than verbose format");
System.out.println("-yuvencode = Encode RGB input as planar YUV rather than compressing as JPEG"); System.out.println("-yuv = Test YUV encoding/decoding functions");
System.out.println("-yuvdecode = Decode JPEG image to planar YUV rather than RGB"); System.out.println("-yuvpad <p> = If testing YUV encoding/decoding, this specifies the number of");
System.out.println("-yuvsize WxH = if compressing a JPEG image from a YUV planar source image, this"); System.out.println(" bytes to which each row of each plane in the intermediate YUV image is");
System.out.println(" specifies the width and height of the source image."); System.out.println(" padded (default = 1)");
System.out.println("-yuvpad <p> = if compressing a JPEG image from a YUV planar source image, this"); System.out.println("-scale M/N = Scale down the width/height of the decompressed JPEG image by a");
System.out.println(" specifies the number of bytes to which each row of each plane in the");
System.out.println(" source image is padded. If decompressing a JPEG image to a YUV planar");
System.out.println(" destination image, this specifies the row padding for each plane of the");
System.out.println(" destination image. (default=1)");
System.out.println("-scale M/N = scale down the width/height of the decompressed JPEG image by a");
System.out.print (" factor of M/N (M/N = "); System.out.print (" factor of M/N (M/N = ");
for (i = 0; i < nsf; i++) { for (i = 0; i < nsf; i++) {
System.out.format("%d/%d", scalingFactors[i].getNum(), System.out.format("%d/%d", scalingFactors[i].getNum(),
@@ -666,6 +657,8 @@ class TJBench {
System.out.println("-grayscale = Perform lossless grayscale conversion prior to decompression"); System.out.println("-grayscale = Perform lossless grayscale conversion prior to decompression");
System.out.println(" test (can be combined with the other transforms above)"); System.out.println(" test (can be combined with the other transforms above)");
System.out.println("-benchtime <t> = Run each benchmark for at least <t> seconds (default = 5.0)"); System.out.println("-benchtime <t> = Run each benchmark for at least <t> seconds (default = 5.0)");
System.out.println("-warmup <w> = Execute each benchmark <w> times to prime the cache before");
System.out.println(" taking performance measurements (default = 1)");
System.out.println("-componly = Stop after running compression tests. Do not test decompression.\n"); System.out.println("-componly = Stop after running compression tests. Do not test decompression.\n");
System.out.println("NOTE: If the quality is specified as a range (e.g. 90-100), a separate"); System.out.println("NOTE: If the quality is specified as a range (e.g. 90-100), a separate");
System.out.println("test will be performed for all quality values in the range.\n"); System.out.println("test will be performed for all quality values in the range.\n");
@@ -687,25 +680,10 @@ class TJBench {
String tempStr = argv[0].toLowerCase(); String tempStr = argv[0].toLowerCase();
if (tempStr.endsWith(".jpg") || tempStr.endsWith(".jpeg")) if (tempStr.endsWith(".jpg") || tempStr.endsWith(".jpeg"))
decompOnly = true; decompOnly = true;
if (tempStr.endsWith(".yuv"))
yuv = YUVCOMPRESS;
System.out.println(""); System.out.println("");
if (argv.length > minArg) { if (!decompOnly) {
for (int i = minArg; i < argv.length; i++) {
if (argv[i].equalsIgnoreCase("-yuvencode")) {
System.out.println("Testing YUV planar encoding\n");
yuv = YUVENCODE; maxQual = minQual = 100;
}
if (argv[i].equalsIgnoreCase("-yuvdecode")) {
System.out.println("Testing YUV planar decoding\n");
yuv = YUVDECODE;
}
}
}
if (!decompOnly && yuv != YUVENCODE) {
minArg = 2; minArg = 2;
if (argv.length < minArg) if (argv.length < minArg)
usage(); usage();
@@ -729,22 +707,6 @@ class TJBench {
if (argv[i].equalsIgnoreCase("-tile")) { if (argv[i].equalsIgnoreCase("-tile")) {
doTile = true; xformOpt |= TJTransform.OPT_CROP; doTile = true; xformOpt |= TJTransform.OPT_CROP;
} }
if (argv[i].equalsIgnoreCase("-forcesse3")) {
System.out.println("Forcing SSE3 code\n");
flags |= TJ.FLAG_FORCESSE3;
}
if (argv[i].equalsIgnoreCase("-forcesse2")) {
System.out.println("Forcing SSE2 code\n");
flags |= TJ.FLAG_FORCESSE2;
}
if (argv[i].equalsIgnoreCase("-forcesse")) {
System.out.println("Forcing SSE code\n");
flags |= TJ.FLAG_FORCESSE;
}
if (argv[i].equalsIgnoreCase("-forcemmx")) {
System.out.println("Forcing MMX code\n");
flags |= TJ.FLAG_FORCEMMX;
}
if (argv[i].equalsIgnoreCase("-fastupsample")) { if (argv[i].equalsIgnoreCase("-fastupsample")) {
System.out.println("Using fast upsampling code\n"); System.out.println("Using fast upsampling code\n");
flags |= TJ.FLAG_FASTUPSAMPLE; flags |= TJ.FLAG_FASTUPSAMPLE;
@@ -826,18 +788,9 @@ class TJBench {
else else
usage(); usage();
} }
if (argv[i].equalsIgnoreCase("-yuvsize") && i < argv.length - 1) { if (argv[i].equalsIgnoreCase("-yuv")) {
int temp1 = 0, temp2 = 0; System.out.println("Testing YUV planar encoding/decoding\n");
Scanner scanner = new Scanner(argv[++i]).useDelimiter("x"); doYUV = true;
try {
temp1 = scanner.nextInt();
temp2 = scanner.nextInt();
} catch(Exception e) {}
if (temp1 >= 1 && temp2 >= 1) {
w = temp1;
h = temp2;
} else
usage();
} }
if (argv[i].equalsIgnoreCase("-yuvpad") && i < argv.length - 1) { if (argv[i].equalsIgnoreCase("-yuvpad") && i < argv.length - 1) {
int temp = 0; int temp = 0;
@@ -864,6 +817,16 @@ class TJBench {
} }
if (argv[i].equalsIgnoreCase("-componly")) if (argv[i].equalsIgnoreCase("-componly"))
compOnly = true; compOnly = true;
if (argv[i].equalsIgnoreCase("-warmup") && i < argv.length - 1) {
int temp = -1;
try {
temp = Integer.parseInt(argv[++i]);
} catch (NumberFormatException e) {}
if (temp >= 0) {
warmup = temp;
System.out.format("Warmup runs = %d\n\n", warmup);
}
}
if (argv[i].equalsIgnoreCase("-?")) if (argv[i].equalsIgnoreCase("-?"))
usage(); usage();
} }
@@ -878,67 +841,60 @@ class TJBench {
doTile = false; doTile = false;
} }
if (yuv != 0 && doTile) {
System.out.println("Disabling tiled compression/decompression tests, because those tests do not");
System.out.println("work when YUV encoding, compression, or decoding is enabled.\n");
doTile = false;
}
if (!decompOnly) { if (!decompOnly) {
if(yuv == YUVCOMPRESS) {
if (w < 1 || h < 1 || subsamp < 0 || subsamp >= TJ.NUMSAMP)
throw new Exception("YUV image size and/or subsampling not specified");
FileInputStream fis = new FileInputStream(argv[0]);
int srcSize = (int)fis.getChannel().size();
if (srcSize != TJ.bufSizeYUV(w, yuvpad, h, subsamp))
throw new Exception("YUV image file is the wrong size");
srcBuf = new byte[srcSize];
fis.read(srcBuf, 0, srcSize);
fis.close();
}
else {
int[] width = new int[1], height = new int[1]; int[] width = new int[1], height = new int[1];
srcBuf = loadImage(argv[0], width, height, pf); srcBuf = loadImage(argv[0], width, height, pf);
w = width[0]; h = height[0]; w = width[0]; h = height[0];
int index = -1; int index = -1;
if ((index = argv[0].indexOf('.')) >= 0) if ((index = argv[0].lastIndexOf('.')) >= 0)
argv[0] = argv[0].substring(0, index); argv[0] = argv[0].substring(0, index);
} }
}
if (quiet == 1 && !decompOnly) { if (quiet == 1 && !decompOnly) {
System.out.println("All performance values in Mpixels/sec\n"); System.out.println("All performance values in Mpixels/sec\n");
System.out.format("Bitmap\tBitmap\tJPEG\tJPEG\t%s %s \tComp\tComp\tDecomp\n", System.out.format("Bitmap JPEG JPEG %s %s ",
(doTile ? "Tile " : "Image"), (doTile ? "Tile " : "Image")); (doTile ? "Tile " : "Image"), (doTile ? "Tile " : "Image"));
System.out.println("Format\tOrder\tSubsamp\tQual\tWidth Height\tPerf \tRatio\tPerf\n"); if (doYUV)
System.out.print("Encode ");
System.out.print("Comp Comp Decomp ");
if (doYUV)
System.out.print("Decode");
System.out.print("\n");
System.out.print("Format Subsamp Qual Width Height ");
if (doYUV)
System.out.print("Perf ");
System.out.print("Perf Ratio Perf ");
if (doYUV)
System.out.print("Perf");
System.out.println("\n");
} }
if (decompOnly) { if (decompOnly) {
doDecompTest(argv[0]); decompTest(argv[0]);
System.out.println(""); System.out.println("");
System.exit(retval); System.exit(retval);
} }
System.gc(); System.gc();
if (yuv == YUVCOMPRESS || (subsamp >= 0 && subsamp < TJ.NUMSAMP)) { if (subsamp >= 0 && subsamp < TJ.NUMSAMP) {
for (int i = maxQual; i >= minQual; i--) for (int i = maxQual; i >= minQual; i--)
doTest(srcBuf, w, h, subsamp, i, argv[0]); fullTest(srcBuf, w, h, subsamp, i, argv[0]);
System.out.println(""); System.out.println("");
} else { } else {
for (int i = maxQual; i >= minQual; i--) for (int i = maxQual; i >= minQual; i--)
doTest(srcBuf, w, h, TJ.SAMP_GRAY, i, argv[0]); fullTest(srcBuf, w, h, TJ.SAMP_GRAY, i, argv[0]);
System.out.println(""); System.out.println("");
System.gc(); System.gc();
for (int i = maxQual; i >= minQual; i--) for (int i = maxQual; i >= minQual; i--)
doTest(srcBuf, w, h, TJ.SAMP_420, i, argv[0]); fullTest(srcBuf, w, h, TJ.SAMP_420, i, argv[0]);
System.out.println(""); System.out.println("");
System.gc(); System.gc();
for (int i = maxQual; i >= minQual; i--) for (int i = maxQual; i >= minQual; i--)
doTest(srcBuf, w, h, TJ.SAMP_422, i, argv[0]); fullTest(srcBuf, w, h, TJ.SAMP_422, i, argv[0]);
System.out.println(""); System.out.println("");
System.gc(); System.gc();
for (int i = maxQual; i >= minQual; i--) for (int i = maxQual; i >= minQual; i--)
doTest(srcBuf, w, h, TJ.SAMP_444, i, argv[0]); fullTest(srcBuf, w, h, TJ.SAMP_444, i, argv[0]);
System.out.println(""); System.out.println("");
} }

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (C)2011-2012 D. R. Commander. All Rights Reserved. * Copyright (C)2011-2012, 2014 D. R. Commander. All Rights Reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met: * modification, are permitted provided that the following conditions are met:
@@ -324,11 +324,11 @@ public class TJExample implements TJCustomFilter {
tjc.setSubsamp(outSubsamp); tjc.setSubsamp(outSubsamp);
tjc.setJPEGQuality(outQual); tjc.setJPEGQuality(outQual);
if (img != null) if (img != null)
jpegBuf = tjc.compress(img, flags); tjc.setSourceImage(img, 0, 0, 0, 0);
else { else {
tjc.setSourceImage(bmpBuf, width, 0, height, TJ.PF_BGRX); tjc.setSourceImage(bmpBuf, 0, 0, width, 0, height, TJ.PF_BGRX);
jpegBuf = tjc.compress(flags);
} }
jpegBuf = tjc.compress(flags);
jpegSize = tjc.getCompressedSize(); jpegSize = tjc.getCompressedSize();
tjc.close(); tjc.close();

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (C)2011-2013 D. R. Commander. All Rights Reserved. * Copyright (C)2011-2014 D. R. Commander. All Rights Reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met: * modification, are permitted provided that the following conditions are met:
@@ -92,9 +92,7 @@ public class TJUnitTest {
TJ.PF_RGB TJ.PF_RGB
}; };
private static final int YUVENCODE = 1; private static boolean doYUV = false;
private static final int YUVDECODE = 2;
private static int yuv = 0;
private static int pad = 4; private static int pad = 4;
private static boolean bi = false; private static boolean bi = false;
@@ -152,10 +150,6 @@ public class TJUnitTest {
return "Unknown"; return "Unknown";
} }
private static double getTime() {
return (double)System.nanoTime() / 1.0e9;
}
private static void initBuf(byte[] buf, int w, int pitch, int h, int pf, private static void initBuf(byte[] buf, int w, int pitch, int h, int pf,
int flags) throws Exception { int flags) throws Exception {
int roffset = TJ.getRedOffset(pf); int roffset = TJ.getRedOffset(pf);
@@ -538,54 +532,6 @@ public class TJUnitTest {
return ((v + (p) - 1) & (~((p) - 1))); return ((v + (p) - 1) & (~((p) - 1)));
} }
private static void initBufYUV(byte[] buf, int w, int pad, int h,
int subsamp) throws Exception {
int row, col;
int hsf = TJ.getMCUWidth(subsamp) / 8, vsf = TJ.getMCUHeight(subsamp) / 8;
int pw = PAD(w, hsf), ph = PAD(h, vsf);
int cw = pw / hsf, ch = ph / vsf;
int ypitch = PAD(pw, pad), uvpitch = PAD(cw, pad);
int halfway = 16, blockSize = 8;
Arrays.fill(buf, (byte)0);
for (row = 0; row < ph; row++) {
for (col = 0; col < pw; col++) {
int index = ypitch * row + col;
if (((row / blockSize) + (col / blockSize)) % 2 == 0) {
if (row < halfway)
buf[index] = (byte)255;
else
buf[index] = 0;
} else {
if (row < halfway)
buf[index] = 76;
else
buf[index] = (byte)226;
}
}
}
if (subsamp != TJ.SAMP_GRAY) {
halfway = 16 / vsf;
for (row = 0; row < ch; row++) {
for (col = 0; col < cw; col++) {
int uindex = ypitch * ph + (uvpitch * row + col),
vindex = ypitch * ph + uvpitch * ch + (uvpitch * row + col);
if (((row * vsf / blockSize) + (col * hsf / blockSize)) % 2 == 0) {
buf[uindex] = buf[vindex] = (byte)128;
} else {
if (row < halfway) {
buf[uindex] = 85;
buf[vindex] = (byte)255;
} else {
buf[uindex] = 0;
buf[vindex] = (byte)149;
}
}
}
}
}
}
private static int checkBufYUV(byte[] buf, int size, int w, int h, private static int checkBufYUV(byte[] buf, int size, int w, int h,
int subsamp, TJScalingFactor sf) int subsamp, TJScalingFactor sf)
throws Exception { throws Exception {
@@ -690,96 +636,68 @@ public class TJUnitTest {
private static int compTest(TJCompressor tjc, byte[] dstBuf, int w, private static int compTest(TJCompressor tjc, byte[] dstBuf, int w,
int h, int pf, String baseName, int subsamp, int h, int pf, String baseName, int subsamp,
int jpegQual, int flags) throws Exception { int jpegQual, int flags) throws Exception {
String tempstr; String tempStr;
byte[] srcBuf = null; byte[] srcBuf = null;
BufferedImage img = null; BufferedImage img = null;
String pfStr; String pfStr, pfStrLong;
String buStr = (flags & TJ.FLAG_BOTTOMUP) != 0 ? "BU" : "TD";
String buStrLong = (flags & TJ.FLAG_BOTTOMUP) != 0 ? String buStrLong = (flags & TJ.FLAG_BOTTOMUP) != 0 ?
"Bottom-Up" : "Top-Down "; "Bottom-Up" : "Top-Down ";
String buStr = (flags & TJ.FLAG_BOTTOMUP) != 0 ? "BU" : "TD";
double t;
int size = 0, ps, imgType = pf; int size = 0, ps, imgType = pf;
if (yuv == YUVDECODE) {
System.out.format("YUV %s %s --> JPEG Q%d ... ", subNameLong[subsamp],
buStrLong, jpegQual);
srcBuf = new byte[TJ.bufSizeYUV(w, pad, h, subsamp)];
initBufYUV(srcBuf, w, pad, h, subsamp);
pfStr = "YUV";
} else {
if (bi) { if (bi) {
pf = biTypePF(imgType); pf = biTypePF(imgType);
pfStr = biTypeStr(imgType); pfStr = biTypeStr(imgType);
} else pfStrLong = pfStr + " (" + pixFormatStr[pf] + ")";
} else {
pfStr = pixFormatStr[pf]; pfStr = pixFormatStr[pf];
pfStrLong = pfStr;
}
ps = TJ.getPixelSize(pf); ps = TJ.getPixelSize(pf);
System.out.print(pfStr + " ");
if (bi)
System.out.print("(" + pixFormatStr[pf] + ") ");
if (yuv == YUVENCODE)
System.out.format("%s -> %s YUV ... ", buStrLong,
subNameLong[subsamp]);
else
System.out.format("%s -> %s Q%d ... ", buStrLong, subNameLong[subsamp],
jpegQual);
if (bi) { if (bi) {
img = new BufferedImage(w, h, imgType); img = new BufferedImage(w, h, imgType);
initImg(img, pf, flags); initImg(img, pf, flags);
tempstr = baseName + "_enc_" + pfStr + "_" + buStr + "_" + tempStr = baseName + "_enc_" + pfStr + "_" + buStr + "_" +
subName[subsamp] + "_Q" + jpegQual + ".png"; subName[subsamp] + "_Q" + jpegQual + ".png";
File file = new File(tempstr); File file = new File(tempStr);
ImageIO.write(img, "png", file); ImageIO.write(img, "png", file);
tjc.setSourceImage(img, 0, 0, 0, 0);
} else { } else {
srcBuf = new byte[w * h * ps + 1]; srcBuf = new byte[w * h * ps + 1];
initBuf(srcBuf, w, w * ps, h, pf, flags); initBuf(srcBuf, w, w * ps, h, pf, flags);
} tjc.setSourceImage(srcBuf, 0, 0, w, 0, h, pf);
} }
Arrays.fill(dstBuf, (byte)0); Arrays.fill(dstBuf, (byte)0);
t = getTime();
tjc.setSubsamp(subsamp); tjc.setSubsamp(subsamp);
tjc.setJPEGQuality(jpegQual); tjc.setJPEGQuality(jpegQual);
tjc.setYUVPad(pad); if (doYUV) {
if (bi) { System.out.format("%s %s -> YUV %s ... ", pfStrLong, buStrLong,
if (yuv == YUVENCODE) subNameLong[subsamp]);
tjc.encodeYUV(img, dstBuf, flags); YUVImage yuvImage = tjc.encodeYUV(pad, flags);
else if (checkBufYUV(yuvImage.getBuf(), yuvImage.getSize(), w, h, subsamp,
tjc.compress(img, dstBuf, flags);
} else {
if (yuv == YUVDECODE)
tjc.setSourceImageYUV(srcBuf, w, pad, h);
else
tjc.setSourceImage(srcBuf, w, 0, h, pf);
if (yuv == YUVENCODE)
tjc.encodeYUV(dstBuf, flags);
else
tjc.compress(dstBuf, flags);
}
size = tjc.getCompressedSize();
t = getTime() - t;
if (yuv == YUVENCODE)
tempstr = baseName + "_enc_" + pfStr + "_" + buStr + "_" +
subName[subsamp] + ".yuv";
else
tempstr = baseName + "_enc_" + pfStr + "_" + buStr + "_" +
subName[subsamp] + "_Q" + jpegQual + ".jpg";
writeJPEG(dstBuf, size, tempstr);
if (yuv == YUVENCODE) {
if (checkBufYUV(dstBuf, size, w, h, subsamp,
new TJScalingFactor(1, 1)) == 1) new TJScalingFactor(1, 1)) == 1)
System.out.print("Passed."); System.out.print("Passed.\n");
else { else {
System.out.print("FAILED!"); System.out.print("FAILED!\n");
exitStatus = -1; exitStatus = -1;
} }
} else
System.out.print("Done."); System.out.format("YUV %s %s -> JPEG Q%d ... ", subNameLong[subsamp],
System.out.format(" %.6f ms\n", t * 1000.); buStrLong, jpegQual);
System.out.println(" Result in " + tempstr); tjc.setSourceImage(yuvImage);
} else {
System.out.format("%s %s -> %s Q%d ... ", pfStrLong, buStrLong,
subNameLong[subsamp], jpegQual);
}
tjc.compress(dstBuf, flags);
size = tjc.getCompressedSize();
tempStr = baseName + "_enc_" + pfStr + "_" + buStr + "_" +
subName[subsamp] + "_Q" + jpegQual + ".jpg";
writeJPEG(dstBuf, size, tempStr);
System.out.println("Done.\n Result in " + tempStr);
return size; return size;
} }
@@ -788,41 +706,25 @@ public class TJUnitTest {
int jpegSize, int w, int h, int pf, int jpegSize, int w, int h, int pf,
String baseName, int subsamp, int flags, String baseName, int subsamp, int flags,
TJScalingFactor sf) throws Exception { TJScalingFactor sf) throws Exception {
String pfStr, tempstr; String pfStr, pfStrLong, tempStr;
double t; String buStrLong = (flags & TJ.FLAG_BOTTOMUP) != 0 ?
"Bottom-Up" : "Top-Down ";
int scaledWidth = sf.getScaled(w); int scaledWidth = sf.getScaled(w);
int scaledHeight = sf.getScaled(h); int scaledHeight = sf.getScaled(h);
int temp1, temp2, imgType = pf; int temp1, temp2, imgType = pf;
BufferedImage img = null; BufferedImage img = null;
byte[] dstBuf = null; byte[] dstBuf = null;
if (yuv == YUVENCODE) return;
if (bi) { if (bi) {
pf = biTypePF(imgType); pf = biTypePF(imgType);
pfStr = biTypeStr(imgType); pfStr = biTypeStr(imgType);
} else pfStrLong = pfStr + " (" + pixFormatStr[pf] + ")";
} else {
pfStr = pixFormatStr[pf]; pfStr = pixFormatStr[pf];
pfStrLong = pfStr;
System.out.print("JPEG -> ");
if (yuv == YUVDECODE)
System.out.print("YUV " + subNameLong[subsamp] + " ");
else {
System.out.print(pfStr + " ");
if (bi)
System.out.print("(" + pixFormatStr[pf] + ") ");
if ((flags & TJ.FLAG_BOTTOMUP) != 0)
System.out.print("Bottom-Up ");
else
System.out.print("Top-Down ");
} }
if (!sf.isOne())
System.out.print(sf.getNum() + "/" + sf.getDenom() + " ... ");
else
System.out.print("... ");
t = getTime(); tjd.setSourceImage(jpegBuf, jpegSize);
tjd.setJPEGImage(jpegBuf, jpegSize);
if (tjd.getWidth() != w || tjd.getHeight() != h || if (tjd.getWidth() != w || tjd.getHeight() != h ||
tjd.getSubsamp() != subsamp) tjd.getSubsamp() != subsamp)
throw new Exception("Incorrect JPEG header"); throw new Exception("Incorrect JPEG header");
@@ -834,45 +736,53 @@ public class TJUnitTest {
if (temp1 != scaledWidth || temp2 != scaledHeight) if (temp1 != scaledWidth || temp2 != scaledHeight)
throw new Exception("Scaled size mismatch"); throw new Exception("Scaled size mismatch");
if (yuv == YUVDECODE) if (doYUV) {
dstBuf = tjd.decompressToYUV(scaledWidth, pad, scaledHeight, flags); System.out.format("JPEG -> YUV %s ", subNameLong[subsamp]);
if(!sf.isOne())
System.out.format("%d/%d ... ", sf.getNum(), sf.getDenom());
else System.out.print("... ");
YUVImage yuvImage = tjd.decompressToYUV(scaledWidth, pad, scaledHeight,
flags);
if (checkBufYUV(yuvImage.getBuf(), yuvImage.getSize(), scaledWidth,
scaledHeight, subsamp, sf) == 1)
System.out.print("Passed.\n");
else { else {
System.out.print("FAILED!\n"); exitStatus = -1;
}
System.out.format("YUV %s -> %s %s ... ", subNameLong[subsamp],
pfStrLong, buStrLong);
tjd.setSourceImage(yuvImage);
} else {
System.out.format("JPEG -> %s %s ", pfStrLong, buStrLong);
if(!sf.isOne())
System.out.format("%d/%d ... ", sf.getNum(), sf.getDenom());
else System.out.print("... ");
}
if (bi) if (bi)
img = tjd.decompress(scaledWidth, scaledHeight, imgType, flags); img = tjd.decompress(scaledWidth, scaledHeight, imgType, flags);
else else
dstBuf = tjd.decompress(scaledWidth, 0, scaledHeight, pf, flags); dstBuf = tjd.decompress(scaledWidth, 0, scaledHeight, pf, flags);
}
t = getTime() - t;
if (bi) { if (bi) {
tempstr = baseName + "_dec_" + pfStr + "_" + tempStr = baseName + "_dec_" + pfStr + "_" +
(((flags & TJ.FLAG_BOTTOMUP) != 0) ? "BU" : "TD") + "_" + (((flags & TJ.FLAG_BOTTOMUP) != 0) ? "BU" : "TD") + "_" +
subName[subsamp] + "_" + subName[subsamp] + "_" +
(double)sf.getNum() / (double)sf.getDenom() + "x" + ".png"; (double)sf.getNum() / (double)sf.getDenom() + "x" + ".png";
File file = new File(tempstr); File file = new File(tempStr);
ImageIO.write(img, "png", file); ImageIO.write(img, "png", file);
} }
if (yuv == YUVDECODE) {
if (checkBufYUV(dstBuf, dstBuf.length, scaledWidth, scaledHeight,
subsamp, sf) == 1)
System.out.print("Passed.");
else {
System.out.print("FAILED!"); exitStatus = -1;
}
} else {
if ((bi && checkImg(img, pf, subsamp, sf, flags) == 1) || if ((bi && checkImg(img, pf, subsamp, sf, flags) == 1) ||
(!bi && checkBuf(dstBuf, scaledWidth, (!bi && checkBuf(dstBuf, scaledWidth,
scaledWidth * TJ.getPixelSize(pf), scaledHeight, pf, scaledWidth * TJ.getPixelSize(pf), scaledHeight, pf,
subsamp, sf, flags) == 1)) subsamp, sf, flags) == 1))
System.out.print("Passed."); System.out.print("Passed.\n");
else { else {
System.out.print("FAILED!"); System.out.print("FAILED!\n");
exitStatus = -1; exitStatus = -1;
} }
} }
System.out.format(" %.6f ms\n", t * 1000.);
}
private static void decompTest(TJDecompressor tjd, byte[] jpegBuf, private static void decompTest(TJDecompressor tjd, byte[] jpegBuf,
int jpegSize, int w, int h, int pf, int jpegSize, int w, int h, int pf,
@@ -900,9 +810,6 @@ public class TJUnitTest {
int size; int size;
byte[] dstBuf; byte[] dstBuf;
if (yuv == YUVENCODE)
dstBuf = new byte[TJ.bufSizeYUV(w, pad, h, subsamp)];
else
dstBuf = new byte[TJ.bufSize(w, h, subsamp)]; dstBuf = new byte[TJ.bufSize(w, h, subsamp)];
try { try {
@@ -916,20 +823,16 @@ public class TJUnitTest {
if (subsamp == TJ.SAMP_422 || subsamp == TJ.SAMP_420 || if (subsamp == TJ.SAMP_422 || subsamp == TJ.SAMP_420 ||
subsamp == TJ.SAMP_440 || subsamp == TJ.SAMP_411) subsamp == TJ.SAMP_440 || subsamp == TJ.SAMP_411)
flags |= TJ.FLAG_FASTUPSAMPLE; flags |= TJ.FLAG_FASTUPSAMPLE;
if (i == 1) { if (i == 1)
if (yuv == YUVDECODE) {
tjc.close();
tjd.close();
return;
} else
flags |= TJ.FLAG_BOTTOMUP; flags |= TJ.FLAG_BOTTOMUP;
}
size = compTest(tjc, dstBuf, w, h, pf, baseName, subsamp, 100, size = compTest(tjc, dstBuf, w, h, pf, baseName, subsamp, 100,
flags); flags);
decompTest(tjd, dstBuf, size, w, h, pf, baseName, subsamp, flags); decompTest(tjd, dstBuf, size, w, h, pf, baseName, subsamp, flags);
if (pf >= TJ.PF_RGBX && pf <= TJ.PF_XRGB && !bi) if (pf >= TJ.PF_RGBX && pf <= TJ.PF_XRGB && !bi) {
System.out.print("\n");
decompTest(tjd, dstBuf, size, w, h, pf + (TJ.PF_RGBA - TJ.PF_RGBX), decompTest(tjd, dstBuf, size, w, h, pf + (TJ.PF_RGBA - TJ.PF_RGBX),
baseName, subsamp, flags); baseName, subsamp, flags);
}
System.out.print("\n"); System.out.print("\n");
} }
} }
@@ -945,7 +848,8 @@ public class TJUnitTest {
private static void bufSizeTest() throws Exception { private static void bufSizeTest() throws Exception {
int w, h, i, subsamp; int w, h, i, subsamp;
byte[] srcBuf, jpegBuf; byte[] srcBuf, dstBuf = null;
YUVImage dstImage = null;
TJCompressor tjc = null; TJCompressor tjc = null;
Random r = new Random(); Random r = new Random();
@@ -959,22 +863,34 @@ public class TJUnitTest {
if (h % 100 == 0) if (h % 100 == 0)
System.out.format("%04d x %04d\b\b\b\b\b\b\b\b\b\b\b", w, h); System.out.format("%04d x %04d\b\b\b\b\b\b\b\b\b\b\b", w, h);
srcBuf = new byte[w * h * 4]; srcBuf = new byte[w * h * 4];
jpegBuf = new byte[TJ.bufSize(w, h, subsamp)]; if (doYUV)
dstImage = new YUVImage(w, pad, h, subsamp);
else
dstBuf = new byte[TJ.bufSize(w, h, subsamp)];
for (i = 0; i < w * h * 4; i++) { for (i = 0; i < w * h * 4; i++) {
srcBuf[i] = (byte)(r.nextInt(2) * 255); srcBuf[i] = (byte)(r.nextInt(2) * 255);
} }
tjc.setSourceImage(srcBuf, w, 0, h, TJ.PF_BGRX); tjc.setSourceImage(srcBuf, 0, 0, w, 0, h, TJ.PF_BGRX);
tjc.setSubsamp(subsamp); tjc.setSubsamp(subsamp);
tjc.setJPEGQuality(100); tjc.setJPEGQuality(100);
tjc.compress(jpegBuf, 0); if (doYUV)
tjc.encodeYUV(dstImage, 0);
else
tjc.compress(dstBuf, 0);
srcBuf = new byte[h * w * 4]; srcBuf = new byte[h * w * 4];
jpegBuf = new byte[TJ.bufSize(h, w, subsamp)]; if (doYUV)
dstImage = new YUVImage(h, pad, w, subsamp);
else
dstBuf = new byte[TJ.bufSize(h, w, subsamp)];
for (i = 0; i < h * w * 4; i++) { for (i = 0; i < h * w * 4; i++) {
srcBuf[i] = (byte)(r.nextInt(2) * 255); srcBuf[i] = (byte)(r.nextInt(2) * 255);
} }
tjc.setSourceImage(srcBuf, h, 0, w, TJ.PF_BGRX); tjc.setSourceImage(srcBuf, 0, 0, h, 0, w, TJ.PF_BGRX);
tjc.compress(jpegBuf, 0); if (doYUV)
tjc.encodeYUV(dstImage, 0);
else
tjc.compress(dstBuf, 0);
} }
} }
} }
@@ -989,10 +905,9 @@ public class TJUnitTest {
public static void main(String[] argv) { public static void main(String[] argv) {
try { try {
String testName = "javatest"; String testName = "javatest";
boolean doyuv = false;
for (int i = 0; i < argv.length; i++) { for (int i = 0; i < argv.length; i++) {
if (argv[i].equalsIgnoreCase("-yuv")) if (argv[i].equalsIgnoreCase("-yuv"))
doyuv = true; doYUV = true;
if (argv[i].equalsIgnoreCase("-noyuvpad")) if (argv[i].equalsIgnoreCase("-noyuvpad"))
pad = 1; pad = 1;
if (argv[i].substring(0, 1).equalsIgnoreCase("-h") || if (argv[i].substring(0, 1).equalsIgnoreCase("-h") ||
@@ -1003,10 +918,8 @@ public class TJUnitTest {
testName = "javabitest"; testName = "javabitest";
} }
} }
if (doyuv) { if (doYUV)
yuv = YUVENCODE;
_4byteFormats[4] = -1; _4byteFormats[4] = -1;
}
doTest(35, 39, bi ? _3byteFormatsBI : _3byteFormats, TJ.SAMP_444, doTest(35, 39, bi ? _3byteFormatsBI : _3byteFormats, TJ.SAMP_444,
testName); testName);
doTest(39, 41, bi ? _4byteFormatsBI : _4byteFormats, TJ.SAMP_444, doTest(39, 41, bi ? _4byteFormatsBI : _4byteFormats, TJ.SAMP_444,
@@ -1033,24 +946,17 @@ public class TJUnitTest {
_4byteFormats[4] = -1; _4byteFormats[4] = -1;
doTest(35, 39, bi ? _4byteFormatsBI : _4byteFormats, TJ.SAMP_GRAY, doTest(35, 39, bi ? _4byteFormatsBI : _4byteFormats, TJ.SAMP_GRAY,
testName); testName);
if (!doyuv && !bi) if (!bi)
bufSizeTest(); bufSizeTest();
if (doyuv && !bi) { if (doYUV && !bi) {
yuv = YUVDECODE; System.out.print("\n--------------------\n\n");
doTest(48, 48, onlyRGB, TJ.SAMP_444, "javatest_yuv0"); doTest(48, 48, onlyRGB, TJ.SAMP_444, "javatest_yuv0");
doTest(35, 39, onlyRGB, TJ.SAMP_444, "javatest_yuv1");
doTest(48, 48, onlyRGB, TJ.SAMP_422, "javatest_yuv0"); doTest(48, 48, onlyRGB, TJ.SAMP_422, "javatest_yuv0");
doTest(39, 41, onlyRGB, TJ.SAMP_422, "javatest_yuv1");
doTest(48, 48, onlyRGB, TJ.SAMP_420, "javatest_yuv0"); doTest(48, 48, onlyRGB, TJ.SAMP_420, "javatest_yuv0");
doTest(41, 35, onlyRGB, TJ.SAMP_420, "javatest_yuv1");
doTest(48, 48, onlyRGB, TJ.SAMP_440, "javatest_yuv0"); doTest(48, 48, onlyRGB, TJ.SAMP_440, "javatest_yuv0");
doTest(35, 39, onlyRGB, TJ.SAMP_440, "javatest_yuv1");
doTest(48, 48, onlyRGB, TJ.SAMP_411, "javatest_yuv0"); doTest(48, 48, onlyRGB, TJ.SAMP_411, "javatest_yuv0");
doTest(39, 41, onlyRGB, TJ.SAMP_411, "javatest_yuv1");
doTest(48, 48, onlyRGB, TJ.SAMP_GRAY, "javatest_yuv0"); doTest(48, 48, onlyRGB, TJ.SAMP_GRAY, "javatest_yuv0");
doTest(41, 35, onlyRGB, TJ.SAMP_GRAY, "javatest_yuv1");
doTest(48, 48, onlyGray, TJ.SAMP_GRAY, "javatest_yuv0"); doTest(48, 48, onlyGray, TJ.SAMP_GRAY, "javatest_yuv0");
doTest(35, 39, onlyGray, TJ.SAMP_GRAY, "javatest_yuv1");
} }
} catch(Exception e) { } catch(Exception e) {
e.printStackTrace(); e.printStackTrace();

View File

@@ -1,41 +1,23 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!-- NewPage --> <!-- NewPage -->
<HTML> <html lang="en">
<HEAD> <head>
<TITLE> <title>All Classes</title>
All Classes <link rel="stylesheet" type="text/css" href="stylesheet.css" title="Style">
</TITLE> </head>
<body>
<h1 class="bar">All Classes</h1>
<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style"> <div class="indexContainer">
<ul>
<li><a href="org/libjpegturbo/turbojpeg/TJ.html" title="class in org.libjpegturbo.turbojpeg" target="classFrame">TJ</a></li>
</HEAD> <li><a href="org/libjpegturbo/turbojpeg/TJCompressor.html" title="class in org.libjpegturbo.turbojpeg" target="classFrame">TJCompressor</a></li>
<li><a href="org/libjpegturbo/turbojpeg/TJCustomFilter.html" title="interface in org.libjpegturbo.turbojpeg" target="classFrame"><i>TJCustomFilter</i></a></li>
<BODY BGCOLOR="white"> <li><a href="org/libjpegturbo/turbojpeg/TJDecompressor.html" title="class in org.libjpegturbo.turbojpeg" target="classFrame">TJDecompressor</a></li>
<FONT size="+1" CLASS="FrameHeadingFont"> <li><a href="org/libjpegturbo/turbojpeg/TJScalingFactor.html" title="class in org.libjpegturbo.turbojpeg" target="classFrame">TJScalingFactor</a></li>
<B>All Classes</B></FONT> <li><a href="org/libjpegturbo/turbojpeg/TJTransform.html" title="class in org.libjpegturbo.turbojpeg" target="classFrame">TJTransform</a></li>
<BR> <li><a href="org/libjpegturbo/turbojpeg/TJTransformer.html" title="class in org.libjpegturbo.turbojpeg" target="classFrame">TJTransformer</a></li>
<li><a href="org/libjpegturbo/turbojpeg/YUVImage.html" title="class in org.libjpegturbo.turbojpeg" target="classFrame">YUVImage</a></li>
<TABLE BORDER="0" WIDTH="100%" SUMMARY=""> </ul>
<TR> </div>
<TD NOWRAP><FONT CLASS="FrameItemFont"><A HREF="org/libjpegturbo/turbojpeg/TJ.html" title="class in org.libjpegturbo.turbojpeg" target="classFrame">TJ</A> </body>
<BR> </html>
<A HREF="org/libjpegturbo/turbojpeg/TJCompressor.html" title="class in org.libjpegturbo.turbojpeg" target="classFrame">TJCompressor</A>
<BR>
<A HREF="org/libjpegturbo/turbojpeg/TJCustomFilter.html" title="interface in org.libjpegturbo.turbojpeg" target="classFrame"><I>TJCustomFilter</I></A>
<BR>
<A HREF="org/libjpegturbo/turbojpeg/TJDecompressor.html" title="class in org.libjpegturbo.turbojpeg" target="classFrame">TJDecompressor</A>
<BR>
<A HREF="org/libjpegturbo/turbojpeg/TJScalingFactor.html" title="class in org.libjpegturbo.turbojpeg" target="classFrame">TJScalingFactor</A>
<BR>
<A HREF="org/libjpegturbo/turbojpeg/TJTransform.html" title="class in org.libjpegturbo.turbojpeg" target="classFrame">TJTransform</A>
<BR>
<A HREF="org/libjpegturbo/turbojpeg/TJTransformer.html" title="class in org.libjpegturbo.turbojpeg" target="classFrame">TJTransformer</A>
<BR>
</FONT></TD>
</TR>
</TABLE>
</BODY>
</HTML>

View File

@@ -1,41 +1,23 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!-- NewPage --> <!-- NewPage -->
<HTML> <html lang="en">
<HEAD> <head>
<TITLE> <title>All Classes</title>
All Classes <link rel="stylesheet" type="text/css" href="stylesheet.css" title="Style">
</TITLE> </head>
<body>
<h1 class="bar">All Classes</h1>
<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style"> <div class="indexContainer">
<ul>
<li><a href="org/libjpegturbo/turbojpeg/TJ.html" title="class in org.libjpegturbo.turbojpeg">TJ</a></li>
</HEAD> <li><a href="org/libjpegturbo/turbojpeg/TJCompressor.html" title="class in org.libjpegturbo.turbojpeg">TJCompressor</a></li>
<li><a href="org/libjpegturbo/turbojpeg/TJCustomFilter.html" title="interface in org.libjpegturbo.turbojpeg"><i>TJCustomFilter</i></a></li>
<BODY BGCOLOR="white"> <li><a href="org/libjpegturbo/turbojpeg/TJDecompressor.html" title="class in org.libjpegturbo.turbojpeg">TJDecompressor</a></li>
<FONT size="+1" CLASS="FrameHeadingFont"> <li><a href="org/libjpegturbo/turbojpeg/TJScalingFactor.html" title="class in org.libjpegturbo.turbojpeg">TJScalingFactor</a></li>
<B>All Classes</B></FONT> <li><a href="org/libjpegturbo/turbojpeg/TJTransform.html" title="class in org.libjpegturbo.turbojpeg">TJTransform</a></li>
<BR> <li><a href="org/libjpegturbo/turbojpeg/TJTransformer.html" title="class in org.libjpegturbo.turbojpeg">TJTransformer</a></li>
<li><a href="org/libjpegturbo/turbojpeg/YUVImage.html" title="class in org.libjpegturbo.turbojpeg">YUVImage</a></li>
<TABLE BORDER="0" WIDTH="100%" SUMMARY=""> </ul>
<TR> </div>
<TD NOWRAP><FONT CLASS="FrameItemFont"><A HREF="org/libjpegturbo/turbojpeg/TJ.html" title="class in org.libjpegturbo.turbojpeg">TJ</A> </body>
<BR> </html>
<A HREF="org/libjpegturbo/turbojpeg/TJCompressor.html" title="class in org.libjpegturbo.turbojpeg">TJCompressor</A>
<BR>
<A HREF="org/libjpegturbo/turbojpeg/TJCustomFilter.html" title="interface in org.libjpegturbo.turbojpeg"><I>TJCustomFilter</I></A>
<BR>
<A HREF="org/libjpegturbo/turbojpeg/TJDecompressor.html" title="class in org.libjpegturbo.turbojpeg">TJDecompressor</A>
<BR>
<A HREF="org/libjpegturbo/turbojpeg/TJScalingFactor.html" title="class in org.libjpegturbo.turbojpeg">TJScalingFactor</A>
<BR>
<A HREF="org/libjpegturbo/turbojpeg/TJTransform.html" title="class in org.libjpegturbo.turbojpeg">TJTransform</A>
<BR>
<A HREF="org/libjpegturbo/turbojpeg/TJTransformer.html" title="class in org.libjpegturbo.turbojpeg">TJTransformer</A>
<BR>
</FONT></TD>
</TR>
</TABLE>
</BODY>
</HTML>

View File

@@ -1,462 +1,479 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!-- NewPage --> <!-- NewPage -->
<HTML> <html lang="en">
<HEAD> <head>
<TITLE> <title>Constant Field Values</title>
Constant Field Values <link rel="stylesheet" type="text/css" href="stylesheet.css" title="Style">
</TITLE> </head>
<body>
<script type="text/javascript"><!--
<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
<SCRIPT type="text/javascript">
function windowTitle()
{
if (location.href.indexOf('is-external=true') == -1) { if (location.href.indexOf('is-external=true') == -1) {
parent.document.title="Constant Field Values"; parent.document.title="Constant Field Values";
} }
} //-->
</SCRIPT> </script>
<NOSCRIPT> <noscript>
</NOSCRIPT> <div>JavaScript is disabled on your browser.</div>
</noscript>
</HEAD>
<BODY BGCOLOR="white" onload="windowTitle();">
<HR>
<!-- ========= START OF TOP NAVBAR ======= --> <!-- ========= START OF TOP NAVBAR ======= -->
<A NAME="navbar_top"><!-- --></A> <div class="topNav"><a name="navbar_top">
<A HREF="#skip-navbar_top" title="Skip navigation links"></A> <!-- -->
<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY=""> </a><a href="#skip-navbar_top" title="Skip navigation links"></a><a name="navbar_top_firstrow">
<TR> <!-- -->
<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> </a>
<A NAME="navbar_top_firstrow"><!-- --></A> <ul class="navList" title="Navigation">
<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY=""> <li><a href="org/libjpegturbo/turbojpeg/package-summary.html">Package</a></li>
<TR ALIGN="center" VALIGN="top"> <li>Class</li>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="org/libjpegturbo/turbojpeg/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A>&nbsp;</TD> <li><a href="org/libjpegturbo/turbojpeg/package-tree.html">Tree</a></li>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Class</FONT>&nbsp;</TD> <li><a href="deprecated-list.html">Deprecated</a></li>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="org/libjpegturbo/turbojpeg/package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A>&nbsp;</TD> <li><a href="index-all.html">Index</a></li>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD> <li><a href="help-doc.html">Help</a></li>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A>&nbsp;</TD> </ul>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD> </div>
</TR> <div class="subNav">
</TABLE> <ul class="navList">
</TD> <li>Prev</li>
<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM> <li>Next</li>
</EM> </ul>
</TD> <ul class="navList">
</TR> <li><a href="index.html?constant-values.html" target="_top">Frames</a></li>
<li><a href="constant-values.html" target="_top">No Frames</a></li>
<TR> </ul>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2"> <ul class="navList" id="allclasses_navbar_top">
&nbsp;PREV&nbsp; <li><a href="allclasses-noframe.html">All Classes</a></li>
&nbsp;NEXT</FONT></TD> </ul>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2"> <div>
<A HREF="index.html?constant-values.html" target="_top"><B>FRAMES</B></A> &nbsp; <script type="text/javascript"><!--
&nbsp;<A HREF="constant-values.html" target="_top"><B>NO FRAMES</B></A> &nbsp; allClassesLink = document.getElementById("allclasses_navbar_top");
&nbsp;<SCRIPT type="text/javascript">
<!--
if(window==top) { if(window==top) {
document.writeln('<A HREF="allclasses-noframe.html"><B>All Classes</B></A>'); allClassesLink.style.display = "block";
}
else {
allClassesLink.style.display = "none";
} }
//--> //-->
</SCRIPT> </script>
<NOSCRIPT> </div>
<A HREF="allclasses-noframe.html"><B>All Classes</B></A> <a name="skip-navbar_top">
</NOSCRIPT> <!-- -->
</a></div>
</FONT></TD>
</TR>
</TABLE>
<A NAME="skip-navbar_top"></A>
<!-- ========= END OF TOP NAVBAR ========= --> <!-- ========= END OF TOP NAVBAR ========= -->
<div class="header">
<HR> <h1 title="Constant Field Values" class="title">Constant Field Values</h1>
<CENTER> <h2 title="Contents">Contents</h2>
<H1> <ul>
Constant Field Values</H1> <li><a href="#org.libjpegturbo">org.libjpegturbo.*</a></li>
</CENTER> </ul>
<HR SIZE="4" NOSHADE> </div>
<B>Contents</B><UL> <div class="constantValuesContainer"><a name="org.libjpegturbo">
<LI><A HREF="#org.libjpegturbo">org.libjpegturbo.*</A> <!-- -->
</UL> </a>
<h2 title="org.libjpegturbo">org.libjpegturbo.*</h2>
<A NAME="org.libjpegturbo"><!-- --></A> <ul class="blockList">
<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY=""> <li class="blockList">
<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor"> <table border="0" cellpadding="3" cellspacing="0" summary="Constant Field Values table, listing constant fields, and values">
<TH ALIGN="left"><FONT SIZE="+2"> <caption><span>org.libjpegturbo.turbojpeg.<a href="org/libjpegturbo/turbojpeg/TJ.html" title="class in org.libjpegturbo.turbojpeg">TJ</a></span><span class="tabEnd">&nbsp;</span></caption>
org.libjpegturbo.*</FONT></TH> <tr>
</TR> <th class="colFirst" scope="col">Modifier and Type</th>
</TABLE> <th scope="col">Constant Field</th>
<th class="colLast" scope="col">Value</th>
<P> </tr>
<tbody>
<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" SUMMARY=""> <tr class="altColor">
<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor"> <td class="colFirst"><a name="org.libjpegturbo.turbojpeg.TJ.CS_CMYK">
<TH ALIGN="left" COLSPAN="3">org.libjpegturbo.turbojpeg.<A HREF="org/libjpegturbo/turbojpeg/TJ.html" title="class in org.libjpegturbo.turbojpeg">TJ</A></TH> <!-- -->
</TR> </a><code>public&nbsp;static&nbsp;final&nbsp;int</code></td>
<TR BGCOLOR="white" CLASS="TableRowColor"> <td><code><a href="org/libjpegturbo/turbojpeg/TJ.html#CS_CMYK">CS_CMYK</a></code></td>
<A NAME="org.libjpegturbo.turbojpeg.TJ.CS_CMYK"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1"> <td class="colLast"><code>3</code></td>
<CODE>public&nbsp;static&nbsp;final&nbsp;int</CODE></FONT></TD> </tr>
<TD ALIGN="left"><CODE><A HREF="org/libjpegturbo/turbojpeg/TJ.html#CS_CMYK">CS_CMYK</A></CODE></TD> <tr class="rowColor">
<TD ALIGN="right"><CODE>3</CODE></TD> <td class="colFirst"><a name="org.libjpegturbo.turbojpeg.TJ.CS_GRAY">
</TR> <!-- -->
<TR BGCOLOR="white" CLASS="TableRowColor"> </a><code>public&nbsp;static&nbsp;final&nbsp;int</code></td>
<A NAME="org.libjpegturbo.turbojpeg.TJ.CS_GRAY"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1"> <td><code><a href="org/libjpegturbo/turbojpeg/TJ.html#CS_GRAY">CS_GRAY</a></code></td>
<CODE>public&nbsp;static&nbsp;final&nbsp;int</CODE></FONT></TD> <td class="colLast"><code>2</code></td>
<TD ALIGN="left"><CODE><A HREF="org/libjpegturbo/turbojpeg/TJ.html#CS_GRAY">CS_GRAY</A></CODE></TD> </tr>
<TD ALIGN="right"><CODE>2</CODE></TD> <tr class="altColor">
</TR> <td class="colFirst"><a name="org.libjpegturbo.turbojpeg.TJ.CS_RGB">
<TR BGCOLOR="white" CLASS="TableRowColor"> <!-- -->
<A NAME="org.libjpegturbo.turbojpeg.TJ.CS_RGB"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1"> </a><code>public&nbsp;static&nbsp;final&nbsp;int</code></td>
<CODE>public&nbsp;static&nbsp;final&nbsp;int</CODE></FONT></TD> <td><code><a href="org/libjpegturbo/turbojpeg/TJ.html#CS_RGB">CS_RGB</a></code></td>
<TD ALIGN="left"><CODE><A HREF="org/libjpegturbo/turbojpeg/TJ.html#CS_RGB">CS_RGB</A></CODE></TD> <td class="colLast"><code>0</code></td>
<TD ALIGN="right"><CODE>0</CODE></TD> </tr>
</TR> <tr class="rowColor">
<TR BGCOLOR="white" CLASS="TableRowColor"> <td class="colFirst"><a name="org.libjpegturbo.turbojpeg.TJ.CS_YCbCr">
<A NAME="org.libjpegturbo.turbojpeg.TJ.CS_YCbCr"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1"> <!-- -->
<CODE>public&nbsp;static&nbsp;final&nbsp;int</CODE></FONT></TD> </a><code>public&nbsp;static&nbsp;final&nbsp;int</code></td>
<TD ALIGN="left"><CODE><A HREF="org/libjpegturbo/turbojpeg/TJ.html#CS_YCbCr">CS_YCbCr</A></CODE></TD> <td><code><a href="org/libjpegturbo/turbojpeg/TJ.html#CS_YCbCr">CS_YCbCr</a></code></td>
<TD ALIGN="right"><CODE>1</CODE></TD> <td class="colLast"><code>1</code></td>
</TR> </tr>
<TR BGCOLOR="white" CLASS="TableRowColor"> <tr class="altColor">
<A NAME="org.libjpegturbo.turbojpeg.TJ.CS_YCCK"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1"> <td class="colFirst"><a name="org.libjpegturbo.turbojpeg.TJ.CS_YCCK">
<CODE>public&nbsp;static&nbsp;final&nbsp;int</CODE></FONT></TD> <!-- -->
<TD ALIGN="left"><CODE><A HREF="org/libjpegturbo/turbojpeg/TJ.html#CS_YCCK">CS_YCCK</A></CODE></TD> </a><code>public&nbsp;static&nbsp;final&nbsp;int</code></td>
<TD ALIGN="right"><CODE>4</CODE></TD> <td><code><a href="org/libjpegturbo/turbojpeg/TJ.html#CS_YCCK">CS_YCCK</a></code></td>
</TR> <td class="colLast"><code>4</code></td>
<TR BGCOLOR="white" CLASS="TableRowColor"> </tr>
<A NAME="org.libjpegturbo.turbojpeg.TJ.FLAG_ACCURATEDCT"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1"> <tr class="rowColor">
<CODE>public&nbsp;static&nbsp;final&nbsp;int</CODE></FONT></TD> <td class="colFirst"><a name="org.libjpegturbo.turbojpeg.TJ.FLAG_ACCURATEDCT">
<TD ALIGN="left"><CODE><A HREF="org/libjpegturbo/turbojpeg/TJ.html#FLAG_ACCURATEDCT">FLAG_ACCURATEDCT</A></CODE></TD> <!-- -->
<TD ALIGN="right"><CODE>4096</CODE></TD> </a><code>public&nbsp;static&nbsp;final&nbsp;int</code></td>
</TR> <td><code><a href="org/libjpegturbo/turbojpeg/TJ.html#FLAG_ACCURATEDCT">FLAG_ACCURATEDCT</a></code></td>
<TR BGCOLOR="white" CLASS="TableRowColor"> <td class="colLast"><code>4096</code></td>
<A NAME="org.libjpegturbo.turbojpeg.TJ.FLAG_BOTTOMUP"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1"> </tr>
<CODE>public&nbsp;static&nbsp;final&nbsp;int</CODE></FONT></TD> <tr class="altColor">
<TD ALIGN="left"><CODE><A HREF="org/libjpegturbo/turbojpeg/TJ.html#FLAG_BOTTOMUP">FLAG_BOTTOMUP</A></CODE></TD> <td class="colFirst"><a name="org.libjpegturbo.turbojpeg.TJ.FLAG_BOTTOMUP">
<TD ALIGN="right"><CODE>2</CODE></TD> <!-- -->
</TR> </a><code>public&nbsp;static&nbsp;final&nbsp;int</code></td>
<TR BGCOLOR="white" CLASS="TableRowColor"> <td><code><a href="org/libjpegturbo/turbojpeg/TJ.html#FLAG_BOTTOMUP">FLAG_BOTTOMUP</a></code></td>
<A NAME="org.libjpegturbo.turbojpeg.TJ.FLAG_FASTDCT"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1"> <td class="colLast"><code>2</code></td>
<CODE>public&nbsp;static&nbsp;final&nbsp;int</CODE></FONT></TD> </tr>
<TD ALIGN="left"><CODE><A HREF="org/libjpegturbo/turbojpeg/TJ.html#FLAG_FASTDCT">FLAG_FASTDCT</A></CODE></TD> <tr class="rowColor">
<TD ALIGN="right"><CODE>2048</CODE></TD> <td class="colFirst"><a name="org.libjpegturbo.turbojpeg.TJ.FLAG_FASTDCT">
</TR> <!-- -->
<TR BGCOLOR="white" CLASS="TableRowColor"> </a><code>public&nbsp;static&nbsp;final&nbsp;int</code></td>
<A NAME="org.libjpegturbo.turbojpeg.TJ.FLAG_FASTUPSAMPLE"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1"> <td><code><a href="org/libjpegturbo/turbojpeg/TJ.html#FLAG_FASTDCT">FLAG_FASTDCT</a></code></td>
<CODE>public&nbsp;static&nbsp;final&nbsp;int</CODE></FONT></TD> <td class="colLast"><code>2048</code></td>
<TD ALIGN="left"><CODE><A HREF="org/libjpegturbo/turbojpeg/TJ.html#FLAG_FASTUPSAMPLE">FLAG_FASTUPSAMPLE</A></CODE></TD> </tr>
<TD ALIGN="right"><CODE>256</CODE></TD> <tr class="altColor">
</TR> <td class="colFirst"><a name="org.libjpegturbo.turbojpeg.TJ.FLAG_FASTUPSAMPLE">
<TR BGCOLOR="white" CLASS="TableRowColor"> <!-- -->
<A NAME="org.libjpegturbo.turbojpeg.TJ.FLAG_FORCEMMX"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1"> </a><code>public&nbsp;static&nbsp;final&nbsp;int</code></td>
<CODE>public&nbsp;static&nbsp;final&nbsp;int</CODE></FONT></TD> <td><code><a href="org/libjpegturbo/turbojpeg/TJ.html#FLAG_FASTUPSAMPLE">FLAG_FASTUPSAMPLE</a></code></td>
<TD ALIGN="left"><CODE><A HREF="org/libjpegturbo/turbojpeg/TJ.html#FLAG_FORCEMMX">FLAG_FORCEMMX</A></CODE></TD> <td class="colLast"><code>256</code></td>
<TD ALIGN="right"><CODE>8</CODE></TD> </tr>
</TR> <tr class="rowColor">
<TR BGCOLOR="white" CLASS="TableRowColor"> <td class="colFirst"><a name="org.libjpegturbo.turbojpeg.TJ.FLAG_FORCEMMX">
<A NAME="org.libjpegturbo.turbojpeg.TJ.FLAG_FORCESSE"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1"> <!-- -->
<CODE>public&nbsp;static&nbsp;final&nbsp;int</CODE></FONT></TD> </a><code>public&nbsp;static&nbsp;final&nbsp;int</code></td>
<TD ALIGN="left"><CODE><A HREF="org/libjpegturbo/turbojpeg/TJ.html#FLAG_FORCESSE">FLAG_FORCESSE</A></CODE></TD> <td><code><a href="org/libjpegturbo/turbojpeg/TJ.html#FLAG_FORCEMMX">FLAG_FORCEMMX</a></code></td>
<TD ALIGN="right"><CODE>16</CODE></TD> <td class="colLast"><code>8</code></td>
</TR> </tr>
<TR BGCOLOR="white" CLASS="TableRowColor"> <tr class="altColor">
<A NAME="org.libjpegturbo.turbojpeg.TJ.FLAG_FORCESSE2"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1"> <td class="colFirst"><a name="org.libjpegturbo.turbojpeg.TJ.FLAG_FORCESSE">
<CODE>public&nbsp;static&nbsp;final&nbsp;int</CODE></FONT></TD> <!-- -->
<TD ALIGN="left"><CODE><A HREF="org/libjpegturbo/turbojpeg/TJ.html#FLAG_FORCESSE2">FLAG_FORCESSE2</A></CODE></TD> </a><code>public&nbsp;static&nbsp;final&nbsp;int</code></td>
<TD ALIGN="right"><CODE>32</CODE></TD> <td><code><a href="org/libjpegturbo/turbojpeg/TJ.html#FLAG_FORCESSE">FLAG_FORCESSE</a></code></td>
</TR> <td class="colLast"><code>16</code></td>
<TR BGCOLOR="white" CLASS="TableRowColor"> </tr>
<A NAME="org.libjpegturbo.turbojpeg.TJ.FLAG_FORCESSE3"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1"> <tr class="rowColor">
<CODE>public&nbsp;static&nbsp;final&nbsp;int</CODE></FONT></TD> <td class="colFirst"><a name="org.libjpegturbo.turbojpeg.TJ.FLAG_FORCESSE2">
<TD ALIGN="left"><CODE><A HREF="org/libjpegturbo/turbojpeg/TJ.html#FLAG_FORCESSE3">FLAG_FORCESSE3</A></CODE></TD> <!-- -->
<TD ALIGN="right"><CODE>128</CODE></TD> </a><code>public&nbsp;static&nbsp;final&nbsp;int</code></td>
</TR> <td><code><a href="org/libjpegturbo/turbojpeg/TJ.html#FLAG_FORCESSE2">FLAG_FORCESSE2</a></code></td>
<TR BGCOLOR="white" CLASS="TableRowColor"> <td class="colLast"><code>32</code></td>
<A NAME="org.libjpegturbo.turbojpeg.TJ.NUMCS"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1"> </tr>
<CODE>public&nbsp;static&nbsp;final&nbsp;int</CODE></FONT></TD> <tr class="altColor">
<TD ALIGN="left"><CODE><A HREF="org/libjpegturbo/turbojpeg/TJ.html#NUMCS">NUMCS</A></CODE></TD> <td class="colFirst"><a name="org.libjpegturbo.turbojpeg.TJ.FLAG_FORCESSE3">
<TD ALIGN="right"><CODE>5</CODE></TD> <!-- -->
</TR> </a><code>public&nbsp;static&nbsp;final&nbsp;int</code></td>
<TR BGCOLOR="white" CLASS="TableRowColor"> <td><code><a href="org/libjpegturbo/turbojpeg/TJ.html#FLAG_FORCESSE3">FLAG_FORCESSE3</a></code></td>
<A NAME="org.libjpegturbo.turbojpeg.TJ.NUMPF"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1"> <td class="colLast"><code>128</code></td>
<CODE>public&nbsp;static&nbsp;final&nbsp;int</CODE></FONT></TD> </tr>
<TD ALIGN="left"><CODE><A HREF="org/libjpegturbo/turbojpeg/TJ.html#NUMPF">NUMPF</A></CODE></TD> <tr class="rowColor">
<TD ALIGN="right"><CODE>12</CODE></TD> <td class="colFirst"><a name="org.libjpegturbo.turbojpeg.TJ.NUMCS">
</TR> <!-- -->
<TR BGCOLOR="white" CLASS="TableRowColor"> </a><code>public&nbsp;static&nbsp;final&nbsp;int</code></td>
<A NAME="org.libjpegturbo.turbojpeg.TJ.NUMSAMP"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1"> <td><code><a href="org/libjpegturbo/turbojpeg/TJ.html#NUMCS">NUMCS</a></code></td>
<CODE>public&nbsp;static&nbsp;final&nbsp;int</CODE></FONT></TD> <td class="colLast"><code>5</code></td>
<TD ALIGN="left"><CODE><A HREF="org/libjpegturbo/turbojpeg/TJ.html#NUMSAMP">NUMSAMP</A></CODE></TD> </tr>
<TD ALIGN="right"><CODE>6</CODE></TD> <tr class="altColor">
</TR> <td class="colFirst"><a name="org.libjpegturbo.turbojpeg.TJ.NUMPF">
<TR BGCOLOR="white" CLASS="TableRowColor"> <!-- -->
<A NAME="org.libjpegturbo.turbojpeg.TJ.PF_ABGR"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1"> </a><code>public&nbsp;static&nbsp;final&nbsp;int</code></td>
<CODE>public&nbsp;static&nbsp;final&nbsp;int</CODE></FONT></TD> <td><code><a href="org/libjpegturbo/turbojpeg/TJ.html#NUMPF">NUMPF</a></code></td>
<TD ALIGN="left"><CODE><A HREF="org/libjpegturbo/turbojpeg/TJ.html#PF_ABGR">PF_ABGR</A></CODE></TD> <td class="colLast"><code>12</code></td>
<TD ALIGN="right"><CODE>9</CODE></TD> </tr>
</TR> <tr class="rowColor">
<TR BGCOLOR="white" CLASS="TableRowColor"> <td class="colFirst"><a name="org.libjpegturbo.turbojpeg.TJ.NUMSAMP">
<A NAME="org.libjpegturbo.turbojpeg.TJ.PF_ARGB"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1"> <!-- -->
<CODE>public&nbsp;static&nbsp;final&nbsp;int</CODE></FONT></TD> </a><code>public&nbsp;static&nbsp;final&nbsp;int</code></td>
<TD ALIGN="left"><CODE><A HREF="org/libjpegturbo/turbojpeg/TJ.html#PF_ARGB">PF_ARGB</A></CODE></TD> <td><code><a href="org/libjpegturbo/turbojpeg/TJ.html#NUMSAMP">NUMSAMP</a></code></td>
<TD ALIGN="right"><CODE>10</CODE></TD> <td class="colLast"><code>6</code></td>
</TR> </tr>
<TR BGCOLOR="white" CLASS="TableRowColor"> <tr class="altColor">
<A NAME="org.libjpegturbo.turbojpeg.TJ.PF_BGR"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1"> <td class="colFirst"><a name="org.libjpegturbo.turbojpeg.TJ.PF_ABGR">
<CODE>public&nbsp;static&nbsp;final&nbsp;int</CODE></FONT></TD> <!-- -->
<TD ALIGN="left"><CODE><A HREF="org/libjpegturbo/turbojpeg/TJ.html#PF_BGR">PF_BGR</A></CODE></TD> </a><code>public&nbsp;static&nbsp;final&nbsp;int</code></td>
<TD ALIGN="right"><CODE>1</CODE></TD> <td><code><a href="org/libjpegturbo/turbojpeg/TJ.html#PF_ABGR">PF_ABGR</a></code></td>
</TR> <td class="colLast"><code>9</code></td>
<TR BGCOLOR="white" CLASS="TableRowColor"> </tr>
<A NAME="org.libjpegturbo.turbojpeg.TJ.PF_BGRA"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1"> <tr class="rowColor">
<CODE>public&nbsp;static&nbsp;final&nbsp;int</CODE></FONT></TD> <td class="colFirst"><a name="org.libjpegturbo.turbojpeg.TJ.PF_ARGB">
<TD ALIGN="left"><CODE><A HREF="org/libjpegturbo/turbojpeg/TJ.html#PF_BGRA">PF_BGRA</A></CODE></TD> <!-- -->
<TD ALIGN="right"><CODE>8</CODE></TD> </a><code>public&nbsp;static&nbsp;final&nbsp;int</code></td>
</TR> <td><code><a href="org/libjpegturbo/turbojpeg/TJ.html#PF_ARGB">PF_ARGB</a></code></td>
<TR BGCOLOR="white" CLASS="TableRowColor"> <td class="colLast"><code>10</code></td>
<A NAME="org.libjpegturbo.turbojpeg.TJ.PF_BGRX"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1"> </tr>
<CODE>public&nbsp;static&nbsp;final&nbsp;int</CODE></FONT></TD> <tr class="altColor">
<TD ALIGN="left"><CODE><A HREF="org/libjpegturbo/turbojpeg/TJ.html#PF_BGRX">PF_BGRX</A></CODE></TD> <td class="colFirst"><a name="org.libjpegturbo.turbojpeg.TJ.PF_BGR">
<TD ALIGN="right"><CODE>3</CODE></TD> <!-- -->
</TR> </a><code>public&nbsp;static&nbsp;final&nbsp;int</code></td>
<TR BGCOLOR="white" CLASS="TableRowColor"> <td><code><a href="org/libjpegturbo/turbojpeg/TJ.html#PF_BGR">PF_BGR</a></code></td>
<A NAME="org.libjpegturbo.turbojpeg.TJ.PF_CMYK"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1"> <td class="colLast"><code>1</code></td>
<CODE>public&nbsp;static&nbsp;final&nbsp;int</CODE></FONT></TD> </tr>
<TD ALIGN="left"><CODE><A HREF="org/libjpegturbo/turbojpeg/TJ.html#PF_CMYK">PF_CMYK</A></CODE></TD> <tr class="rowColor">
<TD ALIGN="right"><CODE>11</CODE></TD> <td class="colFirst"><a name="org.libjpegturbo.turbojpeg.TJ.PF_BGRA">
</TR> <!-- -->
<TR BGCOLOR="white" CLASS="TableRowColor"> </a><code>public&nbsp;static&nbsp;final&nbsp;int</code></td>
<A NAME="org.libjpegturbo.turbojpeg.TJ.PF_GRAY"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1"> <td><code><a href="org/libjpegturbo/turbojpeg/TJ.html#PF_BGRA">PF_BGRA</a></code></td>
<CODE>public&nbsp;static&nbsp;final&nbsp;int</CODE></FONT></TD> <td class="colLast"><code>8</code></td>
<TD ALIGN="left"><CODE><A HREF="org/libjpegturbo/turbojpeg/TJ.html#PF_GRAY">PF_GRAY</A></CODE></TD> </tr>
<TD ALIGN="right"><CODE>6</CODE></TD> <tr class="altColor">
</TR> <td class="colFirst"><a name="org.libjpegturbo.turbojpeg.TJ.PF_BGRX">
<TR BGCOLOR="white" CLASS="TableRowColor"> <!-- -->
<A NAME="org.libjpegturbo.turbojpeg.TJ.PF_RGB"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1"> </a><code>public&nbsp;static&nbsp;final&nbsp;int</code></td>
<CODE>public&nbsp;static&nbsp;final&nbsp;int</CODE></FONT></TD> <td><code><a href="org/libjpegturbo/turbojpeg/TJ.html#PF_BGRX">PF_BGRX</a></code></td>
<TD ALIGN="left"><CODE><A HREF="org/libjpegturbo/turbojpeg/TJ.html#PF_RGB">PF_RGB</A></CODE></TD> <td class="colLast"><code>3</code></td>
<TD ALIGN="right"><CODE>0</CODE></TD> </tr>
</TR> <tr class="rowColor">
<TR BGCOLOR="white" CLASS="TableRowColor"> <td class="colFirst"><a name="org.libjpegturbo.turbojpeg.TJ.PF_CMYK">
<A NAME="org.libjpegturbo.turbojpeg.TJ.PF_RGBA"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1"> <!-- -->
<CODE>public&nbsp;static&nbsp;final&nbsp;int</CODE></FONT></TD> </a><code>public&nbsp;static&nbsp;final&nbsp;int</code></td>
<TD ALIGN="left"><CODE><A HREF="org/libjpegturbo/turbojpeg/TJ.html#PF_RGBA">PF_RGBA</A></CODE></TD> <td><code><a href="org/libjpegturbo/turbojpeg/TJ.html#PF_CMYK">PF_CMYK</a></code></td>
<TD ALIGN="right"><CODE>7</CODE></TD> <td class="colLast"><code>11</code></td>
</TR> </tr>
<TR BGCOLOR="white" CLASS="TableRowColor"> <tr class="altColor">
<A NAME="org.libjpegturbo.turbojpeg.TJ.PF_RGBX"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1"> <td class="colFirst"><a name="org.libjpegturbo.turbojpeg.TJ.PF_GRAY">
<CODE>public&nbsp;static&nbsp;final&nbsp;int</CODE></FONT></TD> <!-- -->
<TD ALIGN="left"><CODE><A HREF="org/libjpegturbo/turbojpeg/TJ.html#PF_RGBX">PF_RGBX</A></CODE></TD> </a><code>public&nbsp;static&nbsp;final&nbsp;int</code></td>
<TD ALIGN="right"><CODE>2</CODE></TD> <td><code><a href="org/libjpegturbo/turbojpeg/TJ.html#PF_GRAY">PF_GRAY</a></code></td>
</TR> <td class="colLast"><code>6</code></td>
<TR BGCOLOR="white" CLASS="TableRowColor"> </tr>
<A NAME="org.libjpegturbo.turbojpeg.TJ.PF_XBGR"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1"> <tr class="rowColor">
<CODE>public&nbsp;static&nbsp;final&nbsp;int</CODE></FONT></TD> <td class="colFirst"><a name="org.libjpegturbo.turbojpeg.TJ.PF_RGB">
<TD ALIGN="left"><CODE><A HREF="org/libjpegturbo/turbojpeg/TJ.html#PF_XBGR">PF_XBGR</A></CODE></TD> <!-- -->
<TD ALIGN="right"><CODE>4</CODE></TD> </a><code>public&nbsp;static&nbsp;final&nbsp;int</code></td>
</TR> <td><code><a href="org/libjpegturbo/turbojpeg/TJ.html#PF_RGB">PF_RGB</a></code></td>
<TR BGCOLOR="white" CLASS="TableRowColor"> <td class="colLast"><code>0</code></td>
<A NAME="org.libjpegturbo.turbojpeg.TJ.PF_XRGB"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1"> </tr>
<CODE>public&nbsp;static&nbsp;final&nbsp;int</CODE></FONT></TD> <tr class="altColor">
<TD ALIGN="left"><CODE><A HREF="org/libjpegturbo/turbojpeg/TJ.html#PF_XRGB">PF_XRGB</A></CODE></TD> <td class="colFirst"><a name="org.libjpegturbo.turbojpeg.TJ.PF_RGBA">
<TD ALIGN="right"><CODE>5</CODE></TD> <!-- -->
</TR> </a><code>public&nbsp;static&nbsp;final&nbsp;int</code></td>
<TR BGCOLOR="white" CLASS="TableRowColor"> <td><code><a href="org/libjpegturbo/turbojpeg/TJ.html#PF_RGBA">PF_RGBA</a></code></td>
<A NAME="org.libjpegturbo.turbojpeg.TJ.SAMP_411"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1"> <td class="colLast"><code>7</code></td>
<CODE>public&nbsp;static&nbsp;final&nbsp;int</CODE></FONT></TD> </tr>
<TD ALIGN="left"><CODE><A HREF="org/libjpegturbo/turbojpeg/TJ.html#SAMP_411">SAMP_411</A></CODE></TD> <tr class="rowColor">
<TD ALIGN="right"><CODE>5</CODE></TD> <td class="colFirst"><a name="org.libjpegturbo.turbojpeg.TJ.PF_RGBX">
</TR> <!-- -->
<TR BGCOLOR="white" CLASS="TableRowColor"> </a><code>public&nbsp;static&nbsp;final&nbsp;int</code></td>
<A NAME="org.libjpegturbo.turbojpeg.TJ.SAMP_420"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1"> <td><code><a href="org/libjpegturbo/turbojpeg/TJ.html#PF_RGBX">PF_RGBX</a></code></td>
<CODE>public&nbsp;static&nbsp;final&nbsp;int</CODE></FONT></TD> <td class="colLast"><code>2</code></td>
<TD ALIGN="left"><CODE><A HREF="org/libjpegturbo/turbojpeg/TJ.html#SAMP_420">SAMP_420</A></CODE></TD> </tr>
<TD ALIGN="right"><CODE>2</CODE></TD> <tr class="altColor">
</TR> <td class="colFirst"><a name="org.libjpegturbo.turbojpeg.TJ.PF_XBGR">
<TR BGCOLOR="white" CLASS="TableRowColor"> <!-- -->
<A NAME="org.libjpegturbo.turbojpeg.TJ.SAMP_422"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1"> </a><code>public&nbsp;static&nbsp;final&nbsp;int</code></td>
<CODE>public&nbsp;static&nbsp;final&nbsp;int</CODE></FONT></TD> <td><code><a href="org/libjpegturbo/turbojpeg/TJ.html#PF_XBGR">PF_XBGR</a></code></td>
<TD ALIGN="left"><CODE><A HREF="org/libjpegturbo/turbojpeg/TJ.html#SAMP_422">SAMP_422</A></CODE></TD> <td class="colLast"><code>4</code></td>
<TD ALIGN="right"><CODE>1</CODE></TD> </tr>
</TR> <tr class="rowColor">
<TR BGCOLOR="white" CLASS="TableRowColor"> <td class="colFirst"><a name="org.libjpegturbo.turbojpeg.TJ.PF_XRGB">
<A NAME="org.libjpegturbo.turbojpeg.TJ.SAMP_440"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1"> <!-- -->
<CODE>public&nbsp;static&nbsp;final&nbsp;int</CODE></FONT></TD> </a><code>public&nbsp;static&nbsp;final&nbsp;int</code></td>
<TD ALIGN="left"><CODE><A HREF="org/libjpegturbo/turbojpeg/TJ.html#SAMP_440">SAMP_440</A></CODE></TD> <td><code><a href="org/libjpegturbo/turbojpeg/TJ.html#PF_XRGB">PF_XRGB</a></code></td>
<TD ALIGN="right"><CODE>4</CODE></TD> <td class="colLast"><code>5</code></td>
</TR> </tr>
<TR BGCOLOR="white" CLASS="TableRowColor"> <tr class="altColor">
<A NAME="org.libjpegturbo.turbojpeg.TJ.SAMP_444"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1"> <td class="colFirst"><a name="org.libjpegturbo.turbojpeg.TJ.SAMP_411">
<CODE>public&nbsp;static&nbsp;final&nbsp;int</CODE></FONT></TD> <!-- -->
<TD ALIGN="left"><CODE><A HREF="org/libjpegturbo/turbojpeg/TJ.html#SAMP_444">SAMP_444</A></CODE></TD> </a><code>public&nbsp;static&nbsp;final&nbsp;int</code></td>
<TD ALIGN="right"><CODE>0</CODE></TD> <td><code><a href="org/libjpegturbo/turbojpeg/TJ.html#SAMP_411">SAMP_411</a></code></td>
</TR> <td class="colLast"><code>5</code></td>
<TR BGCOLOR="white" CLASS="TableRowColor"> </tr>
<A NAME="org.libjpegturbo.turbojpeg.TJ.SAMP_GRAY"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1"> <tr class="rowColor">
<CODE>public&nbsp;static&nbsp;final&nbsp;int</CODE></FONT></TD> <td class="colFirst"><a name="org.libjpegturbo.turbojpeg.TJ.SAMP_420">
<TD ALIGN="left"><CODE><A HREF="org/libjpegturbo/turbojpeg/TJ.html#SAMP_GRAY">SAMP_GRAY</A></CODE></TD> <!-- -->
<TD ALIGN="right"><CODE>3</CODE></TD> </a><code>public&nbsp;static&nbsp;final&nbsp;int</code></td>
</TR> <td><code><a href="org/libjpegturbo/turbojpeg/TJ.html#SAMP_420">SAMP_420</a></code></td>
</FONT></TD> <td class="colLast"><code>2</code></td>
</TR> </tr>
</TABLE> <tr class="altColor">
<td class="colFirst"><a name="org.libjpegturbo.turbojpeg.TJ.SAMP_422">
<P> <!-- -->
</a><code>public&nbsp;static&nbsp;final&nbsp;int</code></td>
<P> <td><code><a href="org/libjpegturbo/turbojpeg/TJ.html#SAMP_422">SAMP_422</a></code></td>
<td class="colLast"><code>1</code></td>
<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" SUMMARY=""> </tr>
<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor"> <tr class="rowColor">
<TH ALIGN="left" COLSPAN="3">org.libjpegturbo.turbojpeg.<A HREF="org/libjpegturbo/turbojpeg/TJTransform.html" title="class in org.libjpegturbo.turbojpeg">TJTransform</A></TH> <td class="colFirst"><a name="org.libjpegturbo.turbojpeg.TJ.SAMP_440">
</TR> <!-- -->
<TR BGCOLOR="white" CLASS="TableRowColor"> </a><code>public&nbsp;static&nbsp;final&nbsp;int</code></td>
<A NAME="org.libjpegturbo.turbojpeg.TJTransform.NUMOP"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1"> <td><code><a href="org/libjpegturbo/turbojpeg/TJ.html#SAMP_440">SAMP_440</a></code></td>
<CODE>public&nbsp;static&nbsp;final&nbsp;int</CODE></FONT></TD> <td class="colLast"><code>4</code></td>
<TD ALIGN="left"><CODE><A HREF="org/libjpegturbo/turbojpeg/TJTransform.html#NUMOP">NUMOP</A></CODE></TD> </tr>
<TD ALIGN="right"><CODE>8</CODE></TD> <tr class="altColor">
</TR> <td class="colFirst"><a name="org.libjpegturbo.turbojpeg.TJ.SAMP_444">
<TR BGCOLOR="white" CLASS="TableRowColor"> <!-- -->
<A NAME="org.libjpegturbo.turbojpeg.TJTransform.OP_HFLIP"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1"> </a><code>public&nbsp;static&nbsp;final&nbsp;int</code></td>
<CODE>public&nbsp;static&nbsp;final&nbsp;int</CODE></FONT></TD> <td><code><a href="org/libjpegturbo/turbojpeg/TJ.html#SAMP_444">SAMP_444</a></code></td>
<TD ALIGN="left"><CODE><A HREF="org/libjpegturbo/turbojpeg/TJTransform.html#OP_HFLIP">OP_HFLIP</A></CODE></TD> <td class="colLast"><code>0</code></td>
<TD ALIGN="right"><CODE>1</CODE></TD> </tr>
</TR> <tr class="rowColor">
<TR BGCOLOR="white" CLASS="TableRowColor"> <td class="colFirst"><a name="org.libjpegturbo.turbojpeg.TJ.SAMP_GRAY">
<A NAME="org.libjpegturbo.turbojpeg.TJTransform.OP_NONE"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1"> <!-- -->
<CODE>public&nbsp;static&nbsp;final&nbsp;int</CODE></FONT></TD> </a><code>public&nbsp;static&nbsp;final&nbsp;int</code></td>
<TD ALIGN="left"><CODE><A HREF="org/libjpegturbo/turbojpeg/TJTransform.html#OP_NONE">OP_NONE</A></CODE></TD> <td><code><a href="org/libjpegturbo/turbojpeg/TJ.html#SAMP_GRAY">SAMP_GRAY</a></code></td>
<TD ALIGN="right"><CODE>0</CODE></TD> <td class="colLast"><code>3</code></td>
</TR> </tr>
<TR BGCOLOR="white" CLASS="TableRowColor"> </tbody>
<A NAME="org.libjpegturbo.turbojpeg.TJTransform.OP_ROT180"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1"> </table>
<CODE>public&nbsp;static&nbsp;final&nbsp;int</CODE></FONT></TD> </li>
<TD ALIGN="left"><CODE><A HREF="org/libjpegturbo/turbojpeg/TJTransform.html#OP_ROT180">OP_ROT180</A></CODE></TD> <li class="blockList">
<TD ALIGN="right"><CODE>6</CODE></TD> <table border="0" cellpadding="3" cellspacing="0" summary="Constant Field Values table, listing constant fields, and values">
</TR> <caption><span>org.libjpegturbo.turbojpeg.<a href="org/libjpegturbo/turbojpeg/TJTransform.html" title="class in org.libjpegturbo.turbojpeg">TJTransform</a></span><span class="tabEnd">&nbsp;</span></caption>
<TR BGCOLOR="white" CLASS="TableRowColor"> <tr>
<A NAME="org.libjpegturbo.turbojpeg.TJTransform.OP_ROT270"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1"> <th class="colFirst" scope="col">Modifier and Type</th>
<CODE>public&nbsp;static&nbsp;final&nbsp;int</CODE></FONT></TD> <th scope="col">Constant Field</th>
<TD ALIGN="left"><CODE><A HREF="org/libjpegturbo/turbojpeg/TJTransform.html#OP_ROT270">OP_ROT270</A></CODE></TD> <th class="colLast" scope="col">Value</th>
<TD ALIGN="right"><CODE>7</CODE></TD> </tr>
</TR> <tbody>
<TR BGCOLOR="white" CLASS="TableRowColor"> <tr class="altColor">
<A NAME="org.libjpegturbo.turbojpeg.TJTransform.OP_ROT90"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1"> <td class="colFirst"><a name="org.libjpegturbo.turbojpeg.TJTransform.NUMOP">
<CODE>public&nbsp;static&nbsp;final&nbsp;int</CODE></FONT></TD> <!-- -->
<TD ALIGN="left"><CODE><A HREF="org/libjpegturbo/turbojpeg/TJTransform.html#OP_ROT90">OP_ROT90</A></CODE></TD> </a><code>public&nbsp;static&nbsp;final&nbsp;int</code></td>
<TD ALIGN="right"><CODE>5</CODE></TD> <td><code><a href="org/libjpegturbo/turbojpeg/TJTransform.html#NUMOP">NUMOP</a></code></td>
</TR> <td class="colLast"><code>8</code></td>
<TR BGCOLOR="white" CLASS="TableRowColor"> </tr>
<A NAME="org.libjpegturbo.turbojpeg.TJTransform.OP_TRANSPOSE"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1"> <tr class="rowColor">
<CODE>public&nbsp;static&nbsp;final&nbsp;int</CODE></FONT></TD> <td class="colFirst"><a name="org.libjpegturbo.turbojpeg.TJTransform.OP_HFLIP">
<TD ALIGN="left"><CODE><A HREF="org/libjpegturbo/turbojpeg/TJTransform.html#OP_TRANSPOSE">OP_TRANSPOSE</A></CODE></TD> <!-- -->
<TD ALIGN="right"><CODE>3</CODE></TD> </a><code>public&nbsp;static&nbsp;final&nbsp;int</code></td>
</TR> <td><code><a href="org/libjpegturbo/turbojpeg/TJTransform.html#OP_HFLIP">OP_HFLIP</a></code></td>
<TR BGCOLOR="white" CLASS="TableRowColor"> <td class="colLast"><code>1</code></td>
<A NAME="org.libjpegturbo.turbojpeg.TJTransform.OP_TRANSVERSE"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1"> </tr>
<CODE>public&nbsp;static&nbsp;final&nbsp;int</CODE></FONT></TD> <tr class="altColor">
<TD ALIGN="left"><CODE><A HREF="org/libjpegturbo/turbojpeg/TJTransform.html#OP_TRANSVERSE">OP_TRANSVERSE</A></CODE></TD> <td class="colFirst"><a name="org.libjpegturbo.turbojpeg.TJTransform.OP_NONE">
<TD ALIGN="right"><CODE>4</CODE></TD> <!-- -->
</TR> </a><code>public&nbsp;static&nbsp;final&nbsp;int</code></td>
<TR BGCOLOR="white" CLASS="TableRowColor"> <td><code><a href="org/libjpegturbo/turbojpeg/TJTransform.html#OP_NONE">OP_NONE</a></code></td>
<A NAME="org.libjpegturbo.turbojpeg.TJTransform.OP_VFLIP"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1"> <td class="colLast"><code>0</code></td>
<CODE>public&nbsp;static&nbsp;final&nbsp;int</CODE></FONT></TD> </tr>
<TD ALIGN="left"><CODE><A HREF="org/libjpegturbo/turbojpeg/TJTransform.html#OP_VFLIP">OP_VFLIP</A></CODE></TD> <tr class="rowColor">
<TD ALIGN="right"><CODE>2</CODE></TD> <td class="colFirst"><a name="org.libjpegturbo.turbojpeg.TJTransform.OP_ROT180">
</TR> <!-- -->
<TR BGCOLOR="white" CLASS="TableRowColor"> </a><code>public&nbsp;static&nbsp;final&nbsp;int</code></td>
<A NAME="org.libjpegturbo.turbojpeg.TJTransform.OPT_CROP"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1"> <td><code><a href="org/libjpegturbo/turbojpeg/TJTransform.html#OP_ROT180">OP_ROT180</a></code></td>
<CODE>public&nbsp;static&nbsp;final&nbsp;int</CODE></FONT></TD> <td class="colLast"><code>6</code></td>
<TD ALIGN="left"><CODE><A HREF="org/libjpegturbo/turbojpeg/TJTransform.html#OPT_CROP">OPT_CROP</A></CODE></TD> </tr>
<TD ALIGN="right"><CODE>4</CODE></TD> <tr class="altColor">
</TR> <td class="colFirst"><a name="org.libjpegturbo.turbojpeg.TJTransform.OP_ROT270">
<TR BGCOLOR="white" CLASS="TableRowColor"> <!-- -->
<A NAME="org.libjpegturbo.turbojpeg.TJTransform.OPT_GRAY"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1"> </a><code>public&nbsp;static&nbsp;final&nbsp;int</code></td>
<CODE>public&nbsp;static&nbsp;final&nbsp;int</CODE></FONT></TD> <td><code><a href="org/libjpegturbo/turbojpeg/TJTransform.html#OP_ROT270">OP_ROT270</a></code></td>
<TD ALIGN="left"><CODE><A HREF="org/libjpegturbo/turbojpeg/TJTransform.html#OPT_GRAY">OPT_GRAY</A></CODE></TD> <td class="colLast"><code>7</code></td>
<TD ALIGN="right"><CODE>8</CODE></TD> </tr>
</TR> <tr class="rowColor">
<TR BGCOLOR="white" CLASS="TableRowColor"> <td class="colFirst"><a name="org.libjpegturbo.turbojpeg.TJTransform.OP_ROT90">
<A NAME="org.libjpegturbo.turbojpeg.TJTransform.OPT_NOOUTPUT"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1"> <!-- -->
<CODE>public&nbsp;static&nbsp;final&nbsp;int</CODE></FONT></TD> </a><code>public&nbsp;static&nbsp;final&nbsp;int</code></td>
<TD ALIGN="left"><CODE><A HREF="org/libjpegturbo/turbojpeg/TJTransform.html#OPT_NOOUTPUT">OPT_NOOUTPUT</A></CODE></TD> <td><code><a href="org/libjpegturbo/turbojpeg/TJTransform.html#OP_ROT90">OP_ROT90</a></code></td>
<TD ALIGN="right"><CODE>16</CODE></TD> <td class="colLast"><code>5</code></td>
</TR> </tr>
<TR BGCOLOR="white" CLASS="TableRowColor"> <tr class="altColor">
<A NAME="org.libjpegturbo.turbojpeg.TJTransform.OPT_PERFECT"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1"> <td class="colFirst"><a name="org.libjpegturbo.turbojpeg.TJTransform.OP_TRANSPOSE">
<CODE>public&nbsp;static&nbsp;final&nbsp;int</CODE></FONT></TD> <!-- -->
<TD ALIGN="left"><CODE><A HREF="org/libjpegturbo/turbojpeg/TJTransform.html#OPT_PERFECT">OPT_PERFECT</A></CODE></TD> </a><code>public&nbsp;static&nbsp;final&nbsp;int</code></td>
<TD ALIGN="right"><CODE>1</CODE></TD> <td><code><a href="org/libjpegturbo/turbojpeg/TJTransform.html#OP_TRANSPOSE">OP_TRANSPOSE</a></code></td>
</TR> <td class="colLast"><code>3</code></td>
<TR BGCOLOR="white" CLASS="TableRowColor"> </tr>
<A NAME="org.libjpegturbo.turbojpeg.TJTransform.OPT_TRIM"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1"> <tr class="rowColor">
<CODE>public&nbsp;static&nbsp;final&nbsp;int</CODE></FONT></TD> <td class="colFirst"><a name="org.libjpegturbo.turbojpeg.TJTransform.OP_TRANSVERSE">
<TD ALIGN="left"><CODE><A HREF="org/libjpegturbo/turbojpeg/TJTransform.html#OPT_TRIM">OPT_TRIM</A></CODE></TD> <!-- -->
<TD ALIGN="right"><CODE>2</CODE></TD> </a><code>public&nbsp;static&nbsp;final&nbsp;int</code></td>
</TR> <td><code><a href="org/libjpegturbo/turbojpeg/TJTransform.html#OP_TRANSVERSE">OP_TRANSVERSE</a></code></td>
</FONT></TD> <td class="colLast"><code>4</code></td>
</TR> </tr>
</TABLE> <tr class="altColor">
<td class="colFirst"><a name="org.libjpegturbo.turbojpeg.TJTransform.OP_VFLIP">
<P> <!-- -->
</a><code>public&nbsp;static&nbsp;final&nbsp;int</code></td>
<P> <td><code><a href="org/libjpegturbo/turbojpeg/TJTransform.html#OP_VFLIP">OP_VFLIP</a></code></td>
<HR> <td class="colLast"><code>2</code></td>
</tr>
<tr class="rowColor">
<td class="colFirst"><a name="org.libjpegturbo.turbojpeg.TJTransform.OPT_CROP">
<!-- -->
</a><code>public&nbsp;static&nbsp;final&nbsp;int</code></td>
<td><code><a href="org/libjpegturbo/turbojpeg/TJTransform.html#OPT_CROP">OPT_CROP</a></code></td>
<td class="colLast"><code>4</code></td>
</tr>
<tr class="altColor">
<td class="colFirst"><a name="org.libjpegturbo.turbojpeg.TJTransform.OPT_GRAY">
<!-- -->
</a><code>public&nbsp;static&nbsp;final&nbsp;int</code></td>
<td><code><a href="org/libjpegturbo/turbojpeg/TJTransform.html#OPT_GRAY">OPT_GRAY</a></code></td>
<td class="colLast"><code>8</code></td>
</tr>
<tr class="rowColor">
<td class="colFirst"><a name="org.libjpegturbo.turbojpeg.TJTransform.OPT_NOOUTPUT">
<!-- -->
</a><code>public&nbsp;static&nbsp;final&nbsp;int</code></td>
<td><code><a href="org/libjpegturbo/turbojpeg/TJTransform.html#OPT_NOOUTPUT">OPT_NOOUTPUT</a></code></td>
<td class="colLast"><code>16</code></td>
</tr>
<tr class="altColor">
<td class="colFirst"><a name="org.libjpegturbo.turbojpeg.TJTransform.OPT_PERFECT">
<!-- -->
</a><code>public&nbsp;static&nbsp;final&nbsp;int</code></td>
<td><code><a href="org/libjpegturbo/turbojpeg/TJTransform.html#OPT_PERFECT">OPT_PERFECT</a></code></td>
<td class="colLast"><code>1</code></td>
</tr>
<tr class="rowColor">
<td class="colFirst"><a name="org.libjpegturbo.turbojpeg.TJTransform.OPT_TRIM">
<!-- -->
</a><code>public&nbsp;static&nbsp;final&nbsp;int</code></td>
<td><code><a href="org/libjpegturbo/turbojpeg/TJTransform.html#OPT_TRIM">OPT_TRIM</a></code></td>
<td class="colLast"><code>2</code></td>
</tr>
</tbody>
</table>
</li>
</ul>
</div>
<!-- ======= START OF BOTTOM NAVBAR ====== --> <!-- ======= START OF BOTTOM NAVBAR ====== -->
<A NAME="navbar_bottom"><!-- --></A> <div class="bottomNav"><a name="navbar_bottom">
<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A> <!-- -->
<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY=""> </a><a href="#skip-navbar_bottom" title="Skip navigation links"></a><a name="navbar_bottom_firstrow">
<TR> <!-- -->
<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> </a>
<A NAME="navbar_bottom_firstrow"><!-- --></A> <ul class="navList" title="Navigation">
<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY=""> <li><a href="org/libjpegturbo/turbojpeg/package-summary.html">Package</a></li>
<TR ALIGN="center" VALIGN="top"> <li>Class</li>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="org/libjpegturbo/turbojpeg/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A>&nbsp;</TD> <li><a href="org/libjpegturbo/turbojpeg/package-tree.html">Tree</a></li>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Class</FONT>&nbsp;</TD> <li><a href="deprecated-list.html">Deprecated</a></li>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="org/libjpegturbo/turbojpeg/package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A>&nbsp;</TD> <li><a href="index-all.html">Index</a></li>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD> <li><a href="help-doc.html">Help</a></li>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A>&nbsp;</TD> </ul>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD> </div>
</TR> <div class="subNav">
</TABLE> <ul class="navList">
</TD> <li>Prev</li>
<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM> <li>Next</li>
</EM> </ul>
</TD> <ul class="navList">
</TR> <li><a href="index.html?constant-values.html" target="_top">Frames</a></li>
<li><a href="constant-values.html" target="_top">No Frames</a></li>
<TR> </ul>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2"> <ul class="navList" id="allclasses_navbar_bottom">
&nbsp;PREV&nbsp; <li><a href="allclasses-noframe.html">All Classes</a></li>
&nbsp;NEXT</FONT></TD> </ul>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2"> <div>
<A HREF="index.html?constant-values.html" target="_top"><B>FRAMES</B></A> &nbsp; <script type="text/javascript"><!--
&nbsp;<A HREF="constant-values.html" target="_top"><B>NO FRAMES</B></A> &nbsp; allClassesLink = document.getElementById("allclasses_navbar_bottom");
&nbsp;<SCRIPT type="text/javascript">
<!--
if(window==top) { if(window==top) {
document.writeln('<A HREF="allclasses-noframe.html"><B>All Classes</B></A>'); allClassesLink.style.display = "block";
}
else {
allClassesLink.style.display = "none";
} }
//--> //-->
</SCRIPT> </script>
<NOSCRIPT> </div>
<A HREF="allclasses-noframe.html"><B>All Classes</B></A> <a name="skip-navbar_bottom">
</NOSCRIPT> <!-- -->
</a></div>
</FONT></TD>
</TR>
</TABLE>
<A NAME="skip-navbar_bottom"></A>
<!-- ======== END OF BOTTOM NAVBAR ======= --> <!-- ======== END OF BOTTOM NAVBAR ======= -->
</body>
<HR> </html>
</BODY>
</HTML>

View File

@@ -1,208 +1,248 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!-- NewPage --> <!-- NewPage -->
<HTML> <html lang="en">
<HEAD> <head>
<TITLE> <title>Deprecated List</title>
Deprecated List <link rel="stylesheet" type="text/css" href="stylesheet.css" title="Style">
</TITLE> </head>
<body>
<script type="text/javascript"><!--
<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
<SCRIPT type="text/javascript">
function windowTitle()
{
if (location.href.indexOf('is-external=true') == -1) { if (location.href.indexOf('is-external=true') == -1) {
parent.document.title="Deprecated List"; parent.document.title="Deprecated List";
} }
} //-->
</SCRIPT> </script>
<NOSCRIPT> <noscript>
</NOSCRIPT> <div>JavaScript is disabled on your browser.</div>
</noscript>
</HEAD>
<BODY BGCOLOR="white" onload="windowTitle();">
<HR>
<!-- ========= START OF TOP NAVBAR ======= --> <!-- ========= START OF TOP NAVBAR ======= -->
<A NAME="navbar_top"><!-- --></A> <div class="topNav"><a name="navbar_top">
<A HREF="#skip-navbar_top" title="Skip navigation links"></A> <!-- -->
<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY=""> </a><a href="#skip-navbar_top" title="Skip navigation links"></a><a name="navbar_top_firstrow">
<TR> <!-- -->
<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> </a>
<A NAME="navbar_top_firstrow"><!-- --></A> <ul class="navList" title="Navigation">
<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY=""> <li><a href="org/libjpegturbo/turbojpeg/package-summary.html">Package</a></li>
<TR ALIGN="center" VALIGN="top"> <li>Class</li>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="org/libjpegturbo/turbojpeg/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A>&nbsp;</TD> <li><a href="org/libjpegturbo/turbojpeg/package-tree.html">Tree</a></li>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Class</FONT>&nbsp;</TD> <li class="navBarCell1Rev">Deprecated</li>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="org/libjpegturbo/turbojpeg/package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A>&nbsp;</TD> <li><a href="index-all.html">Index</a></li>
<TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Deprecated</B></FONT>&nbsp;</TD> <li><a href="help-doc.html">Help</a></li>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A>&nbsp;</TD> </ul>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD> </div>
</TR> <div class="subNav">
</TABLE> <ul class="navList">
</TD> <li>Prev</li>
<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM> <li>Next</li>
</EM> </ul>
</TD> <ul class="navList">
</TR> <li><a href="index.html?deprecated-list.html" target="_top">Frames</a></li>
<li><a href="deprecated-list.html" target="_top">No Frames</a></li>
<TR> </ul>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2"> <ul class="navList" id="allclasses_navbar_top">
&nbsp;PREV&nbsp; <li><a href="allclasses-noframe.html">All Classes</a></li>
&nbsp;NEXT</FONT></TD> </ul>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2"> <div>
<A HREF="index.html?deprecated-list.html" target="_top"><B>FRAMES</B></A> &nbsp; <script type="text/javascript"><!--
&nbsp;<A HREF="deprecated-list.html" target="_top"><B>NO FRAMES</B></A> &nbsp; allClassesLink = document.getElementById("allclasses_navbar_top");
&nbsp;<SCRIPT type="text/javascript">
<!--
if(window==top) { if(window==top) {
document.writeln('<A HREF="allclasses-noframe.html"><B>All Classes</B></A>'); allClassesLink.style.display = "block";
}
else {
allClassesLink.style.display = "none";
} }
//--> //-->
</SCRIPT> </script>
<NOSCRIPT> </div>
<A HREF="allclasses-noframe.html"><B>All Classes</B></A> <a name="skip-navbar_top">
</NOSCRIPT> <!-- -->
</a></div>
</FONT></TD>
</TR>
</TABLE>
<A NAME="skip-navbar_top"></A>
<!-- ========= END OF TOP NAVBAR ========= --> <!-- ========= END OF TOP NAVBAR ========= -->
<div class="header">
<HR> <h1 title="Deprecated API" class="title">Deprecated API</h1>
<CENTER> <h2 title="Contents">Contents</h2>
<H2> <ul>
<B>Deprecated API</B></H2> <li><a href="#field">Deprecated Fields</a></li>
</CENTER> <li><a href="#method">Deprecated Methods</a></li>
<HR SIZE="4" NOSHADE> <li><a href="#constructor">Deprecated Constructors</a></li>
<B>Contents</B><UL> </ul>
<LI><A HREF="#field">Deprecated Fields</A> </div>
<LI><A HREF="#method">Deprecated Methods</A> <div class="contentContainer"><a name="field">
</UL> <!-- -->
</a>
<A NAME="field"><!-- --></A> <ul class="blockList">
<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY=""> <li class="blockList">
<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor"> <table border="0" cellpadding="3" cellspacing="0" summary="Deprecated Fields table, listing deprecated fields, and an explanation">
<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2"> <caption><span>Deprecated Fields</span><span class="tabEnd">&nbsp;</span></caption>
<B>Deprecated Fields</B></FONT></TH> <tr>
</TR> <th class="colOne" scope="col">Field and Description</th>
<TR BGCOLOR="white" CLASS="TableRowColor"> </tr>
<TD><A HREF="org/libjpegturbo/turbojpeg/TJ.html#FLAG_FORCEMMX">org.libjpegturbo.turbojpeg.TJ.FLAG_FORCEMMX</A> <tbody>
<BR> <tr class="altColor">
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD> <td class="colOne"><a href="org/libjpegturbo/turbojpeg/TJ.html#FLAG_FORCEMMX">org.libjpegturbo.turbojpeg.TJ.FLAG_FORCEMMX</a></td>
</TR> </tr>
<TR BGCOLOR="white" CLASS="TableRowColor"> <tr class="rowColor">
<TD><A HREF="org/libjpegturbo/turbojpeg/TJ.html#FLAG_FORCESSE">org.libjpegturbo.turbojpeg.TJ.FLAG_FORCESSE</A> <td class="colOne"><a href="org/libjpegturbo/turbojpeg/TJ.html#FLAG_FORCESSE">org.libjpegturbo.turbojpeg.TJ.FLAG_FORCESSE</a></td>
<BR> </tr>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD> <tr class="altColor">
</TR> <td class="colOne"><a href="org/libjpegturbo/turbojpeg/TJ.html#FLAG_FORCESSE2">org.libjpegturbo.turbojpeg.TJ.FLAG_FORCESSE2</a></td>
<TR BGCOLOR="white" CLASS="TableRowColor"> </tr>
<TD><A HREF="org/libjpegturbo/turbojpeg/TJ.html#FLAG_FORCESSE2">org.libjpegturbo.turbojpeg.TJ.FLAG_FORCESSE2</A> <tr class="rowColor">
<BR> <td class="colOne"><a href="org/libjpegturbo/turbojpeg/TJ.html#FLAG_FORCESSE3">org.libjpegturbo.turbojpeg.TJ.FLAG_FORCESSE3</a></td>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD> </tr>
</TR> </tbody>
<TR BGCOLOR="white" CLASS="TableRowColor"> </table>
<TD><A HREF="org/libjpegturbo/turbojpeg/TJ.html#FLAG_FORCESSE3">org.libjpegturbo.turbojpeg.TJ.FLAG_FORCESSE3</A> </li>
<BR> </ul>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD> <a name="method">
</TR> <!-- -->
</TABLE> </a>
&nbsp; <ul class="blockList">
<P> <li class="blockList">
<A NAME="method"><!-- --></A> <table border="0" cellpadding="3" cellspacing="0" summary="Deprecated Methods table, listing deprecated methods, and an explanation">
<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY=""> <caption><span>Deprecated Methods</span><span class="tabEnd">&nbsp;</span></caption>
<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor"> <tr>
<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2"> <th class="colOne" scope="col">Method and Description</th>
<B>Deprecated Methods</B></FONT></TH> </tr>
</TR> <tbody>
<TR BGCOLOR="white" CLASS="TableRowColor"> <tr class="altColor">
<TD><A HREF="org/libjpegturbo/turbojpeg/TJ.html#bufSizeYUV(int, int, int)">org.libjpegturbo.turbojpeg.TJ.bufSizeYUV(int, int, int)</A> <td class="colOne"><a href="org/libjpegturbo/turbojpeg/TJ.html#bufSizeYUV(int,%20int,%20int)">org.libjpegturbo.turbojpeg.TJ.bufSizeYUV(int, int, int)</a>
<BR> <div class="block"><i>Use <a href="org/libjpegturbo/turbojpeg/TJ.html#bufSizeYUV(int,%20int,%20int,%20int)"><code>TJ.bufSizeYUV(int, int, int, int)</code></a> instead.</i></div>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<I>Use <A HREF="org/libjpegturbo/turbojpeg/TJ.html#bufSizeYUV(int, int, int, int)"><CODE>TJ.bufSizeYUV(int, int, int, int)</CODE></A> instead.</I>&nbsp;</TD> </td>
</TR> </tr>
<TR BGCOLOR="white" CLASS="TableRowColor"> <tr class="rowColor">
<TD><A HREF="org/libjpegturbo/turbojpeg/TJDecompressor.html#decompress(byte[], int, int, int, int, int)">org.libjpegturbo.turbojpeg.TJDecompressor.decompress(byte[], int, int, int, int, int)</A> <td class="colOne"><a href="org/libjpegturbo/turbojpeg/TJCompressor.html#compress(java.awt.image.BufferedImage,%20byte[],%20int)">org.libjpegturbo.turbojpeg.TJCompressor.compress(BufferedImage, byte[], int)</a>
<BR> <div class="block"><i>Use
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<I>Use <a href="org/libjpegturbo/turbojpeg/TJCompressor.html#setSourceImage(java.awt.image.BufferedImage,%20int,%20int,%20int,%20int)"><code>TJCompressor.setSourceImage(BufferedImage, int, int, int, int)</code></a> and
<A HREF="org/libjpegturbo/turbojpeg/TJDecompressor.html#decompress(byte[], int, int, int, int, int, int, int)"><CODE>TJDecompressor.decompress(byte[], int, int, int, int, int, int, int)</CODE></A> instead.</I>&nbsp;</TD> <a href="org/libjpegturbo/turbojpeg/TJCompressor.html#compress(byte[],%20int)"><code>TJCompressor.compress(byte[], int)</code></a> instead.</i></div>
</TR> </td>
<TR BGCOLOR="white" CLASS="TableRowColor"> </tr>
<TD><A HREF="org/libjpegturbo/turbojpeg/TJDecompressor.html#decompressToYUV(byte[], int)">org.libjpegturbo.turbojpeg.TJDecompressor.decompressToYUV(byte[], int)</A> <tr class="altColor">
<BR> <td class="colOne"><a href="org/libjpegturbo/turbojpeg/TJCompressor.html#compress(java.awt.image.BufferedImage,%20int)">org.libjpegturbo.turbojpeg.TJCompressor.compress(BufferedImage, int)</a>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<I>Use <A HREF="org/libjpegturbo/turbojpeg/TJDecompressor.html#decompressToYUV(byte[], int, int, int, int)"><CODE>TJDecompressor.decompressToYUV(byte[], int, int, int, int)</CODE></A> <div class="block"><i>Use
instead.</I>&nbsp;</TD> <a href="org/libjpegturbo/turbojpeg/TJCompressor.html#setSourceImage(java.awt.image.BufferedImage,%20int,%20int,%20int,%20int)"><code>TJCompressor.setSourceImage(BufferedImage, int, int, int, int)</code></a> and
</TR> <a href="org/libjpegturbo/turbojpeg/TJCompressor.html#compress(int)"><code>TJCompressor.compress(int)</code></a> instead.</i></div>
<TR BGCOLOR="white" CLASS="TableRowColor"> </td>
<TD><A HREF="org/libjpegturbo/turbojpeg/TJDecompressor.html#decompressToYUV(int)">org.libjpegturbo.turbojpeg.TJDecompressor.decompressToYUV(int)</A> </tr>
<BR> <tr class="rowColor">
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<I>Use <A HREF="org/libjpegturbo/turbojpeg/TJDecompressor.html#decompressToYUV(int, int, int, int)"><CODE>TJDecompressor.decompressToYUV(int, int, int, int)</CODE></A> instead.</I>&nbsp;</TD> <td class="colOne"><a href="org/libjpegturbo/turbojpeg/TJDecompressor.html#decompress(byte[],%20int,%20int,%20int,%20int,%20int)">org.libjpegturbo.turbojpeg.TJDecompressor.decompress(byte[], int, int, int, int, int)</a>
</TR> <div class="block"><i>Use
<TR BGCOLOR="white" CLASS="TableRowColor"> <a href="org/libjpegturbo/turbojpeg/TJDecompressor.html#decompress(byte[],%20int,%20int,%20int,%20int,%20int,%20int,%20int)"><code>TJDecompressor.decompress(byte[], int, int, int, int, int, int, int)</code></a> instead.</i></div>
<TD><A HREF="org/libjpegturbo/turbojpeg/TJCompressor.html#setSourceImage(byte[], int, int, int, int)">org.libjpegturbo.turbojpeg.TJCompressor.setSourceImage(byte[], int, int, int, int)</A> </td>
<BR> </tr>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<I>Use <tr class="altColor">
<A HREF="org/libjpegturbo/turbojpeg/TJCompressor.html#setSourceImage(byte[], int, int, int, int, int, int)"><CODE>TJCompressor.setSourceImage(byte[], int, int, int, int, int, int)</CODE></A> instead.</I>&nbsp;</TD> <td class="colOne"><a href="org/libjpegturbo/turbojpeg/TJDecompressor.html#decompressToYUV(byte[],%20int)">org.libjpegturbo.turbojpeg.TJDecompressor.decompressToYUV(byte[], int)</a>
</TR> <div class="block"><i>Use <a href="org/libjpegturbo/turbojpeg/TJDecompressor.html#decompressToYUV(org.libjpegturbo.turbojpeg.YUVImage,%20int)"><code>TJDecompressor.decompressToYUV(YUVImage, int)</code></a> instead.</i></div>
</TABLE> </td>
&nbsp; </tr>
<P> <tr class="rowColor">
<HR> <td class="colOne"><a href="org/libjpegturbo/turbojpeg/TJDecompressor.html#decompressToYUV(int)">org.libjpegturbo.turbojpeg.TJDecompressor.decompressToYUV(int)</a>
<div class="block"><i>Use <a href="org/libjpegturbo/turbojpeg/TJDecompressor.html#decompressToYUV(int,%20int,%20int,%20int)"><code>TJDecompressor.decompressToYUV(int, int, int, int)</code></a> instead.</i></div>
</td>
</tr>
<tr class="altColor">
<td class="colOne"><a href="org/libjpegturbo/turbojpeg/TJCompressor.html#encodeYUV(java.awt.image.BufferedImage,%20byte[],%20int)">org.libjpegturbo.turbojpeg.TJCompressor.encodeYUV(BufferedImage, byte[], int)</a>
<div class="block"><i>Use
<a href="org/libjpegturbo/turbojpeg/TJCompressor.html#setSourceImage(java.awt.image.BufferedImage,%20int,%20int,%20int,%20int)"><code>TJCompressor.setSourceImage(BufferedImage, int, int, int, int)</code></a> and
<a href="org/libjpegturbo/turbojpeg/TJCompressor.html#encodeYUV(byte[],%20int)"><code>TJCompressor.encodeYUV(byte[], int)</code></a> instead.</i></div>
</td>
</tr>
<tr class="rowColor">
<td class="colOne"><a href="org/libjpegturbo/turbojpeg/TJCompressor.html#encodeYUV(java.awt.image.BufferedImage,%20int)">org.libjpegturbo.turbojpeg.TJCompressor.encodeYUV(BufferedImage, int)</a>
<div class="block"><i>Use
<a href="org/libjpegturbo/turbojpeg/TJCompressor.html#setSourceImage(java.awt.image.BufferedImage,%20int,%20int,%20int,%20int)"><code>TJCompressor.setSourceImage(BufferedImage, int, int, int, int)</code></a> and
<a href="org/libjpegturbo/turbojpeg/TJCompressor.html#encodeYUV(int,%20int)"><code>TJCompressor.encodeYUV(int, int)</code></a> instead.</i></div>
</td>
</tr>
<tr class="altColor">
<td class="colOne"><a href="org/libjpegturbo/turbojpeg/TJCompressor.html#encodeYUV(byte[],%20int)">org.libjpegturbo.turbojpeg.TJCompressor.encodeYUV(byte[], int)</a>
<div class="block"><i>Use <a href="org/libjpegturbo/turbojpeg/TJCompressor.html#encodeYUV(org.libjpegturbo.turbojpeg.YUVImage,%20int)"><code>TJCompressor.encodeYUV(YUVImage, int)</code></a> instead.</i></div>
</td>
</tr>
<tr class="rowColor">
<td class="colOne"><a href="org/libjpegturbo/turbojpeg/TJCompressor.html#encodeYUV(int)">org.libjpegturbo.turbojpeg.TJCompressor.encodeYUV(int)</a>
<div class="block"><i>Use <a href="org/libjpegturbo/turbojpeg/TJCompressor.html#encodeYUV(int,%20int)"><code>TJCompressor.encodeYUV(int, int)</code></a> instead.</i></div>
</td>
</tr>
<tr class="altColor">
<td class="colOne"><a href="org/libjpegturbo/turbojpeg/TJDecompressor.html#setJPEGImage(byte[],%20int)">org.libjpegturbo.turbojpeg.TJDecompressor.setJPEGImage(byte[], int)</a>
<div class="block"><i>Use <a href="org/libjpegturbo/turbojpeg/TJDecompressor.html#setSourceImage(byte[],%20int)"><code>TJDecompressor.setSourceImage(byte[], int)</code></a> instead.</i></div>
</td>
</tr>
<tr class="rowColor">
<td class="colOne"><a href="org/libjpegturbo/turbojpeg/TJCompressor.html#setSourceImage(byte[],%20int,%20int,%20int,%20int)">org.libjpegturbo.turbojpeg.TJCompressor.setSourceImage(byte[], int, int, int, int)</a>
<div class="block"><i>Use
<a href="org/libjpegturbo/turbojpeg/TJCompressor.html#setSourceImage(byte[],%20int,%20int,%20int,%20int,%20int,%20int)"><code>TJCompressor.setSourceImage(byte[], int, int, int, int, int, int)</code></a> instead.</i></div>
</td>
</tr>
</tbody>
</table>
</li>
</ul>
<a name="constructor">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<table border="0" cellpadding="3" cellspacing="0" summary="Deprecated Constructors table, listing deprecated constructors, and an explanation">
<caption><span>Deprecated Constructors</span><span class="tabEnd">&nbsp;</span></caption>
<tr>
<th class="colOne" scope="col">Constructor and Description</th>
</tr>
<tbody>
<tr class="altColor">
<td class="colOne"><a href="org/libjpegturbo/turbojpeg/TJCompressor.html#TJCompressor(byte[],%20int,%20int,%20int,%20int)">org.libjpegturbo.turbojpeg.TJCompressor(byte[], int, int, int, int)</a>
<div class="block"><i>Use
<a href="org/libjpegturbo/turbojpeg/TJCompressor.html#TJCompressor(byte[],%20int,%20int,%20int,%20int,%20int,%20int)"><code>TJCompressor.TJCompressor(byte[], int, int, int, int, int, int)</code></a> instead.</i></div>
</td>
</tr>
</tbody>
</table>
</li>
</ul>
</div>
<!-- ======= START OF BOTTOM NAVBAR ====== --> <!-- ======= START OF BOTTOM NAVBAR ====== -->
<A NAME="navbar_bottom"><!-- --></A> <div class="bottomNav"><a name="navbar_bottom">
<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A> <!-- -->
<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY=""> </a><a href="#skip-navbar_bottom" title="Skip navigation links"></a><a name="navbar_bottom_firstrow">
<TR> <!-- -->
<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> </a>
<A NAME="navbar_bottom_firstrow"><!-- --></A> <ul class="navList" title="Navigation">
<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY=""> <li><a href="org/libjpegturbo/turbojpeg/package-summary.html">Package</a></li>
<TR ALIGN="center" VALIGN="top"> <li>Class</li>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="org/libjpegturbo/turbojpeg/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A>&nbsp;</TD> <li><a href="org/libjpegturbo/turbojpeg/package-tree.html">Tree</a></li>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Class</FONT>&nbsp;</TD> <li class="navBarCell1Rev">Deprecated</li>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="org/libjpegturbo/turbojpeg/package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A>&nbsp;</TD> <li><a href="index-all.html">Index</a></li>
<TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Deprecated</B></FONT>&nbsp;</TD> <li><a href="help-doc.html">Help</a></li>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A>&nbsp;</TD> </ul>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD> </div>
</TR> <div class="subNav">
</TABLE> <ul class="navList">
</TD> <li>Prev</li>
<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM> <li>Next</li>
</EM> </ul>
</TD> <ul class="navList">
</TR> <li><a href="index.html?deprecated-list.html" target="_top">Frames</a></li>
<li><a href="deprecated-list.html" target="_top">No Frames</a></li>
<TR> </ul>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2"> <ul class="navList" id="allclasses_navbar_bottom">
&nbsp;PREV&nbsp; <li><a href="allclasses-noframe.html">All Classes</a></li>
&nbsp;NEXT</FONT></TD> </ul>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2"> <div>
<A HREF="index.html?deprecated-list.html" target="_top"><B>FRAMES</B></A> &nbsp; <script type="text/javascript"><!--
&nbsp;<A HREF="deprecated-list.html" target="_top"><B>NO FRAMES</B></A> &nbsp; allClassesLink = document.getElementById("allclasses_navbar_bottom");
&nbsp;<SCRIPT type="text/javascript">
<!--
if(window==top) { if(window==top) {
document.writeln('<A HREF="allclasses-noframe.html"><B>All Classes</B></A>'); allClassesLink.style.display = "block";
}
else {
allClassesLink.style.display = "none";
} }
//--> //-->
</SCRIPT> </script>
<NOSCRIPT> </div>
<A HREF="allclasses-noframe.html"><B>All Classes</B></A> <a name="skip-navbar_bottom">
</NOSCRIPT> <!-- -->
</a></div>
</FONT></TD>
</TR>
</TABLE>
<A NAME="skip-navbar_bottom"></A>
<!-- ======== END OF BOTTOM NAVBAR ======= --> <!-- ======== END OF BOTTOM NAVBAR ======= -->
</body>
<HR> </html>
</BODY>
</HTML>

View File

@@ -1,207 +1,206 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!-- NewPage --> <!-- NewPage -->
<HTML> <html lang="en">
<HEAD> <head>
<TITLE> <title>API Help</title>
API Help <link rel="stylesheet" type="text/css" href="stylesheet.css" title="Style">
</TITLE> </head>
<body>
<script type="text/javascript"><!--
<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
<SCRIPT type="text/javascript">
function windowTitle()
{
if (location.href.indexOf('is-external=true') == -1) { if (location.href.indexOf('is-external=true') == -1) {
parent.document.title="API Help"; parent.document.title="API Help";
} }
} //-->
</SCRIPT> </script>
<NOSCRIPT> <noscript>
</NOSCRIPT> <div>JavaScript is disabled on your browser.</div>
</noscript>
</HEAD>
<BODY BGCOLOR="white" onload="windowTitle();">
<HR>
<!-- ========= START OF TOP NAVBAR ======= --> <!-- ========= START OF TOP NAVBAR ======= -->
<A NAME="navbar_top"><!-- --></A> <div class="topNav"><a name="navbar_top">
<A HREF="#skip-navbar_top" title="Skip navigation links"></A> <!-- -->
<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY=""> </a><a href="#skip-navbar_top" title="Skip navigation links"></a><a name="navbar_top_firstrow">
<TR> <!-- -->
<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> </a>
<A NAME="navbar_top_firstrow"><!-- --></A> <ul class="navList" title="Navigation">
<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY=""> <li><a href="org/libjpegturbo/turbojpeg/package-summary.html">Package</a></li>
<TR ALIGN="center" VALIGN="top"> <li>Class</li>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="org/libjpegturbo/turbojpeg/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A>&nbsp;</TD> <li><a href="org/libjpegturbo/turbojpeg/package-tree.html">Tree</a></li>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Class</FONT>&nbsp;</TD> <li><a href="deprecated-list.html">Deprecated</a></li>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="org/libjpegturbo/turbojpeg/package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A>&nbsp;</TD> <li><a href="index-all.html">Index</a></li>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD> <li class="navBarCell1Rev">Help</li>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A>&nbsp;</TD> </ul>
<TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Help</B></FONT>&nbsp;</TD> </div>
</TR> <div class="subNav">
</TABLE> <ul class="navList">
</TD> <li>Prev</li>
<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM> <li>Next</li>
</EM> </ul>
</TD> <ul class="navList">
</TR> <li><a href="index.html?help-doc.html" target="_top">Frames</a></li>
<li><a href="help-doc.html" target="_top">No Frames</a></li>
<TR> </ul>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2"> <ul class="navList" id="allclasses_navbar_top">
&nbsp;PREV&nbsp; <li><a href="allclasses-noframe.html">All Classes</a></li>
&nbsp;NEXT</FONT></TD> </ul>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2"> <div>
<A HREF="index.html?help-doc.html" target="_top"><B>FRAMES</B></A> &nbsp; <script type="text/javascript"><!--
&nbsp;<A HREF="help-doc.html" target="_top"><B>NO FRAMES</B></A> &nbsp; allClassesLink = document.getElementById("allclasses_navbar_top");
&nbsp;<SCRIPT type="text/javascript">
<!--
if(window==top) { if(window==top) {
document.writeln('<A HREF="allclasses-noframe.html"><B>All Classes</B></A>'); allClassesLink.style.display = "block";
}
else {
allClassesLink.style.display = "none";
} }
//--> //-->
</SCRIPT> </script>
<NOSCRIPT> </div>
<A HREF="allclasses-noframe.html"><B>All Classes</B></A> <a name="skip-navbar_top">
</NOSCRIPT> <!-- -->
</a></div>
</FONT></TD>
</TR>
</TABLE>
<A NAME="skip-navbar_top"></A>
<!-- ========= END OF TOP NAVBAR ========= --> <!-- ========= END OF TOP NAVBAR ========= -->
<div class="header">
<HR> <h1 class="title">How This API Document Is Organized</h1>
<CENTER> <div class="subTitle">This API (Application Programming Interface) document has pages corresponding to the items in the navigation bar, described as follows.</div>
<H1> </div>
How This API Document Is Organized</H1> <div class="contentContainer">
</CENTER> <ul class="blockList">
This API (Application Programming Interface) document has pages corresponding to the items in the navigation bar, described as follows.<H3> <li class="blockList">
Package</H3> <h2>Package</h2>
<BLOCKQUOTE> <p>Each package has a page that contains a list of its classes and interfaces, with a summary for each. This page can contain six categories:</p>
<ul>
<P> <li>Interfaces (italic)</li>
Each package has a page that contains a list of its classes and interfaces, with a summary for each. This page can contain four categories:<UL> <li>Classes</li>
<LI>Interfaces (italic)<LI>Classes<LI>Enums<LI>Exceptions<LI>Errors<LI>Annotation Types</UL> <li>Enums</li>
</BLOCKQUOTE> <li>Exceptions</li>
<H3> <li>Errors</li>
Class/Interface</H3> <li>Annotation Types</li>
<BLOCKQUOTE> </ul>
</li>
<P> <li class="blockList">
Each class, interface, nested class and nested interface has its own separate page. Each of these pages has three sections consisting of a class/interface description, summary tables, and detailed member descriptions:<UL> <h2>Class/Interface</h2>
<LI>Class inheritance diagram<LI>Direct Subclasses<LI>All Known Subinterfaces<LI>All Known Implementing Classes<LI>Class/interface declaration<LI>Class/interface description <p>Each class, interface, nested class and nested interface has its own separate page. Each of these pages has three sections consisting of a class/interface description, summary tables, and detailed member descriptions:</p>
<P> <ul>
<LI>Nested Class Summary<LI>Field Summary<LI>Constructor Summary<LI>Method Summary <li>Class inheritance diagram</li>
<P> <li>Direct Subclasses</li>
<LI>Field Detail<LI>Constructor Detail<LI>Method Detail</UL> <li>All Known Subinterfaces</li>
Each summary entry contains the first sentence from the detailed description for that item. The summary entries are alphabetical, while the detailed descriptions are in the order they appear in the source code. This preserves the logical groupings established by the programmer.</BLOCKQUOTE> <li>All Known Implementing Classes</li>
</BLOCKQUOTE> <li>Class/interface declaration</li>
<H3> <li>Class/interface description</li>
Annotation Type</H3> </ul>
<BLOCKQUOTE> <ul>
<li>Nested Class Summary</li>
<P> <li>Field Summary</li>
Each annotation type has its own separate page with the following sections:<UL> <li>Constructor Summary</li>
<LI>Annotation Type declaration<LI>Annotation Type description<LI>Required Element Summary<LI>Optional Element Summary<LI>Element Detail</UL> <li>Method Summary</li>
</BLOCKQUOTE> </ul>
</BLOCKQUOTE> <ul>
<H3> <li>Field Detail</li>
Enum</H3> <li>Constructor Detail</li>
<BLOCKQUOTE> <li>Method Detail</li>
</ul>
<P> <p>Each summary entry contains the first sentence from the detailed description for that item. The summary entries are alphabetical, while the detailed descriptions are in the order they appear in the source code. This preserves the logical groupings established by the programmer.</p>
Each enum has its own separate page with the following sections:<UL> </li>
<LI>Enum declaration<LI>Enum description<LI>Enum Constant Summary<LI>Enum Constant Detail</UL> <li class="blockList">
</BLOCKQUOTE> <h2>Annotation Type</h2>
<H3> <p>Each annotation type has its own separate page with the following sections:</p>
Tree (Class Hierarchy)</H3> <ul>
<BLOCKQUOTE> <li>Annotation Type declaration</li>
There is a <A HREF="overview-tree.html">Class Hierarchy</A> page for all packages, plus a hierarchy for each package. Each hierarchy page contains a list of classes and a list of interfaces. The classes are organized by inheritance structure starting with <code>java.lang.Object</code>. The interfaces do not inherit from <code>java.lang.Object</code>.<UL> <li>Annotation Type description</li>
<LI>When viewing the Overview page, clicking on "Tree" displays the hierarchy for all packages.<LI>When viewing a particular package, class or interface page, clicking "Tree" displays the hierarchy for only that package.</UL> <li>Required Element Summary</li>
</BLOCKQUOTE> <li>Optional Element Summary</li>
<H3> <li>Element Detail</li>
Deprecated API</H3> </ul>
<BLOCKQUOTE> </li>
The <A HREF="deprecated-list.html">Deprecated API</A> page lists all of the API that have been deprecated. A deprecated API is not recommended for use, generally due to improvements, and a replacement API is usually given. Deprecated APIs may be removed in future implementations.</BLOCKQUOTE> <li class="blockList">
<H3> <h2>Enum</h2>
Index</H3> <p>Each enum has its own separate page with the following sections:</p>
<BLOCKQUOTE> <ul>
The <A HREF="index-all.html">Index</A> contains an alphabetic list of all classes, interfaces, constructors, methods, and fields.</BLOCKQUOTE> <li>Enum declaration</li>
<H3> <li>Enum description</li>
Prev/Next</H3> <li>Enum Constant Summary</li>
These links take you to the next or previous class, interface, package, or related page.<H3> <li>Enum Constant Detail</li>
Frames/No Frames</H3> </ul>
These links show and hide the HTML frames. All pages are available with or without frames. </li>
<P> <li class="blockList">
<H3> <h2>Tree (Class Hierarchy)</h2>
Serialized Form</H3> <p>There is a <a href="overview-tree.html">Class Hierarchy</a> page for all packages, plus a hierarchy for each package. Each hierarchy page contains a list of classes and a list of interfaces. The classes are organized by inheritance structure starting with <code>java.lang.Object</code>. The interfaces do not inherit from <code>java.lang.Object</code>.</p>
Each serializable or externalizable class has a description of its serialization fields and methods. This information is of interest to re-implementors, not to developers using the API. While there is no link in the navigation bar, you can get to this information by going to any serialized class and clicking "Serialized Form" in the "See also" section of the class description. <ul>
<P> <li>When viewing the Overview page, clicking on "Tree" displays the hierarchy for all packages.</li>
<H3> <li>When viewing a particular package, class or interface page, clicking "Tree" displays the hierarchy for only that package.</li>
Constant Field Values</H3> </ul>
The <a href="constant-values.html">Constant Field Values</a> page lists the static final fields and their values. </li>
<P> <li class="blockList">
<FONT SIZE="-1"> <h2>Deprecated API</h2>
<EM> <p>The <a href="deprecated-list.html">Deprecated API</a> page lists all of the API that have been deprecated. A deprecated API is not recommended for use, generally due to improvements, and a replacement API is usually given. Deprecated APIs may be removed in future implementations.</p>
This help file applies to API documentation generated using the standard doclet.</EM> </li>
</FONT> <li class="blockList">
<BR> <h2>Index</h2>
<HR> <p>The <a href="index-all.html">Index</a> contains an alphabetic list of all classes, interfaces, constructors, methods, and fields.</p>
</li>
<li class="blockList">
<h2>Prev/Next</h2>
<p>These links take you to the next or previous class, interface, package, or related page.</p>
</li>
<li class="blockList">
<h2>Frames/No Frames</h2>
<p>These links show and hide the HTML frames. All pages are available with or without frames.</p>
</li>
<li class="blockList">
<h2>All Classes</h2>
<p>The <a href="allclasses-noframe.html">All Classes</a> link shows all classes and interfaces except non-static nested types.</p>
</li>
<li class="blockList">
<h2>Serialized Form</h2>
<p>Each serializable or externalizable class has a description of its serialization fields and methods. This information is of interest to re-implementors, not to developers using the API. While there is no link in the navigation bar, you can get to this information by going to any serialized class and clicking "Serialized Form" in the "See also" section of the class description.</p>
</li>
<li class="blockList">
<h2>Constant Field Values</h2>
<p>The <a href="constant-values.html">Constant Field Values</a> page lists the static final fields and their values.</p>
</li>
</ul>
<em>This help file applies to API documentation generated using the standard doclet.</em></div>
<!-- ======= START OF BOTTOM NAVBAR ====== --> <!-- ======= START OF BOTTOM NAVBAR ====== -->
<A NAME="navbar_bottom"><!-- --></A> <div class="bottomNav"><a name="navbar_bottom">
<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A> <!-- -->
<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY=""> </a><a href="#skip-navbar_bottom" title="Skip navigation links"></a><a name="navbar_bottom_firstrow">
<TR> <!-- -->
<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> </a>
<A NAME="navbar_bottom_firstrow"><!-- --></A> <ul class="navList" title="Navigation">
<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY=""> <li><a href="org/libjpegturbo/turbojpeg/package-summary.html">Package</a></li>
<TR ALIGN="center" VALIGN="top"> <li>Class</li>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="org/libjpegturbo/turbojpeg/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A>&nbsp;</TD> <li><a href="org/libjpegturbo/turbojpeg/package-tree.html">Tree</a></li>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Class</FONT>&nbsp;</TD> <li><a href="deprecated-list.html">Deprecated</a></li>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="org/libjpegturbo/turbojpeg/package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A>&nbsp;</TD> <li><a href="index-all.html">Index</a></li>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD> <li class="navBarCell1Rev">Help</li>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A>&nbsp;</TD> </ul>
<TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Help</B></FONT>&nbsp;</TD> </div>
</TR> <div class="subNav">
</TABLE> <ul class="navList">
</TD> <li>Prev</li>
<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM> <li>Next</li>
</EM> </ul>
</TD> <ul class="navList">
</TR> <li><a href="index.html?help-doc.html" target="_top">Frames</a></li>
<li><a href="help-doc.html" target="_top">No Frames</a></li>
<TR> </ul>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2"> <ul class="navList" id="allclasses_navbar_bottom">
&nbsp;PREV&nbsp; <li><a href="allclasses-noframe.html">All Classes</a></li>
&nbsp;NEXT</FONT></TD> </ul>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2"> <div>
<A HREF="index.html?help-doc.html" target="_top"><B>FRAMES</B></A> &nbsp; <script type="text/javascript"><!--
&nbsp;<A HREF="help-doc.html" target="_top"><B>NO FRAMES</B></A> &nbsp; allClassesLink = document.getElementById("allclasses_navbar_bottom");
&nbsp;<SCRIPT type="text/javascript">
<!--
if(window==top) { if(window==top) {
document.writeln('<A HREF="allclasses-noframe.html"><B>All Classes</B></A>'); allClassesLink.style.display = "block";
}
else {
allClassesLink.style.display = "none";
} }
//--> //-->
</SCRIPT> </script>
<NOSCRIPT> </div>
<A HREF="allclasses-noframe.html"><B>All Classes</B></A> <a name="skip-navbar_bottom">
</NOSCRIPT> <!-- -->
</a></div>
</FONT></TD>
</TR>
</TABLE>
<A NAME="skip-navbar_bottom"></A>
<!-- ======== END OF BOTTOM NAVBAR ======= --> <!-- ======== END OF BOTTOM NAVBAR ======= -->
</body>
<HR> </html>
</BODY>
</HTML>

File diff suppressed because it is too large Load Diff

View File

@@ -1,17 +1,21 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd"> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">
<!-- NewPage --> <!-- NewPage -->
<HTML> <html lang="en">
<HEAD> <head>
<TITLE> <title>Generated Documentation (Untitled)</title>
Generated Documentation (Untitled) <script type="text/javascript">
</TITLE>
<SCRIPT type="text/javascript">
targetPage = "" + window.location.search; targetPage = "" + window.location.search;
if (targetPage != "" && targetPage != "undefined") if (targetPage != "" && targetPage != "undefined")
targetPage = targetPage.substring(1); targetPage = targetPage.substring(1);
if (targetPage.indexOf(":") != -1 || (targetPage != "" && !validURL(targetPage))) if (targetPage.indexOf(":") != -1 || (targetPage != "" && !validURL(targetPage)))
targetPage = "undefined"; targetPage = "undefined";
function validURL(url) { function validURL(url) {
try {
url = decodeURIComponent(url);
}
catch (error) {
return false;
}
var pos = url.indexOf(".html"); var pos = url.indexOf(".html");
if (pos == -1 || pos != url.length - 5) if (pos == -1 || pos != url.length - 5)
return false; return false;
@@ -23,7 +27,8 @@ Generated Documentation (Untitled)
if ('a' <= ch && ch <= 'z' || if ('a' <= ch && ch <= 'z' ||
'A' <= ch && ch <= 'Z' || 'A' <= ch && ch <= 'Z' ||
ch == '$' || ch == '$' ||
ch == '_') { ch == '_' ||
ch.charCodeAt(0) > 127) {
allowNumber = true; allowNumber = true;
allowSep = true; allowSep = true;
} else if ('0' <= ch && ch <= '9' } else if ('0' <= ch && ch <= '9'
@@ -49,21 +54,17 @@ Generated Documentation (Untitled)
if (targetPage != "" && targetPage != "undefined") if (targetPage != "" && targetPage != "undefined")
top.classFrame.location = top.targetPage; top.classFrame.location = top.targetPage;
} }
</SCRIPT> </script>
<NOSCRIPT> </head>
</NOSCRIPT> <frameset cols="20%,80%" title="Documentation frame" onload="top.loadFrames()">
</HEAD> <frame src="allclasses-frame.html" name="packageFrame" title="All classes and interfaces (except non-static nested types)">
<FRAMESET cols="20%,80%" title="" onLoad="top.loadFrames()"> <frame src="org/libjpegturbo/turbojpeg/package-summary.html" name="classFrame" title="Package, class and interface descriptions" scrolling="yes">
<FRAME src="allclasses-frame.html" name="packageFrame" title="All classes and interfaces (except non-static nested types)"> <noframes>
<FRAME src="org/libjpegturbo/turbojpeg/package-summary.html" name="classFrame" title="Package, class and interface descriptions" scrolling="yes"> <noscript>
<NOFRAMES> <div>JavaScript is disabled on your browser.</div>
<H2> </noscript>
Frame Alert</H2> <h2>Frame Alert</h2>
<p>This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client. Link to <a href="org/libjpegturbo/turbojpeg/package-summary.html">Non-frame version</a>.</p>
<P> </noframes>
This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client. </frameset>
<BR> </html>
Link to<A HREF="org/libjpegturbo/turbojpeg/package-summary.html">Non-frame version.</A>
</NOFRAMES>
</FRAMESET>
</HTML>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,238 +1,237 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!-- NewPage --> <!-- NewPage -->
<HTML> <html lang="en">
<HEAD> <head>
<TITLE> <title>TJCustomFilter</title>
TJCustomFilter <link rel="stylesheet" type="text/css" href="../../../stylesheet.css" title="Style">
</TITLE> </head>
<body>
<script type="text/javascript"><!--
<LINK REL ="stylesheet" TYPE="text/css" HREF="../../../stylesheet.css" TITLE="Style">
<SCRIPT type="text/javascript">
function windowTitle()
{
if (location.href.indexOf('is-external=true') == -1) { if (location.href.indexOf('is-external=true') == -1) {
parent.document.title="TJCustomFilter"; parent.document.title="TJCustomFilter";
} }
} //-->
</SCRIPT> </script>
<NOSCRIPT> <noscript>
</NOSCRIPT> <div>JavaScript is disabled on your browser.</div>
</noscript>
</HEAD>
<BODY BGCOLOR="white" onload="windowTitle();">
<HR>
<!-- ========= START OF TOP NAVBAR ======= --> <!-- ========= START OF TOP NAVBAR ======= -->
<A NAME="navbar_top"><!-- --></A> <div class="topNav"><a name="navbar_top">
<A HREF="#skip-navbar_top" title="Skip navigation links"></A> <!-- -->
<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY=""> </a><a href="#skip-navbar_top" title="Skip navigation links"></a><a name="navbar_top_firstrow">
<TR> <!-- -->
<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> </a>
<A NAME="navbar_top_firstrow"><!-- --></A> <ul class="navList" title="Navigation">
<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY=""> <li><a href="../../../org/libjpegturbo/turbojpeg/package-summary.html">Package</a></li>
<TR ALIGN="center" VALIGN="top"> <li class="navBarCell1Rev">Class</li>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../org/libjpegturbo/turbojpeg/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A>&nbsp;</TD> <li><a href="package-tree.html">Tree</a></li>
<TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT>&nbsp;</TD> <li><a href="../../../deprecated-list.html">Deprecated</a></li>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A>&nbsp;</TD> <li><a href="../../../index-all.html">Index</a></li>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD> <li><a href="../../../help-doc.html">Help</a></li>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A>&nbsp;</TD> </ul>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD> </div>
</TR> <div class="subNav">
</TABLE> <ul class="navList">
</TD> <li><a href="../../../org/libjpegturbo/turbojpeg/TJCompressor.html" title="class in org.libjpegturbo.turbojpeg"><span class="strong">Prev Class</span></a></li>
<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM> <li><a href="../../../org/libjpegturbo/turbojpeg/TJDecompressor.html" title="class in org.libjpegturbo.turbojpeg"><span class="strong">Next Class</span></a></li>
</EM> </ul>
</TD> <ul class="navList">
</TR> <li><a href="../../../index.html?org/libjpegturbo/turbojpeg/TJCustomFilter.html" target="_top">Frames</a></li>
<li><a href="TJCustomFilter.html" target="_top">No Frames</a></li>
<TR> </ul>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2"> <ul class="navList" id="allclasses_navbar_top">
&nbsp;<A HREF="../../../org/libjpegturbo/turbojpeg/TJCompressor.html" title="class in org.libjpegturbo.turbojpeg"><B>PREV CLASS</B></A>&nbsp; <li><a href="../../../allclasses-noframe.html">All Classes</a></li>
&nbsp;<A HREF="../../../org/libjpegturbo/turbojpeg/TJDecompressor.html" title="class in org.libjpegturbo.turbojpeg"><B>NEXT CLASS</B></A></FONT></TD> </ul>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2"> <div>
<A HREF="../../../index.html?org/libjpegturbo/turbojpeg/TJCustomFilter.html" target="_top"><B>FRAMES</B></A> &nbsp; <script type="text/javascript"><!--
&nbsp;<A HREF="TJCustomFilter.html" target="_top"><B>NO FRAMES</B></A> &nbsp; allClassesLink = document.getElementById("allclasses_navbar_top");
&nbsp;<SCRIPT type="text/javascript">
<!--
if(window==top) { if(window==top) {
document.writeln('<A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A>'); allClassesLink.style.display = "block";
}
else {
allClassesLink.style.display = "none";
} }
//--> //-->
</SCRIPT> </script>
<NOSCRIPT> </div>
<A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A> <div>
</NOSCRIPT> <ul class="subNavList">
<li>Summary:&nbsp;</li>
<li>Nested&nbsp;|&nbsp;</li>
</FONT></TD> <li>Field&nbsp;|&nbsp;</li>
</TR> <li>Constr&nbsp;|&nbsp;</li>
<TR> <li><a href="#method_summary">Method</a></li>
<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2"> </ul>
SUMMARY:&nbsp;NESTED&nbsp;|&nbsp;FIELD&nbsp;|&nbsp;CONSTR&nbsp;|&nbsp;<A HREF="#method_summary">METHOD</A></FONT></TD> <ul class="subNavList">
<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2"> <li>Detail:&nbsp;</li>
DETAIL:&nbsp;FIELD&nbsp;|&nbsp;CONSTR&nbsp;|&nbsp;<A HREF="#method_detail">METHOD</A></FONT></TD> <li>Field&nbsp;|&nbsp;</li>
</TR> <li>Constr&nbsp;|&nbsp;</li>
</TABLE> <li><a href="#method_detail">Method</a></li>
<A NAME="skip-navbar_top"></A> </ul>
</div>
<a name="skip-navbar_top">
<!-- -->
</a></div>
<!-- ========= END OF TOP NAVBAR ========= --> <!-- ========= END OF TOP NAVBAR ========= -->
<HR>
<!-- ======== START OF CLASS DATA ======== --> <!-- ======== START OF CLASS DATA ======== -->
<H2> <div class="header">
<FONT SIZE="-1"> <div class="subTitle">org.libjpegturbo.turbojpeg</div>
org.libjpegturbo.turbojpeg</FONT> <h2 title="Interface TJCustomFilter" class="title">Interface TJCustomFilter</h2>
<BR> </div>
Interface TJCustomFilter</H2> <div class="contentContainer">
<HR> <div class="description">
<DL> <ul class="blockList">
<DT><PRE>public interface <B>TJCustomFilter</B></DL> <li class="blockList">
</PRE> <hr>
<br>
<P> <pre>public interface <span class="strong">TJCustomFilter</span></pre>
Custom filter callback interface <div class="block">Custom filter callback interface</div>
<P> </li>
</ul>
<P> </div>
<HR> <div class="summary">
<ul class="blockList">
<P> <li class="blockList">
<!-- ========== METHOD SUMMARY =========== --> <!-- ========== METHOD SUMMARY =========== -->
<ul class="blockList">
<A NAME="method_summary"><!-- --></A> <li class="blockList"><a name="method_summary">
<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY=""> <!-- -->
<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor"> </a>
<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2"> <h3>Method Summary</h3>
<B>Method Summary</B></FONT></TH> <table class="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="Method Summary table, listing methods, and an explanation">
</TR> <caption><span>Methods</span><span class="tabEnd">&nbsp;</span></caption>
<TR BGCOLOR="white" CLASS="TableRowColor"> <tr>
<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1"> <th class="colFirst" scope="col">Modifier and Type</th>
<CODE>&nbsp;void</CODE></FONT></TD> <th class="colLast" scope="col">Method and Description</th>
<TD><CODE><B><A HREF="../../../org/libjpegturbo/turbojpeg/TJCustomFilter.html#customFilter(java.nio.ShortBuffer, java.awt.Rectangle, java.awt.Rectangle, int, int, org.libjpegturbo.turbojpeg.TJTransform)">customFilter</A></B>(java.nio.ShortBuffer&nbsp;coeffBuffer, </tr>
<tr class="altColor">
<td class="colFirst"><code>void</code></td>
<td class="colLast"><code><strong><a href="../../../org/libjpegturbo/turbojpeg/TJCustomFilter.html#customFilter(java.nio.ShortBuffer,%20java.awt.Rectangle,%20java.awt.Rectangle,%20int,%20int,%20org.libjpegturbo.turbojpeg.TJTransform)">customFilter</a></strong>(java.nio.ShortBuffer&nbsp;coeffBuffer,
java.awt.Rectangle&nbsp;bufferRegion, java.awt.Rectangle&nbsp;bufferRegion,
java.awt.Rectangle&nbsp;planeRegion, java.awt.Rectangle&nbsp;planeRegion,
int&nbsp;componentID, int&nbsp;componentID,
int&nbsp;transformID, int&nbsp;transformID,
<A HREF="../../../org/libjpegturbo/turbojpeg/TJTransform.html" title="class in org.libjpegturbo.turbojpeg">TJTransform</A>&nbsp;transform)</CODE> <a href="../../../org/libjpegturbo/turbojpeg/TJTransform.html" title="class in org.libjpegturbo.turbojpeg">TJTransform</a>&nbsp;transform)</code>
<div class="block">A callback function that can be used to modify the DCT coefficients after
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A callback function that can be used to modify the DCT coefficients after
they are losslessly transformed but before they are transcoded to a new they are losslessly transformed but before they are transcoded to a new
JPEG image.</TD> JPEG image.</div>
</TR> </td>
</TABLE> </tr>
&nbsp; </table>
<P> </li>
</ul>
</li>
</ul>
</div>
<div class="details">
<ul class="blockList">
<li class="blockList">
<!-- ============ METHOD DETAIL ========== --> <!-- ============ METHOD DETAIL ========== -->
<ul class="blockList">
<A NAME="method_detail"><!-- --></A> <li class="blockList"><a name="method_detail">
<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY=""> <!-- -->
<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor"> </a>
<TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2"> <h3>Method Detail</h3>
<B>Method Detail</B></FONT></TH> <a name="customFilter(java.nio.ShortBuffer, java.awt.Rectangle, java.awt.Rectangle, int, int, org.libjpegturbo.turbojpeg.TJTransform)">
</TR> <!-- -->
</TABLE> </a>
<ul class="blockListLast">
<A NAME="customFilter(java.nio.ShortBuffer, java.awt.Rectangle, java.awt.Rectangle, int, int, org.libjpegturbo.turbojpeg.TJTransform)"><!-- --></A><H3> <li class="blockList">
customFilter</H3> <h4>customFilter</h4>
<PRE> <pre>void&nbsp;customFilter(java.nio.ShortBuffer&nbsp;coeffBuffer,
void <B>customFilter</B>(java.nio.ShortBuffer&nbsp;coeffBuffer,
java.awt.Rectangle&nbsp;bufferRegion, java.awt.Rectangle&nbsp;bufferRegion,
java.awt.Rectangle&nbsp;planeRegion, java.awt.Rectangle&nbsp;planeRegion,
int&nbsp;componentID, int&nbsp;componentID,
int&nbsp;transformID, int&nbsp;transformID,
<A HREF="../../../org/libjpegturbo/turbojpeg/TJTransform.html" title="class in org.libjpegturbo.turbojpeg">TJTransform</A>&nbsp;transform) <a href="../../../org/libjpegturbo/turbojpeg/TJTransform.html" title="class in org.libjpegturbo.turbojpeg">TJTransform</a>&nbsp;transform)
throws java.lang.Exception</PRE> throws java.lang.Exception</pre>
<DL> <div class="block">A callback function that can be used to modify the DCT coefficients after
<DD>A callback function that can be used to modify the DCT coefficients after
they are losslessly transformed but before they are transcoded to a new they are losslessly transformed but before they are transcoded to a new
JPEG image. This allows for custom filters or other transformations to be JPEG image. This allows for custom filters or other transformations to be
applied in the frequency domain. applied in the frequency domain.</div>
<P> <dl><dt><span class="strong">Parameters:</span></dt><dd><code>coeffBuffer</code> - a buffer containing transformed DCT coefficients.
<DD><DL>
<DT><B>Parameters:</B><DD><CODE>coeffBuffer</CODE> - a buffer containing transformed DCT coefficients.
(NOTE: this buffer is not guaranteed to be valid once the callback (NOTE: this buffer is not guaranteed to be valid once the callback
returns, so applications wishing to hand off the DCT coefficients to returns, so applications wishing to hand off the DCT coefficients to
another function or library should make a copy of them within the body of another function or library should make a copy of them within the body of
the callback.)<DD><CODE>bufferRegion</CODE> - rectangle containing the width and height of the callback.)</dd><dd><code>bufferRegion</code> - rectangle containing the width and height of
<code>coeffBuffer</code> as well as its offset relative to the component <code>coeffBuffer</code> as well as its offset relative to the component
plane. TurboJPEG implementations may choose to split each component plane plane. TurboJPEG implementations may choose to split each component plane
into multiple DCT coefficient buffers and call the callback function once into multiple DCT coefficient buffers and call the callback function once
for each buffer.<DD><CODE>planeRegion</CODE> - rectangle containing the width and height of the for each buffer.</dd><dd><code>planeRegion</code> - rectangle containing the width and height of the
component plane to which <code>coeffBuffer</code> belongs<DD><CODE>componentID</CODE> - ID number of the component plane to which component plane to which <code>coeffBuffer</code> belongs</dd><dd><code>componentID</code> - ID number of the component plane to which
<code>coeffBuffer</code> belongs (Y, Cb, and Cr have, respectively, ID's <code>coeffBuffer</code> belongs (Y, Cb, and Cr have, respectively, ID's
of 0, 1, and 2 in typical JPEG images.)<DD><CODE>transformID</CODE> - ID number of the transformed image to which of 0, 1, and 2 in typical JPEG images.)</dd><dd><code>transformID</code> - ID number of the transformed image to which
<code>coeffBuffer</code> belongs. This is the same as the index of the <code>coeffBuffer</code> belongs. This is the same as the index of the
transform in the <code>transforms</code> array that was passed to <A HREF="../../../org/libjpegturbo/turbojpeg/TJTransformer.html#transform(byte[][], org.libjpegturbo.turbojpeg.TJTransform[], int)"><CODE>TJTransformer.transform()</CODE></A>.<DD><CODE>transform</CODE> - a <A HREF="../../../org/libjpegturbo/turbojpeg/TJTransform.html" title="class in org.libjpegturbo.turbojpeg"><CODE>TJTransform</CODE></A> instance that specifies the transform in the <code>transforms</code> array that was passed to <a href="../../../org/libjpegturbo/turbojpeg/TJTransformer.html#transform(byte[][],%20org.libjpegturbo.turbojpeg.TJTransform[],%20int)"><code>TJTransformer.transform()</code></a>.</dd><dd><code>transform</code> - a <a href="../../../org/libjpegturbo/turbojpeg/TJTransform.html" title="class in org.libjpegturbo.turbojpeg"><code>TJTransform</code></a> instance that specifies the
parameters and/or cropping region for this transform parameters and/or cropping region for this transform</dd>
<DT><B>Throws:</B> <dt><span class="strong">Throws:</span></dt>
<DD><CODE>java.lang.Exception</CODE></DL> <dd><code>java.lang.Exception</code></dd></dl>
</DD> </li>
</DL> </ul>
</li>
</ul>
</li>
</ul>
</div>
</div>
<!-- ========= END OF CLASS DATA ========= --> <!-- ========= END OF CLASS DATA ========= -->
<HR>
<!-- ======= START OF BOTTOM NAVBAR ====== --> <!-- ======= START OF BOTTOM NAVBAR ====== -->
<A NAME="navbar_bottom"><!-- --></A> <div class="bottomNav"><a name="navbar_bottom">
<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A> <!-- -->
<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY=""> </a><a href="#skip-navbar_bottom" title="Skip navigation links"></a><a name="navbar_bottom_firstrow">
<TR> <!-- -->
<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> </a>
<A NAME="navbar_bottom_firstrow"><!-- --></A> <ul class="navList" title="Navigation">
<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY=""> <li><a href="../../../org/libjpegturbo/turbojpeg/package-summary.html">Package</a></li>
<TR ALIGN="center" VALIGN="top"> <li class="navBarCell1Rev">Class</li>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../org/libjpegturbo/turbojpeg/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A>&nbsp;</TD> <li><a href="package-tree.html">Tree</a></li>
<TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT>&nbsp;</TD> <li><a href="../../../deprecated-list.html">Deprecated</a></li>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A>&nbsp;</TD> <li><a href="../../../index-all.html">Index</a></li>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD> <li><a href="../../../help-doc.html">Help</a></li>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A>&nbsp;</TD> </ul>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD> </div>
</TR> <div class="subNav">
</TABLE> <ul class="navList">
</TD> <li><a href="../../../org/libjpegturbo/turbojpeg/TJCompressor.html" title="class in org.libjpegturbo.turbojpeg"><span class="strong">Prev Class</span></a></li>
<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM> <li><a href="../../../org/libjpegturbo/turbojpeg/TJDecompressor.html" title="class in org.libjpegturbo.turbojpeg"><span class="strong">Next Class</span></a></li>
</EM> </ul>
</TD> <ul class="navList">
</TR> <li><a href="../../../index.html?org/libjpegturbo/turbojpeg/TJCustomFilter.html" target="_top">Frames</a></li>
<li><a href="TJCustomFilter.html" target="_top">No Frames</a></li>
<TR> </ul>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2"> <ul class="navList" id="allclasses_navbar_bottom">
&nbsp;<A HREF="../../../org/libjpegturbo/turbojpeg/TJCompressor.html" title="class in org.libjpegturbo.turbojpeg"><B>PREV CLASS</B></A>&nbsp; <li><a href="../../../allclasses-noframe.html">All Classes</a></li>
&nbsp;<A HREF="../../../org/libjpegturbo/turbojpeg/TJDecompressor.html" title="class in org.libjpegturbo.turbojpeg"><B>NEXT CLASS</B></A></FONT></TD> </ul>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2"> <div>
<A HREF="../../../index.html?org/libjpegturbo/turbojpeg/TJCustomFilter.html" target="_top"><B>FRAMES</B></A> &nbsp; <script type="text/javascript"><!--
&nbsp;<A HREF="TJCustomFilter.html" target="_top"><B>NO FRAMES</B></A> &nbsp; allClassesLink = document.getElementById("allclasses_navbar_bottom");
&nbsp;<SCRIPT type="text/javascript">
<!--
if(window==top) { if(window==top) {
document.writeln('<A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A>'); allClassesLink.style.display = "block";
}
else {
allClassesLink.style.display = "none";
} }
//--> //-->
</SCRIPT> </script>
<NOSCRIPT> </div>
<A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A> <div>
</NOSCRIPT> <ul class="subNavList">
<li>Summary:&nbsp;</li>
<li>Nested&nbsp;|&nbsp;</li>
</FONT></TD> <li>Field&nbsp;|&nbsp;</li>
</TR> <li>Constr&nbsp;|&nbsp;</li>
<TR> <li><a href="#method_summary">Method</a></li>
<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2"> </ul>
SUMMARY:&nbsp;NESTED&nbsp;|&nbsp;FIELD&nbsp;|&nbsp;CONSTR&nbsp;|&nbsp;<A HREF="#method_summary">METHOD</A></FONT></TD> <ul class="subNavList">
<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2"> <li>Detail:&nbsp;</li>
DETAIL:&nbsp;FIELD&nbsp;|&nbsp;CONSTR&nbsp;|&nbsp;<A HREF="#method_detail">METHOD</A></FONT></TD> <li>Field&nbsp;|&nbsp;</li>
</TR> <li>Constr&nbsp;|&nbsp;</li>
</TABLE> <li><a href="#method_detail">Method</a></li>
<A NAME="skip-navbar_bottom"></A> </ul>
</div>
<a name="skip-navbar_bottom">
<!-- -->
</a></div>
<!-- ======== END OF BOTTOM NAVBAR ======= --> <!-- ======== END OF BOTTOM NAVBAR ======= -->
</body>
<HR> </html>
</BODY>
</HTML>

File diff suppressed because it is too large Load Diff

View File

@@ -1,356 +1,336 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!-- NewPage --> <!-- NewPage -->
<HTML> <html lang="en">
<HEAD> <head>
<TITLE> <title>TJScalingFactor</title>
TJScalingFactor <link rel="stylesheet" type="text/css" href="../../../stylesheet.css" title="Style">
</TITLE> </head>
<body>
<script type="text/javascript"><!--
<LINK REL ="stylesheet" TYPE="text/css" HREF="../../../stylesheet.css" TITLE="Style">
<SCRIPT type="text/javascript">
function windowTitle()
{
if (location.href.indexOf('is-external=true') == -1) { if (location.href.indexOf('is-external=true') == -1) {
parent.document.title="TJScalingFactor"; parent.document.title="TJScalingFactor";
} }
} //-->
</SCRIPT> </script>
<NOSCRIPT> <noscript>
</NOSCRIPT> <div>JavaScript is disabled on your browser.</div>
</noscript>
</HEAD>
<BODY BGCOLOR="white" onload="windowTitle();">
<HR>
<!-- ========= START OF TOP NAVBAR ======= --> <!-- ========= START OF TOP NAVBAR ======= -->
<A NAME="navbar_top"><!-- --></A> <div class="topNav"><a name="navbar_top">
<A HREF="#skip-navbar_top" title="Skip navigation links"></A> <!-- -->
<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY=""> </a><a href="#skip-navbar_top" title="Skip navigation links"></a><a name="navbar_top_firstrow">
<TR> <!-- -->
<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> </a>
<A NAME="navbar_top_firstrow"><!-- --></A> <ul class="navList" title="Navigation">
<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY=""> <li><a href="../../../org/libjpegturbo/turbojpeg/package-summary.html">Package</a></li>
<TR ALIGN="center" VALIGN="top"> <li class="navBarCell1Rev">Class</li>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../org/libjpegturbo/turbojpeg/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A>&nbsp;</TD> <li><a href="package-tree.html">Tree</a></li>
<TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT>&nbsp;</TD> <li><a href="../../../deprecated-list.html">Deprecated</a></li>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A>&nbsp;</TD> <li><a href="../../../index-all.html">Index</a></li>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD> <li><a href="../../../help-doc.html">Help</a></li>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A>&nbsp;</TD> </ul>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD> </div>
</TR> <div class="subNav">
</TABLE> <ul class="navList">
</TD> <li><a href="../../../org/libjpegturbo/turbojpeg/TJDecompressor.html" title="class in org.libjpegturbo.turbojpeg"><span class="strong">Prev Class</span></a></li>
<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM> <li><a href="../../../org/libjpegturbo/turbojpeg/TJTransform.html" title="class in org.libjpegturbo.turbojpeg"><span class="strong">Next Class</span></a></li>
</EM> </ul>
</TD> <ul class="navList">
</TR> <li><a href="../../../index.html?org/libjpegturbo/turbojpeg/TJScalingFactor.html" target="_top">Frames</a></li>
<li><a href="TJScalingFactor.html" target="_top">No Frames</a></li>
<TR> </ul>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2"> <ul class="navList" id="allclasses_navbar_top">
&nbsp;<A HREF="../../../org/libjpegturbo/turbojpeg/TJDecompressor.html" title="class in org.libjpegturbo.turbojpeg"><B>PREV CLASS</B></A>&nbsp; <li><a href="../../../allclasses-noframe.html">All Classes</a></li>
&nbsp;<A HREF="../../../org/libjpegturbo/turbojpeg/TJTransform.html" title="class in org.libjpegturbo.turbojpeg"><B>NEXT CLASS</B></A></FONT></TD> </ul>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2"> <div>
<A HREF="../../../index.html?org/libjpegturbo/turbojpeg/TJScalingFactor.html" target="_top"><B>FRAMES</B></A> &nbsp; <script type="text/javascript"><!--
&nbsp;<A HREF="TJScalingFactor.html" target="_top"><B>NO FRAMES</B></A> &nbsp; allClassesLink = document.getElementById("allclasses_navbar_top");
&nbsp;<SCRIPT type="text/javascript">
<!--
if(window==top) { if(window==top) {
document.writeln('<A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A>'); allClassesLink.style.display = "block";
}
else {
allClassesLink.style.display = "none";
} }
//--> //-->
</SCRIPT> </script>
<NOSCRIPT> </div>
<A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A> <div>
</NOSCRIPT> <ul class="subNavList">
<li>Summary:&nbsp;</li>
<li>Nested&nbsp;|&nbsp;</li>
</FONT></TD> <li>Field&nbsp;|&nbsp;</li>
</TR> <li><a href="#constructor_summary">Constr</a>&nbsp;|&nbsp;</li>
<TR> <li><a href="#method_summary">Method</a></li>
<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2"> </ul>
SUMMARY:&nbsp;NESTED&nbsp;|&nbsp;FIELD&nbsp;|&nbsp;<A HREF="#constructor_summary">CONSTR</A>&nbsp;|&nbsp;<A HREF="#method_summary">METHOD</A></FONT></TD> <ul class="subNavList">
<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2"> <li>Detail:&nbsp;</li>
DETAIL:&nbsp;FIELD&nbsp;|&nbsp;<A HREF="#constructor_detail">CONSTR</A>&nbsp;|&nbsp;<A HREF="#method_detail">METHOD</A></FONT></TD> <li>Field&nbsp;|&nbsp;</li>
</TR> <li><a href="#constructor_detail">Constr</a>&nbsp;|&nbsp;</li>
</TABLE> <li><a href="#method_detail">Method</a></li>
<A NAME="skip-navbar_top"></A> </ul>
</div>
<a name="skip-navbar_top">
<!-- -->
</a></div>
<!-- ========= END OF TOP NAVBAR ========= --> <!-- ========= END OF TOP NAVBAR ========= -->
<HR>
<!-- ======== START OF CLASS DATA ======== --> <!-- ======== START OF CLASS DATA ======== -->
<H2> <div class="header">
<FONT SIZE="-1"> <div class="subTitle">org.libjpegturbo.turbojpeg</div>
org.libjpegturbo.turbojpeg</FONT> <h2 title="Class TJScalingFactor" class="title">Class TJScalingFactor</h2>
<BR> </div>
Class TJScalingFactor</H2> <div class="contentContainer">
<PRE> <ul class="inheritance">
java.lang.Object <li>java.lang.Object</li>
<IMG SRC="../../../resources/inherit.gif" ALT="extended by "><B>org.libjpegturbo.turbojpeg.TJScalingFactor</B> <li>
</PRE> <ul class="inheritance">
<HR> <li>org.libjpegturbo.turbojpeg.TJScalingFactor</li>
<DL> </ul>
<DT><PRE>public class <B>TJScalingFactor</B><DT>extends java.lang.Object</DL> </li>
</PRE> </ul>
<div class="description">
<P> <ul class="blockList">
Fractional scaling factor <li class="blockList">
<P> <hr>
<br>
<P> <pre>public class <span class="strong">TJScalingFactor</span>
<HR> extends java.lang.Object</pre>
<div class="block">Fractional scaling factor</div>
<P> </li>
</ul>
</div>
<div class="summary">
<ul class="blockList">
<li class="blockList">
<!-- ======== CONSTRUCTOR SUMMARY ======== --> <!-- ======== CONSTRUCTOR SUMMARY ======== -->
<ul class="blockList">
<A NAME="constructor_summary"><!-- --></A> <li class="blockList"><a name="constructor_summary">
<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY=""> <!-- -->
<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor"> </a>
<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2"> <h3>Constructor Summary</h3>
<B>Constructor Summary</B></FONT></TH> <table class="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="Constructor Summary table, listing constructors, and an explanation">
</TR> <caption><span>Constructors</span><span class="tabEnd">&nbsp;</span></caption>
<TR BGCOLOR="white" CLASS="TableRowColor"> <tr>
<TD><CODE><B><A HREF="../../../org/libjpegturbo/turbojpeg/TJScalingFactor.html#TJScalingFactor(int, int)">TJScalingFactor</A></B>(int&nbsp;num, <th class="colOne" scope="col">Constructor and Description</th>
int&nbsp;denom)</CODE> </tr>
<tr class="altColor">
<BR> <td class="colOne"><code><strong><a href="../../../org/libjpegturbo/turbojpeg/TJScalingFactor.html#TJScalingFactor(int,%20int)">TJScalingFactor</a></strong>(int&nbsp;num,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD> int&nbsp;denom)</code>&nbsp;</td>
</TR> </tr>
</TABLE> </table>
&nbsp; </li>
</ul>
<!-- ========== METHOD SUMMARY =========== --> <!-- ========== METHOD SUMMARY =========== -->
<ul class="blockList">
<A NAME="method_summary"><!-- --></A> <li class="blockList"><a name="method_summary">
<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY=""> <!-- -->
<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor"> </a>
<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2"> <h3>Method Summary</h3>
<B>Method Summary</B></FONT></TH> <table class="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="Method Summary table, listing methods, and an explanation">
</TR> <caption><span>Methods</span><span class="tabEnd">&nbsp;</span></caption>
<TR BGCOLOR="white" CLASS="TableRowColor"> <tr>
<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1"> <th class="colFirst" scope="col">Modifier and Type</th>
<CODE>&nbsp;boolean</CODE></FONT></TD> <th class="colLast" scope="col">Method and Description</th>
<TD><CODE><B><A HREF="../../../org/libjpegturbo/turbojpeg/TJScalingFactor.html#equals(org.libjpegturbo.turbojpeg.TJScalingFactor)">equals</A></B>(<A HREF="../../../org/libjpegturbo/turbojpeg/TJScalingFactor.html" title="class in org.libjpegturbo.turbojpeg">TJScalingFactor</A>&nbsp;other)</CODE> </tr>
<tr class="altColor">
<BR> <td class="colFirst"><code>boolean</code></td>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Returns true or false, depending on whether this instance and <td class="colLast"><code><strong><a href="../../../org/libjpegturbo/turbojpeg/TJScalingFactor.html#equals(org.libjpegturbo.turbojpeg.TJScalingFactor)">equals</a></strong>(<a href="../../../org/libjpegturbo/turbojpeg/TJScalingFactor.html" title="class in org.libjpegturbo.turbojpeg">TJScalingFactor</a>&nbsp;other)</code>
<code>other</code> have the same numerator and denominator.</TD> <div class="block">Returns true or false, depending on whether this instance and
</TR> <code>other</code> have the same numerator and denominator.</div>
<TR BGCOLOR="white" CLASS="TableRowColor"> </td>
<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1"> </tr>
<CODE>&nbsp;int</CODE></FONT></TD> <tr class="rowColor">
<TD><CODE><B><A HREF="../../../org/libjpegturbo/turbojpeg/TJScalingFactor.html#getDenom()">getDenom</A></B>()</CODE> <td class="colFirst"><code>int</code></td>
<td class="colLast"><code><strong><a href="../../../org/libjpegturbo/turbojpeg/TJScalingFactor.html#getDenom()">getDenom</a></strong>()</code>
<BR> <div class="block">Returns denominator</div>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Returns denominator</TD> </td>
</TR> </tr>
<TR BGCOLOR="white" CLASS="TableRowColor"> <tr class="altColor">
<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1"> <td class="colFirst"><code>int</code></td>
<CODE>&nbsp;int</CODE></FONT></TD> <td class="colLast"><code><strong><a href="../../../org/libjpegturbo/turbojpeg/TJScalingFactor.html#getNum()">getNum</a></strong>()</code>
<TD><CODE><B><A HREF="../../../org/libjpegturbo/turbojpeg/TJScalingFactor.html#getNum()">getNum</A></B>()</CODE> <div class="block">Returns numerator</div>
</td>
<BR> </tr>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Returns numerator</TD> <tr class="rowColor">
</TR> <td class="colFirst"><code>int</code></td>
<TR BGCOLOR="white" CLASS="TableRowColor"> <td class="colLast"><code><strong><a href="../../../org/libjpegturbo/turbojpeg/TJScalingFactor.html#getScaled(int)">getScaled</a></strong>(int&nbsp;dimension)</code>
<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1"> <div class="block">Returns the scaled value of <code>dimension</code>.</div>
<CODE>&nbsp;int</CODE></FONT></TD> </td>
<TD><CODE><B><A HREF="../../../org/libjpegturbo/turbojpeg/TJScalingFactor.html#getScaled(int)">getScaled</A></B>(int&nbsp;dimension)</CODE> </tr>
<tr class="altColor">
<BR> <td class="colFirst"><code>boolean</code></td>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Returns the scaled value of <code>dimension</code>.</TD> <td class="colLast"><code><strong><a href="../../../org/libjpegturbo/turbojpeg/TJScalingFactor.html#isOne()">isOne</a></strong>()</code>
</TR> <div class="block">Returns true or false, depending on whether this instance is equal to
<TR BGCOLOR="white" CLASS="TableRowColor"> 1/1.</div>
<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1"> </td>
<CODE>&nbsp;boolean</CODE></FONT></TD> </tr>
<TD><CODE><B><A HREF="../../../org/libjpegturbo/turbojpeg/TJScalingFactor.html#isOne()">isOne</A></B>()</CODE> </table>
<ul class="blockList">
<BR> <li class="blockList"><a name="methods_inherited_from_class_java.lang.Object">
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Returns true or false, depending on whether this instance is equal to <!-- -->
1/1.</TD> </a>
</TR> <h3>Methods inherited from class&nbsp;java.lang.Object</h3>
</TABLE> <code>clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait</code></li>
&nbsp;<A NAME="methods_inherited_from_class_java.lang.Object"><!-- --></A> </ul>
<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY=""> </li>
<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor"> </ul>
<TH ALIGN="left"><B>Methods inherited from class java.lang.Object</B></TH> </li>
</TR> </ul>
<TR BGCOLOR="white" CLASS="TableRowColor"> </div>
<TD><CODE>clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait</CODE></TD> <div class="details">
</TR> <ul class="blockList">
</TABLE> <li class="blockList">
&nbsp;
<P>
<!-- ========= CONSTRUCTOR DETAIL ======== --> <!-- ========= CONSTRUCTOR DETAIL ======== -->
<ul class="blockList">
<A NAME="constructor_detail"><!-- --></A> <li class="blockList"><a name="constructor_detail">
<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY=""> <!-- -->
<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor"> </a>
<TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2"> <h3>Constructor Detail</h3>
<B>Constructor Detail</B></FONT></TH> <a name="TJScalingFactor(int, int)">
</TR> <!-- -->
</TABLE> </a>
<ul class="blockListLast">
<A NAME="TJScalingFactor(int, int)"><!-- --></A><H3> <li class="blockList">
TJScalingFactor</H3> <h4>TJScalingFactor</h4>
<PRE> <pre>public&nbsp;TJScalingFactor(int&nbsp;num,
public <B>TJScalingFactor</B>(int&nbsp;num,
int&nbsp;denom) int&nbsp;denom)
throws java.lang.Exception</PRE> throws java.lang.Exception</pre>
<DL> <dl><dt><span class="strong">Throws:</span></dt>
<DL> <dd><code>java.lang.Exception</code></dd></dl>
</li>
<DT><B>Throws:</B> </ul>
<DD><CODE>java.lang.Exception</CODE></DL> </li>
</DL> </ul>
<!-- ============ METHOD DETAIL ========== --> <!-- ============ METHOD DETAIL ========== -->
<ul class="blockList">
<A NAME="method_detail"><!-- --></A> <li class="blockList"><a name="method_detail">
<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY=""> <!-- -->
<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor"> </a>
<TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2"> <h3>Method Detail</h3>
<B>Method Detail</B></FONT></TH> <a name="getNum()">
</TR> <!-- -->
</TABLE> </a>
<ul class="blockList">
<A NAME="getNum()"><!-- --></A><H3> <li class="blockList">
getNum</H3> <h4>getNum</h4>
<PRE> <pre>public&nbsp;int&nbsp;getNum()</pre>
public int <B>getNum</B>()</PRE> <div class="block">Returns numerator</div>
<DL> <dl><dt><span class="strong">Returns:</span></dt><dd>numerator</dd></dl>
<DD>Returns numerator </li>
<P> </ul>
<DD><DL> <a name="getDenom()">
<!-- -->
<DT><B>Returns:</B><DD>numerator</DL> </a>
</DD> <ul class="blockList">
</DL> <li class="blockList">
<HR> <h4>getDenom</h4>
<pre>public&nbsp;int&nbsp;getDenom()</pre>
<A NAME="getDenom()"><!-- --></A><H3> <div class="block">Returns denominator</div>
getDenom</H3> <dl><dt><span class="strong">Returns:</span></dt><dd>denominator</dd></dl>
<PRE> </li>
public int <B>getDenom</B>()</PRE> </ul>
<DL> <a name="getScaled(int)">
<DD>Returns denominator <!-- -->
<P> </a>
<DD><DL> <ul class="blockList">
<li class="blockList">
<DT><B>Returns:</B><DD>denominator</DL> <h4>getScaled</h4>
</DD> <pre>public&nbsp;int&nbsp;getScaled(int&nbsp;dimension)</pre>
</DL> <div class="block">Returns the scaled value of <code>dimension</code>. This function
<HR>
<A NAME="getScaled(int)"><!-- --></A><H3>
getScaled</H3>
<PRE>
public int <B>getScaled</B>(int&nbsp;dimension)</PRE>
<DL>
<DD>Returns the scaled value of <code>dimension</code>. This function
performs the integer equivalent of performs the integer equivalent of
<code>ceil(dimension * scalingFactor)</code>. <code>ceil(dimension * scalingFactor)</code>.</div>
<P> <dl><dt><span class="strong">Returns:</span></dt><dd>the scaled value of <code>dimension</code>.</dd></dl>
<DD><DL> </li>
</ul>
<DT><B>Returns:</B><DD>the scaled value of <code>dimension</code></DL> <a name="equals(org.libjpegturbo.turbojpeg.TJScalingFactor)">
</DD> <!-- -->
</DL> </a>
<HR> <ul class="blockList">
<li class="blockList">
<A NAME="equals(org.libjpegturbo.turbojpeg.TJScalingFactor)"><!-- --></A><H3> <h4>equals</h4>
equals</H3> <pre>public&nbsp;boolean&nbsp;equals(<a href="../../../org/libjpegturbo/turbojpeg/TJScalingFactor.html" title="class in org.libjpegturbo.turbojpeg">TJScalingFactor</a>&nbsp;other)</pre>
<PRE> <div class="block">Returns true or false, depending on whether this instance and
public boolean <B>equals</B>(<A HREF="../../../org/libjpegturbo/turbojpeg/TJScalingFactor.html" title="class in org.libjpegturbo.turbojpeg">TJScalingFactor</A>&nbsp;other)</PRE> <code>other</code> have the same numerator and denominator.</div>
<DL> <dl><dt><span class="strong">Returns:</span></dt><dd>true or false, depending on whether this instance and
<DD>Returns true or false, depending on whether this instance and <code>other</code> have the same numerator and denominator.</dd></dl>
<code>other</code> have the same numerator and denominator. </li>
<P> </ul>
<DD><DL> <a name="isOne()">
<!-- -->
<DT><B>Returns:</B><DD>true or false, depending on whether this instance and </a>
<code>other</code> have the same numerator and denominator</DL> <ul class="blockListLast">
</DD> <li class="blockList">
</DL> <h4>isOne</h4>
<HR> <pre>public&nbsp;boolean&nbsp;isOne()</pre>
<div class="block">Returns true or false, depending on whether this instance is equal to
<A NAME="isOne()"><!-- --></A><H3> 1/1.</div>
isOne</H3> <dl><dt><span class="strong">Returns:</span></dt><dd>true or false, depending on whether this instance is equal to
<PRE> 1/1.</dd></dl>
public boolean <B>isOne</B>()</PRE> </li>
<DL> </ul>
<DD>Returns true or false, depending on whether this instance is equal to </li>
1/1. </ul>
<P> </li>
<DD><DL> </ul>
</div>
<DT><B>Returns:</B><DD>true or false, depending on whether this instance is equal to </div>
1/1</DL>
</DD>
</DL>
<!-- ========= END OF CLASS DATA ========= --> <!-- ========= END OF CLASS DATA ========= -->
<HR>
<!-- ======= START OF BOTTOM NAVBAR ====== --> <!-- ======= START OF BOTTOM NAVBAR ====== -->
<A NAME="navbar_bottom"><!-- --></A> <div class="bottomNav"><a name="navbar_bottom">
<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A> <!-- -->
<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY=""> </a><a href="#skip-navbar_bottom" title="Skip navigation links"></a><a name="navbar_bottom_firstrow">
<TR> <!-- -->
<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> </a>
<A NAME="navbar_bottom_firstrow"><!-- --></A> <ul class="navList" title="Navigation">
<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY=""> <li><a href="../../../org/libjpegturbo/turbojpeg/package-summary.html">Package</a></li>
<TR ALIGN="center" VALIGN="top"> <li class="navBarCell1Rev">Class</li>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../org/libjpegturbo/turbojpeg/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A>&nbsp;</TD> <li><a href="package-tree.html">Tree</a></li>
<TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT>&nbsp;</TD> <li><a href="../../../deprecated-list.html">Deprecated</a></li>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A>&nbsp;</TD> <li><a href="../../../index-all.html">Index</a></li>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD> <li><a href="../../../help-doc.html">Help</a></li>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A>&nbsp;</TD> </ul>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD> </div>
</TR> <div class="subNav">
</TABLE> <ul class="navList">
</TD> <li><a href="../../../org/libjpegturbo/turbojpeg/TJDecompressor.html" title="class in org.libjpegturbo.turbojpeg"><span class="strong">Prev Class</span></a></li>
<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM> <li><a href="../../../org/libjpegturbo/turbojpeg/TJTransform.html" title="class in org.libjpegturbo.turbojpeg"><span class="strong">Next Class</span></a></li>
</EM> </ul>
</TD> <ul class="navList">
</TR> <li><a href="../../../index.html?org/libjpegturbo/turbojpeg/TJScalingFactor.html" target="_top">Frames</a></li>
<li><a href="TJScalingFactor.html" target="_top">No Frames</a></li>
<TR> </ul>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2"> <ul class="navList" id="allclasses_navbar_bottom">
&nbsp;<A HREF="../../../org/libjpegturbo/turbojpeg/TJDecompressor.html" title="class in org.libjpegturbo.turbojpeg"><B>PREV CLASS</B></A>&nbsp; <li><a href="../../../allclasses-noframe.html">All Classes</a></li>
&nbsp;<A HREF="../../../org/libjpegturbo/turbojpeg/TJTransform.html" title="class in org.libjpegturbo.turbojpeg"><B>NEXT CLASS</B></A></FONT></TD> </ul>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2"> <div>
<A HREF="../../../index.html?org/libjpegturbo/turbojpeg/TJScalingFactor.html" target="_top"><B>FRAMES</B></A> &nbsp; <script type="text/javascript"><!--
&nbsp;<A HREF="TJScalingFactor.html" target="_top"><B>NO FRAMES</B></A> &nbsp; allClassesLink = document.getElementById("allclasses_navbar_bottom");
&nbsp;<SCRIPT type="text/javascript">
<!--
if(window==top) { if(window==top) {
document.writeln('<A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A>'); allClassesLink.style.display = "block";
}
else {
allClassesLink.style.display = "none";
} }
//--> //-->
</SCRIPT> </script>
<NOSCRIPT> </div>
<A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A> <div>
</NOSCRIPT> <ul class="subNavList">
<li>Summary:&nbsp;</li>
<li>Nested&nbsp;|&nbsp;</li>
</FONT></TD> <li>Field&nbsp;|&nbsp;</li>
</TR> <li><a href="#constructor_summary">Constr</a>&nbsp;|&nbsp;</li>
<TR> <li><a href="#method_summary">Method</a></li>
<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2"> </ul>
SUMMARY:&nbsp;NESTED&nbsp;|&nbsp;FIELD&nbsp;|&nbsp;<A HREF="#constructor_summary">CONSTR</A>&nbsp;|&nbsp;<A HREF="#method_summary">METHOD</A></FONT></TD> <ul class="subNavList">
<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2"> <li>Detail:&nbsp;</li>
DETAIL:&nbsp;FIELD&nbsp;|&nbsp;<A HREF="#constructor_detail">CONSTR</A>&nbsp;|&nbsp;<A HREF="#method_detail">METHOD</A></FONT></TD> <li>Field&nbsp;|&nbsp;</li>
</TR> <li><a href="#constructor_detail">Constr</a>&nbsp;|&nbsp;</li>
</TABLE> <li><a href="#method_detail">Method</a></li>
<A NAME="skip-navbar_bottom"></A> </ul>
</div>
<a name="skip-navbar_bottom">
<!-- -->
</a></div>
<!-- ======== END OF BOTTOM NAVBAR ======= --> <!-- ======== END OF BOTTOM NAVBAR ======= -->
</body>
<HR> </html>
</BODY>
</HTML>

File diff suppressed because it is too large Load Diff

View File

@@ -1,301 +1,291 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!-- NewPage --> <!-- NewPage -->
<HTML> <html lang="en">
<HEAD> <head>
<TITLE> <title>TJTransformer</title>
TJTransformer <link rel="stylesheet" type="text/css" href="../../../stylesheet.css" title="Style">
</TITLE> </head>
<body>
<script type="text/javascript"><!--
<LINK REL ="stylesheet" TYPE="text/css" HREF="../../../stylesheet.css" TITLE="Style">
<SCRIPT type="text/javascript">
function windowTitle()
{
if (location.href.indexOf('is-external=true') == -1) { if (location.href.indexOf('is-external=true') == -1) {
parent.document.title="TJTransformer"; parent.document.title="TJTransformer";
} }
} //-->
</SCRIPT> </script>
<NOSCRIPT> <noscript>
</NOSCRIPT> <div>JavaScript is disabled on your browser.</div>
</noscript>
</HEAD>
<BODY BGCOLOR="white" onload="windowTitle();">
<HR>
<!-- ========= START OF TOP NAVBAR ======= --> <!-- ========= START OF TOP NAVBAR ======= -->
<A NAME="navbar_top"><!-- --></A> <div class="topNav"><a name="navbar_top">
<A HREF="#skip-navbar_top" title="Skip navigation links"></A> <!-- -->
<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY=""> </a><a href="#skip-navbar_top" title="Skip navigation links"></a><a name="navbar_top_firstrow">
<TR> <!-- -->
<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> </a>
<A NAME="navbar_top_firstrow"><!-- --></A> <ul class="navList" title="Navigation">
<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY=""> <li><a href="../../../org/libjpegturbo/turbojpeg/package-summary.html">Package</a></li>
<TR ALIGN="center" VALIGN="top"> <li class="navBarCell1Rev">Class</li>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../org/libjpegturbo/turbojpeg/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A>&nbsp;</TD> <li><a href="package-tree.html">Tree</a></li>
<TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT>&nbsp;</TD> <li><a href="../../../deprecated-list.html">Deprecated</a></li>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A>&nbsp;</TD> <li><a href="../../../index-all.html">Index</a></li>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD> <li><a href="../../../help-doc.html">Help</a></li>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A>&nbsp;</TD> </ul>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD> </div>
</TR> <div class="subNav">
</TABLE> <ul class="navList">
</TD> <li><a href="../../../org/libjpegturbo/turbojpeg/TJTransform.html" title="class in org.libjpegturbo.turbojpeg"><span class="strong">Prev Class</span></a></li>
<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM> <li><a href="../../../org/libjpegturbo/turbojpeg/YUVImage.html" title="class in org.libjpegturbo.turbojpeg"><span class="strong">Next Class</span></a></li>
</EM> </ul>
</TD> <ul class="navList">
</TR> <li><a href="../../../index.html?org/libjpegturbo/turbojpeg/TJTransformer.html" target="_top">Frames</a></li>
<li><a href="TJTransformer.html" target="_top">No Frames</a></li>
<TR> </ul>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2"> <ul class="navList" id="allclasses_navbar_top">
&nbsp;<A HREF="../../../org/libjpegturbo/turbojpeg/TJTransform.html" title="class in org.libjpegturbo.turbojpeg"><B>PREV CLASS</B></A>&nbsp; <li><a href="../../../allclasses-noframe.html">All Classes</a></li>
&nbsp;NEXT CLASS</FONT></TD> </ul>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2"> <div>
<A HREF="../../../index.html?org/libjpegturbo/turbojpeg/TJTransformer.html" target="_top"><B>FRAMES</B></A> &nbsp; <script type="text/javascript"><!--
&nbsp;<A HREF="TJTransformer.html" target="_top"><B>NO FRAMES</B></A> &nbsp; allClassesLink = document.getElementById("allclasses_navbar_top");
&nbsp;<SCRIPT type="text/javascript">
<!--
if(window==top) { if(window==top) {
document.writeln('<A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A>'); allClassesLink.style.display = "block";
}
else {
allClassesLink.style.display = "none";
} }
//--> //-->
</SCRIPT> </script>
<NOSCRIPT> </div>
<A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A> <div>
</NOSCRIPT> <ul class="subNavList">
<li>Summary:&nbsp;</li>
<li>Nested&nbsp;|&nbsp;</li>
</FONT></TD> <li><a href="#fields_inherited_from_class_org.libjpegturbo.turbojpeg.TJDecompressor">Field</a>&nbsp;|&nbsp;</li>
</TR> <li><a href="#constructor_summary">Constr</a>&nbsp;|&nbsp;</li>
<TR> <li><a href="#method_summary">Method</a></li>
<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2"> </ul>
SUMMARY:&nbsp;NESTED&nbsp;|&nbsp;<A HREF="#fields_inherited_from_class_org.libjpegturbo.turbojpeg.TJDecompressor">FIELD</A>&nbsp;|&nbsp;<A HREF="#constructor_summary">CONSTR</A>&nbsp;|&nbsp;<A HREF="#method_summary">METHOD</A></FONT></TD> <ul class="subNavList">
<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2"> <li>Detail:&nbsp;</li>
DETAIL:&nbsp;FIELD&nbsp;|&nbsp;<A HREF="#constructor_detail">CONSTR</A>&nbsp;|&nbsp;<A HREF="#method_detail">METHOD</A></FONT></TD> <li>Field&nbsp;|&nbsp;</li>
</TR> <li><a href="#constructor_detail">Constr</a>&nbsp;|&nbsp;</li>
</TABLE> <li><a href="#method_detail">Method</a></li>
<A NAME="skip-navbar_top"></A> </ul>
</div>
<a name="skip-navbar_top">
<!-- -->
</a></div>
<!-- ========= END OF TOP NAVBAR ========= --> <!-- ========= END OF TOP NAVBAR ========= -->
<HR>
<!-- ======== START OF CLASS DATA ======== --> <!-- ======== START OF CLASS DATA ======== -->
<H2> <div class="header">
<FONT SIZE="-1"> <div class="subTitle">org.libjpegturbo.turbojpeg</div>
org.libjpegturbo.turbojpeg</FONT> <h2 title="Class TJTransformer" class="title">Class TJTransformer</h2>
<BR> </div>
Class TJTransformer</H2> <div class="contentContainer">
<PRE> <ul class="inheritance">
java.lang.Object <li>java.lang.Object</li>
<IMG SRC="../../../resources/inherit.gif" ALT="extended by "><A HREF="../../../org/libjpegturbo/turbojpeg/TJDecompressor.html" title="class in org.libjpegturbo.turbojpeg">org.libjpegturbo.turbojpeg.TJDecompressor</A> <li>
<IMG SRC="../../../resources/inherit.gif" ALT="extended by "><B>org.libjpegturbo.turbojpeg.TJTransformer</B> <ul class="inheritance">
</PRE> <li><a href="../../../org/libjpegturbo/turbojpeg/TJDecompressor.html" title="class in org.libjpegturbo.turbojpeg">org.libjpegturbo.turbojpeg.TJDecompressor</a></li>
<HR> <li>
<DL> <ul class="inheritance">
<DT><PRE>public class <B>TJTransformer</B><DT>extends <A HREF="../../../org/libjpegturbo/turbojpeg/TJDecompressor.html" title="class in org.libjpegturbo.turbojpeg">TJDecompressor</A></DL> <li>org.libjpegturbo.turbojpeg.TJTransformer</li>
</PRE> </ul>
</li>
<P> </ul>
TurboJPEG lossless transformer </li>
<P> </ul>
<div class="description">
<P> <ul class="blockList">
<HR> <li class="blockList">
<hr>
<P> <br>
<pre>public class <span class="strong">TJTransformer</span>
extends <a href="../../../org/libjpegturbo/turbojpeg/TJDecompressor.html" title="class in org.libjpegturbo.turbojpeg">TJDecompressor</a></pre>
<div class="block">TurboJPEG lossless transformer</div>
</li>
</ul>
</div>
<div class="summary">
<ul class="blockList">
<li class="blockList">
<!-- =========== FIELD SUMMARY =========== --> <!-- =========== FIELD SUMMARY =========== -->
<ul class="blockList">
<A NAME="field_summary"><!-- --></A> <li class="blockList"><a name="field_summary">
<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY=""> <!-- -->
<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor"> </a>
<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2"> <h3>Field Summary</h3>
<B>Field Summary</B></FONT></TH> <ul class="blockList">
</TR> <li class="blockList"><a name="fields_inherited_from_class_org.libjpegturbo.turbojpeg.TJDecompressor">
</TABLE> <!-- -->
&nbsp;<A NAME="fields_inherited_from_class_org.libjpegturbo.turbojpeg.TJDecompressor"><!-- --></A> </a>
<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY=""> <h3>Fields inherited from class&nbsp;org.libjpegturbo.turbojpeg.<a href="../../../org/libjpegturbo/turbojpeg/TJDecompressor.html" title="class in org.libjpegturbo.turbojpeg">TJDecompressor</a></h3>
<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor"> <code><a href="../../../org/libjpegturbo/turbojpeg/TJDecompressor.html#handle">handle</a>, <a href="../../../org/libjpegturbo/turbojpeg/TJDecompressor.html#jpegBuf">jpegBuf</a>, <a href="../../../org/libjpegturbo/turbojpeg/TJDecompressor.html#jpegBufSize">jpegBufSize</a>, <a href="../../../org/libjpegturbo/turbojpeg/TJDecompressor.html#jpegColorspace">jpegColorspace</a>, <a href="../../../org/libjpegturbo/turbojpeg/TJDecompressor.html#jpegHeight">jpegHeight</a>, <a href="../../../org/libjpegturbo/turbojpeg/TJDecompressor.html#jpegSubsamp">jpegSubsamp</a>, <a href="../../../org/libjpegturbo/turbojpeg/TJDecompressor.html#jpegWidth">jpegWidth</a>, <a href="../../../org/libjpegturbo/turbojpeg/TJDecompressor.html#yuvImage">yuvImage</a></code></li>
<TH ALIGN="left"><B>Fields inherited from class org.libjpegturbo.turbojpeg.<A HREF="../../../org/libjpegturbo/turbojpeg/TJDecompressor.html" title="class in org.libjpegturbo.turbojpeg">TJDecompressor</A></B></TH> </ul>
</TR> </li>
<TR BGCOLOR="white" CLASS="TableRowColor"> </ul>
<TD><CODE><A HREF="../../../org/libjpegturbo/turbojpeg/TJDecompressor.html#handle">handle</A>, <A HREF="../../../org/libjpegturbo/turbojpeg/TJDecompressor.html#jpegBuf">jpegBuf</A>, <A HREF="../../../org/libjpegturbo/turbojpeg/TJDecompressor.html#jpegBufSize">jpegBufSize</A>, <A HREF="../../../org/libjpegturbo/turbojpeg/TJDecompressor.html#jpegColorspace">jpegColorspace</A>, <A HREF="../../../org/libjpegturbo/turbojpeg/TJDecompressor.html#jpegHeight">jpegHeight</A>, <A HREF="../../../org/libjpegturbo/turbojpeg/TJDecompressor.html#jpegSubsamp">jpegSubsamp</A>, <A HREF="../../../org/libjpegturbo/turbojpeg/TJDecompressor.html#jpegWidth">jpegWidth</A></CODE></TD>
</TR>
</TABLE>
&nbsp;
<!-- ======== CONSTRUCTOR SUMMARY ======== --> <!-- ======== CONSTRUCTOR SUMMARY ======== -->
<ul class="blockList">
<A NAME="constructor_summary"><!-- --></A> <li class="blockList"><a name="constructor_summary">
<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY=""> <!-- -->
<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor"> </a>
<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2"> <h3>Constructor Summary</h3>
<B>Constructor Summary</B></FONT></TH> <table class="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="Constructor Summary table, listing constructors, and an explanation">
</TR> <caption><span>Constructors</span><span class="tabEnd">&nbsp;</span></caption>
<TR BGCOLOR="white" CLASS="TableRowColor"> <tr>
<TD><CODE><B><A HREF="../../../org/libjpegturbo/turbojpeg/TJTransformer.html#TJTransformer()">TJTransformer</A></B>()</CODE> <th class="colOne" scope="col">Constructor and Description</th>
</tr>
<BR> <tr class="altColor">
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Create a TurboJPEG lossless transformer instance.</TD> <td class="colOne"><code><strong><a href="../../../org/libjpegturbo/turbojpeg/TJTransformer.html#TJTransformer()">TJTransformer</a></strong>()</code>
</TR> <div class="block">Create a TurboJPEG lossless transformer instance.</div>
<TR BGCOLOR="white" CLASS="TableRowColor"> </td>
<TD><CODE><B><A HREF="../../../org/libjpegturbo/turbojpeg/TJTransformer.html#TJTransformer(byte[])">TJTransformer</A></B>(byte[]&nbsp;jpegImage)</CODE> </tr>
<tr class="rowColor">
<BR> <td class="colOne"><code><strong><a href="../../../org/libjpegturbo/turbojpeg/TJTransformer.html#TJTransformer(byte[])">TJTransformer</a></strong>(byte[]&nbsp;jpegImage)</code>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Create a TurboJPEG lossless transformer instance and associate the JPEG <div class="block">Create a TurboJPEG lossless transformer instance and associate the JPEG
image stored in <code>jpegImage</code> with the newly-created instance.</TD> image stored in <code>jpegImage</code> with the newly created instance.</div>
</TR> </td>
<TR BGCOLOR="white" CLASS="TableRowColor"> </tr>
<TD><CODE><B><A HREF="../../../org/libjpegturbo/turbojpeg/TJTransformer.html#TJTransformer(byte[], int)">TJTransformer</A></B>(byte[]&nbsp;jpegImage, <tr class="altColor">
int&nbsp;imageSize)</CODE> <td class="colOne"><code><strong><a href="../../../org/libjpegturbo/turbojpeg/TJTransformer.html#TJTransformer(byte[],%20int)">TJTransformer</a></strong>(byte[]&nbsp;jpegImage,
int&nbsp;imageSize)</code>
<BR> <div class="block">Create a TurboJPEG lossless transformer instance and associate the JPEG
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Create a TurboJPEG lossless transformer instance and associate the JPEG
image of length <code>imageSize</code> bytes stored in image of length <code>imageSize</code> bytes stored in
<code>jpegImage</code> with the newly-created instance.</TD> <code>jpegImage</code> with the newly created instance.</div>
</TR> </td>
</TABLE> </tr>
&nbsp; </table>
</li>
</ul>
<!-- ========== METHOD SUMMARY =========== --> <!-- ========== METHOD SUMMARY =========== -->
<ul class="blockList">
<A NAME="method_summary"><!-- --></A> <li class="blockList"><a name="method_summary">
<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY=""> <!-- -->
<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor"> </a>
<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2"> <h3>Method Summary</h3>
<B>Method Summary</B></FONT></TH> <table class="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="Method Summary table, listing methods, and an explanation">
</TR> <caption><span>Methods</span><span class="tabEnd">&nbsp;</span></caption>
<TR BGCOLOR="white" CLASS="TableRowColor"> <tr>
<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1"> <th class="colFirst" scope="col">Modifier and Type</th>
<CODE>&nbsp;int[]</CODE></FONT></TD> <th class="colLast" scope="col">Method and Description</th>
<TD><CODE><B><A HREF="../../../org/libjpegturbo/turbojpeg/TJTransformer.html#getTransformedSizes()">getTransformedSizes</A></B>()</CODE> </tr>
<tr class="altColor">
<BR> <td class="colFirst"><code>int[]</code></td>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Returns an array containing the sizes of the transformed JPEG images from <td class="colLast"><code><strong><a href="../../../org/libjpegturbo/turbojpeg/TJTransformer.html#getTransformedSizes()">getTransformedSizes</a></strong>()</code>
the most recent call to <A HREF="../../../org/libjpegturbo/turbojpeg/TJTransformer.html#transform(byte[][], org.libjpegturbo.turbojpeg.TJTransform[], int)"><CODE>transform()</CODE></A>.</TD> <div class="block">Returns an array containing the sizes of the transformed JPEG images
</TR> generated by the most recent transform operation.</div>
<TR BGCOLOR="white" CLASS="TableRowColor"> </td>
<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1"> </tr>
<CODE>&nbsp;void</CODE></FONT></TD> <tr class="rowColor">
<TD><CODE><B><A HREF="../../../org/libjpegturbo/turbojpeg/TJTransformer.html#transform(byte[][], org.libjpegturbo.turbojpeg.TJTransform[], int)">transform</A></B>(byte[][]&nbsp;dstBufs, <td class="colFirst"><code>void</code></td>
<A HREF="../../../org/libjpegturbo/turbojpeg/TJTransform.html" title="class in org.libjpegturbo.turbojpeg">TJTransform</A>[]&nbsp;transforms, <td class="colLast"><code><strong><a href="../../../org/libjpegturbo/turbojpeg/TJTransformer.html#transform(byte[][],%20org.libjpegturbo.turbojpeg.TJTransform[],%20int)">transform</a></strong>(byte[][]&nbsp;dstBufs,
int&nbsp;flags)</CODE> <a href="../../../org/libjpegturbo/turbojpeg/TJTransform.html" title="class in org.libjpegturbo.turbojpeg">TJTransform</a>[]&nbsp;transforms,
int&nbsp;flags)</code>
<BR> <div class="block">Losslessly transform the JPEG image associated with this transformer
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Losslessly transform the JPEG image associated with this transformer
instance into one or more JPEG images stored in the given destination instance into one or more JPEG images stored in the given destination
buffers.</TD> buffers.</div>
</TR> </td>
<TR BGCOLOR="white" CLASS="TableRowColor"> </tr>
<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1"> <tr class="altColor">
<CODE>&nbsp;<A HREF="../../../org/libjpegturbo/turbojpeg/TJDecompressor.html" title="class in org.libjpegturbo.turbojpeg">TJDecompressor</A>[]</CODE></FONT></TD> <td class="colFirst"><code><a href="../../../org/libjpegturbo/turbojpeg/TJDecompressor.html" title="class in org.libjpegturbo.turbojpeg">TJDecompressor</a>[]</code></td>
<TD><CODE><B><A HREF="../../../org/libjpegturbo/turbojpeg/TJTransformer.html#transform(org.libjpegturbo.turbojpeg.TJTransform[], int)">transform</A></B>(<A HREF="../../../org/libjpegturbo/turbojpeg/TJTransform.html" title="class in org.libjpegturbo.turbojpeg">TJTransform</A>[]&nbsp;transforms, <td class="colLast"><code><strong><a href="../../../org/libjpegturbo/turbojpeg/TJTransformer.html#transform(org.libjpegturbo.turbojpeg.TJTransform[],%20int)">transform</a></strong>(<a href="../../../org/libjpegturbo/turbojpeg/TJTransform.html" title="class in org.libjpegturbo.turbojpeg">TJTransform</a>[]&nbsp;transforms,
int&nbsp;flags)</CODE> int&nbsp;flags)</code>
<div class="block">Losslessly transform the JPEG image associated with this transformer
<BR> instance and return an array of <a href="../../../org/libjpegturbo/turbojpeg/TJDecompressor.html" title="class in org.libjpegturbo.turbojpeg"><code>TJDecompressor</code></a> instances, each of
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Losslessly transform the JPEG image associated with this transformer which has a transformed JPEG image associated with it.</div>
instance and return an array of <A HREF="../../../org/libjpegturbo/turbojpeg/TJDecompressor.html" title="class in org.libjpegturbo.turbojpeg"><CODE>TJDecompressor</CODE></A> instances, each of </td>
which has a transformed JPEG image associated with it.</TD> </tr>
</TR> </table>
</TABLE> <ul class="blockList">
&nbsp;<A NAME="methods_inherited_from_class_org.libjpegturbo.turbojpeg.TJDecompressor"><!-- --></A> <li class="blockList"><a name="methods_inherited_from_class_org.libjpegturbo.turbojpeg.TJDecompressor">
<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY=""> <!-- -->
<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor"> </a>
<TH ALIGN="left"><B>Methods inherited from class org.libjpegturbo.turbojpeg.<A HREF="../../../org/libjpegturbo/turbojpeg/TJDecompressor.html" title="class in org.libjpegturbo.turbojpeg">TJDecompressor</A></B></TH> <h3>Methods inherited from class&nbsp;org.libjpegturbo.turbojpeg.<a href="../../../org/libjpegturbo/turbojpeg/TJDecompressor.html" title="class in org.libjpegturbo.turbojpeg">TJDecompressor</a></h3>
</TR> <code><a href="../../../org/libjpegturbo/turbojpeg/TJDecompressor.html#close()">close</a>, <a href="../../../org/libjpegturbo/turbojpeg/TJDecompressor.html#decompress(java.awt.image.BufferedImage,%20int)">decompress</a>, <a href="../../../org/libjpegturbo/turbojpeg/TJDecompressor.html#decompress(byte[],%20int,%20int,%20int,%20int,%20int)">decompress</a>, <a href="../../../org/libjpegturbo/turbojpeg/TJDecompressor.html#decompress(byte[],%20int,%20int,%20int,%20int,%20int,%20int,%20int)">decompress</a>, <a href="../../../org/libjpegturbo/turbojpeg/TJDecompressor.html#decompress(int[],%20int,%20int,%20int,%20int,%20int,%20int,%20int)">decompress</a>, <a href="../../../org/libjpegturbo/turbojpeg/TJDecompressor.html#decompress(int,%20int,%20int,%20int)">decompress</a>, <a href="../../../org/libjpegturbo/turbojpeg/TJDecompressor.html#decompress(int,%20int,%20int,%20int,%20int)">decompress</a>, <a href="../../../org/libjpegturbo/turbojpeg/TJDecompressor.html#decompressToYUV(byte[],%20int)">decompressToYUV</a>, <a href="../../../org/libjpegturbo/turbojpeg/TJDecompressor.html#decompressToYUV(int)">decompressToYUV</a>, <a href="../../../org/libjpegturbo/turbojpeg/TJDecompressor.html#decompressToYUV(int,%20int[],%20int,%20int)">decompressToYUV</a>, <a href="../../../org/libjpegturbo/turbojpeg/TJDecompressor.html#decompressToYUV(int,%20int,%20int,%20int)">decompressToYUV</a>, <a href="../../../org/libjpegturbo/turbojpeg/TJDecompressor.html#decompressToYUV(org.libjpegturbo.turbojpeg.YUVImage,%20int)">decompressToYUV</a>, <a href="../../../org/libjpegturbo/turbojpeg/TJDecompressor.html#finalize()">finalize</a>, <a href="../../../org/libjpegturbo/turbojpeg/TJDecompressor.html#getColorspace()">getColorspace</a>, <a href="../../../org/libjpegturbo/turbojpeg/TJDecompressor.html#getHeight()">getHeight</a>, <a href="../../../org/libjpegturbo/turbojpeg/TJDecompressor.html#getJPEGBuf()">getJPEGBuf</a>, <a href="../../../org/libjpegturbo/turbojpeg/TJDecompressor.html#getJPEGSize()">getJPEGSize</a>, <a href="../../../org/libjpegturbo/turbojpeg/TJDecompressor.html#getScaledHeight(int,%20int)">getScaledHeight</a>, <a href="../../../org/libjpegturbo/turbojpeg/TJDecompressor.html#getScaledWidth(int,%20int)">getScaledWidth</a>, <a href="../../../org/libjpegturbo/turbojpeg/TJDecompressor.html#getSubsamp()">getSubsamp</a>, <a href="../../../org/libjpegturbo/turbojpeg/TJDecompressor.html#getWidth()">getWidth</a>, <a href="../../../org/libjpegturbo/turbojpeg/TJDecompressor.html#setJPEGImage(byte[],%20int)">setJPEGImage</a>, <a href="../../../org/libjpegturbo/turbojpeg/TJDecompressor.html#setSourceImage(byte[],%20int)">setSourceImage</a>, <a href="../../../org/libjpegturbo/turbojpeg/TJDecompressor.html#setSourceImage(org.libjpegturbo.turbojpeg.YUVImage)">setSourceImage</a></code></li>
<TR BGCOLOR="white" CLASS="TableRowColor"> </ul>
<TD><CODE><A HREF="../../../org/libjpegturbo/turbojpeg/TJDecompressor.html#close()">close</A>, <A HREF="../../../org/libjpegturbo/turbojpeg/TJDecompressor.html#decompress(java.awt.image.BufferedImage, int)">decompress</A>, <A HREF="../../../org/libjpegturbo/turbojpeg/TJDecompressor.html#decompress(byte[], int, int, int, int, int)">decompress</A>, <A HREF="../../../org/libjpegturbo/turbojpeg/TJDecompressor.html#decompress(byte[], int, int, int, int, int, int, int)">decompress</A>, <A HREF="../../../org/libjpegturbo/turbojpeg/TJDecompressor.html#decompress(int[], int, int, int, int, int, int, int)">decompress</A>, <A HREF="../../../org/libjpegturbo/turbojpeg/TJDecompressor.html#decompress(int, int, int, int)">decompress</A>, <A HREF="../../../org/libjpegturbo/turbojpeg/TJDecompressor.html#decompress(int, int, int, int, int)">decompress</A>, <A HREF="../../../org/libjpegturbo/turbojpeg/TJDecompressor.html#decompressToYUV(byte[], int)">decompressToYUV</A>, <A HREF="../../../org/libjpegturbo/turbojpeg/TJDecompressor.html#decompressToYUV(byte[], int, int, int, int)">decompressToYUV</A>, <A HREF="../../../org/libjpegturbo/turbojpeg/TJDecompressor.html#decompressToYUV(int)">decompressToYUV</A>, <A HREF="../../../org/libjpegturbo/turbojpeg/TJDecompressor.html#decompressToYUV(int, int, int, int)">decompressToYUV</A>, <A HREF="../../../org/libjpegturbo/turbojpeg/TJDecompressor.html#finalize()">finalize</A>, <A HREF="../../../org/libjpegturbo/turbojpeg/TJDecompressor.html#getColorspace()">getColorspace</A>, <A HREF="../../../org/libjpegturbo/turbojpeg/TJDecompressor.html#getHeight()">getHeight</A>, <A HREF="../../../org/libjpegturbo/turbojpeg/TJDecompressor.html#getJPEGBuf()">getJPEGBuf</A>, <A HREF="../../../org/libjpegturbo/turbojpeg/TJDecompressor.html#getJPEGSize()">getJPEGSize</A>, <A HREF="../../../org/libjpegturbo/turbojpeg/TJDecompressor.html#getScaledHeight(int, int)">getScaledHeight</A>, <A HREF="../../../org/libjpegturbo/turbojpeg/TJDecompressor.html#getScaledWidth(int, int)">getScaledWidth</A>, <A HREF="../../../org/libjpegturbo/turbojpeg/TJDecompressor.html#getSubsamp()">getSubsamp</A>, <A HREF="../../../org/libjpegturbo/turbojpeg/TJDecompressor.html#getWidth()">getWidth</A>, <A HREF="../../../org/libjpegturbo/turbojpeg/TJDecompressor.html#setJPEGImage(byte[], int)">setJPEGImage</A></CODE></TD> <ul class="blockList">
</TR> <li class="blockList"><a name="methods_inherited_from_class_java.lang.Object">
</TABLE> <!-- -->
&nbsp;<A NAME="methods_inherited_from_class_java.lang.Object"><!-- --></A> </a>
<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY=""> <h3>Methods inherited from class&nbsp;java.lang.Object</h3>
<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor"> <code>clone, equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait</code></li>
<TH ALIGN="left"><B>Methods inherited from class java.lang.Object</B></TH> </ul>
</TR> </li>
<TR BGCOLOR="white" CLASS="TableRowColor"> </ul>
<TD><CODE>clone, equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait</CODE></TD> </li>
</TR> </ul>
</TABLE> </div>
&nbsp; <div class="details">
<P> <ul class="blockList">
<li class="blockList">
<!-- ========= CONSTRUCTOR DETAIL ======== --> <!-- ========= CONSTRUCTOR DETAIL ======== -->
<ul class="blockList">
<A NAME="constructor_detail"><!-- --></A> <li class="blockList"><a name="constructor_detail">
<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY=""> <!-- -->
<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor"> </a>
<TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2"> <h3>Constructor Detail</h3>
<B>Constructor Detail</B></FONT></TH> <a name="TJTransformer()">
</TR> <!-- -->
</TABLE> </a>
<ul class="blockList">
<A NAME="TJTransformer()"><!-- --></A><H3> <li class="blockList">
TJTransformer</H3> <h4>TJTransformer</h4>
<PRE> <pre>public&nbsp;TJTransformer()
public <B>TJTransformer</B>() throws java.lang.Exception</pre>
throws java.lang.Exception</PRE> <div class="block">Create a TurboJPEG lossless transformer instance.</div>
<DL> <dl><dt><span class="strong">Throws:</span></dt>
<DD>Create a TurboJPEG lossless transformer instance. <dd><code>java.lang.Exception</code></dd></dl>
<P> </li>
<DL> </ul>
<a name="TJTransformer(byte[])">
<DT><B>Throws:</B> <!-- -->
<DD><CODE>java.lang.Exception</CODE></DL> </a>
</DL> <ul class="blockList">
<HR> <li class="blockList">
<h4>TJTransformer</h4>
<A NAME="TJTransformer(byte[])"><!-- --></A><H3> <pre>public&nbsp;TJTransformer(byte[]&nbsp;jpegImage)
TJTransformer</H3> throws java.lang.Exception</pre>
<PRE> <div class="block">Create a TurboJPEG lossless transformer instance and associate the JPEG
public <B>TJTransformer</B>(byte[]&nbsp;jpegImage) image stored in <code>jpegImage</code> with the newly created instance.</div>
throws java.lang.Exception</PRE> <dl><dt><span class="strong">Parameters:</span></dt><dd><code>jpegImage</code> - JPEG image buffer (size of the JPEG image is assumed to
<DL> be the length of the array)</dd>
<DD>Create a TurboJPEG lossless transformer instance and associate the JPEG <dt><span class="strong">Throws:</span></dt>
image stored in <code>jpegImage</code> with the newly-created instance. <dd><code>java.lang.Exception</code></dd></dl>
<P> </li>
<DL> </ul>
<DT><B>Parameters:</B><DD><CODE>jpegImage</CODE> - JPEG image buffer (size of the JPEG image is assumed to <a name="TJTransformer(byte[], int)">
be the length of the array) <!-- -->
<DT><B>Throws:</B> </a>
<DD><CODE>java.lang.Exception</CODE></DL> <ul class="blockListLast">
</DL> <li class="blockList">
<HR> <h4>TJTransformer</h4>
<pre>public&nbsp;TJTransformer(byte[]&nbsp;jpegImage,
<A NAME="TJTransformer(byte[], int)"><!-- --></A><H3>
TJTransformer</H3>
<PRE>
public <B>TJTransformer</B>(byte[]&nbsp;jpegImage,
int&nbsp;imageSize) int&nbsp;imageSize)
throws java.lang.Exception</PRE> throws java.lang.Exception</pre>
<DL> <div class="block">Create a TurboJPEG lossless transformer instance and associate the JPEG
<DD>Create a TurboJPEG lossless transformer instance and associate the JPEG
image of length <code>imageSize</code> bytes stored in image of length <code>imageSize</code> bytes stored in
<code>jpegImage</code> with the newly-created instance. <code>jpegImage</code> with the newly created instance.</div>
<P> <dl><dt><span class="strong">Parameters:</span></dt><dd><code>jpegImage</code> - JPEG image buffer</dd><dd><code>imageSize</code> - size of the JPEG image (in bytes)</dd>
<DL> <dt><span class="strong">Throws:</span></dt>
<DT><B>Parameters:</B><DD><CODE>jpegImage</CODE> - JPEG image buffer<DD><CODE>imageSize</CODE> - size of the JPEG image (in bytes) <dd><code>java.lang.Exception</code></dd></dl>
<DT><B>Throws:</B> </li>
<DD><CODE>java.lang.Exception</CODE></DL> </ul>
</DL> </li>
</ul>
<!-- ============ METHOD DETAIL ========== --> <!-- ============ METHOD DETAIL ========== -->
<ul class="blockList">
<A NAME="method_detail"><!-- --></A> <li class="blockList"><a name="method_detail">
<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY=""> <!-- -->
<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor"> </a>
<TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2"> <h3>Method Detail</h3>
<B>Method Detail</B></FONT></TH> <a name="transform(byte[][], org.libjpegturbo.turbojpeg.TJTransform[], int)">
</TR> <!-- -->
</TABLE> </a>
<ul class="blockList">
<A NAME="transform(byte[][], org.libjpegturbo.turbojpeg.TJTransform[], int)"><!-- --></A><H3> <li class="blockList">
transform</H3> <h4>transform</h4>
<PRE> <pre>public&nbsp;void&nbsp;transform(byte[][]&nbsp;dstBufs,
public void <B>transform</B>(byte[][]&nbsp;dstBufs, <a href="../../../org/libjpegturbo/turbojpeg/TJTransform.html" title="class in org.libjpegturbo.turbojpeg">TJTransform</a>[]&nbsp;transforms,
<A HREF="../../../org/libjpegturbo/turbojpeg/TJTransform.html" title="class in org.libjpegturbo.turbojpeg">TJTransform</A>[]&nbsp;transforms,
int&nbsp;flags) int&nbsp;flags)
throws java.lang.Exception</PRE> throws java.lang.Exception</pre>
<DL> <div class="block">Losslessly transform the JPEG image associated with this transformer
<DD>Losslessly transform the JPEG image associated with this transformer
instance into one or more JPEG images stored in the given destination instance into one or more JPEG images stored in the given destination
buffers. Lossless transforms work by moving the raw coefficients from one buffers. Lossless transforms work by moving the raw coefficients from one
JPEG image structure to another without altering the values of the JPEG image structure to another without altering the values of the
@@ -306,121 +296,121 @@ public void <B>transform</B>(byte[][]&nbsp;dstBufs,
size of the destination image. Thus, this method provides a means of size of the destination image. Thus, this method provides a means of
generating multiple transformed images from the same source or of applying generating multiple transformed images from the same source or of applying
multiple transformations simultaneously, in order to eliminate the need to multiple transformations simultaneously, in order to eliminate the need to
read the source coefficients multiple times. read the source coefficients multiple times.</div>
<P> <dl><dt><span class="strong">Parameters:</span></dt><dd><code>dstBufs</code> - an array of image buffers. <code>dstbufs[i]</code> will
<DD><DL>
<DT><B>Parameters:</B><DD><CODE>dstBufs</CODE> - an array of image buffers. <code>dstbufs[i]</code> will
receive a JPEG image that has been transformed using the parameters in receive a JPEG image that has been transformed using the parameters in
<code>transforms[i]</code>. Use <A HREF="../../../org/libjpegturbo/turbojpeg/TJ.html#bufSize(int, int, int)"><CODE>TJ.bufSize(int, int, int)</CODE></A> to determine the <code>transforms[i]</code>. Use <a href="../../../org/libjpegturbo/turbojpeg/TJ.html#bufSize(int,%20int,%20int)"><code>TJ.bufSize(int, int, int)</code></a> to determine the
maximum size for each buffer based on the transformed or cropped width and maximum size for each buffer based on the transformed or cropped width and
height.<DD><CODE>transforms</CODE> - an array of <A HREF="../../../org/libjpegturbo/turbojpeg/TJTransform.html" title="class in org.libjpegturbo.turbojpeg"><CODE>TJTransform</CODE></A> instances, each of height and the level of subsampling used in the source image.</dd><dd><code>transforms</code> - an array of <a href="../../../org/libjpegturbo/turbojpeg/TJTransform.html" title="class in org.libjpegturbo.turbojpeg"><code>TJTransform</code></a> instances, each of
which specifies the transform parameters and/or cropping region for the which specifies the transform parameters and/or cropping region for the
corresponding transformed output image<DD><CODE>flags</CODE> - the bitwise OR of one or more of <A HREF="../../../org/libjpegturbo/turbojpeg/TJ.html" title="class in org.libjpegturbo.turbojpeg"><CODE>TJ.FLAG_*</CODE></A> corresponding transformed output image</dd><dd><code>flags</code> - the bitwise OR of one or more of
<DT><B>Throws:</B> <a href="../../../org/libjpegturbo/turbojpeg/TJ.html#FLAG_BOTTOMUP"><code>TJ.FLAG_*</code></a></dd>
<DD><CODE>java.lang.Exception</CODE></DL> <dt><span class="strong">Throws:</span></dt>
</DD> <dd><code>java.lang.Exception</code></dd></dl>
</DL> </li>
<HR> </ul>
<a name="transform(org.libjpegturbo.turbojpeg.TJTransform[], int)">
<A NAME="transform(org.libjpegturbo.turbojpeg.TJTransform[], int)"><!-- --></A><H3> <!-- -->
transform</H3> </a>
<PRE> <ul class="blockList">
public <A HREF="../../../org/libjpegturbo/turbojpeg/TJDecompressor.html" title="class in org.libjpegturbo.turbojpeg">TJDecompressor</A>[] <B>transform</B>(<A HREF="../../../org/libjpegturbo/turbojpeg/TJTransform.html" title="class in org.libjpegturbo.turbojpeg">TJTransform</A>[]&nbsp;transforms, <li class="blockList">
<h4>transform</h4>
<pre>public&nbsp;<a href="../../../org/libjpegturbo/turbojpeg/TJDecompressor.html" title="class in org.libjpegturbo.turbojpeg">TJDecompressor</a>[]&nbsp;transform(<a href="../../../org/libjpegturbo/turbojpeg/TJTransform.html" title="class in org.libjpegturbo.turbojpeg">TJTransform</a>[]&nbsp;transforms,
int&nbsp;flags) int&nbsp;flags)
throws java.lang.Exception</PRE> throws java.lang.Exception</pre>
<DL> <div class="block">Losslessly transform the JPEG image associated with this transformer
<DD>Losslessly transform the JPEG image associated with this transformer instance and return an array of <a href="../../../org/libjpegturbo/turbojpeg/TJDecompressor.html" title="class in org.libjpegturbo.turbojpeg"><code>TJDecompressor</code></a> instances, each of
instance and return an array of <A HREF="../../../org/libjpegturbo/turbojpeg/TJDecompressor.html" title="class in org.libjpegturbo.turbojpeg"><CODE>TJDecompressor</CODE></A> instances, each of which has a transformed JPEG image associated with it.</div>
which has a transformed JPEG image associated with it. <dl><dt><span class="strong">Parameters:</span></dt><dd><code>transforms</code> - an array of <a href="../../../org/libjpegturbo/turbojpeg/TJTransform.html" title="class in org.libjpegturbo.turbojpeg"><code>TJTransform</code></a> instances, each of
<P>
<DD><DL>
<DT><B>Parameters:</B><DD><CODE>transforms</CODE> - an array of <A HREF="../../../org/libjpegturbo/turbojpeg/TJTransform.html" title="class in org.libjpegturbo.turbojpeg"><CODE>TJTransform</CODE></A> instances, each of
which specifies the transform parameters and/or cropping region for the which specifies the transform parameters and/or cropping region for the
corresponding transformed output image<DD><CODE>flags</CODE> - the bitwise OR of one or more of <A HREF="../../../org/libjpegturbo/turbojpeg/TJ.html" title="class in org.libjpegturbo.turbojpeg"><CODE>TJ.FLAG_*</CODE></A> corresponding transformed output image</dd><dd><code>flags</code> - the bitwise OR of one or more of
<DT><B>Returns:</B><DD>an array of <A HREF="../../../org/libjpegturbo/turbojpeg/TJDecompressor.html" title="class in org.libjpegturbo.turbojpeg"><CODE>TJDecompressor</CODE></A> instances, each of <a href="../../../org/libjpegturbo/turbojpeg/TJ.html#FLAG_BOTTOMUP"><code>TJ.FLAG_*</code></a></dd>
which has a transformed JPEG image associated with it <dt><span class="strong">Returns:</span></dt><dd>an array of <a href="../../../org/libjpegturbo/turbojpeg/TJDecompressor.html" title="class in org.libjpegturbo.turbojpeg"><code>TJDecompressor</code></a> instances, each of
<DT><B>Throws:</B> which has a transformed JPEG image associated with it.</dd>
<DD><CODE>java.lang.Exception</CODE></DL> <dt><span class="strong">Throws:</span></dt>
</DD> <dd><code>java.lang.Exception</code></dd></dl>
</DL> </li>
<HR> </ul>
<a name="getTransformedSizes()">
<A NAME="getTransformedSizes()"><!-- --></A><H3> <!-- -->
getTransformedSizes</H3> </a>
<PRE> <ul class="blockListLast">
public int[] <B>getTransformedSizes</B>() <li class="blockList">
throws java.lang.Exception</PRE> <h4>getTransformedSizes</h4>
<DL> <pre>public&nbsp;int[]&nbsp;getTransformedSizes()
<DD>Returns an array containing the sizes of the transformed JPEG images from throws java.lang.Exception</pre>
the most recent call to <A HREF="../../../org/libjpegturbo/turbojpeg/TJTransformer.html#transform(byte[][], org.libjpegturbo.turbojpeg.TJTransform[], int)"><CODE>transform()</CODE></A>. <div class="block">Returns an array containing the sizes of the transformed JPEG images
<P> generated by the most recent transform operation.</div>
<DD><DL> <dl><dt><span class="strong">Returns:</span></dt><dd>an array containing the sizes of the transformed JPEG images
generated by the most recent transform operation.</dd>
<DT><B>Returns:</B><DD>an array containing the sizes of the transformed JPEG images from <dt><span class="strong">Throws:</span></dt>
the most recent call to <A HREF="../../../org/libjpegturbo/turbojpeg/TJTransformer.html#transform(byte[][], org.libjpegturbo.turbojpeg.TJTransform[], int)"><CODE>transform()</CODE></A> <dd><code>java.lang.Exception</code></dd></dl>
<DT><B>Throws:</B> </li>
<DD><CODE>java.lang.Exception</CODE></DL> </ul>
</DD> </li>
</DL> </ul>
</li>
</ul>
</div>
</div>
<!-- ========= END OF CLASS DATA ========= --> <!-- ========= END OF CLASS DATA ========= -->
<HR>
<!-- ======= START OF BOTTOM NAVBAR ====== --> <!-- ======= START OF BOTTOM NAVBAR ====== -->
<A NAME="navbar_bottom"><!-- --></A> <div class="bottomNav"><a name="navbar_bottom">
<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A> <!-- -->
<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY=""> </a><a href="#skip-navbar_bottom" title="Skip navigation links"></a><a name="navbar_bottom_firstrow">
<TR> <!-- -->
<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> </a>
<A NAME="navbar_bottom_firstrow"><!-- --></A> <ul class="navList" title="Navigation">
<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY=""> <li><a href="../../../org/libjpegturbo/turbojpeg/package-summary.html">Package</a></li>
<TR ALIGN="center" VALIGN="top"> <li class="navBarCell1Rev">Class</li>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../org/libjpegturbo/turbojpeg/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A>&nbsp;</TD> <li><a href="package-tree.html">Tree</a></li>
<TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT>&nbsp;</TD> <li><a href="../../../deprecated-list.html">Deprecated</a></li>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A>&nbsp;</TD> <li><a href="../../../index-all.html">Index</a></li>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD> <li><a href="../../../help-doc.html">Help</a></li>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A>&nbsp;</TD> </ul>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD> </div>
</TR> <div class="subNav">
</TABLE> <ul class="navList">
</TD> <li><a href="../../../org/libjpegturbo/turbojpeg/TJTransform.html" title="class in org.libjpegturbo.turbojpeg"><span class="strong">Prev Class</span></a></li>
<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM> <li><a href="../../../org/libjpegturbo/turbojpeg/YUVImage.html" title="class in org.libjpegturbo.turbojpeg"><span class="strong">Next Class</span></a></li>
</EM> </ul>
</TD> <ul class="navList">
</TR> <li><a href="../../../index.html?org/libjpegturbo/turbojpeg/TJTransformer.html" target="_top">Frames</a></li>
<li><a href="TJTransformer.html" target="_top">No Frames</a></li>
<TR> </ul>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2"> <ul class="navList" id="allclasses_navbar_bottom">
&nbsp;<A HREF="../../../org/libjpegturbo/turbojpeg/TJTransform.html" title="class in org.libjpegturbo.turbojpeg"><B>PREV CLASS</B></A>&nbsp; <li><a href="../../../allclasses-noframe.html">All Classes</a></li>
&nbsp;NEXT CLASS</FONT></TD> </ul>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2"> <div>
<A HREF="../../../index.html?org/libjpegturbo/turbojpeg/TJTransformer.html" target="_top"><B>FRAMES</B></A> &nbsp; <script type="text/javascript"><!--
&nbsp;<A HREF="TJTransformer.html" target="_top"><B>NO FRAMES</B></A> &nbsp; allClassesLink = document.getElementById("allclasses_navbar_bottom");
&nbsp;<SCRIPT type="text/javascript">
<!--
if(window==top) { if(window==top) {
document.writeln('<A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A>'); allClassesLink.style.display = "block";
}
else {
allClassesLink.style.display = "none";
} }
//--> //-->
</SCRIPT> </script>
<NOSCRIPT> </div>
<A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A> <div>
</NOSCRIPT> <ul class="subNavList">
<li>Summary:&nbsp;</li>
<li>Nested&nbsp;|&nbsp;</li>
</FONT></TD> <li><a href="#fields_inherited_from_class_org.libjpegturbo.turbojpeg.TJDecompressor">Field</a>&nbsp;|&nbsp;</li>
</TR> <li><a href="#constructor_summary">Constr</a>&nbsp;|&nbsp;</li>
<TR> <li><a href="#method_summary">Method</a></li>
<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2"> </ul>
SUMMARY:&nbsp;NESTED&nbsp;|&nbsp;<A HREF="#fields_inherited_from_class_org.libjpegturbo.turbojpeg.TJDecompressor">FIELD</A>&nbsp;|&nbsp;<A HREF="#constructor_summary">CONSTR</A>&nbsp;|&nbsp;<A HREF="#method_summary">METHOD</A></FONT></TD> <ul class="subNavList">
<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2"> <li>Detail:&nbsp;</li>
DETAIL:&nbsp;FIELD&nbsp;|&nbsp;<A HREF="#constructor_detail">CONSTR</A>&nbsp;|&nbsp;<A HREF="#method_detail">METHOD</A></FONT></TD> <li>Field&nbsp;|&nbsp;</li>
</TR> <li><a href="#constructor_detail">Constr</a>&nbsp;|&nbsp;</li>
</TABLE> <li><a href="#method_detail">Method</a></li>
<A NAME="skip-navbar_bottom"></A> </ul>
</div>
<a name="skip-navbar_bottom">
<!-- -->
</a></div>
<!-- ======== END OF BOTTOM NAVBAR ======= --> <!-- ======== END OF BOTTOM NAVBAR ======= -->
</body>
<HR> </html>
</BODY>
</HTML>

View File

@@ -0,0 +1,806 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!-- NewPage -->
<html lang="en">
<head>
<title>YUVImage</title>
<link rel="stylesheet" type="text/css" href="../../../stylesheet.css" title="Style">
</head>
<body>
<script type="text/javascript"><!--
if (location.href.indexOf('is-external=true') == -1) {
parent.document.title="YUVImage";
}
//-->
</script>
<noscript>
<div>JavaScript is disabled on your browser.</div>
</noscript>
<!-- ========= START OF TOP NAVBAR ======= -->
<div class="topNav"><a name="navbar_top">
<!-- -->
</a><a href="#skip-navbar_top" title="Skip navigation links"></a><a name="navbar_top_firstrow">
<!-- -->
</a>
<ul class="navList" title="Navigation">
<li><a href="../../../org/libjpegturbo/turbojpeg/package-summary.html">Package</a></li>
<li class="navBarCell1Rev">Class</li>
<li><a href="package-tree.html">Tree</a></li>
<li><a href="../../../deprecated-list.html">Deprecated</a></li>
<li><a href="../../../index-all.html">Index</a></li>
<li><a href="../../../help-doc.html">Help</a></li>
</ul>
</div>
<div class="subNav">
<ul class="navList">
<li><a href="../../../org/libjpegturbo/turbojpeg/TJTransformer.html" title="class in org.libjpegturbo.turbojpeg"><span class="strong">Prev Class</span></a></li>
<li>Next Class</li>
</ul>
<ul class="navList">
<li><a href="../../../index.html?org/libjpegturbo/turbojpeg/YUVImage.html" target="_top">Frames</a></li>
<li><a href="YUVImage.html" target="_top">No Frames</a></li>
</ul>
<ul class="navList" id="allclasses_navbar_top">
<li><a href="../../../allclasses-noframe.html">All Classes</a></li>
</ul>
<div>
<script type="text/javascript"><!--
allClassesLink = document.getElementById("allclasses_navbar_top");
if(window==top) {
allClassesLink.style.display = "block";
}
else {
allClassesLink.style.display = "none";
}
//-->
</script>
</div>
<div>
<ul class="subNavList">
<li>Summary:&nbsp;</li>
<li>Nested&nbsp;|&nbsp;</li>
<li><a href="#field_summary">Field</a>&nbsp;|&nbsp;</li>
<li><a href="#constructor_summary">Constr</a>&nbsp;|&nbsp;</li>
<li><a href="#method_summary">Method</a></li>
</ul>
<ul class="subNavList">
<li>Detail:&nbsp;</li>
<li><a href="#field_detail">Field</a>&nbsp;|&nbsp;</li>
<li><a href="#constructor_detail">Constr</a>&nbsp;|&nbsp;</li>
<li><a href="#method_detail">Method</a></li>
</ul>
</div>
<a name="skip-navbar_top">
<!-- -->
</a></div>
<!-- ========= END OF TOP NAVBAR ========= -->
<!-- ======== START OF CLASS DATA ======== -->
<div class="header">
<div class="subTitle">org.libjpegturbo.turbojpeg</div>
<h2 title="Class YUVImage" class="title">Class YUVImage</h2>
</div>
<div class="contentContainer">
<ul class="inheritance">
<li>java.lang.Object</li>
<li>
<ul class="inheritance">
<li>org.libjpegturbo.turbojpeg.YUVImage</li>
</ul>
</li>
</ul>
<div class="description">
<ul class="blockList">
<li class="blockList">
<hr>
<br>
<pre>public class <span class="strong">YUVImage</span>
extends java.lang.Object</pre>
<div class="block">This class encapsulates a YUV planar image and the metadata
associated with it. The TurboJPEG API allows both the JPEG compression and
decompression pipelines to be split into stages: YUV encode, compress from
YUV, decompress to YUV, and YUV decode. A <code>YUVImage</code> instance
serves as the destination image for YUV encode and decompress-to-YUV
operations and as the source image for compress-from-YUV and YUV decode
operations.
<p>
Technically, the JPEG format uses the YCbCr colorspace (which technically is
not a "colorspace" but rather a "color transform"), but per the convention
of the digital video community, the TurboJPEG API uses "YUV" to refer to an
image format consisting of Y, Cb, and Cr image planes.
<p>
Each plane is simply a 2D array of bytes, each byte representing the value
of one of the components (Y, Cb, or Cr) at a particular location in the
image. The width and height of each plane are determined by the image
width, height, and level of chrominance subsampling. The luminance plane
width is the image width padded to the nearest multiple of the horizontal
subsampling factor (2 in the case of 4:2:0 and 4:2:2, 4 in the case of
4:1:1, 1 in the case of 4:4:4 or grayscale.) Similarly, the luminance plane
height is the image height padded to the nearest multiple of the vertical
subsampling factor (2 in the case of 4:2:0 or 4:4:0, 1 in the case of 4:4:4
or grayscale.) The chrominance plane width is equal to the luminance plane
width divided by the horizontal subsampling factor, and the chrominance
plane height is equal to the luminance plane height divided by the vertical
subsampling factor.
<p>
For example, if the source image is 35 x 35 pixels and 4:2:2 subsampling is
used, then the luminance plane would be 36 x 35 bytes, and each of the
chrominance planes would be 18 x 35 bytes. If you specify a line padding of
4 bytes on top of this, then the luminance plane would be 36 x 35 bytes, and
each of the chrominance planes would be 20 x 35 bytes.</div>
</li>
</ul>
</div>
<div class="summary">
<ul class="blockList">
<li class="blockList">
<!-- =========== FIELD SUMMARY =========== -->
<ul class="blockList">
<li class="blockList"><a name="field_summary">
<!-- -->
</a>
<h3>Field Summary</h3>
<table class="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="Field Summary table, listing fields, and an explanation">
<caption><span>Fields</span><span class="tabEnd">&nbsp;</span></caption>
<tr>
<th class="colFirst" scope="col">Modifier and Type</th>
<th class="colLast" scope="col">Field and Description</th>
</tr>
<tr class="altColor">
<td class="colFirst"><code>protected long</code></td>
<td class="colLast"><code><strong><a href="../../../org/libjpegturbo/turbojpeg/YUVImage.html#handle">handle</a></strong></code>&nbsp;</td>
</tr>
<tr class="rowColor">
<td class="colFirst"><code>protected int</code></td>
<td class="colLast"><code><strong><a href="../../../org/libjpegturbo/turbojpeg/YUVImage.html#yuvHeight">yuvHeight</a></strong></code>&nbsp;</td>
</tr>
<tr class="altColor">
<td class="colFirst"><code>protected int[]</code></td>
<td class="colLast"><code><strong><a href="../../../org/libjpegturbo/turbojpeg/YUVImage.html#yuvOffsets">yuvOffsets</a></strong></code>&nbsp;</td>
</tr>
<tr class="rowColor">
<td class="colFirst"><code>protected int</code></td>
<td class="colLast"><code><strong><a href="../../../org/libjpegturbo/turbojpeg/YUVImage.html#yuvPad">yuvPad</a></strong></code>&nbsp;</td>
</tr>
<tr class="altColor">
<td class="colFirst"><code>protected byte[][]</code></td>
<td class="colLast"><code><strong><a href="../../../org/libjpegturbo/turbojpeg/YUVImage.html#yuvPlanes">yuvPlanes</a></strong></code>&nbsp;</td>
</tr>
<tr class="rowColor">
<td class="colFirst"><code>protected int[]</code></td>
<td class="colLast"><code><strong><a href="../../../org/libjpegturbo/turbojpeg/YUVImage.html#yuvStrides">yuvStrides</a></strong></code>&nbsp;</td>
</tr>
<tr class="altColor">
<td class="colFirst"><code>protected int</code></td>
<td class="colLast"><code><strong><a href="../../../org/libjpegturbo/turbojpeg/YUVImage.html#yuvSubsamp">yuvSubsamp</a></strong></code>&nbsp;</td>
</tr>
<tr class="rowColor">
<td class="colFirst"><code>protected int</code></td>
<td class="colLast"><code><strong><a href="../../../org/libjpegturbo/turbojpeg/YUVImage.html#yuvWidth">yuvWidth</a></strong></code>&nbsp;</td>
</tr>
</table>
</li>
</ul>
<!-- ======== CONSTRUCTOR SUMMARY ======== -->
<ul class="blockList">
<li class="blockList"><a name="constructor_summary">
<!-- -->
</a>
<h3>Constructor Summary</h3>
<table class="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="Constructor Summary table, listing constructors, and an explanation">
<caption><span>Constructors</span><span class="tabEnd">&nbsp;</span></caption>
<tr>
<th class="colOne" scope="col">Constructor and Description</th>
</tr>
<tr class="altColor">
<td class="colOne"><code><strong><a href="../../../org/libjpegturbo/turbojpeg/YUVImage.html#YUVImage(byte[][],%20int[],%20int,%20int[],%20int,%20int)">YUVImage</a></strong>(byte[][]&nbsp;planes,
int[]&nbsp;offsets,
int&nbsp;width,
int[]&nbsp;strides,
int&nbsp;height,
int&nbsp;subsamp)</code>
<div class="block">Create a new <code>YUVImage</code> instance from a set of existing image
planes.</div>
</td>
</tr>
<tr class="rowColor">
<td class="colOne"><code><strong><a href="../../../org/libjpegturbo/turbojpeg/YUVImage.html#YUVImage(byte[],%20int,%20int,%20int,%20int)">YUVImage</a></strong>(byte[]&nbsp;yuvImage,
int&nbsp;width,
int&nbsp;pad,
int&nbsp;height,
int&nbsp;subsamp)</code>
<div class="block">Create a new <code>YUVImage</code> instance from an existing unified image
buffer.</div>
</td>
</tr>
<tr class="altColor">
<td class="colOne"><code><strong><a href="../../../org/libjpegturbo/turbojpeg/YUVImage.html#YUVImage(int,%20int[],%20int,%20int)">YUVImage</a></strong>(int&nbsp;width,
int[]&nbsp;strides,
int&nbsp;height,
int&nbsp;subsamp)</code>
<div class="block">Create a new <code>YUVImage</code> instance backed by separate image
planes, and allocate memory for the image planes.</div>
</td>
</tr>
<tr class="rowColor">
<td class="colOne"><code><strong><a href="../../../org/libjpegturbo/turbojpeg/YUVImage.html#YUVImage(int,%20int,%20int,%20int)">YUVImage</a></strong>(int&nbsp;width,
int&nbsp;pad,
int&nbsp;height,
int&nbsp;subsamp)</code>
<div class="block">Create a new <code>YUVImage</code> instance backed by a unified image
buffer, and allocate memory for the image buffer.</div>
</td>
</tr>
</table>
</li>
</ul>
<!-- ========== METHOD SUMMARY =========== -->
<ul class="blockList">
<li class="blockList"><a name="method_summary">
<!-- -->
</a>
<h3>Method Summary</h3>
<table class="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="Method Summary table, listing methods, and an explanation">
<caption><span>Methods</span><span class="tabEnd">&nbsp;</span></caption>
<tr>
<th class="colFirst" scope="col">Modifier and Type</th>
<th class="colLast" scope="col">Method and Description</th>
</tr>
<tr class="altColor">
<td class="colFirst"><code>byte[]</code></td>
<td class="colLast"><code><strong><a href="../../../org/libjpegturbo/turbojpeg/YUVImage.html#getBuf()">getBuf</a></strong>()</code>
<div class="block">Returns the YUV image buffer (if this image is stored in a unified
buffer rather than separate image planes.)</div>
</td>
</tr>
<tr class="rowColor">
<td class="colFirst"><code>int</code></td>
<td class="colLast"><code><strong><a href="../../../org/libjpegturbo/turbojpeg/YUVImage.html#getHeight()">getHeight</a></strong>()</code>
<div class="block">Returns the height of the YUV image (or subregion.)</div>
</td>
</tr>
<tr class="altColor">
<td class="colFirst"><code>int[]</code></td>
<td class="colLast"><code><strong><a href="../../../org/libjpegturbo/turbojpeg/YUVImage.html#getOffsets()">getOffsets</a></strong>()</code>
<div class="block">Returns the offsets (in bytes) of each plane within the planes of a larger
YUV image.</div>
</td>
</tr>
<tr class="rowColor">
<td class="colFirst"><code>int</code></td>
<td class="colLast"><code><strong><a href="../../../org/libjpegturbo/turbojpeg/YUVImage.html#getPad()">getPad</a></strong>()</code>
<div class="block">Returns the line padding used in the YUV image buffer (if this image is
stored in a unified buffer rather than separate image planes.)</div>
</td>
</tr>
<tr class="altColor">
<td class="colFirst"><code>byte[][]</code></td>
<td class="colLast"><code><strong><a href="../../../org/libjpegturbo/turbojpeg/YUVImage.html#getPlanes()">getPlanes</a></strong>()</code>
<div class="block">Returns the YUV image planes.</div>
</td>
</tr>
<tr class="rowColor">
<td class="colFirst"><code>int</code></td>
<td class="colLast"><code><strong><a href="../../../org/libjpegturbo/turbojpeg/YUVImage.html#getSize()">getSize</a></strong>()</code>
<div class="block">Returns the size (in bytes) of the YUV image buffer (if this image is
stored in a unified buffer rather than separate image planes.)</div>
</td>
</tr>
<tr class="altColor">
<td class="colFirst"><code>int[]</code></td>
<td class="colLast"><code><strong><a href="../../../org/libjpegturbo/turbojpeg/YUVImage.html#getStrides()">getStrides</a></strong>()</code>
<div class="block">Returns the number of bytes per line of each plane in the YUV image.</div>
</td>
</tr>
<tr class="rowColor">
<td class="colFirst"><code>int</code></td>
<td class="colLast"><code><strong><a href="../../../org/libjpegturbo/turbojpeg/YUVImage.html#getSubsamp()">getSubsamp</a></strong>()</code>
<div class="block">Returns the level of chrominance subsampling used in the YUV image.</div>
</td>
</tr>
<tr class="altColor">
<td class="colFirst"><code>int</code></td>
<td class="colLast"><code><strong><a href="../../../org/libjpegturbo/turbojpeg/YUVImage.html#getWidth()">getWidth</a></strong>()</code>
<div class="block">Returns the width of the YUV image (or subregion.)</div>
</td>
</tr>
<tr class="rowColor">
<td class="colFirst"><code>void</code></td>
<td class="colLast"><code><strong><a href="../../../org/libjpegturbo/turbojpeg/YUVImage.html#setBuf(byte[][],%20int[],%20int,%20int[],%20int,%20int)">setBuf</a></strong>(byte[][]&nbsp;planes,
int[]&nbsp;offsets,
int&nbsp;width,
int[]&nbsp;strides,
int&nbsp;height,
int&nbsp;subsamp)</code>
<div class="block">Assign a set of image planes to this <code>YUVImage</code> instance.</div>
</td>
</tr>
<tr class="altColor">
<td class="colFirst"><code>void</code></td>
<td class="colLast"><code><strong><a href="../../../org/libjpegturbo/turbojpeg/YUVImage.html#setBuf(byte[],%20int,%20int,%20int,%20int)">setBuf</a></strong>(byte[]&nbsp;yuvImage,
int&nbsp;width,
int&nbsp;pad,
int&nbsp;height,
int&nbsp;subsamp)</code>
<div class="block">Assign a unified image buffer to this <code>YUVImage</code> instance.</div>
</td>
</tr>
</table>
<ul class="blockList">
<li class="blockList"><a name="methods_inherited_from_class_java.lang.Object">
<!-- -->
</a>
<h3>Methods inherited from class&nbsp;java.lang.Object</h3>
<code>clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait</code></li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
<div class="details">
<ul class="blockList">
<li class="blockList">
<!-- ============ FIELD DETAIL =========== -->
<ul class="blockList">
<li class="blockList"><a name="field_detail">
<!-- -->
</a>
<h3>Field Detail</h3>
<a name="handle">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>handle</h4>
<pre>protected&nbsp;long handle</pre>
</li>
</ul>
<a name="yuvPlanes">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>yuvPlanes</h4>
<pre>protected&nbsp;byte[][] yuvPlanes</pre>
</li>
</ul>
<a name="yuvOffsets">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>yuvOffsets</h4>
<pre>protected&nbsp;int[] yuvOffsets</pre>
</li>
</ul>
<a name="yuvStrides">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>yuvStrides</h4>
<pre>protected&nbsp;int[] yuvStrides</pre>
</li>
</ul>
<a name="yuvPad">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>yuvPad</h4>
<pre>protected&nbsp;int yuvPad</pre>
</li>
</ul>
<a name="yuvWidth">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>yuvWidth</h4>
<pre>protected&nbsp;int yuvWidth</pre>
</li>
</ul>
<a name="yuvHeight">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>yuvHeight</h4>
<pre>protected&nbsp;int yuvHeight</pre>
</li>
</ul>
<a name="yuvSubsamp">
<!-- -->
</a>
<ul class="blockListLast">
<li class="blockList">
<h4>yuvSubsamp</h4>
<pre>protected&nbsp;int yuvSubsamp</pre>
</li>
</ul>
</li>
</ul>
<!-- ========= CONSTRUCTOR DETAIL ======== -->
<ul class="blockList">
<li class="blockList"><a name="constructor_detail">
<!-- -->
</a>
<h3>Constructor Detail</h3>
<a name="YUVImage(int, int[], int, int)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>YUVImage</h4>
<pre>public&nbsp;YUVImage(int&nbsp;width,
int[]&nbsp;strides,
int&nbsp;height,
int&nbsp;subsamp)
throws java.lang.Exception</pre>
<div class="block">Create a new <code>YUVImage</code> instance backed by separate image
planes, and allocate memory for the image planes.</div>
<dl><dt><span class="strong">Parameters:</span></dt><dd><code>width</code> - width (in pixels) of the YUV image</dd><dd><code>strides</code> - an array of integers, each specifying the number of bytes
per line in the corresponding plane of the YUV image. Setting the stride
for any plane to 0 is the same as setting it to the plane width (see
<a href="../../../org/libjpegturbo/turbojpeg/YUVImage.html" title="class in org.libjpegturbo.turbojpeg"><code>above</code></a>.) If <code>strides</code> is null, then the
strides for all planes will be set to their respective plane widths. When
using this constructor, the stride for each plane must be equal to or
greater than the plane width.</dd><dd><code>height</code> - height (in pixels) of the YUV image</dd><dd><code>subsamp</code> - the level of chrominance subsampling to be used in the YUV
image (one of <a href="../../../org/libjpegturbo/turbojpeg/TJ.html#SAMP_444"><code>TJ.SAMP_*</code></a>)</dd>
<dt><span class="strong">Throws:</span></dt>
<dd><code>java.lang.Exception</code></dd></dl>
</li>
</ul>
<a name="YUVImage(int, int, int, int)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>YUVImage</h4>
<pre>public&nbsp;YUVImage(int&nbsp;width,
int&nbsp;pad,
int&nbsp;height,
int&nbsp;subsamp)
throws java.lang.Exception</pre>
<div class="block">Create a new <code>YUVImage</code> instance backed by a unified image
buffer, and allocate memory for the image buffer.</div>
<dl><dt><span class="strong">Parameters:</span></dt><dd><code>width</code> - width (in pixels) of the YUV image</dd><dd><code>pad</code> - Each line of each plane in the YUV image buffer will be padded
to this number of bytes (must be a power of 2.)</dd><dd><code>height</code> - height (in pixels) of the YUV image</dd><dd><code>subsamp</code> - the level of chrominance subsampling to be used in the YUV
image (one of <a href="../../../org/libjpegturbo/turbojpeg/TJ.html#SAMP_444"><code>TJ.SAMP_*</code></a>)</dd>
<dt><span class="strong">Throws:</span></dt>
<dd><code>java.lang.Exception</code></dd></dl>
</li>
</ul>
<a name="YUVImage(byte[][], int[], int, int[], int, int)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>YUVImage</h4>
<pre>public&nbsp;YUVImage(byte[][]&nbsp;planes,
int[]&nbsp;offsets,
int&nbsp;width,
int[]&nbsp;strides,
int&nbsp;height,
int&nbsp;subsamp)
throws java.lang.Exception</pre>
<div class="block">Create a new <code>YUVImage</code> instance from a set of existing image
planes.</div>
<dl><dt><span class="strong">Parameters:</span></dt><dd><code>planes</code> - an array of buffers representing the Y, U (Cb), and V (Cr)
image planes (or just the Y plane, if the image is grayscale.) These
planes can be contiguous or non-contiguous in memory. Plane
<code>i</code> should be at least <code>offsets[i] +
<a href="../../../org/libjpegturbo/turbojpeg/TJ.html#planeSizeYUV(int,%20int,%20int,%20int,%20int)"><code>TJ.planeSizeYUV</code></a>(i, width, strides[i], height, subsamp)</code>
bytes in size.</dd><dd><code>offsets</code> - If this <code>YUVImage</code> instance represents a
subregion of a larger image, then <code>offsets[i]</code> specifies the
offset (in bytes) of the subregion within plane <code>i</code> of the
larger image. Setting this to null is the same as setting the offsets for
all planes to 0.</dd><dd><code>width</code> - width (in pixels) of the new YUV image (or subregion)</dd><dd><code>strides</code> - an array of integers, each specifying the number of bytes
per line in the corresponding plane of the YUV image. Setting the stride
for any plane to 0 is the same as setting it to the plane width (see
<a href="../../../org/libjpegturbo/turbojpeg/YUVImage.html" title="class in org.libjpegturbo.turbojpeg"><code>above</code></a>.) If <code>strides</code> is null, then the
strides for all planes will be set to their respective plane widths. You
can adjust the strides in order to add an arbitrary amount of line padding
to each plane or to specify that this <code>YUVImage</code> instance is a
subregion of a larger image (in which case, <code>strides[i]</code> should
be set to the plane width of plane <code>i</code> in the larger image.)</dd><dd><code>height</code> - height (in pixels) of the new YUV image (or subregion)</dd><dd><code>subsamp</code> - the level of chrominance subsampling used in the YUV
image (one of <a href="../../../org/libjpegturbo/turbojpeg/TJ.html#SAMP_444"><code>TJ.SAMP_*</code></a>)</dd>
<dt><span class="strong">Throws:</span></dt>
<dd><code>java.lang.Exception</code></dd></dl>
</li>
</ul>
<a name="YUVImage(byte[], int, int, int, int)">
<!-- -->
</a>
<ul class="blockListLast">
<li class="blockList">
<h4>YUVImage</h4>
<pre>public&nbsp;YUVImage(byte[]&nbsp;yuvImage,
int&nbsp;width,
int&nbsp;pad,
int&nbsp;height,
int&nbsp;subsamp)
throws java.lang.Exception</pre>
<div class="block">Create a new <code>YUVImage</code> instance from an existing unified image
buffer.</div>
<dl><dt><span class="strong">Parameters:</span></dt><dd><code>yuvImage</code> - image buffer that contains or will contain YUV planar
image data. Use <a href="../../../org/libjpegturbo/turbojpeg/TJ.html#bufSizeYUV(int,%20int,%20int,%20int)"><code>TJ.bufSizeYUV(int, int, int, int)</code></a> to determine the minimum size for
this buffer. The Y, U (Cb), and V (Cr) image planes are stored
sequentially in the buffer (see <a href="../../../org/libjpegturbo/turbojpeg/YUVImage.html" title="class in org.libjpegturbo.turbojpeg"><code>above</code></a> for a description
of the image format.)</dd><dd><code>width</code> - width (in pixels) of the YUV image</dd><dd><code>pad</code> - the line padding used in the YUV image buffer. For
instance, if each line in each plane of the buffer is padded to the
nearest multiple of 4 bytes, then <code>pad</code> should be set to 4.</dd><dd><code>height</code> - height (in pixels) of the YUV image</dd><dd><code>subsamp</code> - the level of chrominance subsampling used in the YUV
image (one of <a href="../../../org/libjpegturbo/turbojpeg/TJ.html#SAMP_444"><code>TJ.SAMP_*</code></a>)</dd>
<dt><span class="strong">Throws:</span></dt>
<dd><code>java.lang.Exception</code></dd></dl>
</li>
</ul>
</li>
</ul>
<!-- ============ METHOD DETAIL ========== -->
<ul class="blockList">
<li class="blockList"><a name="method_detail">
<!-- -->
</a>
<h3>Method Detail</h3>
<a name="setBuf(byte[][], int[], int, int[], int, int)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>setBuf</h4>
<pre>public&nbsp;void&nbsp;setBuf(byte[][]&nbsp;planes,
int[]&nbsp;offsets,
int&nbsp;width,
int[]&nbsp;strides,
int&nbsp;height,
int&nbsp;subsamp)
throws java.lang.Exception</pre>
<div class="block">Assign a set of image planes to this <code>YUVImage</code> instance.</div>
<dl><dt><span class="strong">Parameters:</span></dt><dd><code>planes</code> - an array of buffers representing the Y, U (Cb), and V (Cr)
image planes (or just the Y plane, if the image is grayscale.) These
planes can be contiguous or non-contiguous in memory. Plane
<code>i</code> should be at least <code>offsets[i] +
<a href="../../../org/libjpegturbo/turbojpeg/TJ.html#planeSizeYUV(int,%20int,%20int,%20int,%20int)"><code>TJ.planeSizeYUV</code></a>(i, width, strides[i], height, subsamp)</code>
bytes in size.</dd><dd><code>offsets</code> - If this <code>YUVImage</code> instance represents a
subregion of a larger image, then <code>offsets[i]</code> specifies the
offset (in bytes) of the subregion within plane <code>i</code> of the
larger image. Setting this to null is the same as setting the offsets for
all planes to 0.</dd><dd><code>width</code> - width (in pixels) of the YUV image (or subregion)</dd><dd><code>strides</code> - an array of integers, each specifying the number of bytes
per line in the corresponding plane of the YUV image. Setting the stride
for any plane to 0 is the same as setting it to the plane width (see
<a href="../../../org/libjpegturbo/turbojpeg/YUVImage.html" title="class in org.libjpegturbo.turbojpeg"><code>above</code></a>.) If <code>strides</code> is null, then the
strides for all planes will be set to their respective plane widths. You
can adjust the strides in order to add an arbitrary amount of line padding
to each plane or to specify that this <code>YUVImage</code> image is a
subregion of a larger image (in which case, <code>strides[i]</code> should
be set to the plane width of plane <code>i</code> in the larger image.)</dd><dd><code>height</code> - height (in pixels) of the YUV image (or subregion)</dd><dd><code>subsamp</code> - the level of chrominance subsampling used in the YUV
image (one of <a href="../../../org/libjpegturbo/turbojpeg/TJ.html#SAMP_444"><code>TJ.SAMP_*</code></a>)</dd>
<dt><span class="strong">Throws:</span></dt>
<dd><code>java.lang.Exception</code></dd></dl>
</li>
</ul>
<a name="setBuf(byte[], int, int, int, int)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>setBuf</h4>
<pre>public&nbsp;void&nbsp;setBuf(byte[]&nbsp;yuvImage,
int&nbsp;width,
int&nbsp;pad,
int&nbsp;height,
int&nbsp;subsamp)
throws java.lang.Exception</pre>
<div class="block">Assign a unified image buffer to this <code>YUVImage</code> instance.</div>
<dl><dt><span class="strong">Parameters:</span></dt><dd><code>yuvImage</code> - image buffer that contains or will contain YUV planar
image data. Use <a href="../../../org/libjpegturbo/turbojpeg/TJ.html#bufSizeYUV(int,%20int,%20int,%20int)"><code>TJ.bufSizeYUV(int, int, int, int)</code></a> to determine the minimum size for
this buffer. The Y, U (Cb), and V (Cr) image planes are stored
sequentially in the buffer (see <a href="../../../org/libjpegturbo/turbojpeg/YUVImage.html" title="class in org.libjpegturbo.turbojpeg"><code>above</code></a> for a description
of the image format.)</dd><dd><code>width</code> - width (in pixels) of the YUV image</dd><dd><code>pad</code> - the line padding used in the YUV image buffer. For
instance, if each line in each plane of the buffer is padded to the
nearest multiple of 4 bytes, then <code>pad</code> should be set to 4.</dd><dd><code>height</code> - height (in pixels) of the YUV image</dd><dd><code>subsamp</code> - the level of chrominance subsampling used in the YUV
image (one of <a href="../../../org/libjpegturbo/turbojpeg/TJ.html#SAMP_444"><code>TJ.SAMP_*</code></a>)</dd>
<dt><span class="strong">Throws:</span></dt>
<dd><code>java.lang.Exception</code></dd></dl>
</li>
</ul>
<a name="getWidth()">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>getWidth</h4>
<pre>public&nbsp;int&nbsp;getWidth()
throws java.lang.Exception</pre>
<div class="block">Returns the width of the YUV image (or subregion.)</div>
<dl><dt><span class="strong">Returns:</span></dt><dd>the width of the YUV image (or subregion)</dd>
<dt><span class="strong">Throws:</span></dt>
<dd><code>java.lang.Exception</code></dd></dl>
</li>
</ul>
<a name="getHeight()">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>getHeight</h4>
<pre>public&nbsp;int&nbsp;getHeight()
throws java.lang.Exception</pre>
<div class="block">Returns the height of the YUV image (or subregion.)</div>
<dl><dt><span class="strong">Returns:</span></dt><dd>the height of the YUV image (or subregion)</dd>
<dt><span class="strong">Throws:</span></dt>
<dd><code>java.lang.Exception</code></dd></dl>
</li>
</ul>
<a name="getPad()">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>getPad</h4>
<pre>public&nbsp;int&nbsp;getPad()
throws java.lang.Exception</pre>
<div class="block">Returns the line padding used in the YUV image buffer (if this image is
stored in a unified buffer rather than separate image planes.)</div>
<dl><dt><span class="strong">Returns:</span></dt><dd>the line padding used in the YUV image buffer</dd>
<dt><span class="strong">Throws:</span></dt>
<dd><code>java.lang.Exception</code></dd></dl>
</li>
</ul>
<a name="getStrides()">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>getStrides</h4>
<pre>public&nbsp;int[]&nbsp;getStrides()
throws java.lang.Exception</pre>
<div class="block">Returns the number of bytes per line of each plane in the YUV image.</div>
<dl><dt><span class="strong">Returns:</span></dt><dd>the number of bytes per line of each plane in the YUV image</dd>
<dt><span class="strong">Throws:</span></dt>
<dd><code>java.lang.Exception</code></dd></dl>
</li>
</ul>
<a name="getOffsets()">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>getOffsets</h4>
<pre>public&nbsp;int[]&nbsp;getOffsets()
throws java.lang.Exception</pre>
<div class="block">Returns the offsets (in bytes) of each plane within the planes of a larger
YUV image.</div>
<dl><dt><span class="strong">Returns:</span></dt><dd>the offsets (in bytes) of each plane within the planes of a larger
YUV image</dd>
<dt><span class="strong">Throws:</span></dt>
<dd><code>java.lang.Exception</code></dd></dl>
</li>
</ul>
<a name="getSubsamp()">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>getSubsamp</h4>
<pre>public&nbsp;int&nbsp;getSubsamp()
throws java.lang.Exception</pre>
<div class="block">Returns the level of chrominance subsampling used in the YUV image. See
<a href="../../../org/libjpegturbo/turbojpeg/TJ.html#SAMP_444"><code>TJ.SAMP_*</code></a>.</div>
<dl><dt><span class="strong">Returns:</span></dt><dd>the level of chrominance subsampling used in the YUV image</dd>
<dt><span class="strong">Throws:</span></dt>
<dd><code>java.lang.Exception</code></dd></dl>
</li>
</ul>
<a name="getPlanes()">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>getPlanes</h4>
<pre>public&nbsp;byte[][]&nbsp;getPlanes()
throws java.lang.Exception</pre>
<div class="block">Returns the YUV image planes. If the image is stored in a unified buffer,
then all image planes will point to that buffer.</div>
<dl><dt><span class="strong">Returns:</span></dt><dd>the YUV image planes</dd>
<dt><span class="strong">Throws:</span></dt>
<dd><code>java.lang.Exception</code></dd></dl>
</li>
</ul>
<a name="getBuf()">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>getBuf</h4>
<pre>public&nbsp;byte[]&nbsp;getBuf()
throws java.lang.Exception</pre>
<div class="block">Returns the YUV image buffer (if this image is stored in a unified
buffer rather than separate image planes.)</div>
<dl><dt><span class="strong">Returns:</span></dt><dd>the YUV image buffer</dd>
<dt><span class="strong">Throws:</span></dt>
<dd><code>java.lang.Exception</code></dd></dl>
</li>
</ul>
<a name="getSize()">
<!-- -->
</a>
<ul class="blockListLast">
<li class="blockList">
<h4>getSize</h4>
<pre>public&nbsp;int&nbsp;getSize()
throws java.lang.Exception</pre>
<div class="block">Returns the size (in bytes) of the YUV image buffer (if this image is
stored in a unified buffer rather than separate image planes.)</div>
<dl><dt><span class="strong">Returns:</span></dt><dd>the size (in bytes) of the YUV image buffer</dd>
<dt><span class="strong">Throws:</span></dt>
<dd><code>java.lang.Exception</code></dd></dl>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
</div>
<!-- ========= END OF CLASS DATA ========= -->
<!-- ======= START OF BOTTOM NAVBAR ====== -->
<div class="bottomNav"><a name="navbar_bottom">
<!-- -->
</a><a href="#skip-navbar_bottom" title="Skip navigation links"></a><a name="navbar_bottom_firstrow">
<!-- -->
</a>
<ul class="navList" title="Navigation">
<li><a href="../../../org/libjpegturbo/turbojpeg/package-summary.html">Package</a></li>
<li class="navBarCell1Rev">Class</li>
<li><a href="package-tree.html">Tree</a></li>
<li><a href="../../../deprecated-list.html">Deprecated</a></li>
<li><a href="../../../index-all.html">Index</a></li>
<li><a href="../../../help-doc.html">Help</a></li>
</ul>
</div>
<div class="subNav">
<ul class="navList">
<li><a href="../../../org/libjpegturbo/turbojpeg/TJTransformer.html" title="class in org.libjpegturbo.turbojpeg"><span class="strong">Prev Class</span></a></li>
<li>Next Class</li>
</ul>
<ul class="navList">
<li><a href="../../../index.html?org/libjpegturbo/turbojpeg/YUVImage.html" target="_top">Frames</a></li>
<li><a href="YUVImage.html" target="_top">No Frames</a></li>
</ul>
<ul class="navList" id="allclasses_navbar_bottom">
<li><a href="../../../allclasses-noframe.html">All Classes</a></li>
</ul>
<div>
<script type="text/javascript"><!--
allClassesLink = document.getElementById("allclasses_navbar_bottom");
if(window==top) {
allClassesLink.style.display = "block";
}
else {
allClassesLink.style.display = "none";
}
//-->
</script>
</div>
<div>
<ul class="subNavList">
<li>Summary:&nbsp;</li>
<li>Nested&nbsp;|&nbsp;</li>
<li><a href="#field_summary">Field</a>&nbsp;|&nbsp;</li>
<li><a href="#constructor_summary">Constr</a>&nbsp;|&nbsp;</li>
<li><a href="#method_summary">Method</a></li>
</ul>
<ul class="subNavList">
<li>Detail:&nbsp;</li>
<li><a href="#field_detail">Field</a>&nbsp;|&nbsp;</li>
<li><a href="#constructor_detail">Constr</a>&nbsp;|&nbsp;</li>
<li><a href="#method_detail">Method</a></li>
</ul>
</div>
<a name="skip-navbar_bottom">
<!-- -->
</a></div>
<!-- ======== END OF BOTTOM NAVBAR ======= -->
</body>
</html>

View File

@@ -1,51 +1,27 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!-- NewPage --> <!-- NewPage -->
<HTML> <html lang="en">
<HEAD> <head>
<TITLE> <title>org.libjpegturbo.turbojpeg</title>
org.libjpegturbo.turbojpeg <link rel="stylesheet" type="text/css" href="../../../stylesheet.css" title="Style">
</TITLE> </head>
<body>
<h1 class="bar"><a href="../../../org/libjpegturbo/turbojpeg/package-summary.html" target="classFrame">org.libjpegturbo.turbojpeg</a></h1>
<LINK REL ="stylesheet" TYPE="text/css" HREF="../../../stylesheet.css" TITLE="Style"> <div class="indexContainer">
<h2 title="Interfaces">Interfaces</h2>
<ul title="Interfaces">
</HEAD> <li><a href="TJCustomFilter.html" title="interface in org.libjpegturbo.turbojpeg" target="classFrame"><i>TJCustomFilter</i></a></li>
</ul>
<BODY BGCOLOR="white"> <h2 title="Classes">Classes</h2>
<FONT size="+1" CLASS="FrameTitleFont"> <ul title="Classes">
<A HREF="../../../org/libjpegturbo/turbojpeg/package-summary.html" target="classFrame">org.libjpegturbo.turbojpeg</A></FONT> <li><a href="TJ.html" title="class in org.libjpegturbo.turbojpeg" target="classFrame">TJ</a></li>
<TABLE BORDER="0" WIDTH="100%" SUMMARY=""> <li><a href="TJCompressor.html" title="class in org.libjpegturbo.turbojpeg" target="classFrame">TJCompressor</a></li>
<TR> <li><a href="TJDecompressor.html" title="class in org.libjpegturbo.turbojpeg" target="classFrame">TJDecompressor</a></li>
<TD NOWRAP><FONT size="+1" CLASS="FrameHeadingFont"> <li><a href="TJScalingFactor.html" title="class in org.libjpegturbo.turbojpeg" target="classFrame">TJScalingFactor</a></li>
Interfaces</FONT>&nbsp; <li><a href="TJTransform.html" title="class in org.libjpegturbo.turbojpeg" target="classFrame">TJTransform</a></li>
<FONT CLASS="FrameItemFont"> <li><a href="TJTransformer.html" title="class in org.libjpegturbo.turbojpeg" target="classFrame">TJTransformer</a></li>
<BR> <li><a href="YUVImage.html" title="class in org.libjpegturbo.turbojpeg" target="classFrame">YUVImage</a></li>
<A HREF="TJCustomFilter.html" title="interface in org.libjpegturbo.turbojpeg" target="classFrame"><I>TJCustomFilter</I></A></FONT></TD> </ul>
</TR> </div>
</TABLE> </body>
</html>
<TABLE BORDER="0" WIDTH="100%" SUMMARY="">
<TR>
<TD NOWRAP><FONT size="+1" CLASS="FrameHeadingFont">
Classes</FONT>&nbsp;
<FONT CLASS="FrameItemFont">
<BR>
<A HREF="TJ.html" title="class in org.libjpegturbo.turbojpeg" target="classFrame">TJ</A>
<BR>
<A HREF="TJCompressor.html" title="class in org.libjpegturbo.turbojpeg" target="classFrame">TJCompressor</A>
<BR>
<A HREF="TJDecompressor.html" title="class in org.libjpegturbo.turbojpeg" target="classFrame">TJDecompressor</A>
<BR>
<A HREF="TJScalingFactor.html" title="class in org.libjpegturbo.turbojpeg" target="classFrame">TJScalingFactor</A>
<BR>
<A HREF="TJTransform.html" title="class in org.libjpegturbo.turbojpeg" target="classFrame">TJTransform</A>
<BR>
<A HREF="TJTransformer.html" title="class in org.libjpegturbo.turbojpeg" target="classFrame">TJTransformer</A></FONT></TD>
</TR>
</TABLE>
</BODY>
</HTML>

View File

@@ -1,185 +1,183 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!-- NewPage --> <!-- NewPage -->
<HTML> <html lang="en">
<HEAD> <head>
<TITLE> <title>org.libjpegturbo.turbojpeg</title>
org.libjpegturbo.turbojpeg <link rel="stylesheet" type="text/css" href="../../../stylesheet.css" title="Style">
</TITLE> </head>
<body>
<script type="text/javascript"><!--
<LINK REL ="stylesheet" TYPE="text/css" HREF="../../../stylesheet.css" TITLE="Style">
<SCRIPT type="text/javascript">
function windowTitle()
{
if (location.href.indexOf('is-external=true') == -1) { if (location.href.indexOf('is-external=true') == -1) {
parent.document.title="org.libjpegturbo.turbojpeg"; parent.document.title="org.libjpegturbo.turbojpeg";
} }
} //-->
</SCRIPT> </script>
<NOSCRIPT> <noscript>
</NOSCRIPT> <div>JavaScript is disabled on your browser.</div>
</noscript>
</HEAD>
<BODY BGCOLOR="white" onload="windowTitle();">
<HR>
<!-- ========= START OF TOP NAVBAR ======= --> <!-- ========= START OF TOP NAVBAR ======= -->
<A NAME="navbar_top"><!-- --></A> <div class="topNav"><a name="navbar_top">
<A HREF="#skip-navbar_top" title="Skip navigation links"></A> <!-- -->
<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY=""> </a><a href="#skip-navbar_top" title="Skip navigation links"></a><a name="navbar_top_firstrow">
<TR> <!-- -->
<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> </a>
<A NAME="navbar_top_firstrow"><!-- --></A> <ul class="navList" title="Navigation">
<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY=""> <li><a href="../../../org/libjpegturbo/turbojpeg/package-summary.html">Package</a></li>
<TR ALIGN="center" VALIGN="top"> <li>Class</li>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../org/libjpegturbo/turbojpeg/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A>&nbsp;</TD> <li><a href="package-tree.html">Tree</a></li>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Class</FONT>&nbsp;</TD> <li><a href="../../../deprecated-list.html">Deprecated</a></li>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A>&nbsp;</TD> <li><a href="../../../index-all.html">Index</a></li>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD> <li><a href="../../../help-doc.html">Help</a></li>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A>&nbsp;</TD> </ul>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD> </div>
</TR> <div class="subNav">
</TABLE> <ul class="navList">
</TD> <li>Prev Package</li>
<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM> <li>Next Package</li>
</EM> </ul>
</TD> <ul class="navList">
</TR> <li><a href="../../../index.html?org/libjpegturbo/turbojpeg/package-summary.html" target="_top">Frames</a></li>
<li><a href="package-summary.html" target="_top">No Frames</a></li>
<TR> </ul>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2"> <ul class="navList" id="allclasses_navbar_top">
&nbsp;PREV PACKAGE&nbsp; <li><a href="../../../allclasses-noframe.html">All Classes</a></li>
&nbsp;NEXT PACKAGE</FONT></TD> </ul>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2"> <div>
<A HREF="../../../index.html?org/libjpegturbo/turbojpeg/package-summary.html" target="_top"><B>FRAMES</B></A> &nbsp; <script type="text/javascript"><!--
&nbsp;<A HREF="package-summary.html" target="_top"><B>NO FRAMES</B></A> &nbsp; allClassesLink = document.getElementById("allclasses_navbar_top");
&nbsp;<SCRIPT type="text/javascript">
<!--
if(window==top) { if(window==top) {
document.writeln('<A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A>'); allClassesLink.style.display = "block";
}
else {
allClassesLink.style.display = "none";
} }
//--> //-->
</SCRIPT> </script>
<NOSCRIPT> </div>
<A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A> <a name="skip-navbar_top">
</NOSCRIPT> <!-- -->
</a></div>
</FONT></TD>
</TR>
</TABLE>
<A NAME="skip-navbar_top"></A>
<!-- ========= END OF TOP NAVBAR ========= --> <!-- ========= END OF TOP NAVBAR ========= -->
<div class="header">
<HR> <h1 title="Package" class="title">Package&nbsp;org.libjpegturbo.turbojpeg</h1>
<H2> </div>
Package org.libjpegturbo.turbojpeg <div class="contentContainer">
</H2> <ul class="blockList">
<li class="blockList">
<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY=""> <table class="packageSummary" border="0" cellpadding="3" cellspacing="0" summary="Interface Summary table, listing interfaces, and an explanation">
<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor"> <caption><span>Interface Summary</span><span class="tabEnd">&nbsp;</span></caption>
<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2"> <tr>
<B>Interface Summary</B></FONT></TH> <th class="colFirst" scope="col">Interface</th>
</TR> <th class="colLast" scope="col">Description</th>
<TR BGCOLOR="white" CLASS="TableRowColor"> </tr>
<TD WIDTH="15%"><B><A HREF="../../../org/libjpegturbo/turbojpeg/TJCustomFilter.html" title="interface in org.libjpegturbo.turbojpeg">TJCustomFilter</A></B></TD> <tbody>
<TD>Custom filter callback interface</TD> <tr class="altColor">
</TR> <td class="colFirst"><a href="../../../org/libjpegturbo/turbojpeg/TJCustomFilter.html" title="interface in org.libjpegturbo.turbojpeg">TJCustomFilter</a></td>
</TABLE> <td class="colLast">
&nbsp; <div class="block">Custom filter callback interface</div>
</td>
<P> </tr>
</tbody>
<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY=""> </table>
<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor"> </li>
<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2"> <li class="blockList">
<B>Class Summary</B></FONT></TH> <table class="packageSummary" border="0" cellpadding="3" cellspacing="0" summary="Class Summary table, listing classes, and an explanation">
</TR> <caption><span>Class Summary</span><span class="tabEnd">&nbsp;</span></caption>
<TR BGCOLOR="white" CLASS="TableRowColor"> <tr>
<TD WIDTH="15%"><B><A HREF="../../../org/libjpegturbo/turbojpeg/TJ.html" title="class in org.libjpegturbo.turbojpeg">TJ</A></B></TD> <th class="colFirst" scope="col">Class</th>
<TD>TurboJPEG utility class (cannot be instantiated)</TD> <th class="colLast" scope="col">Description</th>
</TR> </tr>
<TR BGCOLOR="white" CLASS="TableRowColor"> <tbody>
<TD WIDTH="15%"><B><A HREF="../../../org/libjpegturbo/turbojpeg/TJCompressor.html" title="class in org.libjpegturbo.turbojpeg">TJCompressor</A></B></TD> <tr class="altColor">
<TD>TurboJPEG compressor</TD> <td class="colFirst"><a href="../../../org/libjpegturbo/turbojpeg/TJ.html" title="class in org.libjpegturbo.turbojpeg">TJ</a></td>
</TR> <td class="colLast">
<TR BGCOLOR="white" CLASS="TableRowColor"> <div class="block">TurboJPEG utility class (cannot be instantiated)</div>
<TD WIDTH="15%"><B><A HREF="../../../org/libjpegturbo/turbojpeg/TJDecompressor.html" title="class in org.libjpegturbo.turbojpeg">TJDecompressor</A></B></TD> </td>
<TD>TurboJPEG decompressor</TD> </tr>
</TR> <tr class="rowColor">
<TR BGCOLOR="white" CLASS="TableRowColor"> <td class="colFirst"><a href="../../../org/libjpegturbo/turbojpeg/TJCompressor.html" title="class in org.libjpegturbo.turbojpeg">TJCompressor</a></td>
<TD WIDTH="15%"><B><A HREF="../../../org/libjpegturbo/turbojpeg/TJScalingFactor.html" title="class in org.libjpegturbo.turbojpeg">TJScalingFactor</A></B></TD> <td class="colLast">
<TD>Fractional scaling factor</TD> <div class="block">TurboJPEG compressor</div>
</TR> </td>
<TR BGCOLOR="white" CLASS="TableRowColor"> </tr>
<TD WIDTH="15%"><B><A HREF="../../../org/libjpegturbo/turbojpeg/TJTransform.html" title="class in org.libjpegturbo.turbojpeg">TJTransform</A></B></TD> <tr class="altColor">
<TD>Lossless transform parameters</TD> <td class="colFirst"><a href="../../../org/libjpegturbo/turbojpeg/TJDecompressor.html" title="class in org.libjpegturbo.turbojpeg">TJDecompressor</a></td>
</TR> <td class="colLast">
<TR BGCOLOR="white" CLASS="TableRowColor"> <div class="block">TurboJPEG decompressor</div>
<TD WIDTH="15%"><B><A HREF="../../../org/libjpegturbo/turbojpeg/TJTransformer.html" title="class in org.libjpegturbo.turbojpeg">TJTransformer</A></B></TD> </td>
<TD>TurboJPEG lossless transformer</TD> </tr>
</TR> <tr class="rowColor">
</TABLE> <td class="colFirst"><a href="../../../org/libjpegturbo/turbojpeg/TJScalingFactor.html" title="class in org.libjpegturbo.turbojpeg">TJScalingFactor</a></td>
&nbsp; <td class="colLast">
<div class="block">Fractional scaling factor</div>
<P> </td>
<DL> </tr>
</DL> <tr class="altColor">
<HR> <td class="colFirst"><a href="../../../org/libjpegturbo/turbojpeg/TJTransform.html" title="class in org.libjpegturbo.turbojpeg">TJTransform</a></td>
<td class="colLast">
<div class="block">Lossless transform parameters</div>
</td>
</tr>
<tr class="rowColor">
<td class="colFirst"><a href="../../../org/libjpegturbo/turbojpeg/TJTransformer.html" title="class in org.libjpegturbo.turbojpeg">TJTransformer</a></td>
<td class="colLast">
<div class="block">TurboJPEG lossless transformer</div>
</td>
</tr>
<tr class="altColor">
<td class="colFirst"><a href="../../../org/libjpegturbo/turbojpeg/YUVImage.html" title="class in org.libjpegturbo.turbojpeg">YUVImage</a></td>
<td class="colLast">
<div class="block">This class encapsulates a YUV planar image and the metadata
associated with it.</div>
</td>
</tr>
</tbody>
</table>
</li>
</ul>
</div>
<!-- ======= START OF BOTTOM NAVBAR ====== --> <!-- ======= START OF BOTTOM NAVBAR ====== -->
<A NAME="navbar_bottom"><!-- --></A> <div class="bottomNav"><a name="navbar_bottom">
<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A> <!-- -->
<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY=""> </a><a href="#skip-navbar_bottom" title="Skip navigation links"></a><a name="navbar_bottom_firstrow">
<TR> <!-- -->
<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> </a>
<A NAME="navbar_bottom_firstrow"><!-- --></A> <ul class="navList" title="Navigation">
<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY=""> <li><a href="../../../org/libjpegturbo/turbojpeg/package-summary.html">Package</a></li>
<TR ALIGN="center" VALIGN="top"> <li>Class</li>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../org/libjpegturbo/turbojpeg/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A>&nbsp;</TD> <li><a href="package-tree.html">Tree</a></li>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Class</FONT>&nbsp;</TD> <li><a href="../../../deprecated-list.html">Deprecated</a></li>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A>&nbsp;</TD> <li><a href="../../../index-all.html">Index</a></li>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD> <li><a href="../../../help-doc.html">Help</a></li>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A>&nbsp;</TD> </ul>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD> </div>
</TR> <div class="subNav">
</TABLE> <ul class="navList">
</TD> <li>Prev Package</li>
<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM> <li>Next Package</li>
</EM> </ul>
</TD> <ul class="navList">
</TR> <li><a href="../../../index.html?org/libjpegturbo/turbojpeg/package-summary.html" target="_top">Frames</a></li>
<li><a href="package-summary.html" target="_top">No Frames</a></li>
<TR> </ul>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2"> <ul class="navList" id="allclasses_navbar_bottom">
&nbsp;PREV PACKAGE&nbsp; <li><a href="../../../allclasses-noframe.html">All Classes</a></li>
&nbsp;NEXT PACKAGE</FONT></TD> </ul>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2"> <div>
<A HREF="../../../index.html?org/libjpegturbo/turbojpeg/package-summary.html" target="_top"><B>FRAMES</B></A> &nbsp; <script type="text/javascript"><!--
&nbsp;<A HREF="package-summary.html" target="_top"><B>NO FRAMES</B></A> &nbsp; allClassesLink = document.getElementById("allclasses_navbar_bottom");
&nbsp;<SCRIPT type="text/javascript">
<!--
if(window==top) { if(window==top) {
document.writeln('<A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A>'); allClassesLink.style.display = "block";
}
else {
allClassesLink.style.display = "none";
} }
//--> //-->
</SCRIPT> </script>
<NOSCRIPT> </div>
<A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A> <a name="skip-navbar_bottom">
</NOSCRIPT> <!-- -->
</a></div>
</FONT></TD>
</TR>
</TABLE>
<A NAME="skip-navbar_bottom"></A>
<!-- ======== END OF BOTTOM NAVBAR ======= --> <!-- ======== END OF BOTTOM NAVBAR ======= -->
</body>
<HR> </html>
</BODY>
</HTML>

View File

@@ -1,159 +1,143 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!-- NewPage --> <!-- NewPage -->
<HTML> <html lang="en">
<HEAD> <head>
<TITLE> <title>org.libjpegturbo.turbojpeg Class Hierarchy</title>
org.libjpegturbo.turbojpeg Class Hierarchy <link rel="stylesheet" type="text/css" href="../../../stylesheet.css" title="Style">
</TITLE> </head>
<body>
<script type="text/javascript"><!--
<LINK REL ="stylesheet" TYPE="text/css" HREF="../../../stylesheet.css" TITLE="Style">
<SCRIPT type="text/javascript">
function windowTitle()
{
if (location.href.indexOf('is-external=true') == -1) { if (location.href.indexOf('is-external=true') == -1) {
parent.document.title="org.libjpegturbo.turbojpeg Class Hierarchy"; parent.document.title="org.libjpegturbo.turbojpeg Class Hierarchy";
} }
} //-->
</SCRIPT> </script>
<NOSCRIPT> <noscript>
</NOSCRIPT> <div>JavaScript is disabled on your browser.</div>
</noscript>
</HEAD>
<BODY BGCOLOR="white" onload="windowTitle();">
<HR>
<!-- ========= START OF TOP NAVBAR ======= --> <!-- ========= START OF TOP NAVBAR ======= -->
<A NAME="navbar_top"><!-- --></A> <div class="topNav"><a name="navbar_top">
<A HREF="#skip-navbar_top" title="Skip navigation links"></A> <!-- -->
<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY=""> </a><a href="#skip-navbar_top" title="Skip navigation links"></a><a name="navbar_top_firstrow">
<TR> <!-- -->
<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> </a>
<A NAME="navbar_top_firstrow"><!-- --></A> <ul class="navList" title="Navigation">
<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY=""> <li><a href="../../../org/libjpegturbo/turbojpeg/package-summary.html">Package</a></li>
<TR ALIGN="center" VALIGN="top"> <li>Class</li>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../org/libjpegturbo/turbojpeg/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A>&nbsp;</TD> <li class="navBarCell1Rev">Tree</li>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Class</FONT>&nbsp;</TD> <li><a href="../../../deprecated-list.html">Deprecated</a></li>
<TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Tree</B></FONT>&nbsp;</TD> <li><a href="../../../index-all.html">Index</a></li>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD> <li><a href="../../../help-doc.html">Help</a></li>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A>&nbsp;</TD> </ul>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD> </div>
</TR> <div class="subNav">
</TABLE> <ul class="navList">
</TD> <li>Prev</li>
<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM> <li>Next</li>
</EM> </ul>
</TD> <ul class="navList">
</TR> <li><a href="../../../index.html?org/libjpegturbo/turbojpeg/package-tree.html" target="_top">Frames</a></li>
<li><a href="package-tree.html" target="_top">No Frames</a></li>
<TR> </ul>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2"> <ul class="navList" id="allclasses_navbar_top">
&nbsp;PREV&nbsp; <li><a href="../../../allclasses-noframe.html">All Classes</a></li>
&nbsp;NEXT</FONT></TD> </ul>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2"> <div>
<A HREF="../../../index.html?org/libjpegturbo/turbojpeg/package-tree.html" target="_top"><B>FRAMES</B></A> &nbsp; <script type="text/javascript"><!--
&nbsp;<A HREF="package-tree.html" target="_top"><B>NO FRAMES</B></A> &nbsp; allClassesLink = document.getElementById("allclasses_navbar_top");
&nbsp;<SCRIPT type="text/javascript">
<!--
if(window==top) { if(window==top) {
document.writeln('<A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A>'); allClassesLink.style.display = "block";
}
else {
allClassesLink.style.display = "none";
} }
//--> //-->
</SCRIPT> </script>
<NOSCRIPT> </div>
<A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A> <a name="skip-navbar_top">
</NOSCRIPT> <!-- -->
</a></div>
</FONT></TD>
</TR>
</TABLE>
<A NAME="skip-navbar_top"></A>
<!-- ========= END OF TOP NAVBAR ========= --> <!-- ========= END OF TOP NAVBAR ========= -->
<div class="header">
<HR> <h1 class="title">Hierarchy For Package org.libjpegturbo.turbojpeg</h1>
<CENTER> </div>
<H2> <div class="contentContainer">
Hierarchy For Package org.libjpegturbo.turbojpeg <h2 title="Class Hierarchy">Class Hierarchy</h2>
</H2> <ul>
</CENTER> <li type="circle">java.lang.Object
<H2> <ul>
Class Hierarchy <li type="circle">java.awt.geom.RectangularShape (implements java.lang.Cloneable, java.awt.Shape)
</H2> <ul>
<UL> <li type="circle">java.awt.geom.Rectangle2D
<LI TYPE="circle">java.lang.Object<UL> <ul>
<LI TYPE="circle">java.awt.geom.RectangularShape (implements java.lang.Cloneable, java.awt.Shape) <li type="circle">java.awt.Rectangle (implements java.io.Serializable, java.awt.Shape)
<UL> <ul>
<LI TYPE="circle">java.awt.geom.Rectangle2D<UL> <li type="circle">org.libjpegturbo.turbojpeg.<a href="../../../org/libjpegturbo/turbojpeg/TJTransform.html" title="class in org.libjpegturbo.turbojpeg"><span class="strong">TJTransform</span></a></li>
<LI TYPE="circle">java.awt.Rectangle (implements java.io.Serializable, java.awt.Shape) </ul>
<UL> </li>
<LI TYPE="circle">org.libjpegturbo.turbojpeg.<A HREF="../../../org/libjpegturbo/turbojpeg/TJTransform.html" title="class in org.libjpegturbo.turbojpeg"><B>TJTransform</B></A></UL> </ul>
</UL> </li>
</UL> </ul>
<LI TYPE="circle">org.libjpegturbo.turbojpeg.<A HREF="../../../org/libjpegturbo/turbojpeg/TJ.html" title="class in org.libjpegturbo.turbojpeg"><B>TJ</B></A><LI TYPE="circle">org.libjpegturbo.turbojpeg.<A HREF="../../../org/libjpegturbo/turbojpeg/TJCompressor.html" title="class in org.libjpegturbo.turbojpeg"><B>TJCompressor</B></A><LI TYPE="circle">org.libjpegturbo.turbojpeg.<A HREF="../../../org/libjpegturbo/turbojpeg/TJDecompressor.html" title="class in org.libjpegturbo.turbojpeg"><B>TJDecompressor</B></A><UL> </li>
<LI TYPE="circle">org.libjpegturbo.turbojpeg.<A HREF="../../../org/libjpegturbo/turbojpeg/TJTransformer.html" title="class in org.libjpegturbo.turbojpeg"><B>TJTransformer</B></A></UL> <li type="circle">org.libjpegturbo.turbojpeg.<a href="../../../org/libjpegturbo/turbojpeg/TJ.html" title="class in org.libjpegturbo.turbojpeg"><span class="strong">TJ</span></a></li>
<LI TYPE="circle">org.libjpegturbo.turbojpeg.<A HREF="../../../org/libjpegturbo/turbojpeg/TJScalingFactor.html" title="class in org.libjpegturbo.turbojpeg"><B>TJScalingFactor</B></A></UL> <li type="circle">org.libjpegturbo.turbojpeg.<a href="../../../org/libjpegturbo/turbojpeg/TJCompressor.html" title="class in org.libjpegturbo.turbojpeg"><span class="strong">TJCompressor</span></a></li>
</UL> <li type="circle">org.libjpegturbo.turbojpeg.<a href="../../../org/libjpegturbo/turbojpeg/TJDecompressor.html" title="class in org.libjpegturbo.turbojpeg"><span class="strong">TJDecompressor</span></a>
<H2> <ul>
Interface Hierarchy <li type="circle">org.libjpegturbo.turbojpeg.<a href="../../../org/libjpegturbo/turbojpeg/TJTransformer.html" title="class in org.libjpegturbo.turbojpeg"><span class="strong">TJTransformer</span></a></li>
</H2> </ul>
<UL> </li>
<LI TYPE="circle">org.libjpegturbo.turbojpeg.<A HREF="../../../org/libjpegturbo/turbojpeg/TJCustomFilter.html" title="interface in org.libjpegturbo.turbojpeg"><B>TJCustomFilter</B></A></UL> <li type="circle">org.libjpegturbo.turbojpeg.<a href="../../../org/libjpegturbo/turbojpeg/TJScalingFactor.html" title="class in org.libjpegturbo.turbojpeg"><span class="strong">TJScalingFactor</span></a></li>
<HR> <li type="circle">org.libjpegturbo.turbojpeg.<a href="../../../org/libjpegturbo/turbojpeg/YUVImage.html" title="class in org.libjpegturbo.turbojpeg"><span class="strong">YUVImage</span></a></li>
</ul>
</li>
</ul>
<h2 title="Interface Hierarchy">Interface Hierarchy</h2>
<ul>
<li type="circle">org.libjpegturbo.turbojpeg.<a href="../../../org/libjpegturbo/turbojpeg/TJCustomFilter.html" title="interface in org.libjpegturbo.turbojpeg"><span class="strong">TJCustomFilter</span></a></li>
</ul>
</div>
<!-- ======= START OF BOTTOM NAVBAR ====== --> <!-- ======= START OF BOTTOM NAVBAR ====== -->
<A NAME="navbar_bottom"><!-- --></A> <div class="bottomNav"><a name="navbar_bottom">
<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A> <!-- -->
<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY=""> </a><a href="#skip-navbar_bottom" title="Skip navigation links"></a><a name="navbar_bottom_firstrow">
<TR> <!-- -->
<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> </a>
<A NAME="navbar_bottom_firstrow"><!-- --></A> <ul class="navList" title="Navigation">
<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY=""> <li><a href="../../../org/libjpegturbo/turbojpeg/package-summary.html">Package</a></li>
<TR ALIGN="center" VALIGN="top"> <li>Class</li>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../org/libjpegturbo/turbojpeg/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A>&nbsp;</TD> <li class="navBarCell1Rev">Tree</li>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Class</FONT>&nbsp;</TD> <li><a href="../../../deprecated-list.html">Deprecated</a></li>
<TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Tree</B></FONT>&nbsp;</TD> <li><a href="../../../index-all.html">Index</a></li>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD> <li><a href="../../../help-doc.html">Help</a></li>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A>&nbsp;</TD> </ul>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD> </div>
</TR> <div class="subNav">
</TABLE> <ul class="navList">
</TD> <li>Prev</li>
<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM> <li>Next</li>
</EM> </ul>
</TD> <ul class="navList">
</TR> <li><a href="../../../index.html?org/libjpegturbo/turbojpeg/package-tree.html" target="_top">Frames</a></li>
<li><a href="package-tree.html" target="_top">No Frames</a></li>
<TR> </ul>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2"> <ul class="navList" id="allclasses_navbar_bottom">
&nbsp;PREV&nbsp; <li><a href="../../../allclasses-noframe.html">All Classes</a></li>
&nbsp;NEXT</FONT></TD> </ul>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2"> <div>
<A HREF="../../../index.html?org/libjpegturbo/turbojpeg/package-tree.html" target="_top"><B>FRAMES</B></A> &nbsp; <script type="text/javascript"><!--
&nbsp;<A HREF="package-tree.html" target="_top"><B>NO FRAMES</B></A> &nbsp; allClassesLink = document.getElementById("allclasses_navbar_bottom");
&nbsp;<SCRIPT type="text/javascript">
<!--
if(window==top) { if(window==top) {
document.writeln('<A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A>'); allClassesLink.style.display = "block";
}
else {
allClassesLink.style.display = "none";
} }
//--> //-->
</SCRIPT> </script>
<NOSCRIPT> </div>
<A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A> <a name="skip-navbar_bottom">
</NOSCRIPT> <!-- -->
</a></div>
</FONT></TD>
</TR>
</TABLE>
<A NAME="skip-navbar_bottom"></A>
<!-- ======== END OF BOTTOM NAVBAR ======= --> <!-- ======== END OF BOTTOM NAVBAR ======= -->
</body>
<HR> </html>
</BODY>
</HTML>

View File

@@ -1,161 +1,147 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!-- NewPage --> <!-- NewPage -->
<HTML> <html lang="en">
<HEAD> <head>
<TITLE> <title>Class Hierarchy</title>
Class Hierarchy <link rel="stylesheet" type="text/css" href="stylesheet.css" title="Style">
</TITLE> </head>
<body>
<script type="text/javascript"><!--
<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
<SCRIPT type="text/javascript">
function windowTitle()
{
if (location.href.indexOf('is-external=true') == -1) { if (location.href.indexOf('is-external=true') == -1) {
parent.document.title="Class Hierarchy"; parent.document.title="Class Hierarchy";
} }
} //-->
</SCRIPT> </script>
<NOSCRIPT> <noscript>
</NOSCRIPT> <div>JavaScript is disabled on your browser.</div>
</noscript>
</HEAD>
<BODY BGCOLOR="white" onload="windowTitle();">
<HR>
<!-- ========= START OF TOP NAVBAR ======= --> <!-- ========= START OF TOP NAVBAR ======= -->
<A NAME="navbar_top"><!-- --></A> <div class="topNav"><a name="navbar_top">
<A HREF="#skip-navbar_top" title="Skip navigation links"></A> <!-- -->
<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY=""> </a><a href="#skip-navbar_top" title="Skip navigation links"></a><a name="navbar_top_firstrow">
<TR> <!-- -->
<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> </a>
<A NAME="navbar_top_firstrow"><!-- --></A> <ul class="navList" title="Navigation">
<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY=""> <li><a href="org/libjpegturbo/turbojpeg/package-summary.html">Package</a></li>
<TR ALIGN="center" VALIGN="top"> <li>Class</li>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="org/libjpegturbo/turbojpeg/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A>&nbsp;</TD> <li class="navBarCell1Rev">Tree</li>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Class</FONT>&nbsp;</TD> <li><a href="deprecated-list.html">Deprecated</a></li>
<TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Tree</B></FONT>&nbsp;</TD> <li><a href="index-all.html">Index</a></li>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD> <li><a href="help-doc.html">Help</a></li>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A>&nbsp;</TD> </ul>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD> </div>
</TR> <div class="subNav">
</TABLE> <ul class="navList">
</TD> <li>Prev</li>
<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM> <li>Next</li>
</EM> </ul>
</TD> <ul class="navList">
</TR> <li><a href="index.html?overview-tree.html" target="_top">Frames</a></li>
<li><a href="overview-tree.html" target="_top">No Frames</a></li>
<TR> </ul>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2"> <ul class="navList" id="allclasses_navbar_top">
&nbsp;PREV&nbsp; <li><a href="allclasses-noframe.html">All Classes</a></li>
&nbsp;NEXT</FONT></TD> </ul>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2"> <div>
<A HREF="index.html?overview-tree.html" target="_top"><B>FRAMES</B></A> &nbsp; <script type="text/javascript"><!--
&nbsp;<A HREF="overview-tree.html" target="_top"><B>NO FRAMES</B></A> &nbsp; allClassesLink = document.getElementById("allclasses_navbar_top");
&nbsp;<SCRIPT type="text/javascript">
<!--
if(window==top) { if(window==top) {
document.writeln('<A HREF="allclasses-noframe.html"><B>All Classes</B></A>'); allClassesLink.style.display = "block";
}
else {
allClassesLink.style.display = "none";
} }
//--> //-->
</SCRIPT> </script>
<NOSCRIPT> </div>
<A HREF="allclasses-noframe.html"><B>All Classes</B></A> <a name="skip-navbar_top">
</NOSCRIPT> <!-- -->
</a></div>
</FONT></TD>
</TR>
</TABLE>
<A NAME="skip-navbar_top"></A>
<!-- ========= END OF TOP NAVBAR ========= --> <!-- ========= END OF TOP NAVBAR ========= -->
<div class="header">
<HR> <h1 class="title">Hierarchy For All Packages</h1>
<CENTER> <span class="strong">Package Hierarchies:</span>
<H2> <ul class="horizontal">
Hierarchy For All Packages</H2> <li><a href="org/libjpegturbo/turbojpeg/package-tree.html">org.libjpegturbo.turbojpeg</a></li>
</CENTER> </ul>
<DL> </div>
<DT><B>Package Hierarchies:</B><DD><A HREF="org/libjpegturbo/turbojpeg/package-tree.html">org.libjpegturbo.turbojpeg</A></DL> <div class="contentContainer">
<HR> <h2 title="Class Hierarchy">Class Hierarchy</h2>
<H2> <ul>
Class Hierarchy <li type="circle">java.lang.Object
</H2> <ul>
<UL> <li type="circle">java.awt.geom.RectangularShape (implements java.lang.Cloneable, java.awt.Shape)
<LI TYPE="circle">java.lang.Object<UL> <ul>
<LI TYPE="circle">java.awt.geom.RectangularShape (implements java.lang.Cloneable, java.awt.Shape) <li type="circle">java.awt.geom.Rectangle2D
<UL> <ul>
<LI TYPE="circle">java.awt.geom.Rectangle2D<UL> <li type="circle">java.awt.Rectangle (implements java.io.Serializable, java.awt.Shape)
<LI TYPE="circle">java.awt.Rectangle (implements java.io.Serializable, java.awt.Shape) <ul>
<UL> <li type="circle">org.libjpegturbo.turbojpeg.<a href="org/libjpegturbo/turbojpeg/TJTransform.html" title="class in org.libjpegturbo.turbojpeg"><span class="strong">TJTransform</span></a></li>
<LI TYPE="circle">org.libjpegturbo.turbojpeg.<A HREF="org/libjpegturbo/turbojpeg/TJTransform.html" title="class in org.libjpegturbo.turbojpeg"><B>TJTransform</B></A></UL> </ul>
</UL> </li>
</UL> </ul>
<LI TYPE="circle">org.libjpegturbo.turbojpeg.<A HREF="org/libjpegturbo/turbojpeg/TJ.html" title="class in org.libjpegturbo.turbojpeg"><B>TJ</B></A><LI TYPE="circle">org.libjpegturbo.turbojpeg.<A HREF="org/libjpegturbo/turbojpeg/TJCompressor.html" title="class in org.libjpegturbo.turbojpeg"><B>TJCompressor</B></A><LI TYPE="circle">org.libjpegturbo.turbojpeg.<A HREF="org/libjpegturbo/turbojpeg/TJDecompressor.html" title="class in org.libjpegturbo.turbojpeg"><B>TJDecompressor</B></A><UL> </li>
<LI TYPE="circle">org.libjpegturbo.turbojpeg.<A HREF="org/libjpegturbo/turbojpeg/TJTransformer.html" title="class in org.libjpegturbo.turbojpeg"><B>TJTransformer</B></A></UL> </ul>
<LI TYPE="circle">org.libjpegturbo.turbojpeg.<A HREF="org/libjpegturbo/turbojpeg/TJScalingFactor.html" title="class in org.libjpegturbo.turbojpeg"><B>TJScalingFactor</B></A></UL> </li>
</UL> <li type="circle">org.libjpegturbo.turbojpeg.<a href="org/libjpegturbo/turbojpeg/TJ.html" title="class in org.libjpegturbo.turbojpeg"><span class="strong">TJ</span></a></li>
<H2> <li type="circle">org.libjpegturbo.turbojpeg.<a href="org/libjpegturbo/turbojpeg/TJCompressor.html" title="class in org.libjpegturbo.turbojpeg"><span class="strong">TJCompressor</span></a></li>
Interface Hierarchy <li type="circle">org.libjpegturbo.turbojpeg.<a href="org/libjpegturbo/turbojpeg/TJDecompressor.html" title="class in org.libjpegturbo.turbojpeg"><span class="strong">TJDecompressor</span></a>
</H2> <ul>
<UL> <li type="circle">org.libjpegturbo.turbojpeg.<a href="org/libjpegturbo/turbojpeg/TJTransformer.html" title="class in org.libjpegturbo.turbojpeg"><span class="strong">TJTransformer</span></a></li>
<LI TYPE="circle">org.libjpegturbo.turbojpeg.<A HREF="org/libjpegturbo/turbojpeg/TJCustomFilter.html" title="interface in org.libjpegturbo.turbojpeg"><B>TJCustomFilter</B></A></UL> </ul>
<HR> </li>
<li type="circle">org.libjpegturbo.turbojpeg.<a href="org/libjpegturbo/turbojpeg/TJScalingFactor.html" title="class in org.libjpegturbo.turbojpeg"><span class="strong">TJScalingFactor</span></a></li>
<li type="circle">org.libjpegturbo.turbojpeg.<a href="org/libjpegturbo/turbojpeg/YUVImage.html" title="class in org.libjpegturbo.turbojpeg"><span class="strong">YUVImage</span></a></li>
</ul>
</li>
</ul>
<h2 title="Interface Hierarchy">Interface Hierarchy</h2>
<ul>
<li type="circle">org.libjpegturbo.turbojpeg.<a href="org/libjpegturbo/turbojpeg/TJCustomFilter.html" title="interface in org.libjpegturbo.turbojpeg"><span class="strong">TJCustomFilter</span></a></li>
</ul>
</div>
<!-- ======= START OF BOTTOM NAVBAR ====== --> <!-- ======= START OF BOTTOM NAVBAR ====== -->
<A NAME="navbar_bottom"><!-- --></A> <div class="bottomNav"><a name="navbar_bottom">
<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A> <!-- -->
<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY=""> </a><a href="#skip-navbar_bottom" title="Skip navigation links"></a><a name="navbar_bottom_firstrow">
<TR> <!-- -->
<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> </a>
<A NAME="navbar_bottom_firstrow"><!-- --></A> <ul class="navList" title="Navigation">
<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY=""> <li><a href="org/libjpegturbo/turbojpeg/package-summary.html">Package</a></li>
<TR ALIGN="center" VALIGN="top"> <li>Class</li>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="org/libjpegturbo/turbojpeg/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A>&nbsp;</TD> <li class="navBarCell1Rev">Tree</li>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Class</FONT>&nbsp;</TD> <li><a href="deprecated-list.html">Deprecated</a></li>
<TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Tree</B></FONT>&nbsp;</TD> <li><a href="index-all.html">Index</a></li>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD> <li><a href="help-doc.html">Help</a></li>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A>&nbsp;</TD> </ul>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD> </div>
</TR> <div class="subNav">
</TABLE> <ul class="navList">
</TD> <li>Prev</li>
<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM> <li>Next</li>
</EM> </ul>
</TD> <ul class="navList">
</TR> <li><a href="index.html?overview-tree.html" target="_top">Frames</a></li>
<li><a href="overview-tree.html" target="_top">No Frames</a></li>
<TR> </ul>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2"> <ul class="navList" id="allclasses_navbar_bottom">
&nbsp;PREV&nbsp; <li><a href="allclasses-noframe.html">All Classes</a></li>
&nbsp;NEXT</FONT></TD> </ul>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2"> <div>
<A HREF="index.html?overview-tree.html" target="_top"><B>FRAMES</B></A> &nbsp; <script type="text/javascript"><!--
&nbsp;<A HREF="overview-tree.html" target="_top"><B>NO FRAMES</B></A> &nbsp; allClassesLink = document.getElementById("allclasses_navbar_bottom");
&nbsp;<SCRIPT type="text/javascript">
<!--
if(window==top) { if(window==top) {
document.writeln('<A HREF="allclasses-noframe.html"><B>All Classes</B></A>'); allClassesLink.style.display = "block";
}
else {
allClassesLink.style.display = "none";
} }
//--> //-->
</SCRIPT> </script>
<NOSCRIPT> </div>
<A HREF="allclasses-noframe.html"><B>All Classes</B></A> <a name="skip-navbar_bottom">
</NOSCRIPT> <!-- -->
</a></div>
</FONT></TD>
</TR>
</TABLE>
<A NAME="skip-navbar_bottom"></A>
<!-- ======== END OF BOTTOM NAVBAR ======= --> <!-- ======== END OF BOTTOM NAVBAR ======= -->
</body>
<HR> </html>
</BODY>
</HTML>

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 57 B

BIN
java/doc/resources/tab.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 291 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 849 B

View File

@@ -1,200 +1,150 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!-- NewPage --> <!-- NewPage -->
<HTML> <html lang="en">
<HEAD> <head>
<TITLE> <title>Serialized Form</title>
Serialized Form <link rel="stylesheet" type="text/css" href="stylesheet.css" title="Style">
</TITLE> </head>
<body>
<script type="text/javascript"><!--
<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
<SCRIPT type="text/javascript">
function windowTitle()
{
if (location.href.indexOf('is-external=true') == -1) { if (location.href.indexOf('is-external=true') == -1) {
parent.document.title="Serialized Form"; parent.document.title="Serialized Form";
} }
} //-->
</SCRIPT> </script>
<NOSCRIPT> <noscript>
</NOSCRIPT> <div>JavaScript is disabled on your browser.</div>
</noscript>
</HEAD>
<BODY BGCOLOR="white" onload="windowTitle();">
<HR>
<!-- ========= START OF TOP NAVBAR ======= --> <!-- ========= START OF TOP NAVBAR ======= -->
<A NAME="navbar_top"><!-- --></A> <div class="topNav"><a name="navbar_top">
<A HREF="#skip-navbar_top" title="Skip navigation links"></A> <!-- -->
<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY=""> </a><a href="#skip-navbar_top" title="Skip navigation links"></a><a name="navbar_top_firstrow">
<TR> <!-- -->
<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> </a>
<A NAME="navbar_top_firstrow"><!-- --></A> <ul class="navList" title="Navigation">
<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY=""> <li><a href="org/libjpegturbo/turbojpeg/package-summary.html">Package</a></li>
<TR ALIGN="center" VALIGN="top"> <li>Class</li>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="org/libjpegturbo/turbojpeg/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A>&nbsp;</TD> <li><a href="org/libjpegturbo/turbojpeg/package-tree.html">Tree</a></li>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Class</FONT>&nbsp;</TD> <li><a href="deprecated-list.html">Deprecated</a></li>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="org/libjpegturbo/turbojpeg/package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A>&nbsp;</TD> <li><a href="index-all.html">Index</a></li>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD> <li><a href="help-doc.html">Help</a></li>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A>&nbsp;</TD> </ul>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD> </div>
</TR> <div class="subNav">
</TABLE> <ul class="navList">
</TD> <li>Prev</li>
<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM> <li>Next</li>
</EM> </ul>
</TD> <ul class="navList">
</TR> <li><a href="index.html?serialized-form.html" target="_top">Frames</a></li>
<li><a href="serialized-form.html" target="_top">No Frames</a></li>
<TR> </ul>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2"> <ul class="navList" id="allclasses_navbar_top">
&nbsp;PREV&nbsp; <li><a href="allclasses-noframe.html">All Classes</a></li>
&nbsp;NEXT</FONT></TD> </ul>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2"> <div>
<A HREF="index.html?serialized-form.html" target="_top"><B>FRAMES</B></A> &nbsp; <script type="text/javascript"><!--
&nbsp;<A HREF="serialized-form.html" target="_top"><B>NO FRAMES</B></A> &nbsp; allClassesLink = document.getElementById("allclasses_navbar_top");
&nbsp;<SCRIPT type="text/javascript">
<!--
if(window==top) { if(window==top) {
document.writeln('<A HREF="allclasses-noframe.html"><B>All Classes</B></A>'); allClassesLink.style.display = "block";
}
else {
allClassesLink.style.display = "none";
} }
//--> //-->
</SCRIPT> </script>
<NOSCRIPT> </div>
<A HREF="allclasses-noframe.html"><B>All Classes</B></A> <a name="skip-navbar_top">
</NOSCRIPT> <!-- -->
</a></div>
</FONT></TD>
</TR>
</TABLE>
<A NAME="skip-navbar_top"></A>
<!-- ========= END OF TOP NAVBAR ========= --> <!-- ========= END OF TOP NAVBAR ========= -->
<div class="header">
<HR> <h1 title="Serialized Form" class="title">Serialized Form</h1>
<CENTER> </div>
<H1> <div class="serializedFormContainer">
Serialized Form</H1> <ul class="blockList">
</CENTER> <li class="blockList">
<HR SIZE="4" NOSHADE> <h2 title="Package">Package&nbsp;org.libjpegturbo.turbojpeg</h2>
<ul class="blockList">
<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY=""> <li class="blockList"><a name="org.libjpegturbo.turbojpeg.TJTransform">
<TR BGCOLOR="#CCCCFF" CLASS="TableSubHeadingColor"> <!-- -->
<TH ALIGN="center"><FONT SIZE="+2"> </a>
<B>Package</B> <B>org.libjpegturbo.turbojpeg</B></FONT></TH> <h3>Class <a href="org/libjpegturbo/turbojpeg/TJTransform.html" title="class in org.libjpegturbo.turbojpeg">org.libjpegturbo.turbojpeg.TJTransform</a> extends java.awt.Rectangle implements Serializable</h3>
</TR> <dl class="nameValue">
</TABLE> <dt>serialVersionUID:</dt>
<dd>-127367705761430371L</dd>
<P> </dl>
<A NAME="org.libjpegturbo.turbojpeg.TJTransform"><!-- --></A> <ul class="blockList">
<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY=""> <li class="blockList"><a name="serializedForm">
<TR BGCOLOR="#CCCCFF" CLASS="TableSubHeadingColor"> <!-- -->
<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2"> </a>
<B>Class <A HREF="org/libjpegturbo/turbojpeg/TJTransform.html" title="class in org.libjpegturbo.turbojpeg">org.libjpegturbo.turbojpeg.TJTransform</A> extends java.awt.Rectangle implements Serializable</B></FONT></TH> <h3>Serialized Fields</h3>
</TR> <ul class="blockList">
</TABLE> <li class="blockList">
<h4>op</h4>
<P> <pre>int op</pre>
<B>serialVersionUID:&nbsp;</B>-127367705761430371L <div class="block">Transform operation (one of <code>OP_*</code>)</div>
</li>
<P> <li class="blockList">
<A NAME="serializedForm"><!-- --></A> <h4>options</h4>
<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY=""> <pre>int options</pre>
<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor"> <div class="block">Transform options (bitwise OR of one or more of <code>OPT_*</code>)</div>
<TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2"> </li>
<B>Serialized Fields</B></FONT></TH> <li class="blockListLast">
</TR> <h4>cf</h4>
</TABLE> <pre><a href="org/libjpegturbo/turbojpeg/TJCustomFilter.html" title="interface in org.libjpegturbo.turbojpeg">TJCustomFilter</a> cf</pre>
<div class="block">Custom filter instance</div>
<H3> </li>
op</H3> </ul>
<PRE> </li>
int <B>op</B></PRE> </ul>
<DL> </li>
<DD>Transform operation (one of <code>OP_*</code>) </ul>
<P> </li>
<DL> </ul>
</DL> </div>
</DL>
<HR>
<H3>
options</H3>
<PRE>
int <B>options</B></PRE>
<DL>
<DD>Transform options (bitwise OR of one or more of <code>OPT_*</code>)
<P>
<DL>
</DL>
</DL>
<HR>
<H3>
cf</H3>
<PRE>
<A HREF="org/libjpegturbo/turbojpeg/TJCustomFilter.html" title="interface in org.libjpegturbo.turbojpeg">TJCustomFilter</A> <B>cf</B></PRE>
<DL>
<DD>Custom filter instance
<P>
<DL>
</DL>
</DL>
<P>
<HR>
<!-- ======= START OF BOTTOM NAVBAR ====== --> <!-- ======= START OF BOTTOM NAVBAR ====== -->
<A NAME="navbar_bottom"><!-- --></A> <div class="bottomNav"><a name="navbar_bottom">
<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A> <!-- -->
<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY=""> </a><a href="#skip-navbar_bottom" title="Skip navigation links"></a><a name="navbar_bottom_firstrow">
<TR> <!-- -->
<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> </a>
<A NAME="navbar_bottom_firstrow"><!-- --></A> <ul class="navList" title="Navigation">
<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY=""> <li><a href="org/libjpegturbo/turbojpeg/package-summary.html">Package</a></li>
<TR ALIGN="center" VALIGN="top"> <li>Class</li>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="org/libjpegturbo/turbojpeg/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A>&nbsp;</TD> <li><a href="org/libjpegturbo/turbojpeg/package-tree.html">Tree</a></li>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Class</FONT>&nbsp;</TD> <li><a href="deprecated-list.html">Deprecated</a></li>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="org/libjpegturbo/turbojpeg/package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A>&nbsp;</TD> <li><a href="index-all.html">Index</a></li>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD> <li><a href="help-doc.html">Help</a></li>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A>&nbsp;</TD> </ul>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD> </div>
</TR> <div class="subNav">
</TABLE> <ul class="navList">
</TD> <li>Prev</li>
<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM> <li>Next</li>
</EM> </ul>
</TD> <ul class="navList">
</TR> <li><a href="index.html?serialized-form.html" target="_top">Frames</a></li>
<li><a href="serialized-form.html" target="_top">No Frames</a></li>
<TR> </ul>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2"> <ul class="navList" id="allclasses_navbar_bottom">
&nbsp;PREV&nbsp; <li><a href="allclasses-noframe.html">All Classes</a></li>
&nbsp;NEXT</FONT></TD> </ul>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2"> <div>
<A HREF="index.html?serialized-form.html" target="_top"><B>FRAMES</B></A> &nbsp; <script type="text/javascript"><!--
&nbsp;<A HREF="serialized-form.html" target="_top"><B>NO FRAMES</B></A> &nbsp; allClassesLink = document.getElementById("allclasses_navbar_bottom");
&nbsp;<SCRIPT type="text/javascript">
<!--
if(window==top) { if(window==top) {
document.writeln('<A HREF="allclasses-noframe.html"><B>All Classes</B></A>'); allClassesLink.style.display = "block";
}
else {
allClassesLink.style.display = "none";
} }
//--> //-->
</SCRIPT> </script>
<NOSCRIPT> </div>
<A HREF="allclasses-noframe.html"><B>All Classes</B></A> <a name="skip-navbar_bottom">
</NOSCRIPT> <!-- -->
</a></div>
</FONT></TD>
</TR>
</TABLE>
<A NAME="skip-navbar_bottom"></A>
<!-- ======== END OF BOTTOM NAVBAR ======= --> <!-- ======== END OF BOTTOM NAVBAR ======= -->
</body>
<HR> </html>
</BODY>
</HTML>

View File

@@ -1,29 +1,474 @@
/* Javadoc style sheet */ /* Javadoc style sheet */
/*
/* Define colors, fonts and other style attributes here to override the defaults */ Overall document style
*/
/* Page background color */ body {
body { background-color: #FFFFFF; color:#000000 } background-color:#ffffff;
color:#353833;
/* Headings */ font-family:Arial, Helvetica, sans-serif;
h1 { font-size: 145% } font-size:76%;
margin:0;
/* Table colors */ }
.TableHeadingColor { background: #CCCCFF; color:#000000 } /* Dark mauve */ a:link, a:visited {
.TableSubHeadingColor { background: #EEEEFF; color:#000000 } /* Light mauve */ text-decoration:none;
.TableRowColor { background: #FFFFFF; color:#000000 } /* White */ color:#4c6b87;
}
/* Font used in left-hand frame lists */ a:hover, a:focus {
.FrameTitleFont { font-size: 100%; font-family: Helvetica, Arial, sans-serif; color:#000000 } text-decoration:none;
.FrameHeadingFont { font-size: 90%; font-family: Helvetica, Arial, sans-serif; color:#000000 } color:#bb7a2a;
.FrameItemFont { font-size: 90%; font-family: Helvetica, Arial, sans-serif; color:#000000 } }
a:active {
/* Navigation bar fonts and colors */ text-decoration:none;
.NavBarCell1 { background-color:#EEEEFF; color:#000000} /* Light mauve */ color:#4c6b87;
.NavBarCell1Rev { background-color:#00008B; color:#FFFFFF} /* Dark Blue */ }
.NavBarFont1 { font-family: Arial, Helvetica, sans-serif; color:#000000;color:#000000;} a[name] {
.NavBarFont1Rev { font-family: Arial, Helvetica, sans-serif; color:#FFFFFF;color:#FFFFFF;} color:#353833;
}
.NavBarCell2 { font-family: Arial, Helvetica, sans-serif; background-color:#FFFFFF; color:#000000} a[name]:hover {
.NavBarCell3 { font-family: Arial, Helvetica, sans-serif; background-color:#FFFFFF; color:#000000} text-decoration:none;
color:#353833;
}
pre {
font-size:1.3em;
}
h1 {
font-size:1.8em;
}
h2 {
font-size:1.5em;
}
h3 {
font-size:1.4em;
}
h4 {
font-size:1.3em;
}
h5 {
font-size:1.2em;
}
h6 {
font-size:1.1em;
}
ul {
list-style-type:disc;
}
code, tt {
font-size:1.2em;
}
dt code {
font-size:1.2em;
}
table tr td dt code {
font-size:1.2em;
vertical-align:top;
}
sup {
font-size:.6em;
}
/*
Document title and Copyright styles
*/
.clear {
clear:both;
height:0px;
overflow:hidden;
}
.aboutLanguage {
float:right;
padding:0px 21px;
font-size:.8em;
z-index:200;
margin-top:-7px;
}
.legalCopy {
margin-left:.5em;
}
.bar a, .bar a:link, .bar a:visited, .bar a:active {
color:#FFFFFF;
text-decoration:none;
}
.bar a:hover, .bar a:focus {
color:#bb7a2a;
}
.tab {
background-color:#0066FF;
background-image:url(resources/titlebar.gif);
background-position:left top;
background-repeat:no-repeat;
color:#ffffff;
padding:8px;
width:5em;
font-weight:bold;
}
/*
Navigation bar styles
*/
.bar {
background-image:url(resources/background.gif);
background-repeat:repeat-x;
color:#FFFFFF;
padding:.8em .5em .4em .8em;
height:auto;/*height:1.8em;*/
font-size:1em;
margin:0;
}
.topNav {
background-image:url(resources/background.gif);
background-repeat:repeat-x;
color:#FFFFFF;
float:left;
padding:0;
width:100%;
clear:right;
height:2.8em;
padding-top:10px;
overflow:hidden;
}
.bottomNav {
margin-top:10px;
background-image:url(resources/background.gif);
background-repeat:repeat-x;
color:#FFFFFF;
float:left;
padding:0;
width:100%;
clear:right;
height:2.8em;
padding-top:10px;
overflow:hidden;
}
.subNav {
background-color:#dee3e9;
border-bottom:1px solid #9eadc0;
float:left;
width:100%;
overflow:hidden;
}
.subNav div {
clear:left;
float:left;
padding:0 0 5px 6px;
}
ul.navList, ul.subNavList {
float:left;
margin:0 25px 0 0;
padding:0;
}
ul.navList li{
list-style:none;
float:left;
padding:3px 6px;
}
ul.subNavList li{
list-style:none;
float:left;
font-size:90%;
}
.topNav a:link, .topNav a:active, .topNav a:visited, .bottomNav a:link, .bottomNav a:active, .bottomNav a:visited {
color:#FFFFFF;
text-decoration:none;
}
.topNav a:hover, .bottomNav a:hover {
text-decoration:none;
color:#bb7a2a;
}
.navBarCell1Rev {
background-image:url(resources/tab.gif);
background-color:#a88834;
color:#FFFFFF;
margin: auto 5px;
border:1px solid #c9aa44;
}
/*
Page header and footer styles
*/
.header, .footer {
clear:both;
margin:0 20px;
padding:5px 0 0 0;
}
.indexHeader {
margin:10px;
position:relative;
}
.indexHeader h1 {
font-size:1.3em;
}
.title {
color:#2c4557;
margin:10px 0;
}
.subTitle {
margin:5px 0 0 0;
}
.header ul {
margin:0 0 25px 0;
padding:0;
}
.footer ul {
margin:20px 0 5px 0;
}
.header ul li, .footer ul li {
list-style:none;
font-size:1.2em;
}
/*
Heading styles
*/
div.details ul.blockList ul.blockList ul.blockList li.blockList h4, div.details ul.blockList ul.blockList ul.blockListLast li.blockList h4 {
background-color:#dee3e9;
border-top:1px solid #9eadc0;
border-bottom:1px solid #9eadc0;
margin:0 0 6px -8px;
padding:2px 5px;
}
ul.blockList ul.blockList ul.blockList li.blockList h3 {
background-color:#dee3e9;
border-top:1px solid #9eadc0;
border-bottom:1px solid #9eadc0;
margin:0 0 6px -8px;
padding:2px 5px;
}
ul.blockList ul.blockList li.blockList h3 {
padding:0;
margin:15px 0;
}
ul.blockList li.blockList h2 {
padding:0px 0 20px 0;
}
/*
Page layout container styles
*/
.contentContainer, .sourceContainer, .classUseContainer, .serializedFormContainer, .constantValuesContainer {
clear:both;
padding:10px 20px;
position:relative;
}
.indexContainer {
margin:10px;
position:relative;
font-size:1.0em;
}
.indexContainer h2 {
font-size:1.1em;
padding:0 0 3px 0;
}
.indexContainer ul {
margin:0;
padding:0;
}
.indexContainer ul li {
list-style:none;
}
.contentContainer .description dl dt, .contentContainer .details dl dt, .serializedFormContainer dl dt {
font-size:1.1em;
font-weight:bold;
margin:10px 0 0 0;
color:#4E4E4E;
}
.contentContainer .description dl dd, .contentContainer .details dl dd, .serializedFormContainer dl dd {
margin:10px 0 10px 20px;
}
.serializedFormContainer dl.nameValue dt {
margin-left:1px;
font-size:1.1em;
display:inline;
font-weight:bold;
}
.serializedFormContainer dl.nameValue dd {
margin:0 0 0 1px;
font-size:1.1em;
display:inline;
}
/*
List styles
*/
ul.horizontal li {
display:inline;
font-size:0.9em;
}
ul.inheritance {
margin:0;
padding:0;
}
ul.inheritance li {
display:inline;
list-style:none;
}
ul.inheritance li ul.inheritance {
margin-left:15px;
padding-left:15px;
padding-top:1px;
}
ul.blockList, ul.blockListLast {
margin:10px 0 10px 0;
padding:0;
}
ul.blockList li.blockList, ul.blockListLast li.blockList {
list-style:none;
margin-bottom:25px;
}
ul.blockList ul.blockList li.blockList, ul.blockList ul.blockListLast li.blockList {
padding:0px 20px 5px 10px;
border:1px solid #9eadc0;
background-color:#f9f9f9;
}
ul.blockList ul.blockList ul.blockList li.blockList, ul.blockList ul.blockList ul.blockListLast li.blockList {
padding:0 0 5px 8px;
background-color:#ffffff;
border:1px solid #9eadc0;
border-top:none;
}
ul.blockList ul.blockList ul.blockList ul.blockList li.blockList {
margin-left:0;
padding-left:0;
padding-bottom:15px;
border:none;
border-bottom:1px solid #9eadc0;
}
ul.blockList ul.blockList ul.blockList ul.blockList li.blockListLast {
list-style:none;
border-bottom:none;
padding-bottom:0;
}
table tr td dl, table tr td dl dt, table tr td dl dd {
margin-top:0;
margin-bottom:1px;
}
/*
Table styles
*/
.contentContainer table, .classUseContainer table, .constantValuesContainer table {
border-bottom:1px solid #9eadc0;
width:100%;
}
.contentContainer ul li table, .classUseContainer ul li table, .constantValuesContainer ul li table {
width:100%;
}
.contentContainer .description table, .contentContainer .details table {
border-bottom:none;
}
.contentContainer ul li table th.colOne, .contentContainer ul li table th.colFirst, .contentContainer ul li table th.colLast, .classUseContainer ul li table th, .constantValuesContainer ul li table th, .contentContainer ul li table td.colOne, .contentContainer ul li table td.colFirst, .contentContainer ul li table td.colLast, .classUseContainer ul li table td, .constantValuesContainer ul li table td{
vertical-align:top;
padding-right:20px;
}
.contentContainer ul li table th.colLast, .classUseContainer ul li table th.colLast,.constantValuesContainer ul li table th.colLast,
.contentContainer ul li table td.colLast, .classUseContainer ul li table td.colLast,.constantValuesContainer ul li table td.colLast,
.contentContainer ul li table th.colOne, .classUseContainer ul li table th.colOne,
.contentContainer ul li table td.colOne, .classUseContainer ul li table td.colOne {
padding-right:3px;
}
.overviewSummary caption, .packageSummary caption, .contentContainer ul.blockList li.blockList caption, .summary caption, .classUseContainer caption, .constantValuesContainer caption {
position:relative;
text-align:left;
background-repeat:no-repeat;
color:#FFFFFF;
font-weight:bold;
clear:none;
overflow:hidden;
padding:0px;
margin:0px;
}
caption a:link, caption a:hover, caption a:active, caption a:visited {
color:#FFFFFF;
}
.overviewSummary caption span, .packageSummary caption span, .contentContainer ul.blockList li.blockList caption span, .summary caption span, .classUseContainer caption span, .constantValuesContainer caption span {
white-space:nowrap;
padding-top:8px;
padding-left:8px;
display:block;
float:left;
background-image:url(resources/titlebar.gif);
height:18px;
}
.overviewSummary .tabEnd, .packageSummary .tabEnd, .contentContainer ul.blockList li.blockList .tabEnd, .summary .tabEnd, .classUseContainer .tabEnd, .constantValuesContainer .tabEnd {
width:10px;
background-image:url(resources/titlebar_end.gif);
background-repeat:no-repeat;
background-position:top right;
position:relative;
float:left;
}
ul.blockList ul.blockList li.blockList table {
margin:0 0 12px 0px;
width:100%;
}
.tableSubHeadingColor {
background-color: #EEEEFF;
}
.altColor {
background-color:#eeeeef;
}
.rowColor {
background-color:#ffffff;
}
.overviewSummary td, .packageSummary td, .contentContainer ul.blockList li.blockList td, .summary td, .classUseContainer td, .constantValuesContainer td {
text-align:left;
padding:3px 3px 3px 7px;
}
th.colFirst, th.colLast, th.colOne, .constantValuesContainer th {
background:#dee3e9;
border-top:1px solid #9eadc0;
border-bottom:1px solid #9eadc0;
text-align:left;
padding:3px 3px 3px 7px;
}
td.colOne a:link, td.colOne a:active, td.colOne a:visited, td.colOne a:hover, td.colFirst a:link, td.colFirst a:active, td.colFirst a:visited, td.colFirst a:hover, td.colLast a:link, td.colLast a:active, td.colLast a:visited, td.colLast a:hover, .constantValuesContainer td a:link, .constantValuesContainer td a:active, .constantValuesContainer td a:visited, .constantValuesContainer td a:hover {
font-weight:bold;
}
td.colFirst, th.colFirst {
border-left:1px solid #9eadc0;
white-space:nowrap;
}
td.colLast, th.colLast {
border-right:1px solid #9eadc0;
}
td.colOne, th.colOne {
border-right:1px solid #9eadc0;
border-left:1px solid #9eadc0;
}
table.overviewSummary {
padding:0px;
margin-left:0px;
}
table.overviewSummary td.colFirst, table.overviewSummary th.colFirst,
table.overviewSummary td.colOne, table.overviewSummary th.colOne {
width:25%;
vertical-align:middle;
}
table.packageSummary td.colFirst, table.overviewSummary th.colFirst {
width:25%;
vertical-align:middle;
}
/*
Content styles
*/
.description pre {
margin-top:0;
}
.deprecatedContent {
margin:0;
padding:10px 0;
}
.docSummary {
padding:0;
}
/*
Formatting effect styles
*/
.sourceLineNo {
color:green;
padding:0 30px 0 0;
}
h1.hidden {
visibility:hidden;
overflow:hidden;
font-size:.9em;
}
.block {
display:block;
margin:3px 0 0 0;
}
.strong {
font-weight:bold;
}

View File

@@ -84,7 +84,8 @@ public final class TJ {
* @param subsamp the level of chrominance subsampling (one of * @param subsamp the level of chrominance subsampling (one of
* <code>SAMP_*</code>) * <code>SAMP_*</code>)
* *
* @return the MCU block width for the given level of chrominance subsampling * @return the MCU block width for the given level of chrominance
* subsampling.
*/ */
public static int getMCUWidth(int subsamp) throws Exception { public static int getMCUWidth(int subsamp) throws Exception {
if (subsamp < 0 || subsamp >= NUMSAMP) if (subsamp < 0 || subsamp >= NUMSAMP)
@@ -105,7 +106,7 @@ public final class TJ {
* <code>SAMP_*</code>) * <code>SAMP_*</code>)
* *
* @return the MCU block height for the given level of chrominance * @return the MCU block height for the given level of chrominance
* subsampling * subsampling.
*/ */
public static int getMCUHeight(int subsamp) throws Exception { public static int getMCUHeight(int subsamp) throws Exception {
if (subsamp < 0 || subsamp >= NUMSAMP) if (subsamp < 0 || subsamp >= NUMSAMP)
@@ -214,7 +215,7 @@ public final class TJ {
* *
* @param pixelFormat the pixel format (one of <code>PF_*</code>) * @param pixelFormat the pixel format (one of <code>PF_*</code>)
* *
* @return the pixel size (in bytes) for the given pixel format * @return the pixel size (in bytes) for the given pixel format.
*/ */
public static int getPixelSize(int pixelFormat) throws Exception { public static int getPixelSize(int pixelFormat) throws Exception {
if (pixelFormat < 0 || pixelFormat >= NUMPF) if (pixelFormat < 0 || pixelFormat >= NUMPF)
@@ -236,7 +237,7 @@ public final class TJ {
* *
* @param pixelFormat the pixel format (one of <code>PF_*</code>) * @param pixelFormat the pixel format (one of <code>PF_*</code>)
* *
* @return the red offset for the given pixel format * @return the red offset for the given pixel format.
*/ */
public static int getRedOffset(int pixelFormat) throws Exception { public static int getRedOffset(int pixelFormat) throws Exception {
if (pixelFormat < 0 || pixelFormat >= NUMPF) if (pixelFormat < 0 || pixelFormat >= NUMPF)
@@ -258,7 +259,7 @@ public final class TJ {
* *
* @param pixelFormat the pixel format (one of <code>PF_*</code>) * @param pixelFormat the pixel format (one of <code>PF_*</code>)
* *
* @return the green offset for the given pixel format * @return the green offset for the given pixel format.
*/ */
public static int getGreenOffset(int pixelFormat) throws Exception { public static int getGreenOffset(int pixelFormat) throws Exception {
if (pixelFormat < 0 || pixelFormat >= NUMPF) if (pixelFormat < 0 || pixelFormat >= NUMPF)
@@ -280,7 +281,7 @@ public final class TJ {
* *
* @param pixelFormat the pixel format (one of <code>PF_*</code>) * @param pixelFormat the pixel format (one of <code>PF_*</code>)
* *
* @return the blue offset for the given pixel format * @return the blue offset for the given pixel format.
*/ */
public static int getBlueOffset(int pixelFormat) throws Exception { public static int getBlueOffset(int pixelFormat) throws Exception {
if (pixelFormat < 0 || pixelFormat >= NUMPF) if (pixelFormat < 0 || pixelFormat >= NUMPF)
@@ -404,7 +405,7 @@ public final class TJ {
* generating the JPEG image (one of {@link TJ TJ.SAMP_*}) * generating the JPEG image (one of {@link TJ TJ.SAMP_*})
* *
* @return the maximum size of the buffer (in bytes) required to hold a JPEG * @return the maximum size of the buffer (in bytes) required to hold a JPEG
* image with the given width, height, and level of chrominance subsampling * image with the given width, height, and level of chrominance subsampling.
*/ */
public static native int bufSize(int width, int height, int jpegSubsamp) public static native int bufSize(int width, int height, int jpegSubsamp)
throws Exception; throws Exception;
@@ -416,8 +417,7 @@ public final class TJ {
* @param width the width (in pixels) of the YUV image * @param width the width (in pixels) of the YUV image
* *
* @param pad the width of each line in each plane of the image is padded to * @param pad the width of each line in each plane of the image is padded to
* the nearest multiple of this number of bytes (must be a power of * the nearest multiple of this number of bytes (must be a power of 2.)
* 2.)
* *
* @param height the height (in pixels) of the YUV image * @param height the height (in pixels) of the YUV image
* *
@@ -425,7 +425,7 @@ public final class TJ {
* image (one of {@link TJ TJ.SAMP_*}) * image (one of {@link TJ TJ.SAMP_*})
* *
* @return the size of the buffer (in bytes) required to hold a YUV planar * @return the size of the buffer (in bytes) required to hold a YUV planar
* image with the given width, height, and level of chrominance subsampling * image with the given width, height, and level of chrominance subsampling.
*/ */
public static native int bufSizeYUV(int width, int pad, int height, public static native int bufSizeYUV(int width, int pad, int height,
int subsamp) int subsamp)
@@ -438,12 +438,72 @@ public final class TJ {
public static native int bufSizeYUV(int width, int height, int subsamp) public static native int bufSizeYUV(int width, int height, int subsamp)
throws Exception; throws Exception;
/**
* Returns the size of the buffer (in bytes) required to hold a YUV image
* plane with the given parameters.
*
* @param componentID ID number of the image plane (0 = Y, 1 = U/Cb,
* 2 = V/Cr)
*
* @param width width (in pixels) of the YUV image. NOTE: this is the width
* of the whole image, not the plane width.
*
* @param stride bytes per line in the image plane.
*
* @param height height (in pixels) of the YUV image. NOTE: this is the
* height of the whole image, not the plane height.
*
* @param subsamp the level of chrominance subsampling used in the YUV
* image (one of {@link TJ TJ.SAMP_*})
*
* @return the size of the buffer (in bytes) required to hold a YUV planar
* image with the given parameters.
*/
public static native int planeSizeYUV(int componentID, int width, int stride,
int height, int subsamp)
throws Exception;
/**
* Returns the plane width of a YUV image plane with the given parameters.
* Refer to {@link YUVImage YUVImage} for a description of plane width.
*
* @param componentID ID number of the image plane (0 = Y, 1 = U/Cb,
* 2 = V/Cr)
*
* @param width width (in pixels) of the YUV image
*
* @param subsamp the level of chrominance subsampling used in the YUV image
* (one of {@link TJ TJ.SAMP_*})
*
* @return the plane width of a YUV image plane with the given parameters.
*/
public static native int planeWidth(int componentID, int width, int subsamp)
throws Exception;
/**
* Returns the plane height of a YUV image plane with the given parameters.
* Refer to {@link YUVImage YUVImage} for a description of plane height.
*
* @param componentID ID number of the image plane (0 = Y, 1 = U/Cb,
* 2 = V/Cr)
*
* @param height height (in pixels) of the YUV image
*
* @param subsamp the level of chrominance subsampling used in the YUV image
* (one of {@link TJ TJ.SAMP_*})
*
* @return the plane height of a YUV image plane with the given parameters.
*/
public static native int planeHeight(int componentID, int height,
int subsamp)
throws Exception;
/** /**
* Returns a list of fractional scaling factors that the JPEG decompressor in * Returns a list of fractional scaling factors that the JPEG decompressor in
* this implementation of TurboJPEG supports. * this implementation of TurboJPEG supports.
* *
* @return a list of fractional scaling factors that the JPEG decompressor in * @return a list of fractional scaling factors that the JPEG decompressor in
* this implementation of TurboJPEG supports * this implementation of TurboJPEG supports.
*/ */
public static native TJScalingFactor[] getScalingFactors() public static native TJScalingFactor[] getScalingFactors()
throws Exception; throws Exception;

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (C)2011-2013 D. R. Commander. All Rights Reserved. * Copyright (C)2011-2014 D. R. Commander. All Rights Reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met: * modification, are permitted provided that the following conditions are met:
@@ -48,28 +48,7 @@ public class TJCompressor {
/** /**
* Create a TurboJPEG compressor instance and associate the uncompressed * Create a TurboJPEG compressor instance and associate the uncompressed
* source image stored in <code>srcImage</code> with the newly-created * source image stored in <code>srcImage</code> with the newly created
* instance.
*
* @param srcImage see {@link #setSourceImage} for description
*
* @param width see {@link #setSourceImage} for description
*
* @param pitch see {@link #setSourceImage} for description
*
* @param height see {@link #setSourceImage} for description
*
* @param pixelFormat pixel format of the source image (one of
* {@link TJ TJ.PF_*})
*/
public TJCompressor(byte[] srcImage, int width, int pitch, int height,
int pixelFormat) throws Exception {
setSourceImage(srcImage, width, pitch, height, pixelFormat);
}
/**
* Create a TurboJPEG compressor instance and associate the uncompressed
* source image stored in <code>srcImage</code> with the newly-created
* instance. * instance.
* *
* @param srcImage see {@link #setSourceImage} for description * @param srcImage see {@link #setSourceImage} for description
@@ -85,7 +64,7 @@ public class TJCompressor {
* @param height see {@link #setSourceImage} for description * @param height see {@link #setSourceImage} for description
* *
* @param pixelFormat pixel format of the source image (one of * @param pixelFormat pixel format of the source image (one of
* {@link TJ TJ.PF_*}) * {@link TJ#PF_RGB TJ.PF_*})
*/ */
public TJCompressor(byte[] srcImage, int x, int y, int width, int pitch, public TJCompressor(byte[] srcImage, int x, int y, int width, int pitch,
int height, int pixelFormat) throws Exception { int height, int pixelFormat) throws Exception {
@@ -93,34 +72,70 @@ public class TJCompressor {
} }
/** /**
* Associate an uncompressed source image with this compressor instance. * @deprecated Use
* {@link #TJCompressor(byte[], int, int, int, int, int, int)} instead.
*/
@Deprecated
public TJCompressor(byte[] srcImage, int width, int pitch, int height,
int pixelFormat) throws Exception {
setSourceImage(srcImage, width, pitch, height, pixelFormat);
}
/**
* Create a TurboJPEG compressor instance and associate the uncompressed
* source image stored in <code>srcImage</code> with the newly created
* instance.
*
* @param srcImage see
* {@link #setSourceImage(BufferedImage, int, int, int, int)} for description
*
* @param x see
* {@link #setSourceImage(BufferedImage, int, int, int, int)} for description
*
* @param y see
* {@link #setSourceImage(BufferedImage, int, int, int, int)} for description
*
* @param width see
* {@link #setSourceImage(BufferedImage, int, int, int, int)} for description
*
* @param height see
* {@link #setSourceImage(BufferedImage, int, int, int, int)} for description
*/
public TJCompressor(BufferedImage srcImage, int x, int y, int width,
int height) throws Exception {
setSourceImage(srcImage, x, y, width, height);
}
/**
* Associate an uncompressed RGB, grayscale, or CMYK source image with this
* compressor instance.
* *
* @param srcImage image buffer containing RGB, grayscale, or CMYK pixels to * @param srcImage image buffer containing RGB, grayscale, or CMYK pixels to
* be compressed * be compressed or encoded
* *
* @param x x offset (in pixels) of the region from which the JPEG image * @param x x offset (in pixels) of the region in the source image from which
* should be compressed, relative to the start of <code>srcImage</code>. * the JPEG or YUV image should be compressed/encoded
* *
* @param y y offset (in pixels) of the region from which the JPEG image * @param y y offset (in pixels) of the region in the source image from which
* should be compressed, relative to the start of <code>srcImage</code>. * the JPEG or YUV image should be compressed/encoded
* *
* @param width width (in pixels) of the region in the source image from * @param width width (in pixels) of the region in the source image from
* which the JPEG image should be compressed. * which the JPEG or YUV image should be compressed/encoded
* *
* @param pitch bytes per line of the source image. Normally, this should be * @param pitch bytes per line of the source image. Normally, this should be
* <code>width * TJ.pixelSize(pixelFormat)</code> if the source image is * <code>width * TJ.pixelSize(pixelFormat)</code> if the source image is
* unpadded, but you can use this parameter to, for instance, specify that * unpadded, but you can use this parameter to, for instance, specify that
* the scanlines in the source image are padded to a 4-byte boundary or to * the scanlines in the source image are padded to a 4-byte boundary or to
* compress a JPEG image from a region of a larger source image. You can * compress/encode a JPEG or YUV image from a region of a larger source
* also be clever and use this parameter to skip lines, etc. Setting this * image. You can also be clever and use this parameter to skip lines, etc.
* parameter to 0 is the equivalent of setting it to <code>width * * Setting this parameter to 0 is the equivalent of setting it to
* TJ.pixelSize(pixelFormat)</code>. * <code>width * TJ.pixelSize(pixelFormat)</code>.
* *
* @param height height (in pixels) of the region in the source image from * @param height height (in pixels) of the region in the source image from
* which the JPEG image should be compressed. * which the JPEG or YUV image should be compressed/encoded
* *
* @param pixelFormat pixel format of the source image (one of * @param pixelFormat pixel format of the source image (one of
* {@link TJ TJ.PF_*}) * {@link TJ#PF_RGB TJ.PF_*})
*/ */
public void setSourceImage(byte[] srcImage, int x, int y, int width, public void setSourceImage(byte[] srcImage, int x, int y, int width,
int pitch, int height, int pixelFormat) int pitch, int height, int pixelFormat)
@@ -139,7 +154,8 @@ public class TJCompressor {
srcPixelFormat = pixelFormat; srcPixelFormat = pixelFormat;
srcX = x; srcX = x;
srcY = y; srcY = y;
srcIsYUV = false; srcBufInt = null;
srcYUVImage = null;
} }
/** /**
@@ -154,147 +170,38 @@ public class TJCompressor {
} }
/** /**
* Associate an uncompressed YUV planar source image with this compressor * Associate an uncompressed RGB or grayscale source image with this
* instance. * compressor instance.
*
* @param srcImage image buffer containing a YUV planar image to be
* compressed. The Y, U (Cb), and V (Cr) image planes should be stored
* sequentially in the buffer, and the size of each plane is determined by
* the specified width, height, and padding, as well as the level of
* chrominance subsampling (specified using {@link #setSubsamp}.) If the
* chrominance components are subsampled along the horizontal dimension, then
* the width of the luminance plane should be padded to the nearest multiple
* of 2 (same goes for the height of the luminance plane, if the chrominance
* components are subsampled along the vertical dimension.) This is
* irrespective of any additional padding specified in the <code>pad</code>
* parameter.
*
* @param width width (in pixels) of the source image
*
* @param pad the line padding used in the source image. For instance, if
* each line in each plane of the YUV image is padded to the nearest multiple
* of 4 bytes, then <code>pad</code> should be set to 4.
*
* @param height height (in pixels) of the source image
*/
public void setSourceImageYUV(byte[] srcImage, int width, int pad,
int height) throws Exception {
if (handle == 0) init();
if (srcImage == null || width < 1 || pad < 1 || height < 1)
throw new Exception("Invalid argument in setSourceImageYUV()");
srcBuf = srcImage;
srcWidth = width;
srcYUVPad = pad;
srcHeight = height;
srcIsYUV = true;
}
/**
* Set the level of chrominance subsampling for subsequent compress/encode
* operations. When pixels are converted from RGB to YCbCr (see
* {@link TJ#CS_YCbCr}) or from CMYK to YCCK (see {@link TJ#CS_YCCK}) as part
* of the JPEG compression process, some of the Cb and Cr (chrominance)
* components can be discarded or averaged together to produce a smaller
* image with little perceptible loss of image clarity (the human eye is more
* sensitive to small changes in brightness than to small changes in color.)
* This is called "chrominance subsampling".
* <p>
* NOTE: When compressing a YUV planar image into a JPEG image, this method
* also specifies the level of chrominance subsampling used in the source
* image.
*
* @param newSubsamp the new level of chrominance subsampling (one of
* {@link TJ TJ.SAMP_*})
*/
public void setSubsamp(int newSubsamp) throws Exception {
if (newSubsamp < 0 || newSubsamp >= TJ.NUMSAMP)
throw new Exception("Invalid argument in setSubsamp()");
subsamp = newSubsamp;
}
/**
* Set the JPEG image quality level for subsequent compress operations.
*
* @param quality the new JPEG image quality level (1 to 100, 1 = worst,
* 100 = best)
*/
public void setJPEGQuality(int quality) throws Exception {
if (quality < 1 || quality > 100)
throw new Exception("Invalid argument in setJPEGQuality()");
jpegQuality = quality;
}
/**
* Compress the uncompressed source image associated with this compressor
* instance and output a JPEG image to the given destination buffer.
*
* @param dstBuf buffer that will receive the JPEG image. Use
* {@link TJ#bufSize} to determine the maximum size for this buffer based on
* the image width, height, and level of chrominance subsampling.
*
* @param flags the bitwise OR of one or more of {@link TJ TJ.FLAG_*}
*/
public void compress(byte[] dstBuf, int flags) throws Exception {
if (dstBuf == null || flags < 0)
throw new Exception("Invalid argument in compress()");
if (srcBuf == null)
throw new Exception(NO_ASSOC_ERROR);
if (jpegQuality < 0)
throw new Exception("JPEG Quality not set");
if (subsamp < 0)
throw new Exception("Subsampling level not set");
if (srcIsYUV)
compressedSize = compressFromYUV(srcBuf, srcWidth, srcYUVPad, srcHeight,
subsamp, dstBuf, jpegQuality, flags);
else {
if (srcX >= 0 && srcY >= 0)
compressedSize = compress(srcBuf, srcX, srcY, srcWidth, srcPitch,
srcHeight, srcPixelFormat, dstBuf, subsamp,
jpegQuality, flags);
else
compressedSize = compress(srcBuf, srcWidth, srcPitch, srcHeight,
srcPixelFormat, dstBuf, subsamp, jpegQuality,
flags);
}
}
/**
* Compress the uncompressed source image associated with this compressor
* instance and return a buffer containing a JPEG image.
*
* @param flags the bitwise OR of one or more of {@link TJ TJ.FLAG_*}
*
* @return a buffer containing a JPEG image. The length of this buffer will
* not be equal to the size of the JPEG image. Use {@link
* #getCompressedSize} to obtain the size of the JPEG image.
*/
public byte[] compress(int flags) throws Exception {
if (srcWidth < 1 || srcHeight < 1)
throw new Exception(NO_ASSOC_ERROR);
byte[] buf = new byte[TJ.bufSize(srcWidth, srcHeight, subsamp)];
compress(buf, flags);
return buf;
}
/**
* Compress the uncompressed source image stored in <code>srcImage</code>
* and output a JPEG image to the given destination buffer.
* *
* @param srcImage a <code>BufferedImage</code> instance containing RGB or * @param srcImage a <code>BufferedImage</code> instance containing RGB or
* grayscale pixels to be compressed * grayscale pixels to be compressed or encoded
* *
* @param dstBuf buffer that will receive the JPEG image. Use * @param x x offset (in pixels) of the region in the source image from which
* {@link TJ#bufSize} to determine the maximum size for this buffer based on * the JPEG or YUV image should be compressed/encoded
* the image width, height, and level of chrominance subsampling.
* *
* @param flags the bitwise OR of one or more of {@link TJ TJ.FLAG_*} * @param y y offset (in pixels) of the region in the source image from which
* the JPEG or YUV image should be compressed/encoded
*
* @param width width (in pixels) of the region in the source image from
* which the JPEG or YUV image should be compressed/encoded (0 = use the
* width of the source image)
*
* @param height height (in pixels) of the region in the source image from
* which the JPEG or YUV image should be compressed/encoded (0 = use the
* height of the source image)
*/ */
public void compress(BufferedImage srcImage, byte[] dstBuf, int flags) public void setSourceImage(BufferedImage srcImage, int x, int y, int width,
throws Exception { int height) throws Exception {
if (srcImage == null || dstBuf == null || flags < 0) if (handle == 0) init();
throw new Exception("Invalid argument in compress()"); if (srcImage == null || x < 0 || y < 0 || width < 0 || height < 0)
int width = srcImage.getWidth(); throw new Exception("Invalid argument in setSourceImage()");
int height = srcImage.getHeight(); srcX = x;
srcY = y;
srcWidth = (width == 0) ? srcImage.getWidth(): width;
srcHeight = (height == 0) ? srcImage.getHeight() : height;
if (x + width > srcImage.getWidth() || y + height > srcImage.getHeight())
throw new Exception("Compression region exceeds the bounds of the source image");
int pixelFormat; int pixelFormat;
boolean intPixels = false; boolean intPixels = false;
if (byteOrder == null) if (byteOrder == null)
@@ -324,235 +231,333 @@ public class TJCompressor {
default: default:
throw new Exception("Unsupported BufferedImage format"); throw new Exception("Unsupported BufferedImage format");
} }
srcPixelFormat = pixelFormat;
WritableRaster wr = srcImage.getRaster(); WritableRaster wr = srcImage.getRaster();
if (jpegQuality < 0)
throw new Exception("JPEG Quality not set");
if (subsamp < 0)
throw new Exception("Subsampling level not set");
if (intPixels) { if (intPixels) {
SinglePixelPackedSampleModel sm = SinglePixelPackedSampleModel sm =
(SinglePixelPackedSampleModel)srcImage.getSampleModel(); (SinglePixelPackedSampleModel)srcImage.getSampleModel();
int stride = sm.getScanlineStride(); srcStride = sm.getScanlineStride();
DataBufferInt db = (DataBufferInt)wr.getDataBuffer(); DataBufferInt db = (DataBufferInt)wr.getDataBuffer();
int[] buf = db.getData(); srcBufInt = db.getData();
if (srcX >= 0 && srcY >= 0) srcBuf = null;
compressedSize = compress(buf, srcX, srcY, width, stride, height,
pixelFormat, dstBuf, subsamp, jpegQuality,
flags);
else
compressedSize = compress(buf, width, stride, height, pixelFormat,
dstBuf, subsamp, jpegQuality, flags);
} else { } else {
ComponentSampleModel sm = ComponentSampleModel sm =
(ComponentSampleModel)srcImage.getSampleModel(); (ComponentSampleModel)srcImage.getSampleModel();
int pixelSize = sm.getPixelStride(); int pixelSize = sm.getPixelStride();
if (pixelSize != TJ.getPixelSize(pixelFormat)) if (pixelSize != TJ.getPixelSize(pixelFormat))
throw new Exception("Inconsistency between pixel format and pixel size in BufferedImage"); throw new Exception("Inconsistency between pixel format and pixel size in BufferedImage");
int pitch = sm.getScanlineStride(); srcPitch = sm.getScanlineStride();
DataBufferByte db = (DataBufferByte)wr.getDataBuffer(); DataBufferByte db = (DataBufferByte)wr.getDataBuffer();
byte[] buf = db.getData(); srcBuf = db.getData();
srcBufInt = null;
}
srcYUVImage = null;
}
/**
* Associate an uncompressed YUV planar source image with this compressor
* instance.
*
* @param srcImage YUV planar image to be compressed
*/
public void setSourceImage(YUVImage srcImage) throws Exception {
if (handle == 0) init();
if (srcImage == null)
throw new Exception("Invalid argument in setSourceImage()");
srcYUVImage = srcImage;
srcBuf = null;
srcBufInt = null;
}
/**
* Set the level of chrominance subsampling for subsequent compress/encode
* operations. When pixels are converted from RGB to YCbCr (see
* {@link TJ#CS_YCbCr}) or from CMYK to YCCK (see {@link TJ#CS_YCCK}) as part
* of the JPEG compression process, some of the Cb and Cr (chrominance)
* components can be discarded or averaged together to produce a smaller
* image with little perceptible loss of image clarity (the human eye is more
* sensitive to small changes in brightness than to small changes in color.)
* This is called "chrominance subsampling".
* <p>
* NOTE: This method has no effect when compressing a JPEG image from a YUV
* planar source. In that case, the level of chrominance subsampling in
* the JPEG image is determined by the source. Further, this method has no
* effect when encoding to a pre-allocated {@link YUVImage} instance. In
* that case, the level of chrominance subsampling is determined by the
* destination.
*
* @param newSubsamp the level of chrominance subsampling to use in
* subsequent compress/encode oeprations (one of
* {@link TJ#SAMP_444 TJ.SAMP_*})
*/
public void setSubsamp(int newSubsamp) throws Exception {
if (newSubsamp < 0 || newSubsamp >= TJ.NUMSAMP)
throw new Exception("Invalid argument in setSubsamp()");
subsamp = newSubsamp;
}
/**
* Set the JPEG image quality level for subsequent compress operations.
*
* @param quality the new JPEG image quality level (1 to 100, 1 = worst,
* 100 = best)
*/
public void setJPEGQuality(int quality) throws Exception {
if (quality < 1 || quality > 100)
throw new Exception("Invalid argument in setJPEGQuality()");
jpegQuality = quality;
}
/**
* Compress the uncompressed source image associated with this compressor
* instance and output a JPEG image to the given destination buffer.
*
* @param dstBuf buffer that will receive the JPEG image. Use
* {@link TJ#bufSize} to determine the maximum size for this buffer based on
* the source image's width and height and the desired level of chrominance
* subsampling.
*
* @param flags the bitwise OR of one or more of
* {@link TJ#FLAG_BOTTOMUP TJ.FLAG_*}
*/
public void compress(byte[] dstBuf, int flags) throws Exception {
if (dstBuf == null || flags < 0)
throw new Exception("Invalid argument in compress()");
if (srcBuf == null && srcBufInt == null && srcYUVImage == null)
throw new Exception(NO_ASSOC_ERROR);
if (jpegQuality < 0)
throw new Exception("JPEG Quality not set");
if (subsamp < 0 && srcYUVImage == null)
throw new Exception("Subsampling level not set");
if (srcYUVImage != null)
compressedSize = compressFromYUV(srcYUVImage.getPlanes(),
srcYUVImage.getOffsets(),
srcYUVImage.getWidth(),
srcYUVImage.getStrides(),
srcYUVImage.getHeight(),
srcYUVImage.getSubsamp(),
dstBuf, jpegQuality, flags);
else if (srcBuf != null) {
if (srcX >= 0 && srcY >= 0) if (srcX >= 0 && srcY >= 0)
compressedSize = compress(buf, srcX, srcY, width, pitch, height, compressedSize = compress(srcBuf, srcX, srcY, srcWidth, srcPitch,
pixelFormat, dstBuf, subsamp, jpegQuality, srcHeight, srcPixelFormat, dstBuf, subsamp,
flags); jpegQuality, flags);
else else
compressedSize = compress(buf, width, pitch, height, pixelFormat, compressedSize = compress(srcBuf, srcWidth, srcPitch, srcHeight,
dstBuf, subsamp, jpegQuality, flags); srcPixelFormat, dstBuf, subsamp, jpegQuality,
flags);
} else if (srcBufInt != null) {
if (srcX >= 0 && srcY >= 0)
compressedSize = compress(srcBufInt, srcX, srcY, srcWidth, srcStride,
srcHeight, srcPixelFormat, dstBuf, subsamp,
jpegQuality, flags);
else
compressedSize = compress(srcBufInt, srcWidth, srcStride, srcHeight,
srcPixelFormat, dstBuf, subsamp, jpegQuality,
flags);
} }
} }
/** /**
* Compress the uncompressed source image stored in <code>srcImage</code> * Compress the uncompressed source image associated with this compressor
* and return a buffer containing a JPEG image. * instance and return a buffer containing a JPEG image.
* *
* @param srcImage a <code>BufferedImage</code> instance containing RGB or * @param flags the bitwise OR of one or more of
* grayscale pixels to be compressed * {@link TJ#FLAG_BOTTOMUP TJ.FLAG_*}
*
* @param flags the bitwise OR of one or more of {@link TJ TJ.FLAG_*}
* *
* @return a buffer containing a JPEG image. The length of this buffer will * @return a buffer containing a JPEG image. The length of this buffer will
* not be equal to the size of the JPEG image. Use {@link * not be equal to the size of the JPEG image. Use {@link
* #getCompressedSize} to obtain the size of the JPEG image. * #getCompressedSize} to obtain the size of the JPEG image.
*/ */
public byte[] compress(BufferedImage srcImage, int flags) throws Exception { public byte[] compress(int flags) throws Exception {
int width = srcImage.getWidth(); if (srcWidth < 1 || srcHeight < 1)
int height = srcImage.getHeight(); throw new Exception(NO_ASSOC_ERROR);
byte[] buf = new byte[TJ.bufSize(width, height, subsamp)]; byte[] buf = new byte[TJ.bufSize(srcWidth, srcHeight, subsamp)];
compress(srcImage, buf, flags); compress(buf, flags);
return buf; return buf;
} }
/**
* @deprecated Use
* {@link #setSourceImage(BufferedImage, int, int, int, int)} and
* {@link #compress(byte[], int)} instead.
*/
@Deprecated
public void compress(BufferedImage srcImage, byte[] dstBuf, int flags)
throws Exception {
setSourceImage(srcImage, 0, 0, 0, 0);
compress(dstBuf, flags);
}
/** /**
* Set the plane padding for subsequent YUV encode operations. * @deprecated Use
* * {@link #setSourceImage(BufferedImage, int, int, int, int)} and
* @param pad the width of each line in each plane of the YUV image will be * {@link #compress(int)} instead.
* padded to the nearest multiple of this number of bytes (must be a
* power of 2.) The default padding is 4 bytes, which generates
* images suitable for direct video display.
*/ */
public void setYUVPad(int pad) throws Exception { @Deprecated
if(pad < 1 || ((pad & (pad - 1)) != 0)) public byte[] compress(BufferedImage srcImage, int flags) throws Exception {
throw new Exception("Invalid argument in setYUVPad()"); setSourceImage(srcImage, 0, 0, 0, 0);
yuvPad = pad; return compress(flags);
} }
/** /**
* Encode the uncompressed source image associated with this compressor * Encode the uncompressed source image associated with this compressor
* instance and output a YUV planar image to the given destination buffer. * instance into a YUV planar image and store it in the given
* This method uses the accelerated color conversion routines in TurboJPEG's * <code>YUVImage</code> instance. This method uses the accelerated color
* underlying codec but does not execute any of the other steps in the JPEG * conversion routines in TurboJPEG's underlying codec but does not execute
* compression process. The Y, U (Cb), and V (Cr) image planes are stored * any of the other steps in the JPEG compression process. Encoding
* sequentially into the destination buffer, and the size of each plane is * CMYK source images to YUV is not supported.
* determined by the width and height of the source image, as well as the
* specified padding and level of chrominance subsampling. If the
* chrominance components are subsampled along the horizontal dimension, then
* the width of the luminance plane is padded to the nearest multiple of 2 in
* the output image (same goes for the height of the luminance plane, if the
* chrominance components are subsampled along the vertical dimension.)
* <p>
* NOTE: Technically, the JPEG format uses the YCbCr colorspace, but per the
* convention of the digital video community, the TurboJPEG API uses "YUV" to
* refer to an image format consisting of Y, Cb, and Cr image planes.
* *
* @param dstBuf buffer that will receive the YUV planar image. Use * @param dstImage {@link YUVImage} instance that will receive the YUV planar
* {@link TJ#bufSizeYUV} to determine the appropriate size for this buffer * image
* based on the image width, height, and level of chrominance subsampling.
* *
* @param flags the bitwise OR of one or more of {@link TJ TJ.FLAG_*} * @param flags the bitwise OR of one or more of
* {@link TJ#FLAG_BOTTOMUP TJ.FLAG_*}
*/ */
public void encodeYUV(YUVImage dstImage, int flags) throws Exception {
if (dstImage == null || flags < 0)
throw new Exception("Invalid argument in encodeYUV()");
if (srcBuf == null && srcBufInt == null)
throw new Exception(NO_ASSOC_ERROR);
if (srcYUVImage != null)
throw new Exception("Source image is not correct type");
if (subsamp < 0)
throw new Exception("Subsampling level not set");
if (srcWidth != dstImage.getWidth() || srcHeight != dstImage.getHeight())
throw new Exception("Destination image is the wrong size");
if (srcBufInt != null) {
encodeYUV(srcBufInt, srcX, srcY, srcWidth, srcStride, srcHeight,
srcPixelFormat, dstImage.getPlanes(), dstImage.getOffsets(),
dstImage.getStrides(), dstImage.getSubsamp(), flags);
} else {
encodeYUV(srcBuf, srcX, srcY, srcWidth, srcPitch, srcHeight,
srcPixelFormat, dstImage.getPlanes(), dstImage.getOffsets(),
dstImage.getStrides(), dstImage.getSubsamp(), flags);
}
compressedSize = 0;
}
/**
* @deprecated Use {@link #encodeYUV(YUVImage, int)} instead.
*/
@Deprecated
public void encodeYUV(byte[] dstBuf, int flags) throws Exception { public void encodeYUV(byte[] dstBuf, int flags) throws Exception {
if (dstBuf == null || flags < 0) if(dstBuf == null)
throw new Exception("Invalid argument in compress()"); throw new Exception("Invalid argument in encodeYUV()");
if (srcBuf == null) if (srcWidth < 1 || srcHeight < 1)
throw new Exception(NO_ASSOC_ERROR); throw new Exception(NO_ASSOC_ERROR);
if (subsamp < 0) if (subsamp < 0)
throw new Exception("Subsampling level not set"); throw new Exception("Subsampling level not set");
encodeYUV(srcBuf, srcWidth, srcPitch, srcHeight, srcPixelFormat, dstBuf, YUVImage yuvImage = new YUVImage(dstBuf, srcWidth, 4, srcHeight, subsamp);
yuvPad, subsamp, flags); encodeYUV(yuvImage, flags);
compressedSize = TJ.bufSizeYUV(srcWidth, yuvPad, srcHeight, subsamp);
} }
/** /**
* Encode the uncompressed source image associated with this compressor * Encode the uncompressed source image associated with this compressor
* instance and return a buffer containing a YUV planar image. See * instance into a unified YUV planar image buffer and return a
* {@link #encodeYUV(byte[], int)} for more detail. * <code>YUVImage</code> instance containing the encoded image. This method
* uses the accelerated color conversion routines in TurboJPEG's underlying
* codec but does not execute any of the other steps in the JPEG compression
* process. Encoding CMYK source images to YUV is not supported.
* *
* @param flags the bitwise OR of one or more of {@link TJ TJ.FLAG_*} * @param pad the width of each line in each plane of the YUV image will be
* padded to the nearest multiple of this number of bytes (must be a power of
* 2.)
* *
* @return a buffer containing a YUV planar image * @param flags the bitwise OR of one or more of
* {@link TJ#FLAG_BOTTOMUP TJ.FLAG_*}
*
* @return a YUV planar image.
*/ */
public YUVImage encodeYUV(int pad, int flags) throws Exception {
if (srcWidth < 1 || srcHeight < 1)
throw new Exception(NO_ASSOC_ERROR);
if (subsamp < 0)
throw new Exception("Subsampling level not set");
if(pad < 1 || ((pad & (pad - 1)) != 0))
throw new Exception("Invalid argument in encodeYUV()");
YUVImage yuvImage = new YUVImage(srcWidth, pad, srcHeight, subsamp);
encodeYUV(yuvImage, flags);
return yuvImage;
}
/**
* Encode the uncompressed source image associated with this compressor
* instance into separate Y, U (Cb), and V (Cr) image planes and return a
* <code>YUVImage</code> instance containing the encoded image planes. This
* method uses the accelerated color conversion routines in TurboJPEG's
* underlying codec but does not execute any of the other steps in the JPEG
* compression process. Encoding CMYK source images to YUV is not supported.
*
* @param strides an array of integers, each specifying the number of bytes
* per line in the corresponding plane of the output image. Setting the
* stride for any plane to 0 is the same as setting it to the component width
* of the plane. If <code>strides</code> is null, then the strides for all
* planes will be set to their respective component widths. You can adjust
* the strides in order to add an arbitrary amount of line padding to each
* plane.
*
* @param flags the bitwise OR of one or more of
* {@link TJ#FLAG_BOTTOMUP TJ.FLAG_*}
*
* @return a YUV planar image.
*/
public YUVImage encodeYUV(int[] strides, int flags) throws Exception {
if (srcWidth < 1 || srcHeight < 1)
throw new Exception(NO_ASSOC_ERROR);
if (subsamp < 0)
throw new Exception("Subsampling level not set");
YUVImage yuvImage = new YUVImage(srcWidth, strides, srcHeight, subsamp);
encodeYUV(yuvImage, flags);
return yuvImage;
}
/**
* @deprecated Use {@link #encodeYUV(int, int)} instead.
*/
@Deprecated
public byte[] encodeYUV(int flags) throws Exception { public byte[] encodeYUV(int flags) throws Exception {
if (srcWidth < 1 || srcHeight < 1) if (srcWidth < 1 || srcHeight < 1)
throw new Exception(NO_ASSOC_ERROR); throw new Exception(NO_ASSOC_ERROR);
if (subsamp < 0) if (subsamp < 0)
throw new Exception("Subsampling level not set"); throw new Exception("Subsampling level not set");
byte[] buf = new byte[TJ.bufSizeYUV(srcWidth, yuvPad, srcHeight, subsamp)]; YUVImage yuvImage = new YUVImage(srcWidth, 4, srcHeight, subsamp);
encodeYUV(buf, flags); encodeYUV(yuvImage, flags);
return buf; return yuvImage.getBuf();
} }
/** /**
* Encode the uncompressed source image stored in <code>srcImage</code> * @deprecated Use
* and output a YUV planar image to the given destination buffer. See * {@link #setSourceImage(BufferedImage, int, int, int, int)} and
* {@link #encodeYUV(byte[], int)} for more detail. * {@link #encodeYUV(byte[], int)} instead.
*
* @param srcImage a <code>BufferedImage</code> instance containing RGB or
* grayscale pixels to be encoded
*
* @param dstBuf buffer that will receive the YUV planar image. Use
* {@link TJ#bufSizeYUV} to determine the appropriate size for this buffer
* based on the image width, height, and level of chrominance subsampling.
*
* @param flags the bitwise OR of one or more of {@link TJ TJ.FLAG_*}
*/ */
@Deprecated
public void encodeYUV(BufferedImage srcImage, byte[] dstBuf, int flags) public void encodeYUV(BufferedImage srcImage, byte[] dstBuf, int flags)
throws Exception { throws Exception {
if (srcImage == null || dstBuf == null || flags < 0) setSourceImage(srcImage, 0, 0, 0, 0);
throw new Exception("Invalid argument in encodeYUV()"); encodeYUV(dstBuf, flags);
int width = srcImage.getWidth();
int height = srcImage.getHeight();
int pixelFormat; boolean intPixels = false;
if (byteOrder == null)
byteOrder = ByteOrder.nativeOrder();
switch(srcImage.getType()) {
case BufferedImage.TYPE_3BYTE_BGR:
pixelFormat = TJ.PF_BGR; break;
case BufferedImage.TYPE_4BYTE_ABGR:
case BufferedImage.TYPE_4BYTE_ABGR_PRE:
pixelFormat = TJ.PF_XBGR; break;
case BufferedImage.TYPE_BYTE_GRAY:
pixelFormat = TJ.PF_GRAY; break;
case BufferedImage.TYPE_INT_BGR:
if (byteOrder == ByteOrder.BIG_ENDIAN)
pixelFormat = TJ.PF_XBGR;
else
pixelFormat = TJ.PF_RGBX;
intPixels = true; break;
case BufferedImage.TYPE_INT_RGB:
case BufferedImage.TYPE_INT_ARGB:
case BufferedImage.TYPE_INT_ARGB_PRE:
if (byteOrder == ByteOrder.BIG_ENDIAN)
pixelFormat = TJ.PF_XRGB;
else
pixelFormat = TJ.PF_BGRX;
intPixels = true; break;
default:
throw new Exception("Unsupported BufferedImage format");
}
WritableRaster wr = srcImage.getRaster();
if (subsamp < 0) throw new Exception("Subsampling level not set");
if (intPixels) {
SinglePixelPackedSampleModel sm =
(SinglePixelPackedSampleModel)srcImage.getSampleModel();
int stride = sm.getScanlineStride();
DataBufferInt db = (DataBufferInt)wr.getDataBuffer();
int[] buf = db.getData();
encodeYUV(buf, width, stride, height, pixelFormat, dstBuf, yuvPad,
subsamp, flags);
} else {
ComponentSampleModel sm =
(ComponentSampleModel)srcImage.getSampleModel();
int pixelSize = sm.getPixelStride();
if (pixelSize != TJ.getPixelSize(pixelFormat))
throw new Exception("Inconsistency between pixel format and pixel size in BufferedImage");
int pitch = sm.getScanlineStride();
DataBufferByte db = (DataBufferByte)wr.getDataBuffer();
byte[] buf = db.getData();
encodeYUV(buf, width, pitch, height, pixelFormat, dstBuf, yuvPad,
subsamp, flags);
}
compressedSize = TJ.bufSizeYUV(width, yuvPad, height, subsamp);
} }
/** /**
* Encode the uncompressed source image stored in <code>srcImage</code> * @deprecated Use
* and return a buffer containing a YUV planar image. See * {@link #setSourceImage(BufferedImage, int, int, int, int)} and
* {@link #encodeYUV(byte[], int)} for more detail. * {@link #encodeYUV(int, int)} instead.
*
* @param srcImage a <code>BufferedImage</code> instance containing RGB or
* grayscale pixels to be encoded
*
* @param flags the bitwise OR of one or more of {@link TJ TJ.FLAG_*}
*
* @return a buffer containing a YUV planar image
*/ */
@Deprecated
public byte[] encodeYUV(BufferedImage srcImage, int flags) throws Exception { public byte[] encodeYUV(BufferedImage srcImage, int flags) throws Exception {
if (subsamp < 0) setSourceImage(srcImage, 0, 0, 0, 0);
throw new Exception("Subsampling level not set"); return encodeYUV(flags);
int width = srcImage.getWidth();
int height = srcImage.getHeight();
byte[] buf = new byte[TJ.bufSizeYUV(width, yuvPad, height, subsamp)];
encodeYUV(srcImage, buf, flags);
return buf;
} }
/** /**
* Returns the size of the image (in bytes) generated by the most recent * Returns the size of the image (in bytes) generated by the most recent
* compress/encode operation. * compress operation.
* *
* @return the size of the image (in bytes) generated by the most recent * @return the size of the image (in bytes) generated by the most recent
* compress/encode operation * compress operation.
*/ */
public int getCompressedSize() { public int getCompressedSize() {
return compressedSize; return compressedSize;
@@ -595,25 +600,28 @@ public class TJCompressor {
int stride, int height, int pixelFormat, byte[] dstBuf, int jpegSubsamp, int stride, int height, int pixelFormat, byte[] dstBuf, int jpegSubsamp,
int jpegQual, int flags) throws Exception; int jpegQual, int flags) throws Exception;
private native int compressFromYUV(byte[] srcBuf, int width, int pad, private native int compressFromYUV(byte[][] srcPlanes, int[] srcOffsets,
int height, int subsamp, byte[] dstBuf, int jpegQual, int flags) int width, int[] srcStrides, int height, int subsamp, byte[] dstBuf,
int jpegQual, int flags)
throws Exception; throws Exception;
private native void encodeYUV(byte[] srcBuf, int width, int pitch, private native void encodeYUV(byte[] srcBuf, int width, int pitch,
int height, int pixelFormat, byte[] dstBuf, int subsamp, int flags) int height, int pixelFormat, byte[] dstBuf, int subsamp, int flags)
throws Exception; // deprecated throws Exception; // deprecated
private native void encodeYUV(byte[] srcBuf, int width, int pitch, private native void encodeYUV(byte[] srcBuf, int x, int y, int width,
int height, int pixelFormat, byte[] dstBuf, int pad, int subsamp, int pitch, int height, int pixelFormat, byte[][] dstPlanes,
int flags) throws Exception; int[] dstOffsets, int[] dstStrides, int subsamp, int flags)
throws Exception;
private native void encodeYUV(int[] srcBuf, int width, int stride, private native void encodeYUV(int[] srcBuf, int width, int stride,
int height, int pixelFormat, byte[] dstBuf, int subsamp, int flags) int height, int pixelFormat, byte[] dstBuf, int subsamp, int flags)
throws Exception; // deprecated throws Exception; // deprecated
private native void encodeYUV(int[] srcBuf, int width, int pitch, private native void encodeYUV(int[] srcBuf, int x, int y, int width,
int height, int pixelFormat, byte[] dstBuf, int pad, int subsamp, int srcStride, int height, int pixelFormat, byte[][] dstPlanes,
int flags) throws Exception; int[] dstOffsets, int[] dstStrides, int subsamp, int flags)
throws Exception;
static { static {
TJLoader.load(); TJLoader.load();
@@ -621,14 +629,15 @@ public class TJCompressor {
private long handle = 0; private long handle = 0;
private byte[] srcBuf = null; private byte[] srcBuf = null;
private int[] srcBufInt = null;
private int srcWidth = 0; private int srcWidth = 0;
private int srcHeight = 0; private int srcHeight = 0;
private int srcX = -1; private int srcX = -1;
private int srcY = -1; private int srcY = -1;
private int srcPitch = 0; private int srcPitch = 0;
private int srcStride = 0;
private int srcPixelFormat = -1; private int srcPixelFormat = -1;
private int srcYUVPad = -1; private YUVImage srcYUVImage = null;
private boolean srcIsYUV;
private int subsamp = -1; private int subsamp = -1;
private int jpegQuality = -1; private int jpegQuality = -1;
private int compressedSize = 0; private int compressedSize = 0;

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (C)2011-2013 D. R. Commander. All Rights Reserved. * Copyright (C)2011-2014 D. R. Commander. All Rights Reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met: * modification, are permitted provided that the following conditions are met:
@@ -47,21 +47,21 @@ public class TJDecompressor {
} }
/** /**
* Create a TurboJPEG decompressor instance and associate the JPEG image * Create a TurboJPEG decompressor instance and associate the JPEG source
* stored in <code>jpegImage</code> with the newly-created instance. * image stored in <code>jpegImage</code> with the newly created instance.
* *
* @param jpegImage JPEG image buffer (size of the JPEG image is assumed to * @param jpegImage JPEG image buffer (size of the JPEG image is assumed to
* be the length of the array) * be the length of the array)
*/ */
public TJDecompressor(byte[] jpegImage) throws Exception { public TJDecompressor(byte[] jpegImage) throws Exception {
init(); init();
setJPEGImage(jpegImage, jpegImage.length); setSourceImage(jpegImage, jpegImage.length);
} }
/** /**
* Create a TurboJPEG decompressor instance and associate the JPEG image * Create a TurboJPEG decompressor instance and associate the JPEG source
* of length <code>imageSize</code> bytes stored in <code>jpegImage</code> * image of length <code>imageSize</code> bytes stored in
* with the newly-created instance. * <code>jpegImage</code> with the newly created instance.
* *
* @param jpegImage JPEG image buffer * @param jpegImage JPEG image buffer
* *
@@ -69,7 +69,20 @@ public class TJDecompressor {
*/ */
public TJDecompressor(byte[] jpegImage, int imageSize) throws Exception { public TJDecompressor(byte[] jpegImage, int imageSize) throws Exception {
init(); init();
setJPEGImage(jpegImage, imageSize); setSourceImage(jpegImage, imageSize);
}
/**
* Create a TurboJPEG decompressor instance and associate the YUV planar
* source image stored in <code>yuvImage</code> with the newly created
* instance.
*
* @param yuvImage {@link YUVImage} instance containing a YUV planar
* image to be decoded
*/
public TJDecompressor(YUVImage yuvImage) throws Exception {
init();
setSourceImage(yuvImage);
} }
/** /**
@@ -81,48 +94,82 @@ public class TJDecompressor {
* *
* @param imageSize size of the JPEG image (in bytes) * @param imageSize size of the JPEG image (in bytes)
*/ */
public void setJPEGImage(byte[] jpegImage, int imageSize) throws Exception { public void setSourceImage(byte[] jpegImage, int imageSize)
throws Exception {
if (jpegImage == null || imageSize < 1) if (jpegImage == null || imageSize < 1)
throw new Exception("Invalid argument in setJPEGImage()"); throw new Exception("Invalid argument in setSourceImage()");
jpegBuf = jpegImage; jpegBuf = jpegImage;
jpegBufSize = imageSize; jpegBufSize = imageSize;
decompressHeader(jpegBuf, jpegBufSize); decompressHeader(jpegBuf, jpegBufSize);
yuvImage = null;
} }
/** /**
* Returns the width of the JPEG image associated with this decompressor * @deprecated Use {@link #setSourceImage(byte[], int)} instead.
* instance. */
@Deprecated
public void setJPEGImage(byte[] jpegImage, int imageSize) throws Exception {
setSourceImage(jpegImage, imageSize);
}
/**
* Associate the specified YUV planar source image with this decompressor
* instance. Subsequent decompress operations will decode this image into an
* RGB or grayscale destination image.
* *
* @return the width of the JPEG image associated with this decompressor * @param srcImage {@link YUVImage} instance containing a YUV planar image to
* instance * be decoded
*/
public void setSourceImage(YUVImage srcImage) throws Exception {
if (srcImage == null)
throw new Exception("Invalid argument in setSourceImage()");
yuvImage = srcImage;
jpegBuf = null;
jpegBufSize = 0;
}
/**
* Returns the width of the source image (JPEG or YUV) associated with this
* decompressor instance.
*
* @return the width of the source image (JPEG or YUV) associated with this
* decompressor instance.
*/ */
public int getWidth() throws Exception { public int getWidth() throws Exception {
if (yuvImage != null)
return yuvImage.getWidth();
if (jpegWidth < 1) if (jpegWidth < 1)
throw new Exception(NO_ASSOC_ERROR); throw new Exception(NO_ASSOC_ERROR);
return jpegWidth; return jpegWidth;
} }
/** /**
* Returns the height of the JPEG image associated with this decompressor * Returns the height of the source image (JPEG or YUV) associated with this
* instance. * decompressor instance.
* *
* @return the height of the JPEG image associated with this decompressor * @return the height of the source image (JPEG or YUV) associated with this
* instance * decompressor instance.
*/ */
public int getHeight() throws Exception { public int getHeight() throws Exception {
if (yuvImage != null)
return yuvImage.getHeight();
if (jpegHeight < 1) if (jpegHeight < 1)
throw new Exception(NO_ASSOC_ERROR); throw new Exception(NO_ASSOC_ERROR);
return jpegHeight; return jpegHeight;
} }
/** /**
* Returns the level of chrominance subsampling used in the JPEG image * Returns the level of chrominance subsampling used in the source image
* associated with this decompressor instance. See {@link TJ TJ.SAMP_*}. * (JPEG or YUV) associated with this decompressor instance. See
* {@link TJ#SAMP_444 TJ.SAMP_*}.
* *
* @return the level of chrominance subsampling used in the JPEG image * @return the level of chrominance subsampling used in the source image
* associated with this decompressor instance * (JPEG or YUV) associated with this decompressor instance.
*/ */
public int getSubsamp() throws Exception { public int getSubsamp() throws Exception {
if (yuvImage != null)
return yuvImage.getSubsamp();
if (jpegSubsamp < 0) if (jpegSubsamp < 0)
throw new Exception(NO_ASSOC_ERROR); throw new Exception(NO_ASSOC_ERROR);
if (jpegSubsamp >= TJ.NUMSAMP) if (jpegSubsamp >= TJ.NUMSAMP)
@@ -131,13 +178,16 @@ public class TJDecompressor {
} }
/** /**
* Returns the colorspace used in the JPEG image associated with this * Returns the colorspace used in the source image (JPEG or YUV) associated
* decompressor instance. See {@link TJ TJ.CS_*}. * with this decompressor instance. See {@link TJ#CS_RGB TJ.CS_*}. If the
* source image is YUV, then this always returns {@link TJ#CS_YCbCr}.
* *
* @return the colorspace used in the JPEG image associated with this * @return the colorspace used in the source image (JPEG or YUV) associated
* decompressor instance * with this decompressor instance.
*/ */
public int getColorspace() throws Exception { public int getColorspace() throws Exception {
if (yuvImage != null)
return TJ.CS_YCbCr;
if (jpegColorspace < 0) if (jpegColorspace < 0)
throw new Exception(NO_ASSOC_ERROR); throw new Exception(NO_ASSOC_ERROR);
if (jpegColorspace >= TJ.NUMCS) if (jpegColorspace >= TJ.NUMCS)
@@ -148,7 +198,7 @@ public class TJDecompressor {
/** /**
* Returns the JPEG image buffer associated with this decompressor instance. * Returns the JPEG image buffer associated with this decompressor instance.
* *
* @return the JPEG image buffer associated with this decompressor instance * @return the JPEG image buffer associated with this decompressor instance.
*/ */
public byte[] getJPEGBuf() throws Exception { public byte[] getJPEGBuf() throws Exception {
if (jpegBuf == null) if (jpegBuf == null)
@@ -161,7 +211,7 @@ public class TJDecompressor {
* decompressor instance. * decompressor instance.
* *
* @return the size of the JPEG image (in bytes) associated with this * @return the size of the JPEG image (in bytes) associated with this
* decompressor instance * decompressor instance.
*/ */
public int getJPEGSize() throws Exception { public int getJPEGSize() throws Exception {
if (jpegBufSize < 1) if (jpegBufSize < 1)
@@ -169,7 +219,6 @@ public class TJDecompressor {
return jpegBufSize; return jpegBufSize;
} }
/** /**
* Returns the width of the largest scaled-down image that the TurboJPEG * Returns the width of the largest scaled-down image that the TurboJPEG
* decompressor can generate without exceeding the desired image width and * decompressor can generate without exceeding the desired image width and
@@ -187,7 +236,7 @@ public class TJDecompressor {
* *
* @return the width of the largest scaled-down image that the TurboJPEG * @return the width of the largest scaled-down image that the TurboJPEG
* decompressor can generate without exceeding the desired image width and * decompressor can generate without exceeding the desired image width and
* height * height.
*/ */
public int getScaledWidth(int desiredWidth, int desiredHeight) public int getScaledWidth(int desiredWidth, int desiredHeight)
throws Exception { throws Exception {
@@ -229,7 +278,7 @@ public class TJDecompressor {
* *
* @return the height of the largest scaled-down image that the TurboJPEG * @return the height of the largest scaled-down image that the TurboJPEG
* decompressor can generate without exceeding the desired image width and * decompressor can generate without exceeding the desired image width and
* height * height.
*/ */
public int getScaledHeight(int desiredWidth, int desiredHeight) public int getScaledHeight(int desiredWidth, int desiredHeight)
throws Exception { throws Exception {
@@ -255,67 +304,84 @@ public class TJDecompressor {
} }
/** /**
* Decompress the JPEG source image associated with this decompressor * Decompress the JPEG source image or decode the YUV source image associated
* instance and output a decompressed image to the given destination buffer. * with this decompressor instance and output a grayscale, RGB, or CMYK image
* to the given destination buffer.
* *
* @param dstBuf buffer that will receive the decompressed image. This * @param dstBuf buffer that will receive the decompressed/decoded image.
* buffer should normally be <code>pitch * scaledHeight</code> bytes in size, * If the source image is a JPEG image, then this buffer should normally be
* where <code>scaledHeight</code> can be determined by calling <code> * <code>pitch * scaledHeight</code> bytes in size, where
* <code>scaledHeight</code> can be determined by calling <code>
* scalingFactor.{@link TJScalingFactor#getScaled getScaled}(jpegHeight) * scalingFactor.{@link TJScalingFactor#getScaled getScaled}(jpegHeight)
* </code> with one of the scaling factors returned from {@link * </code> with one of the scaling factors returned from {@link
* TJ#getScalingFactors} or by calling {@link #getScaledHeight}. However, * TJ#getScalingFactors} or by calling {@link #getScaledHeight}. If the
* the buffer may also be larger than the dimensions of the JPEG image, in * source image is a YUV image, then this buffer should normally be
* which case the <code>x</code>, <code>y</code>, and <code>pitch</code> * <code>pitch * height</code> bytes in size, where <code>height</code> is
* parameters can be used to specify the region into which the JPEG image * the height of the YUV image. However, the buffer may also be larger than
* should be decompressed. * the dimensions of the source image, in which case the <code>x</code>,
* <code>y</code>, and <code>pitch</code> parameters can be used to specify
* the region into which the source image should be decompressed/decoded.
* *
* @param x x offset (in pixels) of the region into which the JPEG image * @param x x offset (in pixels) of the region in the destination image into
* should be decompressed, relative to the start of <code>dstBuf</code>. * which the source image should be decompressed/decoded
* *
* @param y y offset (in pixels) of the region into which the JPEG image * @param y y offset (in pixels) of the region in the destination image into
* should be decompressed, relative to the start of <code>dstBuf</code>. * which the source image should be decompressed/decoded
* *
* @param desiredWidth desired width (in pixels) of the decompressed image * @param desiredWidth If the source image is a JPEG image, then this
* (or image region.) If the desired image dimensions are different than the * specifies the desired width (in pixels) of the decompressed image (or
* dimensions of the JPEG image being decompressed, then TurboJPEG will use * image region.) If the desired destination image dimensions are different
* scaling in the JPEG decompressor to generate the largest possible image * than the source image dimensions, then TurboJPEG will use scaling in the
* that will fit within the desired dimensions. Setting this to 0 is the * JPEG decompressor to generate the largest possible image that will fit
* same as setting it to the width of the JPEG image (in other words, the * within the desired dimensions. Setting this to 0 is the same as setting
* width will not be considered when determining the scaled image size.) * it to the width of the JPEG image (in other words, the width will not be
* considered when determining the scaled image size.) This parameter is
* ignored if the source image is a YUV image.
* *
* @param pitch bytes per line of the destination image. Normally, this * @param pitch bytes per line of the destination image. Normally, this
* should be set to <code>scaledWidth * TJ.pixelSize(pixelFormat)</code> if * should be set to <code>scaledWidth * TJ.pixelSize(pixelFormat)</code> if
* the decompressed image is unpadded, but you can use this to, for instance, * the destination image is unpadded, but you can use this to, for instance,
* pad each line of the decompressed image to a 4-byte boundary or to * pad each line of the destination image to a 4-byte boundary or to
* decompress the JPEG image into a region of a larger image. NOTE: * decompress/decode the source image into a region of a larger image. NOTE:
* <code>scaledWidth</code> can be determined by calling <code> * if the source image is a JPEG image, then <code>scaledWidth</code> can be
* determined by calling <code>
* scalingFactor.{@link TJScalingFactor#getScaled getScaled}(jpegWidth) * scalingFactor.{@link TJScalingFactor#getScaled getScaled}(jpegWidth)
* </code> or by calling {@link #getScaledWidth}. Setting this parameter to * </code> or by calling {@link #getScaledWidth}. If the source image is a
* 0 is the equivalent of setting it to <code>scaledWidth * * YUV image, then <code>scaledWidth</code> is the width of the YUV image.
* TJ.pixelSize(pixelFormat)</code>. * Setting this parameter to 0 is the equivalent of setting it to
* <code>scaledWidth * TJ.pixelSize(pixelFormat)</code>.
* *
* @param desiredHeight desired height (in pixels) of the decompressed image * @param desiredHeight If the source image is a JPEG image, then this
* (or image region.) If the desired image dimensions are different than the * specifies the desired height (in pixels) of the decompressed image (or
* dimensions of the JPEG image being decompressed, then TurboJPEG will use * image region.) If the desired destination image dimensions are different
* scaling in the JPEG decompressor to generate the largest possible image * than the source image dimensions, then TurboJPEG will use scaling in the
* that will fit within the desired dimensions. Setting this to 0 is the * JPEG decompressor to generate the largest possible image that will fit
* same as setting it to the height of the JPEG image (in other words, the * within the desired dimensions. Setting this to 0 is the same as setting
* height will not be considered when determining the scaled image size.) * it to the height of the JPEG image (in other words, the height will not be
* considered when determining the scaled image size.) This parameter is
* ignored if the source image is a YUV image.
* *
* @param pixelFormat pixel format of the decompressed image (one of * @param pixelFormat pixel format of the decompressed/decoded image (one of
* {@link TJ TJ.PF_*}) * {@link TJ#PF_RGB TJ.PF_*})
* *
* @param flags the bitwise OR of one or more of {@link TJ TJ.FLAG_*} * @param flags the bitwise OR of one or more of
* {@link TJ#FLAG_BOTTOMUP TJ.FLAG_*}
*/ */
public void decompress(byte[] dstBuf, int x, int y, int desiredWidth, public void decompress(byte[] dstBuf, int x, int y, int desiredWidth,
int pitch, int desiredHeight, int pixelFormat, int pitch, int desiredHeight, int pixelFormat,
int flags) throws Exception { int flags) throws Exception {
if (jpegBuf == null) if (jpegBuf == null && yuvImage == null)
throw new Exception(NO_ASSOC_ERROR); throw new Exception(NO_ASSOC_ERROR);
if (dstBuf == null || x < 0 || y < 0 || desiredWidth < 0 || pitch < 0 || if (dstBuf == null || x < 0 || y < 0 || pitch < 0 ||
desiredHeight < 0 || pixelFormat < 0 || pixelFormat >= TJ.NUMPF || (yuvImage != null && (desiredWidth < 0 || desiredHeight < 0)) ||
flags < 0) pixelFormat < 0 || pixelFormat >= TJ.NUMPF || flags < 0)
throw new Exception("Invalid argument in decompress()"); throw new Exception("Invalid argument in decompress()");
if (yuvImage != null)
decodeYUV(yuvImage.getPlanes(), yuvImage.getOffsets(),
yuvImage.getStrides(), yuvImage.getSubsamp(), dstBuf, x, y,
yuvImage.getWidth(), pitch, yuvImage.getHeight(), pixelFormat,
flags);
else {
if (x > 0 || y > 0) if (x > 0 || y > 0)
decompress(jpegBuf, jpegBufSize, dstBuf, x, y, desiredWidth, pitch, decompress(jpegBuf, jpegBufSize, dstBuf, x, y, desiredWidth, pitch,
desiredHeight, pixelFormat, flags); desiredHeight, pixelFormat, flags);
@@ -323,6 +389,7 @@ public class TJDecompressor {
decompress(jpegBuf, jpegBufSize, dstBuf, desiredWidth, pitch, decompress(jpegBuf, jpegBufSize, dstBuf, desiredWidth, pitch,
desiredHeight, pixelFormat, flags); desiredHeight, pixelFormat, flags);
} }
}
/** /**
* @deprecated Use * @deprecated Use
@@ -353,15 +420,17 @@ public class TJDecompressor {
* for description * for description
* *
* @param pixelFormat pixel format of the decompressed image (one of * @param pixelFormat pixel format of the decompressed image (one of
* {@link TJ TJ.PF_*}) * {@link TJ#PF_RGB TJ.PF_*})
* *
* @param flags the bitwise OR of one or more of {@link TJ TJ.FLAG_*} * @param flags the bitwise OR of one or more of
* {@link TJ#FLAG_BOTTOMUP TJ.FLAG_*}
* *
* @return a buffer containing the decompressed image * @return a buffer containing the decompressed image.
*/ */
public byte[] decompress(int desiredWidth, int pitch, int desiredHeight, public byte[] decompress(int desiredWidth, int pitch, int desiredHeight,
int pixelFormat, int flags) throws Exception { int pixelFormat, int flags) throws Exception {
if (desiredWidth < 0 || pitch < 0 || desiredHeight < 0 || if (pitch < 0 ||
(yuvImage == null && (desiredWidth < 0 || desiredHeight < 0)) ||
pixelFormat < 0 || pixelFormat >= TJ.NUMPF || flags < 0) pixelFormat < 0 || pixelFormat >= TJ.NUMPF || flags < 0)
throw new Exception("Invalid argument in decompress()"); throw new Exception("Invalid argument in decompress()");
int pixelSize = TJ.getPixelSize(pixelFormat); int pixelSize = TJ.getPixelSize(pixelFormat);
@@ -376,22 +445,118 @@ public class TJDecompressor {
/** /**
* Decompress the JPEG source image associated with this decompressor * Decompress the JPEG source image associated with this decompressor
* instance and output a YUV planar image to the given destination buffer. * instance into a YUV planar image and store it in the given
* This method performs JPEG decompression but leaves out the color * <code>YUVImage</code> instance. This method performs JPEG decompression
* conversion step, so a planar YUV image is generated instead of an RGB * but leaves out the color conversion step, so a planar YUV image is
* image. The padding of the planes in this image is the same as in the * generated instead of an RGB or grayscale image. This method cannot be
* images generated by {@link TJCompressor#encodeYUV(byte[], int)}. Note * used to decompress JPEG source images with the CMYK or YCCK colorspace.
* that, if the width or height of the image is not an even multiple of the
* MCU block size (see {@link TJ#getMCUWidth} and {@link TJ#getMCUHeight}),
* then an intermediate buffer copy will be performed within TurboJPEG.
* <p>
* NOTE: Technically, the JPEG format uses the YCbCr colorspace, but per the
* convention of the digital video community, the TurboJPEG API uses "YUV" to
* refer to an image format consisting of Y, Cb, and Cr image planes.
* *
* @param dstBuf buffer that will receive the YUV planar image. Use * @param dstImage {@link YUVImage} instance that will receive the YUV planar
* {@link TJ#bufSizeYUV} to determine the appropriate size for this buffer * image. The level of subsampling specified in this <code>YUVImage</code>
* based on the image width, height, and level of chrominance subsampling. * instance must match that of the JPEG image, and the width and height
* specified in the <code>YUVImage</code> instance must match one of the
* scaled image sizes that TurboJPEG is capable of generating from the JPEG
* source image.
*
* @param flags the bitwise OR of one or more of
* {@link TJ#FLAG_BOTTOMUP TJ.FLAG_*}
*/
public void decompressToYUV(YUVImage dstImage, int flags) throws Exception {
if (jpegBuf == null)
throw new Exception(NO_ASSOC_ERROR);
if (dstImage == null || flags < 0)
throw new Exception("Invalid argument in decompressToYUV()");
int scaledWidth = getScaledWidth(dstImage.getWidth(),
dstImage.getHeight());
int scaledHeight = getScaledHeight(dstImage.getWidth(),
dstImage.getHeight());
if (scaledWidth != dstImage.getWidth() ||
scaledHeight != dstImage.getHeight())
throw new Exception("YUVImage dimensions do not match one of the scaled image sizes that TurboJPEG is capable of generating.");
if (jpegSubsamp != dstImage.getSubsamp())
throw new Exception("YUVImage subsampling level does not match that of the JPEG image");
decompressToYUV(jpegBuf, jpegBufSize, dstImage.getPlanes(),
dstImage.getOffsets(), dstImage.getWidth(),
dstImage.getStrides(), dstImage.getHeight(), flags);
}
/**
* @deprecated Use {@link #decompressToYUV(YUVImage, int)} instead.
*/
@Deprecated
public void decompressToYUV(byte[] dstBuf, int flags) throws Exception {
YUVImage dstImage = new YUVImage(dstBuf, jpegWidth, 4, jpegHeight,
jpegSubsamp);
decompressToYUV(dstImage, flags);
}
/**
* Decompress the JPEG source image associated with this decompressor
* instance into a set of Y, U (Cb), and V (Cr) image planes and return a
* <code>YUVImage</code> instance containing the decompressed image planes.
* This method performs JPEG decompression but leaves out the color
* conversion step, so a planar YUV image is generated instead of an RGB or
* grayscale image. This method cannot be used to decompress JPEG source
* images with the CMYK or YCCK colorspace.
*
* @param desiredWidth desired width (in pixels) of the YUV image. If the
* desired image dimensions are different than the dimensions of the JPEG
* image being decompressed, then TurboJPEG will use scaling in the JPEG
* decompressor to generate the largest possible image that will fit within
* the desired dimensions. Setting this to 0 is the same as setting it to
* the width of the JPEG image (in other words, the width will not be
* considered when determining the scaled image size.)
*
* @param strides an array of integers, each specifying the number of bytes
* per line in the corresponding plane of the output image. Setting the
* stride for any plane to 0 is the same as setting it to the scaled
* component width of the plane. If <tt>strides</tt> is NULL, then the
* strides for all planes will be set to their respective scaled component
* widths. You can adjust the strides in order to add an arbitrary amount of
* line padding to each plane.
*
* @param desiredHeight desired height (in pixels) of the YUV image. If the
* desired image dimensions are different than the dimensions of the JPEG
* image being decompressed, then TurboJPEG will use scaling in the JPEG
* decompressor to generate the largest possible image that will fit within
* the desired dimensions. Setting this to 0 is the same as setting it to
* the height of the JPEG image (in other words, the height will not be
* considered when determining the scaled image size.)
*
* @param flags the bitwise OR of one or more of
* {@link TJ#FLAG_BOTTOMUP TJ.FLAG_*}
*
* @return a YUV planar image.
*/
public YUVImage decompressToYUV(int desiredWidth, int[] strides,
int desiredHeight,
int flags) throws Exception {
if (flags < 0)
throw new Exception("Invalid argument in decompressToYUV()");
if (jpegWidth < 1 || jpegHeight < 1 || jpegSubsamp < 0)
throw new Exception(NO_ASSOC_ERROR);
if (jpegSubsamp >= TJ.NUMSAMP)
throw new Exception("JPEG header information is invalid");
if (yuvImage != null)
throw new Exception("Source image is the wrong type");
int scaledWidth = getScaledWidth(desiredWidth, desiredHeight);
int scaledHeight = getScaledHeight(desiredWidth, desiredHeight);
YUVImage yuvImage = new YUVImage(scaledWidth, null, scaledHeight,
jpegSubsamp);
decompressToYUV(yuvImage, flags);
return yuvImage;
}
/**
* Decompress the JPEG source image associated with this decompressor
* instance into a unified YUV planar image buffer and return a
* <code>YUVImage</code> instance containing the decompressed image. This
* method performs JPEG decompression but leaves out the color conversion
* step, so a planar YUV image is generated instead of an RGB or grayscale
* image. This method cannot be used to decompress JPEG source images with
* the CMYK or YCCK colorspace.
* *
* @param desiredWidth desired width (in pixels) of the YUV image. If the * @param desiredWidth desired width (in pixels) of the YUV image. If the
* desired image dimensions are different than the dimensions of the JPEG * desired image dimensions are different than the dimensions of the JPEG
@@ -413,47 +578,12 @@ public class TJDecompressor {
* the height of the JPEG image (in other words, the height will not be * the height of the JPEG image (in other words, the height will not be
* considered when determining the scaled image size.) * considered when determining the scaled image size.)
* *
* @param flags the bitwise OR of one or more of {@link TJ TJ.FLAG_*} * @param flags the bitwise OR of one or more of
* {@link TJ#FLAG_BOTTOMUP TJ.FLAG_*}
*
* @return a YUV planar image.
*/ */
public void decompressToYUV(byte[] dstBuf, int desiredWidth, int pad, public YUVImage decompressToYUV(int desiredWidth, int pad, int desiredHeight,
int desiredHeight, int flags) throws Exception {
if (jpegBuf == null)
throw new Exception(NO_ASSOC_ERROR);
if (dstBuf == null || desiredWidth < 0 || pad < 1 ||
((pad & (pad - 1)) != 0) || desiredHeight < 0 || flags < 0)
throw new Exception("Invalid argument in decompressToYUV()");
decompressToYUV(jpegBuf, jpegBufSize, dstBuf, desiredWidth, pad,
desiredHeight, flags);
}
/**
* @deprecated Use {@link #decompressToYUV(byte[], int, int, int, int)}
* instead.
*/
@Deprecated
public void decompressToYUV(byte[] dstBuf, int flags) throws Exception {
decompressToYUV(dstBuf, 0, 4, 0, flags);
}
/**
* Decompress the JPEG source image associated with this decompressor
* instance and return a buffer containing a YUV planar image. See {@link
* #decompressToYUV(byte[], int, int, int, int)} for more detail.
*
* @param desiredWidth see
* {@link #decompressToYUV(byte[], int, int, int, int)} for description
*
* @param pad see {@link #decompressToYUV(byte[], int, int, int, int)} for
* description
*
* @param desiredHeight see {@link
* #decompressToYUV(byte[], int, int, int, int)} for description
*
* @param flags the bitwise OR of one or more of {@link TJ TJ.FLAG_*}
*
* @return a buffer containing a YUV planar image
*/
public byte[] decompressToYUV(int desiredWidth, int pad, int desiredHeight,
int flags) throws Exception { int flags) throws Exception {
if (flags < 0) if (flags < 0)
throw new Exception("Invalid argument in decompressToYUV()"); throw new Exception("Invalid argument in decompressToYUV()");
@@ -461,12 +591,15 @@ public class TJDecompressor {
throw new Exception(NO_ASSOC_ERROR); throw new Exception(NO_ASSOC_ERROR);
if (jpegSubsamp >= TJ.NUMSAMP) if (jpegSubsamp >= TJ.NUMSAMP)
throw new Exception("JPEG header information is invalid"); throw new Exception("JPEG header information is invalid");
if (yuvImage != null)
throw new Exception("Source image is the wrong type");
int scaledWidth = getScaledWidth(desiredWidth, desiredHeight); int scaledWidth = getScaledWidth(desiredWidth, desiredHeight);
int scaledHeight = getScaledHeight(desiredWidth, desiredHeight); int scaledHeight = getScaledHeight(desiredWidth, desiredHeight);
byte[] buf = new byte[TJ.bufSizeYUV(scaledWidth, pad, scaledHeight, YUVImage yuvImage = new YUVImage(scaledWidth, pad, scaledHeight,
jpegSubsamp)]; jpegSubsamp);
decompressToYUV(buf, desiredWidth, pad, desiredHeight, flags); decompressToYUV(yuvImage, flags);
return buf; return yuvImage;
} }
/** /**
@@ -474,91 +607,127 @@ public class TJDecompressor {
*/ */
@Deprecated @Deprecated
public byte[] decompressToYUV(int flags) throws Exception { public byte[] decompressToYUV(int flags) throws Exception {
return decompressToYUV(0, 4, 0, flags); YUVImage dstImage = new YUVImage(jpegWidth, 4, jpegHeight, jpegSubsamp);
decompressToYUV(dstImage, flags);
return dstImage.getBuf();
} }
/** /**
* Decompress the JPEG source image associated with this decompressor * Decompress the JPEG source image or decode the YUV source image associated
* instance and output a decompressed image to the given destination buffer. * with this decompressor instance and output a grayscale, RGB, or CMYK image
* to the given destination buffer.
* *
* @param dstBuf buffer that will receive the decompressed image. This * @param dstBuf buffer that will receive the decompressed/decoded image.
* buffer should normally be <code>stride * scaledHeight</code> pixels in * If the source image is a JPEG image, then this buffer should normally be
* size, where <code>scaledHeight</code> can be determined by calling <code> * <code>stride * scaledHeight</code> pixels in size, where
* <code>scaledHeight</code> can be determined by calling <code>
* scalingFactor.{@link TJScalingFactor#getScaled getScaled}(jpegHeight) * scalingFactor.{@link TJScalingFactor#getScaled getScaled}(jpegHeight)
* </code> with one of the scaling factors returned from {@link * </code> with one of the scaling factors returned from {@link
* TJ#getScalingFactors} or by calling {@link #getScaledHeight}. However, * TJ#getScalingFactors} or by calling {@link #getScaledHeight}. If the
* the buffer may also be larger than the dimensions of the JPEG image, in * source image is a YUV image, then this buffer should normally be
* which case the <code>x</code>, <code>y</code>, and <code>stride</code> * <code>stride * height</code> pixels in size, where <code>height</code> is
* parameters can be used to specify the region into which the JPEG image * the height of the YUV image. However, the buffer may also be larger than
* should be decompressed. * the dimensions of the JPEG image, in which case the <code>x</code>,
* <code>y</code>, and <code>stride</code> parameters can be used to specify
* the region into which the source image should be decompressed.
* *
* @param x x offset (in pixels) of the region into which the JPEG image * @param x x offset (in pixels) of the region in the destination image into
* should be decompressed, relative to the start of <code>dstBuf</code>. * which the source image should be decompressed/decoded
* *
* @param y y offset (in pixels) of the region into which the JPEG image * @param y y offset (in pixels) of the region in the destination image into
* should be decompressed, relative to the start of <code>dstBuf</code>. * which the source image should be decompressed/decoded
* *
* @param desiredWidth desired width (in pixels) of the decompressed image * @param desiredWidth If the source image is a JPEG image, then this
* (or image region.) If the desired image dimensions are different than the * specifies the desired width (in pixels) of the decompressed image (or
* dimensions of the JPEG image being decompressed, then TurboJPEG will use * image region.) If the desired destination image dimensions are different
* scaling in the JPEG decompressor to generate the largest possible image * than the source image dimensions, then TurboJPEG will use scaling in the
* that will fit within the desired dimensions. Setting this to 0 is the * JPEG decompressor to generate the largest possible image that will fit
* same as setting it to the width of the JPEG image (in other words, the * within the desired dimensions. Setting this to 0 is the same as setting
* width will not be considered when determining the scaled image size.) * it to the width of the JPEG image (in other words, the width will not be
* considered when determining the scaled image size.) This parameter is
* ignored if the source image is a YUV image.
* *
* @param stride pixels per line of the destination image. Normally, this * @param stride pixels per line of the destination image. Normally, this
* should be set to <code>scaledWidth</code>, but you can use this to, for * should be set to <code>scaledWidth</code>, but you can use this to, for
* instance, decompress the JPEG image into a region of a larger image. * instance, decompress the JPEG image into a region of a larger image.
* NOTE: <code>scaledWidth</code> can be determined by calling <code> * NOTE: if the source image is a JPEG image, then <code>scaledWidth</code>
* can be determined by calling <code>
* scalingFactor.{@link TJScalingFactor#getScaled getScaled}(jpegWidth) * scalingFactor.{@link TJScalingFactor#getScaled getScaled}(jpegWidth)
* </code> or by calling {@link #getScaledWidth}. Setting this parameter to * </code> or by calling {@link #getScaledWidth}. If the source image is a
* 0 is the equivalent of setting it to <code>scaledWidth</code>. * YUV image, then <code>scaledWidth</code> is the width of the YUV image.
* Setting this parameter to 0 is the equivalent of setting it to
* <code>scaledWidth</code>.
* *
* @param desiredHeight desired height (in pixels) of the decompressed image * @param desiredHeight If the source image is a JPEG image, then this
* (or image region.) If the desired image dimensions are different than the * specifies the desired height (in pixels) of the decompressed image (or
* dimensions of the JPEG image being decompressed, then TurboJPEG will use * image region.) If the desired destination image dimensions are different
* scaling in the JPEG decompressor to generate the largest possible image * than the source image dimensions, then TurboJPEG will use scaling in the
* that will fit within the desired dimensions. Setting this to 0 is the * JPEG decompressor to generate the largest possible image that will fit
* same as setting it to the height of the JPEG image (in other words, the * within the desired dimensions. Setting this to 0 is the same as setting
* height will not be considered when determining the scaled image size.) * it to the height of the JPEG image (in other words, the height will not be
* considered when determining the scaled image size.) This parameter is
* ignored if the source image is a YUV image.
* *
* @param pixelFormat pixel format of the decompressed image (one of * @param pixelFormat pixel format of the decompressed image (one of
* {@link TJ TJ.PF_*}) * {@link TJ#PF_RGB TJ.PF_*})
* *
* @param flags the bitwise OR of one or more of {@link TJ TJ.FLAG_*} * @param flags the bitwise OR of one or more of
* {@link TJ#FLAG_BOTTOMUP TJ.FLAG_*}
*/ */
public void decompress(int[] dstBuf, int x, int y, int desiredWidth, public void decompress(int[] dstBuf, int x, int y, int desiredWidth,
int stride, int desiredHeight, int pixelFormat, int stride, int desiredHeight, int pixelFormat,
int flags) throws Exception { int flags) throws Exception {
if (jpegBuf == null) if (jpegBuf == null && yuvImage == null)
throw new Exception(NO_ASSOC_ERROR); throw new Exception(NO_ASSOC_ERROR);
if (dstBuf == null || x < 0 || y < 0 || desiredWidth < 0 || stride < 0 || if (dstBuf == null || x < 0 || y < 0 || stride < 0 ||
desiredHeight < 0 || pixelFormat < 0 || pixelFormat >= TJ.NUMPF || (yuvImage != null && (desiredWidth < 0 || desiredHeight < 0)) ||
flags < 0) pixelFormat < 0 || pixelFormat >= TJ.NUMPF || flags < 0)
throw new Exception("Invalid argument in decompress()"); throw new Exception("Invalid argument in decompress()");
if (yuvImage != null)
decodeYUV(yuvImage.getPlanes(), yuvImage.getOffsets(),
yuvImage.getStrides(), yuvImage.getSubsamp(), dstBuf, x, y,
yuvImage.getWidth(), stride, yuvImage.getHeight(), pixelFormat,
flags);
else
decompress(jpegBuf, jpegBufSize, dstBuf, x, y, desiredWidth, stride, decompress(jpegBuf, jpegBufSize, dstBuf, x, y, desiredWidth, stride,
desiredHeight, pixelFormat, flags); desiredHeight, pixelFormat, flags);
} }
/** /**
* Decompress the JPEG source image associated with this decompressor * Decompress the JPEG source image or decode the YUV source image associated
* instance and output a decompressed image to the given * with this decompressor instance and output a decompressed/decoded image to
* <code>BufferedImage</code> instance. * the given <code>BufferedImage</code> instance.
* *
* @param dstImage a <code>BufferedImage</code> instance that will receive * @param dstImage a <code>BufferedImage</code> instance that will receive
* the decompressed image * the decompressed/decoded image. If the source image is a JPEG image, then
* the width and height of the <code>BufferedImage</code> instance must match
* one of the scaled image sizes that TurboJPEG is capable of generating from
* the JPEG image. If the source image is a YUV image, then the width and
* height of the <code>BufferedImage</code> instance must match the width and
* height of the YUV image.
* *
* @param flags the bitwise OR of one or more of {@link TJ TJ.FLAG_*} * @param flags the bitwise OR of one or more of
* {@link TJ#FLAG_BOTTOMUP TJ.FLAG_*}
*/ */
public void decompress(BufferedImage dstImage, int flags) throws Exception { public void decompress(BufferedImage dstImage, int flags) throws Exception {
if (dstImage == null || flags < 0) if (dstImage == null || flags < 0)
throw new Exception("Invalid argument in decompress()"); throw new Exception("Invalid argument in decompress()");
int desiredWidth = dstImage.getWidth(); int desiredWidth = dstImage.getWidth();
int desiredHeight = dstImage.getHeight(); int desiredHeight = dstImage.getHeight();
int scaledWidth = getScaledWidth(desiredWidth, desiredHeight); int scaledWidth, scaledHeight;
int scaledHeight = getScaledHeight(desiredWidth, desiredHeight);
if (yuvImage != null) {
if (desiredWidth != yuvImage.getWidth() ||
desiredHeight != yuvImage.getHeight())
throw new Exception("BufferedImage dimensions do not match the dimensions of the source image.");
scaledWidth = yuvImage.getWidth();
scaledHeight = yuvImage.getHeight();
} else {
scaledWidth = getScaledWidth(desiredWidth, desiredHeight);
scaledHeight = getScaledHeight(desiredWidth, desiredHeight);
if (scaledWidth != desiredWidth || scaledHeight != desiredHeight) if (scaledWidth != desiredWidth || scaledHeight != desiredHeight)
throw new Exception("BufferedImage dimensions do not match a scaled image size that TurboJPEG is capable of generating."); throw new Exception("BufferedImage dimensions do not match one of the scaled image sizes that TurboJPEG is capable of generating.");
}
int pixelFormat; boolean intPixels = false; int pixelFormat; boolean intPixels = false;
if (byteOrder == null) if (byteOrder == null)
byteOrder = ByteOrder.nativeOrder(); byteOrder = ByteOrder.nativeOrder();
@@ -599,10 +768,17 @@ public class TJDecompressor {
int stride = sm.getScanlineStride(); int stride = sm.getScanlineStride();
DataBufferInt db = (DataBufferInt)wr.getDataBuffer(); DataBufferInt db = (DataBufferInt)wr.getDataBuffer();
int[] buf = db.getData(); int[] buf = db.getData();
if (yuvImage != null)
decodeYUV(yuvImage.getPlanes(), yuvImage.getOffsets(),
yuvImage.getStrides(), yuvImage.getSubsamp(), buf, 0, 0,
yuvImage.getWidth(), stride, yuvImage.getHeight(),
pixelFormat, flags);
else {
if (jpegBuf == null) if (jpegBuf == null)
throw new Exception(NO_ASSOC_ERROR); throw new Exception(NO_ASSOC_ERROR);
decompress(jpegBuf, jpegBufSize, buf, scaledWidth, stride, scaledHeight, decompress(jpegBuf, jpegBufSize, buf, 0, 0, scaledWidth, stride,
pixelFormat, flags); scaledHeight, pixelFormat, flags);
}
} else { } else {
ComponentSampleModel sm = ComponentSampleModel sm =
(ComponentSampleModel)dstImage.getSampleModel(); (ComponentSampleModel)dstImage.getSampleModel();
@@ -612,14 +788,15 @@ public class TJDecompressor {
int pitch = sm.getScanlineStride(); int pitch = sm.getScanlineStride();
DataBufferByte db = (DataBufferByte)wr.getDataBuffer(); DataBufferByte db = (DataBufferByte)wr.getDataBuffer();
byte[] buf = db.getData(); byte[] buf = db.getData();
decompress(buf, scaledWidth, pitch, scaledHeight, pixelFormat, flags); decompress(buf, 0, 0, scaledWidth, pitch, scaledHeight, pixelFormat,
flags);
} }
} }
/** /**
* Decompress the JPEG source image associated with this decompressor * Decompress the JPEG source image or decode the YUV source image associated
* instance and return a <code>BufferedImage</code> instance containing the * with this decompressor instance and return a <code>BufferedImage</code>
* decompressed image. * instance containing the decompressed/decoded image.
* *
* @param desiredWidth see * @param desiredWidth see
* {@link #decompress(byte[], int, int, int, int, int, int, int)} for * {@link #decompress(byte[], int, int, int, int, int, int, int)} for
@@ -629,19 +806,21 @@ public class TJDecompressor {
* {@link #decompress(byte[], int, int, int, int, int, int, int)} for * {@link #decompress(byte[], int, int, int, int, int, int, int)} for
* description * description
* *
* @param bufferedImageType the image type of the newly-created * @param bufferedImageType the image type of the <code>BufferedImage</code>
* <code>BufferedImage</code> instance (for instance, * instance that will be created (for instance,
* <code>BufferedImage.TYPE_INT_RGB</code>) * <code>BufferedImage.TYPE_INT_RGB</code>)
* *
* @param flags the bitwise OR of one or more of {@link TJ TJ.FLAG_*} * @param flags the bitwise OR of one or more of
* {@link TJ#FLAG_BOTTOMUP TJ.FLAG_*}
* *
* @return a <code>BufferedImage</code> instance containing the * @return a <code>BufferedImage</code> instance containing the
* decompressed image * decompressed/decoded image.
*/ */
public BufferedImage decompress(int desiredWidth, int desiredHeight, public BufferedImage decompress(int desiredWidth, int desiredHeight,
int bufferedImageType, int flags) int bufferedImageType, int flags)
throws Exception { throws Exception {
if (desiredWidth < 0 || desiredHeight < 0 || flags < 0) if ((yuvImage == null && (desiredWidth < 0 || desiredHeight < 0)) ||
flags < 0)
throw new Exception("Invalid argument in decompress()"); throw new Exception("Invalid argument in decompress()");
int scaledWidth = getScaledWidth(desiredWidth, desiredHeight); int scaledWidth = getScaledWidth(desiredWidth, desiredHeight);
int scaledHeight = getScaledHeight(desiredWidth, desiredHeight); int scaledHeight = getScaledHeight(desiredWidth, desiredHeight);
@@ -693,8 +872,17 @@ public class TJDecompressor {
private native void decompressToYUV(byte[] srcBuf, int size, byte[] dstBuf, private native void decompressToYUV(byte[] srcBuf, int size, byte[] dstBuf,
int flags) throws Exception; // deprecated int flags) throws Exception; // deprecated
private native void decompressToYUV(byte[] srcBuf, int size, byte[] dstBuf, private native void decompressToYUV(byte[] srcBuf, int size,
int desiredWidth, int pad, int desiredheight, int flags) throws Exception; byte[][] dstPlanes, int[] dstOffsets, int desiredWidth, int[] dstStrides,
int desiredheight, int flags) throws Exception;
private native void decodeYUV(byte[][] srcPlanes, int[] srcOffsets,
int[] srcStrides, int subsamp, byte[] dstBuf, int x, int y, int width,
int pitch, int height, int pixelFormat, int flags) throws Exception;
private native void decodeYUV(byte[][] srcPlanes, int[] srcOffsets,
int[] srcStrides, int subsamp, int[] dstBuf, int x, int y, int width,
int stride, int height, int pixelFormat, int flags) throws Exception;
static { static {
TJLoader.load(); TJLoader.load();
@@ -703,6 +891,7 @@ public class TJDecompressor {
protected long handle = 0; protected long handle = 0;
protected byte[] jpegBuf = null; protected byte[] jpegBuf = null;
protected int jpegBufSize = 0; protected int jpegBufSize = 0;
protected YUVImage yuvImage = null;
protected int jpegWidth = 0; protected int jpegWidth = 0;
protected int jpegHeight = 0; protected int jpegHeight = 0;
protected int jpegSubsamp = -1; protected int jpegSubsamp = -1;

View File

@@ -42,6 +42,7 @@ public class TJScalingFactor {
/** /**
* Returns numerator * Returns numerator
*
* @return numerator * @return numerator
*/ */
public int getNum() { public int getNum() {
@@ -50,6 +51,7 @@ public class TJScalingFactor {
/** /**
* Returns denominator * Returns denominator
*
* @return denominator * @return denominator
*/ */
public int getDenom() { public int getDenom() {
@@ -60,7 +62,8 @@ public class TJScalingFactor {
* Returns the scaled value of <code>dimension</code>. This function * Returns the scaled value of <code>dimension</code>. This function
* performs the integer equivalent of * performs the integer equivalent of
* <code>ceil(dimension * scalingFactor)</code>. * <code>ceil(dimension * scalingFactor)</code>.
* @return the scaled value of <code>dimension</code> *
* @return the scaled value of <code>dimension</code>.
*/ */
public int getScaled(int dimension) { public int getScaled(int dimension) {
return (dimension * num + denom - 1) / denom; return (dimension * num + denom - 1) / denom;
@@ -69,8 +72,9 @@ public class TJScalingFactor {
/** /**
* Returns true or false, depending on whether this instance and * Returns true or false, depending on whether this instance and
* <code>other</code> have the same numerator and denominator. * <code>other</code> have the same numerator and denominator.
*
* @return true or false, depending on whether this instance and * @return true or false, depending on whether this instance and
* <code>other</code> have the same numerator and denominator * <code>other</code> have the same numerator and denominator.
*/ */
public boolean equals(TJScalingFactor other) { public boolean equals(TJScalingFactor other) {
return (this.num == other.num && this.denom == other.denom); return (this.num == other.num && this.denom == other.denom);
@@ -79,8 +83,9 @@ public class TJScalingFactor {
/** /**
* Returns true or false, depending on whether this instance is equal to * Returns true or false, depending on whether this instance is equal to
* 1/1. * 1/1.
*
* @return true or false, depending on whether this instance is equal to * @return true or false, depending on whether this instance is equal to
* 1/1 * 1/1.
*/ */
public boolean isOne() { public boolean isOne() {
return (num == 1 && denom == 1); return (num == 1 && denom == 1);

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (C)2011, 2013 D. R. Commander. All Rights Reserved. * Copyright (C)2011, 2013-2014 D. R. Commander. All Rights Reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met: * modification, are permitted provided that the following conditions are met:
@@ -42,20 +42,20 @@ public class TJTransformer extends TJDecompressor {
/** /**
* Create a TurboJPEG lossless transformer instance and associate the JPEG * Create a TurboJPEG lossless transformer instance and associate the JPEG
* image stored in <code>jpegImage</code> with the newly-created instance. * image stored in <code>jpegImage</code> with the newly created instance.
* *
* @param jpegImage JPEG image buffer (size of the JPEG image is assumed to * @param jpegImage JPEG image buffer (size of the JPEG image is assumed to
* be the length of the array) * be the length of the array)
*/ */
public TJTransformer(byte[] jpegImage) throws Exception { public TJTransformer(byte[] jpegImage) throws Exception {
init(); init();
setJPEGImage(jpegImage, jpegImage.length); setSourceImage(jpegImage, jpegImage.length);
} }
/** /**
* Create a TurboJPEG lossless transformer instance and associate the JPEG * Create a TurboJPEG lossless transformer instance and associate the JPEG
* image of length <code>imageSize</code> bytes stored in * image of length <code>imageSize</code> bytes stored in
* <code>jpegImage</code> with the newly-created instance. * <code>jpegImage</code> with the newly created instance.
* *
* @param jpegImage JPEG image buffer * @param jpegImage JPEG image buffer
* *
@@ -63,7 +63,7 @@ public class TJTransformer extends TJDecompressor {
*/ */
public TJTransformer(byte[] jpegImage, int imageSize) throws Exception { public TJTransformer(byte[] jpegImage, int imageSize) throws Exception {
init(); init();
setJPEGImage(jpegImage, imageSize); setSourceImage(jpegImage, imageSize);
} }
/** /**
@@ -84,13 +84,14 @@ public class TJTransformer extends TJDecompressor {
* receive a JPEG image that has been transformed using the parameters in * receive a JPEG image that has been transformed using the parameters in
* <code>transforms[i]</code>. Use {@link TJ#bufSize} to determine the * <code>transforms[i]</code>. Use {@link TJ#bufSize} to determine the
* maximum size for each buffer based on the transformed or cropped width and * maximum size for each buffer based on the transformed or cropped width and
* height. * height and the level of subsampling used in the source image.
* *
* @param transforms an array of {@link TJTransform} instances, each of * @param transforms an array of {@link TJTransform} instances, each of
* which specifies the transform parameters and/or cropping region for the * which specifies the transform parameters and/or cropping region for the
* corresponding transformed output image * corresponding transformed output image
* *
* @param flags the bitwise OR of one or more of {@link TJ TJ.FLAG_*} * @param flags the bitwise OR of one or more of
* {@link TJ#FLAG_BOTTOMUP TJ.FLAG_*}
*/ */
public void transform(byte[][] dstBufs, TJTransform[] transforms, public void transform(byte[][] dstBufs, TJTransform[] transforms,
int flags) throws Exception { int flags) throws Exception {
@@ -110,9 +111,10 @@ public class TJTransformer extends TJDecompressor {
* corresponding transformed output image * corresponding transformed output image
* *
* @return an array of {@link TJDecompressor} instances, each of * @return an array of {@link TJDecompressor} instances, each of
* which has a transformed JPEG image associated with it * which has a transformed JPEG image associated with it.
* *
* @param flags the bitwise OR of one or more of {@link TJ TJ.FLAG_*} * @param flags the bitwise OR of one or more of
* {@link TJ#FLAG_BOTTOMUP TJ.FLAG_*}
*/ */
public TJDecompressor[] transform(TJTransform[] transforms, int flags) public TJDecompressor[] transform(TJTransform[] transforms, int flags)
throws Exception { throws Exception {
@@ -135,11 +137,11 @@ public class TJTransformer extends TJDecompressor {
} }
/** /**
* Returns an array containing the sizes of the transformed JPEG images from * Returns an array containing the sizes of the transformed JPEG images
* the most recent call to {@link #transform transform()}. * generated by the most recent transform operation.
* *
* @return an array containing the sizes of the transformed JPEG images from * @return an array containing the sizes of the transformed JPEG images
* the most recent call to {@link #transform transform()} * generated by the most recent transform operation.
*/ */
public int[] getTransformedSizes() throws Exception { public int[] getTransformedSizes() throws Exception {
if (transformedSizes == null) if (transformedSizes == null)

View File

@@ -0,0 +1,441 @@
/*
* Copyright (C)2014 D. R. Commander. All Rights Reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* - Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* - Neither the name of the libjpeg-turbo Project nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT HOLDERS OR CONTRIBUTORS 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.
*/
package org.libjpegturbo.turbojpeg;
/**
* This class encapsulates a YUV planar image and the metadata
* associated with it. The TurboJPEG API allows both the JPEG compression and
* decompression pipelines to be split into stages: YUV encode, compress from
* YUV, decompress to YUV, and YUV decode. A <code>YUVImage</code> instance
* serves as the destination image for YUV encode and decompress-to-YUV
* operations and as the source image for compress-from-YUV and YUV decode
* operations.
* <p>
* Technically, the JPEG format uses the YCbCr colorspace (which technically is
* not a "colorspace" but rather a "color transform"), but per the convention
* of the digital video community, the TurboJPEG API uses "YUV" to refer to an
* image format consisting of Y, Cb, and Cr image planes.
* <p>
* Each plane is simply a 2D array of bytes, each byte representing the value
* of one of the components (Y, Cb, or Cr) at a particular location in the
* image. The width and height of each plane are determined by the image
* width, height, and level of chrominance subsampling. The luminance plane
* width is the image width padded to the nearest multiple of the horizontal
* subsampling factor (2 in the case of 4:2:0 and 4:2:2, 4 in the case of
* 4:1:1, 1 in the case of 4:4:4 or grayscale.) Similarly, the luminance plane
* height is the image height padded to the nearest multiple of the vertical
* subsampling factor (2 in the case of 4:2:0 or 4:4:0, 1 in the case of 4:4:4
* or grayscale.) The chrominance plane width is equal to the luminance plane
* width divided by the horizontal subsampling factor, and the chrominance
* plane height is equal to the luminance plane height divided by the vertical
* subsampling factor.
* <p>
* For example, if the source image is 35 x 35 pixels and 4:2:2 subsampling is
* used, then the luminance plane would be 36 x 35 bytes, and each of the
* chrominance planes would be 18 x 35 bytes. If you specify a line padding of
* 4 bytes on top of this, then the luminance plane would be 36 x 35 bytes, and
* each of the chrominance planes would be 20 x 35 bytes.
*/
public class YUVImage {
private static final String NO_ASSOC_ERROR =
"No image data is associated with this instance";
/**
* Create a new <code>YUVImage</code> instance backed by separate image
* planes, and allocate memory for the image planes.
*
* @param width width (in pixels) of the YUV image
*
* @param strides an array of integers, each specifying the number of bytes
* per line in the corresponding plane of the YUV image. Setting the stride
* for any plane to 0 is the same as setting it to the plane width (see
* {@link YUVImage above}.) If <code>strides</code> is null, then the
* strides for all planes will be set to their respective plane widths. When
* using this constructor, the stride for each plane must be equal to or
* greater than the plane width.
*
* @param height height (in pixels) of the YUV image
*
* @param subsamp the level of chrominance subsampling to be used in the YUV
* image (one of {@link TJ#SAMP_444 TJ.SAMP_*})
*/
public YUVImage(int width, int[] strides, int height, int subsamp)
throws Exception {
setBuf(null, null, width, strides, height, subsamp, true);
}
/**
* Create a new <code>YUVImage</code> instance backed by a unified image
* buffer, and allocate memory for the image buffer.
*
* @param width width (in pixels) of the YUV image
*
* @param pad Each line of each plane in the YUV image buffer will be padded
* to this number of bytes (must be a power of 2.)
*
* @param height height (in pixels) of the YUV image
*
* @param subsamp the level of chrominance subsampling to be used in the YUV
* image (one of {@link TJ#SAMP_444 TJ.SAMP_*})
*/
public YUVImage(int width, int pad, int height, int subsamp)
throws Exception {
setBuf(new byte[TJ.bufSizeYUV(width, pad, height, subsamp)], width, pad,
height, subsamp);
}
/**
* Create a new <code>YUVImage</code> instance from a set of existing image
* planes.
*
* @param planes an array of buffers representing the Y, U (Cb), and V (Cr)
* image planes (or just the Y plane, if the image is grayscale.) These
* planes can be contiguous or non-contiguous in memory. Plane
* <code>i</code> should be at least <code>offsets[i] +
* {@link TJ#planeSizeYUV TJ.planeSizeYUV}(i, width, strides[i], height, subsamp)</code>
* bytes in size.
*
* @param offsets If this <code>YUVImage</code> instance represents a
* subregion of a larger image, then <code>offsets[i]</code> specifies the
* offset (in bytes) of the subregion within plane <code>i</code> of the
* larger image. Setting this to null is the same as setting the offsets for
* all planes to 0.
*
* @param width width (in pixels) of the new YUV image (or subregion)
*
* @param strides an array of integers, each specifying the number of bytes
* per line in the corresponding plane of the YUV image. Setting the stride
* for any plane to 0 is the same as setting it to the plane width (see
* {@link YUVImage above}.) If <code>strides</code> is null, then the
* strides for all planes will be set to their respective plane widths. You
* can adjust the strides in order to add an arbitrary amount of line padding
* to each plane or to specify that this <code>YUVImage</code> instance is a
* subregion of a larger image (in which case, <code>strides[i]</code> should
* be set to the plane width of plane <code>i</code> in the larger image.)
*
* @param height height (in pixels) of the new YUV image (or subregion)
*
* @param subsamp the level of chrominance subsampling used in the YUV
* image (one of {@link TJ#SAMP_444 TJ.SAMP_*})
*/
public YUVImage(byte[][] planes, int[] offsets, int width, int[] strides,
int height, int subsamp) throws Exception {
setBuf(planes, offsets, width, strides, height, subsamp, false);
}
/**
* Create a new <code>YUVImage</code> instance from an existing unified image
* buffer.
*
* @param yuvImage image buffer that contains or will contain YUV planar
* image data. Use {@link TJ#bufSizeYUV} to determine the minimum size for
* this buffer. The Y, U (Cb), and V (Cr) image planes are stored
* sequentially in the buffer (see {@link YUVImage above} for a description
* of the image format.)
*
* @param width width (in pixels) of the YUV image
*
* @param pad the line padding used in the YUV image buffer. For
* instance, if each line in each plane of the buffer is padded to the
* nearest multiple of 4 bytes, then <code>pad</code> should be set to 4.
*
* @param height height (in pixels) of the YUV image
*
* @param subsamp the level of chrominance subsampling used in the YUV
* image (one of {@link TJ#SAMP_444 TJ.SAMP_*})
*/
public YUVImage(byte[] yuvImage, int width, int pad, int height,
int subsamp) throws Exception {
setBuf(yuvImage, width, pad, height, subsamp);
}
/**
* Assign a set of image planes to this <code>YUVImage</code> instance.
*
* @param planes an array of buffers representing the Y, U (Cb), and V (Cr)
* image planes (or just the Y plane, if the image is grayscale.) These
* planes can be contiguous or non-contiguous in memory. Plane
* <code>i</code> should be at least <code>offsets[i] +
* {@link TJ#planeSizeYUV TJ.planeSizeYUV}(i, width, strides[i], height, subsamp)</code>
* bytes in size.
*
* @param offsets If this <code>YUVImage</code> instance represents a
* subregion of a larger image, then <code>offsets[i]</code> specifies the
* offset (in bytes) of the subregion within plane <code>i</code> of the
* larger image. Setting this to null is the same as setting the offsets for
* all planes to 0.
*
* @param width width (in pixels) of the YUV image (or subregion)
*
* @param strides an array of integers, each specifying the number of bytes
* per line in the corresponding plane of the YUV image. Setting the stride
* for any plane to 0 is the same as setting it to the plane width (see
* {@link YUVImage above}.) If <code>strides</code> is null, then the
* strides for all planes will be set to their respective plane widths. You
* can adjust the strides in order to add an arbitrary amount of line padding
* to each plane or to specify that this <code>YUVImage</code> image is a
* subregion of a larger image (in which case, <code>strides[i]</code> should
* be set to the plane width of plane <code>i</code> in the larger image.)
*
* @param height height (in pixels) of the YUV image (or subregion)
*
* @param subsamp the level of chrominance subsampling used in the YUV
* image (one of {@link TJ#SAMP_444 TJ.SAMP_*})
*/
public void setBuf(byte[][] planes, int[] offsets, int width, int strides[],
int height, int subsamp) throws Exception {
setBuf(planes, offsets, width, strides, height, subsamp, false);
}
private void setBuf(byte[][] planes, int[] offsets, int width, int strides[],
int height, int subsamp, boolean alloc) throws Exception {
if ((planes == null && !alloc) || width < 1 || height < 1 || subsamp < 0 ||
subsamp >= TJ.NUMSAMP)
throw new Exception("Invalid argument in YUVImage::setBuf()");
int nc = (subsamp == TJ.SAMP_GRAY ? 1 : 3);
if (planes.length != nc || (offsets != null && offsets.length != nc) ||
(strides != null && strides.length != nc))
throw new Exception("YUVImage::setBuf(): planes, offsets, or strides array is the wrong size");
if (offsets == null)
offsets = new int[nc];
if (strides == null)
strides = new int[nc];
for (int i = 0; i < nc; i++) {
int pw = TJ.planeWidth(i, width, subsamp);
int ph = TJ.planeHeight(i, height, subsamp);
int planeSize = TJ.planeSizeYUV(i, width, strides[i], height, subsamp);
if (strides[i] == 0)
strides[i] = pw;
if (alloc) {
if (strides[i] < pw)
throw new Exception("Stride must be >= plane width when allocating a new YUV image");
planes[i] = new byte[strides[i] * ph];
}
if (planes[i] == null || offsets[i] < 0)
throw new Exception("Invalid argument in YUVImage::setBuf()");
if (strides[i] < 0 && offsets[i] - planeSize + pw < 0)
throw new Exception("Stride for plane " + i + " would cause memory to be accessed below plane boundary");
if (planes[i].length < offsets[i] + planeSize)
throw new Exception("Image plane " + i + " is not large enough");
}
yuvPlanes = planes;
yuvOffsets = offsets;
yuvWidth = width;
yuvStrides = strides;
yuvHeight = height;
yuvSubsamp = subsamp;
}
/**
* Assign a unified image buffer to this <code>YUVImage</code> instance.
*
* @param yuvImage image buffer that contains or will contain YUV planar
* image data. Use {@link TJ#bufSizeYUV} to determine the minimum size for
* this buffer. The Y, U (Cb), and V (Cr) image planes are stored
* sequentially in the buffer (see {@link YUVImage above} for a description
* of the image format.)
*
* @param width width (in pixels) of the YUV image
*
* @param pad the line padding used in the YUV image buffer. For
* instance, if each line in each plane of the buffer is padded to the
* nearest multiple of 4 bytes, then <code>pad</code> should be set to 4.
*
* @param height height (in pixels) of the YUV image
*
* @param subsamp the level of chrominance subsampling used in the YUV
* image (one of {@link TJ#SAMP_444 TJ.SAMP_*})
*/
public void setBuf(byte[] yuvImage, int width, int pad, int height,
int subsamp) throws Exception {
if (yuvImage == null || width < 1 || pad < 1 || ((pad & (pad - 1)) != 0) ||
height < 1 || subsamp < 0 || subsamp >= TJ.NUMSAMP)
throw new Exception("Invalid argument in YUVImage::setBuf()");
if (yuvImage.length < TJ.bufSizeYUV(width, pad, height, subsamp))
throw new Exception("YUV image buffer is not large enough");
int nc = (subsamp == TJ.SAMP_GRAY ? 1 : 3);
byte[][] planes = new byte[nc][];
int[] strides = new int[nc];
int[] offsets = new int[nc];
planes[0] = yuvImage;
strides[0] = PAD(TJ.planeWidth(0, width, subsamp), pad);
if (subsamp != TJ.SAMP_GRAY) {
strides[1] = strides[2] = PAD(TJ.planeWidth(1, width, subsamp), pad);
planes[1] = planes[2] = yuvImage;
offsets[1] = offsets[0] +
strides[0] * TJ.planeHeight(0, height, subsamp);
offsets[2] = offsets[1] +
strides[1] * TJ.planeHeight(1, height, subsamp);
}
yuvPad = pad;
setBuf(planes, offsets, width, strides, height, subsamp);
}
/**
* Returns the width of the YUV image (or subregion.)
*
* @return the width of the YUV image (or subregion)
*/
public int getWidth() throws Exception {
if (yuvWidth < 1)
throw new Exception(NO_ASSOC_ERROR);
return yuvWidth;
}
/**
* Returns the height of the YUV image (or subregion.)
*
* @return the height of the YUV image (or subregion)
*/
public int getHeight() throws Exception {
if (yuvHeight < 1)
throw new Exception(NO_ASSOC_ERROR);
return yuvHeight;
}
/**
* Returns the line padding used in the YUV image buffer (if this image is
* stored in a unified buffer rather than separate image planes.)
*
* @return the line padding used in the YUV image buffer
*/
public int getPad() throws Exception {
if (yuvPlanes == null)
throw new Exception(NO_ASSOC_ERROR);
if (yuvPad < 1 || ((yuvPad & (yuvPad - 1)) != 0))
throw new Exception("Image is not stored in a unified buffer");
return yuvPad;
}
/**
* Returns the number of bytes per line of each plane in the YUV image.
*
* @return the number of bytes per line of each plane in the YUV image
*/
public int[] getStrides() throws Exception {
if (yuvStrides == null)
throw new Exception(NO_ASSOC_ERROR);
return yuvStrides;
}
/**
* Returns the offsets (in bytes) of each plane within the planes of a larger
* YUV image.
*
* @return the offsets (in bytes) of each plane within the planes of a larger
* YUV image
*/
public int[] getOffsets() throws Exception {
if (yuvOffsets == null)
throw new Exception(NO_ASSOC_ERROR);
return yuvOffsets;
}
/**
* Returns the level of chrominance subsampling used in the YUV image. See
* {@link TJ#SAMP_444 TJ.SAMP_*}.
*
* @return the level of chrominance subsampling used in the YUV image
*/
public int getSubsamp() throws Exception {
if (yuvSubsamp < 0 || yuvSubsamp >= TJ.NUMSAMP)
throw new Exception(NO_ASSOC_ERROR);
return yuvSubsamp;
}
/**
* Returns the YUV image planes. If the image is stored in a unified buffer,
* then all image planes will point to that buffer.
*
* @return the YUV image planes
*/
public byte[][] getPlanes() throws Exception {
if (yuvPlanes == null)
throw new Exception(NO_ASSOC_ERROR);
return yuvPlanes;
}
/**
* Returns the YUV image buffer (if this image is stored in a unified
* buffer rather than separate image planes.)
*
* @return the YUV image buffer
*/
public byte[] getBuf() throws Exception {
if (yuvPlanes == null || yuvSubsamp < 0 || yuvSubsamp >= TJ.NUMSAMP)
throw new Exception(NO_ASSOC_ERROR);
int nc = (yuvSubsamp == TJ.SAMP_GRAY ? 1 : 3);
for (int i = 1; i < nc; i++) {
if (yuvPlanes[i] != yuvPlanes[0])
throw new Exception("Image is not stored in a unified buffer");
}
return yuvPlanes[0];
}
/**
* Returns the size (in bytes) of the YUV image buffer (if this image is
* stored in a unified buffer rather than separate image planes.)
*
* @return the size (in bytes) of the YUV image buffer
*/
public int getSize() throws Exception {
if (yuvPlanes == null || yuvSubsamp < 0 || yuvSubsamp >= TJ.NUMSAMP)
throw new Exception(NO_ASSOC_ERROR);
int nc = (yuvSubsamp == TJ.SAMP_GRAY ? 1 : 3);
if (yuvPad < 1)
throw new Exception("Image is not stored in a unified buffer");
for (int i = 1; i < nc; i++) {
if (yuvPlanes[i] != yuvPlanes[0])
throw new Exception("Image is not stored in a unified buffer");
}
return TJ.bufSizeYUV(yuvWidth, yuvPad, yuvHeight, yuvSubsamp);
}
private static final int PAD(int v, int p) {
return (v + p - 1) & (~(p - 1));
}
protected long handle = 0;
protected byte[][] yuvPlanes = null;
protected int[] yuvOffsets = null;
protected int[] yuvStrides = null;
protected int yuvPad = 0;
protected int yuvWidth = 0;
protected int yuvHeight = 0;
protected int yuvSubsamp = -1;
};

View File

@@ -91,6 +91,30 @@ JNIEXPORT jint JNICALL Java_org_libjpegturbo_turbojpeg_TJ_bufSizeYUV__IIII
JNIEXPORT jint JNICALL Java_org_libjpegturbo_turbojpeg_TJ_bufSizeYUV__III JNIEXPORT jint JNICALL Java_org_libjpegturbo_turbojpeg_TJ_bufSizeYUV__III
(JNIEnv *, jclass, jint, jint, jint); (JNIEnv *, jclass, jint, jint, jint);
/*
* Class: org_libjpegturbo_turbojpeg_TJ
* Method: planeSizeYUV
* Signature: (IIIII)I
*/
JNIEXPORT jint JNICALL Java_org_libjpegturbo_turbojpeg_TJ_planeSizeYUV__IIIII
(JNIEnv *, jclass, jint, jint, jint, jint, jint);
/*
* Class: org_libjpegturbo_turbojpeg_TJ
* Method: planeWidth
* Signature: (III)I
*/
JNIEXPORT jint JNICALL Java_org_libjpegturbo_turbojpeg_TJ_planeWidth__III
(JNIEnv *, jclass, jint, jint, jint);
/*
* Class: org_libjpegturbo_turbojpeg_TJ
* Method: planeHeight
* Signature: (III)I
*/
JNIEXPORT jint JNICALL Java_org_libjpegturbo_turbojpeg_TJ_planeHeight__III
(JNIEnv *, jclass, jint, jint, jint);
/* /*
* Class: org_libjpegturbo_turbojpeg_TJ * Class: org_libjpegturbo_turbojpeg_TJ
* Method: getScalingFactors * Method: getScalingFactors

View File

@@ -58,10 +58,10 @@ JNIEXPORT jint JNICALL Java_org_libjpegturbo_turbojpeg_TJCompressor_compress___3
/* /*
* Class: org_libjpegturbo_turbojpeg_TJCompressor * Class: org_libjpegturbo_turbojpeg_TJCompressor
* Method: compressFromYUV * Method: compressFromYUV
* Signature: ([BIIII[BII)I * Signature: ([[B[II[III[BII)I
*/ */
JNIEXPORT jint JNICALL Java_org_libjpegturbo_turbojpeg_TJCompressor_compressFromYUV___3BIIII_3BII JNIEXPORT jint JNICALL Java_org_libjpegturbo_turbojpeg_TJCompressor_compressFromYUV___3_3B_3II_3III_3BII
(JNIEnv *, jobject, jbyteArray, jint, jint, jint, jint, jbyteArray, jint, jint); (JNIEnv *, jobject, jobjectArray, jintArray, jint, jintArray, jint, jint, jbyteArray, jint, jint);
/* /*
* Class: org_libjpegturbo_turbojpeg_TJCompressor * Class: org_libjpegturbo_turbojpeg_TJCompressor
@@ -74,10 +74,10 @@ JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJCompressor_encodeYUV___
/* /*
* Class: org_libjpegturbo_turbojpeg_TJCompressor * Class: org_libjpegturbo_turbojpeg_TJCompressor
* Method: encodeYUV * Method: encodeYUV
* Signature: ([BIIII[BIII)V * Signature: ([BIIIIII[[B[I[III)V
*/ */
JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJCompressor_encodeYUV___3BIIII_3BIII JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJCompressor_encodeYUV___3BIIIIII_3_3B_3I_3III
(JNIEnv *, jobject, jbyteArray, jint, jint, jint, jint, jbyteArray, jint, jint, jint); (JNIEnv *, jobject, jbyteArray, jint, jint, jint, jint, jint, jint, jobjectArray, jintArray, jintArray, jint, jint);
/* /*
* Class: org_libjpegturbo_turbojpeg_TJCompressor * Class: org_libjpegturbo_turbojpeg_TJCompressor
@@ -90,10 +90,10 @@ JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJCompressor_encodeYUV___
/* /*
* Class: org_libjpegturbo_turbojpeg_TJCompressor * Class: org_libjpegturbo_turbojpeg_TJCompressor
* Method: encodeYUV * Method: encodeYUV
* Signature: ([IIIII[BIII)V * Signature: ([IIIIIII[[B[I[III)V
*/ */
JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJCompressor_encodeYUV___3IIIII_3BIII JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJCompressor_encodeYUV___3IIIIIII_3_3B_3I_3III
(JNIEnv *, jobject, jintArray, jint, jint, jint, jint, jbyteArray, jint, jint, jint); (JNIEnv *, jobject, jintArray, jint, jint, jint, jint, jint, jint, jobjectArray, jintArray, jintArray, jint, jint);
#ifdef __cplusplus #ifdef __cplusplus
} }

View File

@@ -74,10 +74,26 @@ JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJDecompressor_decompress
/* /*
* Class: org_libjpegturbo_turbojpeg_TJDecompressor * Class: org_libjpegturbo_turbojpeg_TJDecompressor
* Method: decompressToYUV * Method: decompressToYUV
* Signature: ([BI[BIIII)V * Signature: ([BI[[B[II[III)V
*/ */
JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJDecompressor_decompressToYUV___3BI_3BIIII JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJDecompressor_decompressToYUV___3BI_3_3B_3II_3III
(JNIEnv *, jobject, jbyteArray, jint, jbyteArray, jint, jint, jint, jint); (JNIEnv *, jobject, jbyteArray, jint, jobjectArray, jintArray, jint, jintArray, jint, jint);
/*
* Class: org_libjpegturbo_turbojpeg_TJDecompressor
* Method: decodeYUV
* Signature: ([[B[I[II[BIIIIIII)V
*/
JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJDecompressor_decodeYUV___3_3B_3I_3II_3BIIIIIII
(JNIEnv *, jobject, jobjectArray, jintArray, jintArray, jint, jbyteArray, jint, jint, jint, jint, jint, jint, jint);
/*
* Class: org_libjpegturbo_turbojpeg_TJDecompressor
* Method: decodeYUV
* Signature: ([[B[I[II[IIIIIIII)V
*/
JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJDecompressor_decodeYUV___3_3B_3I_3II_3IIIIIIII
(JNIEnv *, jobject, jobjectArray, jintArray, jintArray, jint, jintArray, jint, jint, jint, jint, jint, jint, jint);
#ifdef __cplusplus #ifdef __cplusplus
} }

View File

@@ -1,9 +1,11 @@
/* /*
* jcapimin.c * jcapimin.c
* *
* This file was part of the Independent JPEG Group's software:
* Copyright (C) 1994-1998, Thomas G. Lane. * Copyright (C) 1994-1998, Thomas G. Lane.
* Modified 2003-2010 by Guido Vollbeding. * Modified 2003-2010 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software. * libjpeg-turbo Modifications:
* Copyright (C) 2014, D. R. Commander.
* For conditions of distribution and use, see the accompanying README file. * For conditions of distribution and use, see the accompanying README file.
* *
* This file contains application interface code for the compression half * This file contains application interface code for the compression half
@@ -20,6 +22,8 @@
#define JPEG_INTERNALS #define JPEG_INTERNALS
#include "jinclude.h" #include "jinclude.h"
#include "jpeglib.h" #include "jpeglib.h"
#include "jmemsys.h"
#include "jcmaster.h"
/* /*
@@ -36,9 +40,9 @@ jpeg_CreateCompress (j_compress_ptr cinfo, int version, size_t structsize)
cinfo->mem = NULL; /* so jpeg_destroy knows mem mgr not called */ cinfo->mem = NULL; /* so jpeg_destroy knows mem mgr not called */
if (version != JPEG_LIB_VERSION) if (version != JPEG_LIB_VERSION)
ERREXIT2(cinfo, JERR_BAD_LIB_VERSION, JPEG_LIB_VERSION, version); ERREXIT2(cinfo, JERR_BAD_LIB_VERSION, JPEG_LIB_VERSION, version);
if (structsize != SIZEOF(struct jpeg_compress_struct)) if (structsize != sizeof(struct jpeg_compress_struct))
ERREXIT2(cinfo, JERR_BAD_STRUCT_SIZE, ERREXIT2(cinfo, JERR_BAD_STRUCT_SIZE,
(int) SIZEOF(struct jpeg_compress_struct), (int) structsize); (int) sizeof(struct jpeg_compress_struct), (int) structsize);
/* For debugging purposes, we zero the whole master structure. /* For debugging purposes, we zero the whole master structure.
* But the application has already set the err pointer, and may have set * But the application has already set the err pointer, and may have set
@@ -49,7 +53,7 @@ jpeg_CreateCompress (j_compress_ptr cinfo, int version, size_t structsize)
{ {
struct jpeg_error_mgr * err = cinfo->err; struct jpeg_error_mgr * err = cinfo->err;
void * client_data = cinfo->client_data; /* ignore Purify complaint here */ void * client_data = cinfo->client_data; /* ignore Purify complaint here */
MEMZERO(cinfo, SIZEOF(struct jpeg_compress_struct)); MEMZERO(cinfo, sizeof(struct jpeg_compress_struct));
cinfo->err = err; cinfo->err = err;
cinfo->client_data = client_data; cinfo->client_data = client_data;
} }
@@ -89,6 +93,16 @@ jpeg_CreateCompress (j_compress_ptr cinfo, int version, size_t structsize)
/* OK, I'm ready */ /* OK, I'm ready */
cinfo->global_state = CSTATE_START; cinfo->global_state = CSTATE_START;
/* The master struct is used to store extension parameters, so we allocate it
* here. It is later reallocated by jinit_c_master_control().
*/
cinfo->master = (struct jpeg_comp_master *)
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,
sizeof(my_comp_master));
MEMZERO(cinfo->master, sizeof(my_comp_master));
cinfo->master->compress_profile = JCP_MAX_COMPRESSION;
} }
@@ -204,7 +218,7 @@ GLOBAL(void)
jpeg_write_marker (j_compress_ptr cinfo, int marker, jpeg_write_marker (j_compress_ptr cinfo, int marker,
const JOCTET *dataptr, unsigned int datalen) const JOCTET *dataptr, unsigned int datalen)
{ {
JMETHOD(void, write_marker_byte, (j_compress_ptr info, int val)); void (*write_marker_byte) (j_compress_ptr info, int val);
if (cinfo->next_scanline != 0 || if (cinfo->next_scanline != 0 ||
(cinfo->global_state != CSTATE_SCANNING && (cinfo->global_state != CSTATE_SCANNING &&

View File

@@ -46,8 +46,9 @@ jpeg_start_compress (j_compress_ptr cinfo, boolean write_all_tables)
jpeg_suppress_tables(cinfo, FALSE); /* mark all tables to be written */ jpeg_suppress_tables(cinfo, FALSE); /* mark all tables to be written */
/* setting up scan optimisation pattern failed, disable scan optimisation */ /* setting up scan optimisation pattern failed, disable scan optimisation */
if (cinfo->num_scans_luma == 0) if (cinfo->master->num_scans_luma == 0 || cinfo->scan_info == NULL ||
cinfo->optimize_scans = FALSE; cinfo->num_scans == 0)
cinfo->master->optimize_scans = FALSE;
/* (Re)initialize error mgr and destination modules */ /* (Re)initialize error mgr and destination modules */
(*cinfo->err->reset_error_mgr) ((j_common_ptr) cinfo); (*cinfo->err->reset_error_mgr) ((j_common_ptr) cinfo);

View File

@@ -1,8 +1,10 @@
/* /*
* jcarith.c * jcarith.c
* *
* This file was part of the Independent JPEG Group's software:
* Developed 1997-2009 by Guido Vollbeding. * Developed 1997-2009 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software. * It was modified by The libjpeg-turbo Project to include only code relevant
* to libjpeg-turbo.
* For conditions of distribution and use, see the accompanying README file. * For conditions of distribution and use, see the accompanying README file.
* *
* This file contains portable arithmetic entropy encoding routines for JPEG * This file contains portable arithmetic entropy encoding routines for JPEG
@@ -16,7 +18,7 @@
#define JPEG_INTERNALS #define JPEG_INTERNALS
#include "jinclude.h" #include "jinclude.h"
#include "jpeglib.h" #include "jpeglib.h"
#include <math.h>
/* Expanded entropy encoder object for arithmetic encoding. */ /* Expanded entropy encoder object for arithmetic encoding. */
@@ -118,6 +120,10 @@ emit_byte (int val, j_compress_ptr cinfo)
{ {
struct jpeg_destination_mgr * dest = cinfo->dest; struct jpeg_destination_mgr * dest = cinfo->dest;
/* Do not emit bytes during trellis passes */
if (cinfo->master->trellis_passes)
return;
*dest->next_output_byte++ = (JOCTET) val; *dest->next_output_byte++ = (JOCTET) val;
if (--dest->free_in_buffer == 0) if (--dest->free_in_buffer == 0)
if (! (*dest->empty_output_buffer) (cinfo)) if (! (*dest->empty_output_buffer) (cinfo))
@@ -824,6 +830,7 @@ start_pass (j_compress_ptr cinfo, boolean gather_statistics)
arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy; arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;
int ci, tbl; int ci, tbl;
jpeg_component_info * compptr; jpeg_component_info * compptr;
boolean progressive_mode;
if (gather_statistics) if (gather_statistics)
/* Make sure to avoid that in the master control logic! /* Make sure to avoid that in the master control logic!
@@ -834,8 +841,12 @@ start_pass (j_compress_ptr cinfo, boolean gather_statistics)
/* We assume jcmaster.c already validated the progressive scan parameters. */ /* We assume jcmaster.c already validated the progressive scan parameters. */
/* Trellis optimization does DC and AC in same pass and without refinement
* so consider progressive mode to be off in such case */
progressive_mode = (cinfo->master->trellis_passes) ? FALSE : cinfo->progressive_mode;
/* Select execution routines */ /* Select execution routines */
if (cinfo->progressive_mode) { if (progressive_mode) {
if (cinfo->Ah == 0) { if (cinfo->Ah == 0) {
if (cinfo->Ss == 0) if (cinfo->Ss == 0)
entropy->pub.encode_mcu = encode_mcu_DC_first; entropy->pub.encode_mcu = encode_mcu_DC_first;
@@ -854,7 +865,7 @@ start_pass (j_compress_ptr cinfo, boolean gather_statistics)
for (ci = 0; ci < cinfo->comps_in_scan; ci++) { for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
compptr = cinfo->cur_comp_info[ci]; compptr = cinfo->cur_comp_info[ci];
/* DC needs no table for refinement scan */ /* DC needs no table for refinement scan */
if (cinfo->progressive_mode == 0 || (cinfo->Ss == 0 && cinfo->Ah == 0)) { if (progressive_mode == 0 || (cinfo->Ss == 0 && cinfo->Ah == 0)) {
tbl = compptr->dc_tbl_no; tbl = compptr->dc_tbl_no;
if (tbl < 0 || tbl >= NUM_ARITH_TBLS) if (tbl < 0 || tbl >= NUM_ARITH_TBLS)
ERREXIT1(cinfo, JERR_NO_ARITH_TABLE, tbl); ERREXIT1(cinfo, JERR_NO_ARITH_TABLE, tbl);
@@ -867,7 +878,7 @@ start_pass (j_compress_ptr cinfo, boolean gather_statistics)
entropy->dc_context[ci] = 0; entropy->dc_context[ci] = 0;
} }
/* AC needs no table when not present */ /* AC needs no table when not present */
if (cinfo->progressive_mode == 0 || cinfo->Se) { if (progressive_mode == 0 || cinfo->Se) {
tbl = compptr->ac_tbl_no; tbl = compptr->ac_tbl_no;
if (tbl < 0 || tbl >= NUM_ARITH_TBLS) if (tbl < 0 || tbl >= NUM_ARITH_TBLS)
ERREXIT1(cinfo, JERR_NO_ARITH_TABLE, tbl); ERREXIT1(cinfo, JERR_NO_ARITH_TABLE, tbl);
@@ -876,7 +887,7 @@ start_pass (j_compress_ptr cinfo, boolean gather_statistics)
((j_common_ptr) cinfo, JPOOL_IMAGE, AC_STAT_BINS); ((j_common_ptr) cinfo, JPOOL_IMAGE, AC_STAT_BINS);
MEMZERO(entropy->ac_stats[tbl], AC_STAT_BINS); MEMZERO(entropy->ac_stats[tbl], AC_STAT_BINS);
#ifdef CALCULATE_SPECTRAL_CONDITIONING #ifdef CALCULATE_SPECTRAL_CONDITIONING
if (cinfo->progressive_mode) if (progressive_mode)
/* Section G.1.3.2: Set appropriate arithmetic conditioning value Kx */ /* Section G.1.3.2: Set appropriate arithmetic conditioning value Kx */
cinfo->arith_ac_K[tbl] = cinfo->Ss + ((8 + cinfo->Se - cinfo->Ss) >> 4); cinfo->arith_ac_K[tbl] = cinfo->Ss + ((8 + cinfo->Se - cinfo->Ss) >> 4);
#endif #endif
@@ -909,7 +920,7 @@ jinit_arith_encoder (j_compress_ptr cinfo)
entropy = (arith_entropy_ptr) entropy = (arith_entropy_ptr)
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
SIZEOF(arith_entropy_encoder)); sizeof(arith_entropy_encoder));
cinfo->entropy = (struct jpeg_entropy_encoder *) entropy; cinfo->entropy = (struct jpeg_entropy_encoder *) entropy;
entropy->pub.start_pass = start_pass; entropy->pub.start_pass = start_pass;
entropy->pub.finish_pass = finish_pass; entropy->pub.finish_pass = finish_pass;
@@ -923,3 +934,29 @@ jinit_arith_encoder (j_compress_ptr cinfo)
/* Initialize index for fixed probability estimation */ /* Initialize index for fixed probability estimation */
entropy->fixed_bin[0] = 113; entropy->fixed_bin[0] = 113;
} }
GLOBAL(void)
jget_arith_rates (j_compress_ptr cinfo, int dc_tbl_no, int ac_tbl_no, arith_rates *r)
{
int i;
arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;
for (i = 0; i < DC_STAT_BINS; i++) {
int state = entropy->dc_stats[dc_tbl_no][i];
int mps_val = state >> 7;
float prob_lps = (jpeg_aritab[state & 0x7f] >> 16) / 46340.95; /* 32768*sqrt(2) */
float prob_0 = (mps_val) ? prob_lps : 1.0 - prob_lps;
float prob_1 = 1.0 - prob_0;
r->rate_dc[i][0] = -log(prob_0) / log(2.0);
r->rate_dc[i][1] = -log(prob_1) / log(2.0);
}
for (i = 0; i < AC_STAT_BINS; i++) {
int state = entropy->ac_stats[ac_tbl_no][i];
int mps_val = state >> 7;
float prob_lps = (jpeg_aritab[state & 0x7f] >> 16) / 46340.95;
float prob_0 = (mps_val) ? prob_lps : 1.0 - prob_lps;
float prob_1 = 1.0 - prob_0;
r->rate_ac[i][0] = -log(prob_0) / log(2.0);
r->rate_ac[i][1] = -log(prob_1) / log(2.0);
}
}

View File

@@ -1,10 +1,12 @@
/* /*
* jccoefct.c * jccoefct.c
* *
* This file was part of the Independent JPEG Group's software:
* Copyright (C) 1994-1997, Thomas G. Lane. * Copyright (C) 1994-1997, Thomas G. Lane.
* It was modified by The libjpeg-turbo Project to include only code and
* information relevant to libjpeg-turbo.
* mozjpeg Modifications: * mozjpeg Modifications:
* Copyright (C) 2014, Mozilla Corporation. * Copyright (C) 2014, Mozilla Corporation.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file. * For conditions of distribution and use, see the accompanying README file.
* *
* This file contains the coefficient buffer controller for compression. * This file contains the coefficient buffer controller for compression.
@@ -44,11 +46,8 @@ typedef struct {
/* For single-pass compression, it's sufficient to buffer just one MCU /* For single-pass compression, it's sufficient to buffer just one MCU
* (although this may prove a bit slow in practice). We allocate a * (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 * 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 * MCU constructed and sent. In multi-pass modes, this array points to the
* it's not really very big; this is to keep the module interfaces unchanged * current MCU's blocks within the virtual arrays.
* 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]; JBLOCKROW MCU_buffer[C_MAX_BLOCKS_IN_MCU];
@@ -65,15 +64,15 @@ typedef my_coef_controller * my_coef_ptr;
/* Forward declarations */ /* Forward declarations */
METHODDEF(boolean) compress_data METHODDEF(boolean) compress_data
JPP((j_compress_ptr cinfo, JSAMPIMAGE input_buf)); (j_compress_ptr cinfo, JSAMPIMAGE input_buf);
#ifdef FULL_COEF_BUFFER_SUPPORTED #ifdef FULL_COEF_BUFFER_SUPPORTED
METHODDEF(boolean) compress_first_pass METHODDEF(boolean) compress_first_pass
JPP((j_compress_ptr cinfo, JSAMPIMAGE input_buf)); (j_compress_ptr cinfo, JSAMPIMAGE input_buf);
METHODDEF(boolean) compress_output METHODDEF(boolean) compress_output
JPP((j_compress_ptr cinfo, JSAMPIMAGE input_buf)); (j_compress_ptr cinfo, JSAMPIMAGE input_buf);
#endif #endif
METHODDEF(boolean) compress_trellis_pass METHODDEF(boolean) compress_trellis_pass
JPP((j_compress_ptr cinfo, JSAMPIMAGE input_buf)); (j_compress_ptr cinfo, JSAMPIMAGE input_buf);
LOCAL(void) LOCAL(void)
@@ -191,19 +190,20 @@ compress_data (j_compress_ptr cinfo, JSAMPIMAGE input_buf)
(*cinfo->fdct->forward_DCT) (cinfo, compptr, (*cinfo->fdct->forward_DCT) (cinfo, compptr,
input_buf[compptr->component_index], input_buf[compptr->component_index],
coef->MCU_buffer[blkn], coef->MCU_buffer[blkn],
ypos, xpos, (JDIMENSION) blockcnt, NULL); ypos, xpos, (JDIMENSION) blockcnt,
NULL);
if (blockcnt < compptr->MCU_width) { if (blockcnt < compptr->MCU_width) {
/* Create some dummy blocks at the right edge of the image. */ /* Create some dummy blocks at the right edge of the image. */
jzero_far((void FAR *) coef->MCU_buffer[blkn + blockcnt], jzero_far((void *) coef->MCU_buffer[blkn + blockcnt],
(compptr->MCU_width - blockcnt) * SIZEOF(JBLOCK)); (compptr->MCU_width - blockcnt) * sizeof(JBLOCK));
for (bi = blockcnt; bi < compptr->MCU_width; bi++) { for (bi = blockcnt; bi < compptr->MCU_width; bi++) {
coef->MCU_buffer[blkn+bi][0][0] = coef->MCU_buffer[blkn+bi-1][0][0]; coef->MCU_buffer[blkn+bi][0][0] = coef->MCU_buffer[blkn+bi-1][0][0];
} }
} }
} else { } else {
/* Create a row of dummy blocks at the bottom of the image. */ /* Create a row of dummy blocks at the bottom of the image. */
jzero_far((void FAR *) coef->MCU_buffer[blkn], jzero_far((void *) coef->MCU_buffer[blkn],
compptr->MCU_width * SIZEOF(JBLOCK)); compptr->MCU_width * sizeof(JBLOCK));
for (bi = 0; bi < compptr->MCU_width; bi++) { for (bi = 0; bi < compptr->MCU_width; bi++) {
coef->MCU_buffer[blkn+bi][0][0] = coef->MCU_buffer[blkn-1][0][0]; coef->MCU_buffer[blkn+bi][0][0] = coef->MCU_buffer[blkn-1][0][0];
} }
@@ -303,11 +303,12 @@ compress_first_pass (j_compress_ptr cinfo, JSAMPIMAGE input_buf)
(*cinfo->fdct->forward_DCT) (cinfo, compptr, (*cinfo->fdct->forward_DCT) (cinfo, compptr,
input_buf[ci], thisblockrow, input_buf[ci], thisblockrow,
(JDIMENSION) (block_row * DCTSIZE), (JDIMENSION) (block_row * DCTSIZE),
(JDIMENSION) 0, blocks_across, buffer_dst[block_row]); (JDIMENSION) 0, blocks_across,
buffer_dst[block_row]);
if (ndummy > 0) { if (ndummy > 0) {
/* Create dummy blocks at the right edge of the image. */ /* Create dummy blocks at the right edge of the image. */
thisblockrow += blocks_across; /* => first dummy block */ thisblockrow += blocks_across; /* => first dummy block */
jzero_far((void FAR *) thisblockrow, ndummy * SIZEOF(JBLOCK)); jzero_far((void *) thisblockrow, ndummy * sizeof(JBLOCK));
lastDC = thisblockrow[-1][0]; lastDC = thisblockrow[-1][0];
for (bi = 0; bi < ndummy; bi++) { for (bi = 0; bi < ndummy; bi++) {
thisblockrow[bi][0] = lastDC; thisblockrow[bi][0] = lastDC;
@@ -326,8 +327,8 @@ compress_first_pass (j_compress_ptr cinfo, JSAMPIMAGE input_buf)
block_row++) { block_row++) {
thisblockrow = buffer[block_row]; thisblockrow = buffer[block_row];
lastblockrow = buffer[block_row-1]; lastblockrow = buffer[block_row-1];
jzero_far((void FAR *) thisblockrow, jzero_far((void *) thisblockrow,
(size_t) (blocks_across * SIZEOF(JBLOCK))); (size_t) (blocks_across * sizeof(JBLOCK)));
for (MCUindex = 0; MCUindex < MCUs_across; MCUindex++) { for (MCUindex = 0; MCUindex < MCUs_across; MCUindex++) {
lastDC = lastblockrow[h_samp_factor-1][0]; lastDC = lastblockrow[h_samp_factor-1][0];
for (bi = 0; bi < h_samp_factor; bi++) { for (bi = 0; bi < h_samp_factor; bi++) {
@@ -361,11 +362,22 @@ compress_trellis_pass (j_compress_ptr cinfo, JSAMPIMAGE input_buf)
JBLOCKARRAY buffer_dst; JBLOCKARRAY buffer_dst;
for (ci = 0; ci < cinfo->comps_in_scan; ci++) { for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
c_derived_tbl dctbl_data;
c_derived_tbl *dctbl = &dctbl_data;
c_derived_tbl actbl_data; c_derived_tbl actbl_data;
c_derived_tbl *actbl = &actbl_data; c_derived_tbl *actbl = &actbl_data;
arith_rates arith_r_data;
arith_rates *arith_r = &arith_r_data;
compptr = cinfo->cur_comp_info[ci]; compptr = cinfo->cur_comp_info[ci];
if (cinfo->arith_code)
jget_arith_rates(cinfo, compptr->dc_tbl_no, compptr->ac_tbl_no, arith_r);
else {
jpeg_make_c_derived_tbl(cinfo, TRUE, compptr->dc_tbl_no, &dctbl);
jpeg_make_c_derived_tbl(cinfo, FALSE, compptr->ac_tbl_no, &actbl); jpeg_make_c_derived_tbl(cinfo, FALSE, compptr->ac_tbl_no, &actbl);
}
/* Align the virtual buffer for this component. */ /* Align the virtual buffer for this component. */
buffer = (*cinfo->mem->access_virt_barray) buffer = (*cinfo->mem->access_virt_barray)
@@ -392,17 +404,34 @@ compress_trellis_pass (j_compress_ptr cinfo, JSAMPIMAGE input_buf)
ndummy = (int) (blocks_across % h_samp_factor); ndummy = (int) (blocks_across % h_samp_factor);
if (ndummy > 0) if (ndummy > 0)
ndummy = h_samp_factor - ndummy; ndummy = h_samp_factor - ndummy;
lastDC = 0;
/* Perform DCT for all non-dummy blocks in this iMCU row. Each call /* Perform DCT for all non-dummy blocks in this iMCU row. Each call
* on forward_DCT processes a complete horizontal row of DCT blocks. * on forward_DCT processes a complete horizontal row of DCT blocks.
*/ */
for (block_row = 0; block_row < block_rows; block_row++) { for (block_row = 0; block_row < block_rows; block_row++) {
thisblockrow = buffer[block_row]; thisblockrow = buffer[block_row];
quantize_trellis(cinfo, actbl, thisblockrow, buffer_dst[block_row], blocks_across, cinfo->quant_tbl_ptrs[compptr->quant_tbl_no], cinfo->norm_src[compptr->quant_tbl_no], cinfo->norm_coef[compptr->quant_tbl_no]); lastblockrow = (block_row > 0) ? buffer[block_row-1] : NULL;
if (cinfo->arith_code)
quantize_trellis_arith(cinfo, arith_r, thisblockrow,
buffer_dst[block_row], blocks_across,
cinfo->quant_tbl_ptrs[compptr->quant_tbl_no],
cinfo->master->norm_src[compptr->quant_tbl_no],
cinfo->master->norm_coef[compptr->quant_tbl_no],
&lastDC, lastblockrow, buffer_dst[block_row-1]);
else
quantize_trellis(cinfo, dctbl, actbl, thisblockrow,
buffer_dst[block_row], blocks_across,
cinfo->quant_tbl_ptrs[compptr->quant_tbl_no],
cinfo->master->norm_src[compptr->quant_tbl_no],
cinfo->master->norm_coef[compptr->quant_tbl_no],
&lastDC, lastblockrow, buffer_dst[block_row-1]);
if (ndummy > 0) { if (ndummy > 0) {
/* Create dummy blocks at the right edge of the image. */ /* Create dummy blocks at the right edge of the image. */
thisblockrow += blocks_across; /* => first dummy block */ thisblockrow += blocks_across; /* => first dummy block */
jzero_far((void FAR *) thisblockrow, ndummy * SIZEOF(JBLOCK)); jzero_far((void *) thisblockrow, ndummy * sizeof(JBLOCK));
lastDC = thisblockrow[-1][0]; lastDC = thisblockrow[-1][0];
for (bi = 0; bi < ndummy; bi++) { for (bi = 0; bi < ndummy; bi++) {
thisblockrow[bi][0] = lastDC; thisblockrow[bi][0] = lastDC;
@@ -421,8 +450,8 @@ compress_trellis_pass (j_compress_ptr cinfo, JSAMPIMAGE input_buf)
block_row++) { block_row++) {
thisblockrow = buffer[block_row]; thisblockrow = buffer[block_row];
lastblockrow = buffer[block_row-1]; lastblockrow = buffer[block_row-1];
jzero_far((void FAR *) thisblockrow, jzero_far((void *) thisblockrow,
(size_t) (blocks_across * SIZEOF(JBLOCK))); (size_t) (blocks_across * sizeof(JBLOCK)));
for (MCUindex = 0; MCUindex < MCUs_across; MCUindex++) { for (MCUindex = 0; MCUindex < MCUs_across; MCUindex++) {
lastDC = lastblockrow[h_samp_factor-1][0]; lastDC = lastblockrow[h_samp_factor-1][0];
for (bi = 0; bi < h_samp_factor; bi++) { for (bi = 0; bi < h_samp_factor; bi++) {
@@ -493,7 +522,6 @@ compress_output (j_compress_ptr cinfo, JSAMPIMAGE input_buf)
} }
} }
} }
/* Try to write the MCU. */ /* Try to write the MCU. */
if (! (*cinfo->entropy->encode_mcu) (cinfo, coef->MCU_buffer)) { if (! (*cinfo->entropy->encode_mcu) (cinfo, coef->MCU_buffer)) {
/* Suspension forced; update state counters and exit */ /* Suspension forced; update state counters and exit */
@@ -525,7 +553,7 @@ jinit_c_coef_controller (j_compress_ptr cinfo, boolean need_full_buffer)
coef = (my_coef_ptr) coef = (my_coef_ptr)
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
SIZEOF(my_coef_controller)); sizeof(my_coef_controller));
cinfo->coef = (struct jpeg_c_coef_controller *) coef; cinfo->coef = (struct jpeg_c_coef_controller *) coef;
coef->pub.start_pass = start_pass_coef; coef->pub.start_pass = start_pass_coef;
@@ -565,7 +593,7 @@ jinit_c_coef_controller (j_compress_ptr cinfo, boolean need_full_buffer)
buffer = (JBLOCKROW) buffer = (JBLOCKROW)
(*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE, (*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE,
C_MAX_BLOCKS_IN_MCU * SIZEOF(JBLOCK)); C_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
for (i = 0; i < C_MAX_BLOCKS_IN_MCU; i++) { for (i = 0; i < C_MAX_BLOCKS_IN_MCU; i++) {
coef->MCU_buffer[i] = buffer + i; coef->MCU_buffer[i] = buffer + i;
} }

View File

@@ -6,6 +6,7 @@
* libjpeg-turbo Modifications: * libjpeg-turbo Modifications:
* Copyright 2009 Pierre Ossman <ossman@cendio.se> for Cendio AB * Copyright 2009 Pierre Ossman <ossman@cendio.se> for Cendio AB
* Copyright (C) 2009-2012, D. R. Commander. * Copyright (C) 2009-2012, D. R. Commander.
* Copyright (C) 2014, MIPS Technologies, Inc., California
* For conditions of distribution and use, see the accompanying README file. * For conditions of distribution and use, see the accompanying README file.
* *
* This file contains input colorspace conversion routines. * This file contains input colorspace conversion routines.
@@ -15,7 +16,7 @@
#include "jinclude.h" #include "jinclude.h"
#include "jpeglib.h" #include "jpeglib.h"
#include "jsimd.h" #include "jsimd.h"
#include "config.h" #include "jconfigint.h"
/* Private subobject */ /* Private subobject */
@@ -202,7 +203,7 @@ rgb_ycc_start (j_compress_ptr cinfo)
/* Allocate and fill in the conversion tables. */ /* Allocate and fill in the conversion tables. */
cconvert->rgb_ycc_tab = rgb_ycc_tab = (INT32 *) cconvert->rgb_ycc_tab = rgb_ycc_tab = (INT32 *)
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
(TABLE_SIZE * SIZEOF(INT32))); (TABLE_SIZE * sizeof(INT32)));
for (i = 0; i <= MAXJSAMPLE; i++) { for (i = 0; i <= MAXJSAMPLE; i++) {
rgb_ycc_tab[i+R_Y_OFF] = FIX(0.29900) * i; rgb_ycc_tab[i+R_Y_OFF] = FIX(0.29900) * i;
@@ -507,7 +508,7 @@ jinit_color_converter (j_compress_ptr cinfo)
cconvert = (my_cconvert_ptr) cconvert = (my_cconvert_ptr)
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
SIZEOF(my_color_converter)); sizeof(my_color_converter));
cinfo->cconvert = (struct jpeg_color_converter *) cconvert; cinfo->cconvert = (struct jpeg_color_converter *) cconvert;
/* set start_pass to null method until we find out differently */ /* set start_pass to null method until we find out differently */
cconvert->pub.start_pass = null_method; cconvert->pub.start_pass = null_method;
@@ -587,9 +588,14 @@ jinit_color_converter (j_compress_ptr cinfo)
if (rgb_red[cinfo->in_color_space] == 0 && if (rgb_red[cinfo->in_color_space] == 0 &&
rgb_green[cinfo->in_color_space] == 1 && rgb_green[cinfo->in_color_space] == 1 &&
rgb_blue[cinfo->in_color_space] == 2 && rgb_blue[cinfo->in_color_space] == 2 &&
rgb_pixelsize[cinfo->in_color_space] == 3) rgb_pixelsize[cinfo->in_color_space] == 3) {
#if defined(__mips__)
if (jsimd_c_can_null_convert())
cconvert->pub.color_convert = jsimd_c_null_convert;
else
#endif
cconvert->pub.color_convert = null_convert; cconvert->pub.color_convert = null_convert;
else if (cinfo->in_color_space == JCS_RGB || } else if (cinfo->in_color_space == JCS_RGB ||
cinfo->in_color_space == JCS_EXT_RGB || cinfo->in_color_space == JCS_EXT_RGB ||
cinfo->in_color_space == JCS_EXT_RGBX || cinfo->in_color_space == JCS_EXT_RGBX ||
cinfo->in_color_space == JCS_EXT_BGR || cinfo->in_color_space == JCS_EXT_BGR ||
@@ -625,18 +631,28 @@ jinit_color_converter (j_compress_ptr cinfo)
cconvert->pub.start_pass = rgb_ycc_start; cconvert->pub.start_pass = rgb_ycc_start;
cconvert->pub.color_convert = rgb_ycc_convert; cconvert->pub.color_convert = rgb_ycc_convert;
} }
} else if (cinfo->in_color_space == JCS_YCbCr) } else if (cinfo->in_color_space == JCS_YCbCr) {
cconvert->pub.color_convert = null_convert; #if defined(__mips__)
if (jsimd_c_can_null_convert())
cconvert->pub.color_convert = jsimd_c_null_convert;
else else
#endif
cconvert->pub.color_convert = null_convert;
} else
ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL); ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
break; break;
case JCS_CMYK: case JCS_CMYK:
if (cinfo->num_components != 4) if (cinfo->num_components != 4)
ERREXIT(cinfo, JERR_BAD_J_COLORSPACE); ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
if (cinfo->in_color_space == JCS_CMYK) if (cinfo->in_color_space == JCS_CMYK) {
cconvert->pub.color_convert = null_convert; #if defined(__mips__)
if (jsimd_c_can_null_convert())
cconvert->pub.color_convert = jsimd_c_null_convert;
else else
#endif
cconvert->pub.color_convert = null_convert;
} else
ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL); ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
break; break;
@@ -646,9 +662,14 @@ jinit_color_converter (j_compress_ptr cinfo)
if (cinfo->in_color_space == JCS_CMYK) { if (cinfo->in_color_space == JCS_CMYK) {
cconvert->pub.start_pass = rgb_ycc_start; cconvert->pub.start_pass = rgb_ycc_start;
cconvert->pub.color_convert = cmyk_ycck_convert; cconvert->pub.color_convert = cmyk_ycck_convert;
} else if (cinfo->in_color_space == JCS_YCCK) } else if (cinfo->in_color_space == JCS_YCCK) {
cconvert->pub.color_convert = null_convert; #if defined(__mips__)
if (jsimd_c_can_null_convert())
cconvert->pub.color_convert = jsimd_c_null_convert;
else else
#endif
cconvert->pub.color_convert = null_convert;
} else
ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL); ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
break; break;
@@ -656,6 +677,11 @@ jinit_color_converter (j_compress_ptr cinfo)
if (cinfo->jpeg_color_space != cinfo->in_color_space || if (cinfo->jpeg_color_space != cinfo->in_color_space ||
cinfo->num_components != cinfo->input_components) cinfo->num_components != cinfo->input_components)
ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL); ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
#if defined(__mips__)
if (jsimd_c_can_null_convert())
cconvert->pub.color_convert = jsimd_c_null_convert;
else
#endif
cconvert->pub.color_convert = null_convert; cconvert->pub.color_convert = null_convert;
break; break;
} }

File diff suppressed because it is too large Load Diff

219
jcext.c Normal file
View File

@@ -0,0 +1,219 @@
/*
* jcext.c
*
* Copyright (C) 2014, D. R. Commander.
* Copyright (C) 2014, Mozilla Corporation.
* For conditions of distribution and use, see the accompanying README file.
*
* This file contains accessor functions for extension parameters. These
* allow for extending the functionality of the libjpeg API without breaking
* backward ABI compatibility.
*/
#define JPEG_INTERNALS
#include "jinclude.h"
#include "jpeglib.h"
GLOBAL(boolean)
jpeg_c_bool_param_supported (j_compress_ptr cinfo, J_BOOLEAN_PARAM param)
{
switch (param) {
case JBOOLEAN_OPTIMIZE_SCANS:
case JBOOLEAN_TRELLIS_QUANT:
case JBOOLEAN_TRELLIS_QUANT_DC:
case JBOOLEAN_TRELLIS_EOB_OPT:
case JBOOLEAN_USE_LAMBDA_WEIGHT_TBL:
case JBOOLEAN_USE_SCANS_IN_TRELLIS:
case JBOOLEAN_TRELLIS_Q_OPT:
case JBOOLEAN_OVERSHOOT_DERINGING:
return TRUE;
}
return FALSE;
}
GLOBAL(void)
jpeg_c_set_bool_param (j_compress_ptr cinfo, J_BOOLEAN_PARAM param,
boolean value)
{
switch(param) {
case JBOOLEAN_OPTIMIZE_SCANS:
cinfo->master->optimize_scans = value;
break;
case JBOOLEAN_TRELLIS_QUANT:
cinfo->master->trellis_quant = value;
break;
case JBOOLEAN_TRELLIS_QUANT_DC:
cinfo->master->trellis_quant_dc = value;
break;
case JBOOLEAN_TRELLIS_EOB_OPT:
cinfo->master->trellis_eob_opt = value;
break;
case JBOOLEAN_USE_LAMBDA_WEIGHT_TBL:
cinfo->master->use_lambda_weight_tbl = value;
break;
case JBOOLEAN_USE_SCANS_IN_TRELLIS:
cinfo->master->use_scans_in_trellis = value;
break;
case JBOOLEAN_TRELLIS_Q_OPT:
cinfo->master->trellis_q_opt = value;
break;
case JBOOLEAN_OVERSHOOT_DERINGING:
cinfo->master->overshoot_deringing = value;
break;
default:
ERREXIT(cinfo, JERR_BAD_PARAM);
}
}
GLOBAL(boolean)
jpeg_c_get_bool_param (j_compress_ptr cinfo, J_BOOLEAN_PARAM param)
{
switch(param) {
case JBOOLEAN_OPTIMIZE_SCANS:
return cinfo->master->optimize_scans;
case JBOOLEAN_TRELLIS_QUANT:
return cinfo->master->trellis_quant;
case JBOOLEAN_TRELLIS_QUANT_DC:
return cinfo->master->trellis_quant_dc;
case JBOOLEAN_TRELLIS_EOB_OPT:
return cinfo->master->trellis_eob_opt;
case JBOOLEAN_USE_LAMBDA_WEIGHT_TBL:
return cinfo->master->use_lambda_weight_tbl;
case JBOOLEAN_USE_SCANS_IN_TRELLIS:
return cinfo->master->use_scans_in_trellis;
case JBOOLEAN_TRELLIS_Q_OPT:
return cinfo->master->trellis_q_opt;
case JBOOLEAN_OVERSHOOT_DERINGING:
return cinfo->master->overshoot_deringing;
default:
ERREXIT(cinfo, JERR_BAD_PARAM);
}
return FALSE;
}
GLOBAL(boolean)
jpeg_c_float_param_supported (j_compress_ptr cinfo, J_FLOAT_PARAM param)
{
switch (param) {
case JFLOAT_LAMBDA_LOG_SCALE1:
case JFLOAT_LAMBDA_LOG_SCALE2:
case JFLOAT_TRELLIS_DELTA_DC_WEIGHT:
return TRUE;
}
return FALSE;
}
GLOBAL(void)
jpeg_c_set_float_param (j_compress_ptr cinfo, J_FLOAT_PARAM param, float value)
{
switch (param) {
case JFLOAT_LAMBDA_LOG_SCALE1:
cinfo->master->lambda_log_scale1 = value;
break;
case JFLOAT_LAMBDA_LOG_SCALE2:
cinfo->master->lambda_log_scale2 = value;
break;
case JFLOAT_TRELLIS_DELTA_DC_WEIGHT:
cinfo->master->trellis_delta_dc_weight = value;
break;
default:
ERREXIT(cinfo, JERR_BAD_PARAM);
}
}
GLOBAL(float)
jpeg_c_get_float_param (j_compress_ptr cinfo, J_FLOAT_PARAM param)
{
switch (param) {
case JFLOAT_LAMBDA_LOG_SCALE1:
return cinfo->master->lambda_log_scale1;
case JFLOAT_LAMBDA_LOG_SCALE2:
return cinfo->master->lambda_log_scale2;
case JFLOAT_TRELLIS_DELTA_DC_WEIGHT:
return cinfo->master->trellis_delta_dc_weight;
default:
ERREXIT(cinfo, JERR_BAD_PARAM);
}
return -1;
}
GLOBAL(boolean)
jpeg_c_int_param_supported (j_compress_ptr cinfo, J_INT_PARAM param)
{
switch (param) {
case JINT_COMPRESS_PROFILE:
case JINT_TRELLIS_FREQ_SPLIT:
case JINT_TRELLIS_NUM_LOOPS:
case JINT_BASE_QUANT_TBL_IDX:
case JINT_DC_SCAN_OPT_MODE:
return TRUE;
}
return FALSE;
}
GLOBAL(void)
jpeg_c_set_int_param (j_compress_ptr cinfo, J_INT_PARAM param, int value)
{
switch (param) {
case JINT_COMPRESS_PROFILE:
switch (value) {
case JCP_MAX_COMPRESSION:
case JCP_FASTEST:
cinfo->master->compress_profile = value;
break;
default:
ERREXIT(cinfo, JERR_BAD_PARAM_VALUE);
}
break;
case JINT_TRELLIS_FREQ_SPLIT:
cinfo->master->trellis_freq_split = value;
break;
case JINT_TRELLIS_NUM_LOOPS:
cinfo->master->trellis_num_loops = value;
break;
case JINT_BASE_QUANT_TBL_IDX:
if (value >= 0 && value <= 8)
cinfo->master->quant_tbl_master_idx = value;
break;
case JINT_DC_SCAN_OPT_MODE:
cinfo->master->dc_scan_opt_mode = value;
break;
default:
ERREXIT(cinfo, JERR_BAD_PARAM);
}
}
GLOBAL(int)
jpeg_c_get_int_param (j_compress_ptr cinfo, J_INT_PARAM param)
{
switch (param) {
case JINT_COMPRESS_PROFILE:
return cinfo->master->compress_profile;
case JINT_TRELLIS_FREQ_SPLIT:
return cinfo->master->trellis_freq_split;
case JINT_TRELLIS_NUM_LOOPS:
return cinfo->master->trellis_num_loops;
case JINT_BASE_QUANT_TBL_IDX:
return cinfo->master->quant_tbl_master_idx;
case JINT_DC_SCAN_OPT_MODE:
return cinfo->master->dc_scan_opt_mode;
default:
ERREXIT(cinfo, JERR_BAD_PARAM);
}
return -1;
}

View File

@@ -4,7 +4,7 @@
* This file was part of the Independent JPEG Group's software: * This file was part of the Independent JPEG Group's software:
* Copyright (C) 1991-1997, Thomas G. Lane. * Copyright (C) 1991-1997, Thomas G. Lane.
* libjpeg-turbo Modifications: * libjpeg-turbo Modifications:
* Copyright (C) 2009-2011, D. R. Commander. * Copyright (C) 2009-2011, 2014 D. R. Commander.
* For conditions of distribution and use, see the accompanying README file. * For conditions of distribution and use, see the accompanying README file.
* *
* This file contains Huffman entropy encoding routines. * This file contains Huffman entropy encoding routines.
@@ -22,8 +22,35 @@
#include "jchuff.h" /* Declarations shared with jcphuff.c */ #include "jchuff.h" /* Declarations shared with jcphuff.c */
#include <limits.h> #include <limits.h>
static unsigned char jpeg_nbits_table[65536]; /*
static int jpeg_nbits_table_init = 0; * NOTE: If USE_CLZ_INTRINSIC is defined, then clz/bsr instructions will be
* used for bit counting rather than the lookup table. This will reduce the
* memory footprint by 64k, which is important for some mobile applications
* that create many isolated instances of libjpeg-turbo (web browsers, for
* instance.) This may improve performance on some mobile platforms as well.
* This feature is enabled by default only on ARM processors, because some x86
* chips have a slow implementation of bsr, and the use of clz/bsr cannot be
* shown to have a significant performance impact even on the x86 chips that
* have a fast implementation of it. When building for ARMv6, you can
* explicitly disable the use of clz/bsr by adding -mthumb to the compiler
* flags (this defines __thumb__).
*/
/* NOTE: Both GCC and Clang define __GNUC__ */
#if defined __GNUC__ && defined __arm__
#if !defined __thumb__ || defined __thumb2__
#define USE_CLZ_INTRINSIC
#endif
#endif
#ifdef USE_CLZ_INTRINSIC
#define JPEG_NBITS_NONZERO(x) (32 - __builtin_clz(x))
#define JPEG_NBITS(x) (x ? JPEG_NBITS_NONZERO(x) : 0)
#else
#include "jpeg_nbits_table.h"
#define JPEG_NBITS(x) (jpeg_nbits_table[x])
#define JPEG_NBITS_NONZERO(x) JPEG_NBITS(x)
#endif
#ifndef min #ifndef min
#define min(a,b) ((a)<(b)?(a):(b)) #define min(a,b) ((a)<(b)?(a):(b))
@@ -96,13 +123,12 @@ typedef struct {
/* Forward declarations */ /* Forward declarations */
METHODDEF(boolean) encode_mcu_huff JPP((j_compress_ptr cinfo, METHODDEF(boolean) encode_mcu_huff (j_compress_ptr cinfo, JBLOCKROW *MCU_data);
JBLOCKROW *MCU_data)); METHODDEF(void) finish_pass_huff (j_compress_ptr cinfo);
METHODDEF(void) finish_pass_huff JPP((j_compress_ptr cinfo));
#ifdef ENTROPY_OPT_SUPPORTED #ifdef ENTROPY_OPT_SUPPORTED
METHODDEF(boolean) encode_mcu_gather JPP((j_compress_ptr cinfo, METHODDEF(boolean) encode_mcu_gather (j_compress_ptr cinfo,
JBLOCKROW *MCU_data)); JBLOCKROW *MCU_data);
METHODDEF(void) finish_pass_gather JPP((j_compress_ptr cinfo)); METHODDEF(void) finish_pass_gather (j_compress_ptr cinfo);
#endif #endif
@@ -148,13 +174,13 @@ start_pass_huff (j_compress_ptr cinfo, boolean gather_statistics)
if (entropy->dc_count_ptrs[dctbl] == NULL) if (entropy->dc_count_ptrs[dctbl] == NULL)
entropy->dc_count_ptrs[dctbl] = (long *) entropy->dc_count_ptrs[dctbl] = (long *)
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
257 * SIZEOF(long)); 257 * sizeof(long));
MEMZERO(entropy->dc_count_ptrs[dctbl], 257 * SIZEOF(long)); MEMZERO(entropy->dc_count_ptrs[dctbl], 257 * sizeof(long));
if (entropy->ac_count_ptrs[actbl] == NULL) if (entropy->ac_count_ptrs[actbl] == NULL)
entropy->ac_count_ptrs[actbl] = (long *) entropy->ac_count_ptrs[actbl] = (long *)
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
257 * SIZEOF(long)); 257 * sizeof(long));
MEMZERO(entropy->ac_count_ptrs[actbl], 257 * SIZEOF(long)); MEMZERO(entropy->ac_count_ptrs[actbl], 257 * sizeof(long));
#endif #endif
} else { } else {
/* Compute derived values for Huffman tables */ /* Compute derived values for Huffman tables */
@@ -212,7 +238,7 @@ jpeg_make_c_derived_tbl (j_compress_ptr cinfo, boolean isDC, int tblno,
if (*pdtbl == NULL) if (*pdtbl == NULL)
*pdtbl = (c_derived_tbl *) *pdtbl = (c_derived_tbl *)
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
SIZEOF(c_derived_tbl)); sizeof(c_derived_tbl));
dtbl = *pdtbl; dtbl = *pdtbl;
/* Figure C.1: make table of Huffman code length for each symbol */ /* Figure C.1: make table of Huffman code length for each symbol */
@@ -255,7 +281,7 @@ jpeg_make_c_derived_tbl (j_compress_ptr cinfo, boolean isDC, int tblno,
* this lets us detect duplicate VAL entries here, and later * this lets us detect duplicate VAL entries here, and later
* allows emit_bits to detect any attempt to emit such symbols. * allows emit_bits to detect any attempt to emit such symbols.
*/ */
MEMZERO(dtbl->ehufsi, SIZEOF(dtbl->ehufsi)); MEMZERO(dtbl->ehufsi, sizeof(dtbl->ehufsi));
/* This is also a convenient place to check for out-of-range /* This is also a convenient place to check for out-of-range
* and duplicated VAL entries. We allow 0..255 for AC symbols * and duplicated VAL entries. We allow 0..255 for AC symbols
@@ -271,15 +297,6 @@ jpeg_make_c_derived_tbl (j_compress_ptr cinfo, boolean isDC, int tblno,
dtbl->ehufco[i] = huffcode[p]; dtbl->ehufco[i] = huffcode[p];
dtbl->ehufsi[i] = huffsize[p]; dtbl->ehufsi[i] = huffsize[p];
} }
if(!jpeg_nbits_table_init) {
for(i = 0; i < 65536; i++) {
int nbits = 0, temp = i;
while (temp) {temp >>= 1; nbits++;}
jpeg_nbits_table[i] = nbits;
}
jpeg_nbits_table_init = 1;
}
} }
@@ -391,7 +408,16 @@ dump_buffer (working_state * state)
#endif #endif
#define BUFSIZE (DCTSIZE2 * 2) /* Although it is exceedingly rare, it is possible for a Huffman-encoded
* coefficient block to be larger than the 128-byte unencoded block. For each
* of the 64 coefficients, PUT_BITS is invoked twice, and each invocation can
* theoretically store 16 bits (for a maximum of 2048 bits or 256 bytes per
* encoded block.) If, for instance, one artificially sets the AC
* coefficients to alternating values of 32767 and -32768 (using the JPEG
* scanning order-- 1, 8, 16, etc.), then this will produce an encoded block
* larger than 200 bytes.
*/
#define BUFSIZE (DCTSIZE2 * 4)
#define LOAD_BUFFER() { \ #define LOAD_BUFFER() { \
if (state->free_in_buffer < BUFSIZE) { \ if (state->free_in_buffer < BUFSIZE) { \
@@ -482,7 +508,7 @@ encode_one_block (working_state * state, JCOEFPTR block, int last_dc_val,
temp2 += temp3; temp2 += temp3;
/* Find the number of bits needed for the magnitude of the coefficient */ /* Find the number of bits needed for the magnitude of the coefficient */
nbits = jpeg_nbits_table[temp]; nbits = JPEG_NBITS(temp);
/* Emit the Huffman-coded symbol for the number of bits */ /* Emit the Huffman-coded symbol for the number of bits */
code = dctbl->ehufco[nbits]; code = dctbl->ehufco[nbits];
@@ -516,7 +542,7 @@ encode_one_block (working_state * state, JCOEFPTR block, int last_dc_val,
temp ^= temp3; \ temp ^= temp3; \
temp -= temp3; \ temp -= temp3; \
temp2 += temp3; \ temp2 += temp3; \
nbits = jpeg_nbits_table[temp]; \ nbits = JPEG_NBITS_NONZERO(temp); \
/* if run length > 15, must emit special run-length-16 codes (0xF0) */ \ /* if run length > 15, must emit special run-length-16 codes (0xF0) */ \
while (r > 15) { \ while (r > 15) { \
EMIT_BITS(code_0xf0, size_0xf0) \ EMIT_BITS(code_0xf0, size_0xf0) \
@@ -830,8 +856,8 @@ jpeg_gen_optimal_table (j_compress_ptr cinfo, JHUFF_TBL * htbl, long freq[])
/* This algorithm is explained in section K.2 of the JPEG standard */ /* This algorithm is explained in section K.2 of the JPEG standard */
MEMZERO(bits, SIZEOF(bits)); MEMZERO(bits, sizeof(bits));
MEMZERO(codesize, SIZEOF(codesize)); MEMZERO(codesize, sizeof(codesize));
for (i = 0; i < 257; i++) for (i = 0; i < 257; i++)
others[i] = -1; /* init links to empty */ others[i] = -1; /* init links to empty */
@@ -933,7 +959,7 @@ jpeg_gen_optimal_table (j_compress_ptr cinfo, JHUFF_TBL * htbl, long freq[])
bits[i]--; bits[i]--;
/* Return final symbol counts (only for lengths 0..16) */ /* Return final symbol counts (only for lengths 0..16) */
MEMCOPY(htbl->bits, bits, SIZEOF(htbl->bits)); MEMCOPY(htbl->bits, bits, sizeof(htbl->bits));
/* Return a list of the symbols sorted by code length */ /* Return a list of the symbols sorted by code length */
/* It's not real clear to me why we don't need to consider the codelength /* It's not real clear to me why we don't need to consider the codelength
@@ -971,8 +997,8 @@ finish_pass_gather (j_compress_ptr cinfo)
/* It's important not to apply jpeg_gen_optimal_table more than once /* It's important not to apply jpeg_gen_optimal_table more than once
* per table, because it clobbers the input frequency counts! * per table, because it clobbers the input frequency counts!
*/ */
MEMZERO(did_dc, SIZEOF(did_dc)); MEMZERO(did_dc, sizeof(did_dc));
MEMZERO(did_ac, SIZEOF(did_ac)); MEMZERO(did_ac, sizeof(did_ac));
for (ci = 0; ci < cinfo->comps_in_scan; ci++) { for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
compptr = cinfo->cur_comp_info[ci]; compptr = cinfo->cur_comp_info[ci];
@@ -1011,7 +1037,7 @@ jinit_huff_encoder (j_compress_ptr cinfo)
entropy = (huff_entropy_ptr) entropy = (huff_entropy_ptr)
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
SIZEOF(huff_entropy_encoder)); sizeof(huff_entropy_encoder));
cinfo->entropy = (struct jpeg_entropy_encoder *) entropy; cinfo->entropy = (struct jpeg_entropy_encoder *) entropy;
entropy->pub.start_pass = start_pass_huff; entropy->pub.start_pass = start_pass_huff;

View File

@@ -1,10 +1,12 @@
/* /*
* jchuff.h * jchuff.h
* *
* This file was part of the Independent JPEG Group's software:
* Copyright (C) 1991-1997, Thomas G. Lane. * Copyright (C) 1991-1997, Thomas G. Lane.
* It was modified by The libjpeg-turbo Project to include only code relevant
* to libjpeg-turbo.
* mozjpeg Modifications: * mozjpeg Modifications:
* Copyright (C) 2014, Mozilla Corporation. * Copyright (C) 2014, Mozilla Corporation.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file. * For conditions of distribution and use, see the accompanying README file.
* *
* This file contains declarations for Huffman entropy encoding routines * This file contains declarations for Huffman entropy encoding routines
@@ -32,22 +34,16 @@ typedef struct {
/* If no code has been allocated for a symbol S, ehufsi[S] contains 0 */ /* If no code has been allocated for a symbol S, ehufsi[S] contains 0 */
} c_derived_tbl; } c_derived_tbl;
/* Short forms of external names for systems with brain-damaged linkers. */
#ifdef NEED_SHORT_EXTERNAL_NAMES
#define jpeg_make_c_derived_tbl jMkCDerived
#define jpeg_gen_optimal_table jGenOptTbl
#endif /* NEED_SHORT_EXTERNAL_NAMES */
/* Expand a Huffman table definition into the derived format */ /* Expand a Huffman table definition into the derived format */
EXTERN(void) jpeg_make_c_derived_tbl EXTERN(void) jpeg_make_c_derived_tbl
JPP((j_compress_ptr cinfo, boolean isDC, int tblno, (j_compress_ptr cinfo, boolean isDC, int tblno,
c_derived_tbl ** pdtbl)); c_derived_tbl ** pdtbl);
/* Generate an optimal table definition given the specified counts */ /* Generate an optimal table definition given the specified counts */
EXTERN(void) jpeg_gen_optimal_table EXTERN(void) jpeg_gen_optimal_table
JPP((j_compress_ptr cinfo, JHUFF_TBL * htbl, long freq[])); (j_compress_ptr cinfo, JHUFF_TBL * htbl, long freq[]);
EXTERN(void) quantize_trellis EXTERN(void) quantize_trellis
JPP((j_compress_ptr cinfo, c_derived_tbl *actbl, JBLOCKROW coef_blocks, JBLOCKROW src, JDIMENSION num_blocks, (j_compress_ptr cinfo, c_derived_tbl *dctbl, c_derived_tbl *actbl, JBLOCKROW coef_blocks, JBLOCKROW src, JDIMENSION num_blocks,
JQUANT_TBL * qtbl, double *norm_src, double *norm_coef)); JQUANT_TBL * qtbl, double *norm_src, double *norm_coef, JCOEF *last_dc_val,
JBLOCKROW coef_blocks_above, JBLOCKROW src_above);

View File

@@ -62,7 +62,8 @@ jinit_compress_master (j_compress_ptr cinfo)
/* Need a full-image coefficient buffer in any multi-pass mode. */ /* Need a full-image coefficient buffer in any multi-pass mode. */
jinit_c_coef_controller(cinfo, jinit_c_coef_controller(cinfo,
(boolean) (cinfo->num_scans > 1 || cinfo->optimize_coding || cinfo->optimize_scans)); (boolean) (cinfo->num_scans > 1 || cinfo->optimize_coding ||
cinfo->master->optimize_scans || cinfo->master->trellis_quant));
jinit_c_main_controller(cinfo, FALSE /* never need full buffer here */); jinit_c_main_controller(cinfo, FALSE /* never need full buffer here */);
jinit_marker_writer(cinfo); jinit_marker_writer(cinfo);

View File

@@ -1,8 +1,10 @@
/* /*
* jcmainct.c * jcmainct.c
* *
* This file was part of the Independent JPEG Group's software:
* Copyright (C) 1994-1996, Thomas G. Lane. * Copyright (C) 1994-1996, Thomas G. Lane.
* This file is part of the Independent JPEG Group's software. * It was modified by The libjpeg-turbo Project to include only code relevant
* to libjpeg-turbo.
* For conditions of distribution and use, see the accompanying README file. * For conditions of distribution and use, see the accompanying README file.
* *
* This file contains the main buffer controller for compression. * This file contains the main buffer controller for compression.
@@ -52,12 +54,12 @@ typedef my_main_controller * my_main_ptr;
/* Forward declarations */ /* Forward declarations */
METHODDEF(void) process_data_simple_main METHODDEF(void) process_data_simple_main
JPP((j_compress_ptr cinfo, JSAMPARRAY input_buf, (j_compress_ptr cinfo, JSAMPARRAY input_buf, JDIMENSION *in_row_ctr,
JDIMENSION *in_row_ctr, JDIMENSION in_rows_avail)); JDIMENSION in_rows_avail);
#ifdef FULL_MAIN_BUFFER_SUPPORTED #ifdef FULL_MAIN_BUFFER_SUPPORTED
METHODDEF(void) process_data_buffer_main METHODDEF(void) process_data_buffer_main
JPP((j_compress_ptr cinfo, JSAMPARRAY input_buf, (j_compress_ptr cinfo, JSAMPARRAY input_buf, JDIMENSION *in_row_ctr,
JDIMENSION *in_row_ctr, JDIMENSION in_rows_avail)); JDIMENSION in_rows_avail);
#endif #endif
@@ -250,7 +252,7 @@ jinit_c_main_controller (j_compress_ptr cinfo, boolean need_full_buffer)
main_ptr = (my_main_ptr) main_ptr = (my_main_ptr)
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
SIZEOF(my_main_controller)); sizeof(my_main_controller));
cinfo->main = (struct jpeg_c_main_controller *) main_ptr; cinfo->main = (struct jpeg_c_main_controller *) main_ptr;
main_ptr->pub.start_pass = start_pass_main; main_ptr->pub.start_pass = start_pass_main;

View File

@@ -183,6 +183,72 @@ emit_dqt (j_compress_ptr cinfo, int index)
return prec; return prec;
} }
LOCAL(int)
emit_multi_dqt (j_compress_ptr cinfo)
/* Emits a DQT marker containing all quantization tables */
/* Returns number of emitted 16-bit tables, or -1 for failed for baseline checking. */
{
int prec[MAX_COMPONENTS];
int seen[MAX_COMPONENTS] = { 0 };
int fin_prec = 0;
int ci;
int size = 0;
if (cinfo->master->compress_profile == JCP_FASTEST)
return -1;
for (ci = 0; ci < cinfo->num_components; ci++) {
int tbl_num = cinfo->comp_info[ci].quant_tbl_no;
int i;
JQUANT_TBL * qtbl = cinfo->quant_tbl_ptrs[tbl_num];
if (qtbl == NULL || qtbl->sent_table == TRUE)
return -1;
prec[ci] = 0;
for (i = 0; i < DCTSIZE2; i++)
prec[ci] = !!(prec[ci] + (qtbl->quantval[i] > 255));
fin_prec += prec[ci];
}
emit_marker(cinfo, M_DQT);
for (ci = 0; ci < cinfo->num_components; ci++) {
int tbl_num = cinfo->comp_info[ci].quant_tbl_no;
if (!seen[tbl_num]) {
size += DCTSIZE2 * (prec[ci] + 1) + 1;
seen[tbl_num] = 1;
}
}
size += 2;
emit_2bytes(cinfo, size);
for (ci = 0; ci < cinfo->num_components; ci++) {
int tbl_num = cinfo->comp_info[ci].quant_tbl_no;
int i;
JQUANT_TBL * qtbl = cinfo->quant_tbl_ptrs[tbl_num];
if (qtbl->sent_table == TRUE)
continue;
emit_byte(cinfo, tbl_num + (prec[ci] << 4));
for (i = 0; i < DCTSIZE2; i++) {
unsigned int qval = qtbl->quantval[jpeg_natural_order[i]];
if (prec[ci])
emit_byte(cinfo, (int) (qval >> 8));
emit_byte(cinfo, (int) (qval & 0xFF));
}
qtbl->sent_table = TRUE;
}
return fin_prec;
}
LOCAL(void) LOCAL(void)
emit_dht (j_compress_ptr cinfo, int index, boolean is_ac) emit_dht (j_compress_ptr cinfo, int index, boolean is_ac)
@@ -221,6 +287,115 @@ emit_dht (j_compress_ptr cinfo, int index, boolean is_ac)
} }
} }
LOCAL(boolean)
emit_multi_dht (j_compress_ptr cinfo)
/* Emit all DHT markers */
/* Returns FALSE on failure, TRUE otherwise. */
{
int i, j;
int length = 2;
int dclens[NUM_HUFF_TBLS] = { 0 };
int aclens[NUM_HUFF_TBLS] = { 0 };
JHUFF_TBL *dcseen[NUM_HUFF_TBLS] = { NULL };
JHUFF_TBL *acseen[NUM_HUFF_TBLS] = { NULL };
if (cinfo->master->compress_profile == JCP_FASTEST)
return 0;
/* Calclate the total length. */
for (i = 0; i < cinfo->comps_in_scan; i++) {
jpeg_component_info *compptr = cinfo->cur_comp_info[i];
int dcidx = compptr->dc_tbl_no;
int acidx = compptr->ac_tbl_no;
JHUFF_TBL *dctbl = cinfo->dc_huff_tbl_ptrs[dcidx];
JHUFF_TBL *actbl = cinfo->ac_huff_tbl_ptrs[acidx];
int seen = 0;
/* Handle DC table lenghts */
if (cinfo->Ss == 0 && cinfo->Ah == 0) {
if (dctbl == NULL)
ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, dcidx);
if (dctbl->sent_table)
continue;
for (j = 0; j < NUM_HUFF_TBLS; j++)
seen += (dctbl == dcseen[j]);
if (seen)
continue;
dcseen[i] = dctbl;
for (j = 1; j <= 16; j++)
dclens[i] += dctbl->bits[j];
length += dclens[i] + 16 + 1;
}
/* Handle AC table lengths */
if (cinfo->Se) {
if (actbl == NULL)
ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, acidx + 0x10);
if (actbl->sent_table)
continue;
seen = 0;
for (j = 0; j < NUM_HUFF_TBLS; j++)
seen += (actbl == acseen[j]);
if (seen)
continue;
acseen[i] = actbl;
for (j = 1; j <= 16; j++)
aclens[i] += actbl->bits[j];
length += aclens[i] + 16 + 1;
}
}
/* Make sure we can fit it all into one DHT marker */
if (length > (1 << 16) - 1)
return FALSE;
emit_marker(cinfo, M_DHT);
emit_2bytes(cinfo, length);
for (i = 0; i < cinfo->comps_in_scan; i++) {
jpeg_component_info *compptr = cinfo->cur_comp_info[i];
int dcidx = compptr->dc_tbl_no;
int acidx = compptr->ac_tbl_no;
JHUFF_TBL *dctbl = cinfo->dc_huff_tbl_ptrs[dcidx];
JHUFF_TBL *actbl = cinfo->ac_huff_tbl_ptrs[acidx];
acidx += 0x10;
/* DC */
if (cinfo->Ss == 0 && cinfo->Ah == 0 && !dctbl->sent_table) {
emit_byte(cinfo, dcidx);
for (j = 1; j <= 16; j++)
emit_byte(cinfo, dctbl->bits[j]);
for (j = 0; j < dclens[i]; j++)
emit_byte(cinfo, dctbl->huffval[j]);
dctbl->sent_table = TRUE;
}
if (cinfo->Se && !actbl->sent_table) {
emit_byte(cinfo, acidx);
for (j = 1; j <= 16; j++)
emit_byte(cinfo, actbl->bits[j]);
for (j = 0; j < aclens[i]; j++)
emit_byte(cinfo, actbl->huffval[j]);
actbl->sent_table = TRUE;
}
}
return TRUE;
}
LOCAL(void) LOCAL(void)
emit_dac (j_compress_ptr cinfo) emit_dac (j_compress_ptr cinfo)
@@ -504,11 +679,14 @@ write_frame_header (j_compress_ptr cinfo)
/* Emit DQT for each quantization table. /* Emit DQT for each quantization table.
* Note that emit_dqt() suppresses any duplicate tables. * Note that emit_dqt() suppresses any duplicate tables.
*/ */
prec = emit_multi_dqt(cinfo);
if (prec == -1) {
prec = 0; prec = 0;
for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
ci++, compptr++) { ci++, compptr++) {
prec += emit_dqt(cinfo, compptr->quant_tbl_no); prec += emit_dqt(cinfo, compptr->quant_tbl_no);
} }
}
/* now prec is nonzero iff there are any 16-bit quant tables. */ /* now prec is nonzero iff there are any 16-bit quant tables. */
/* Check for a non-baseline specification. /* Check for a non-baseline specification.
@@ -571,6 +749,7 @@ write_scan_header (j_compress_ptr cinfo)
/* Emit Huffman tables. /* Emit Huffman tables.
* Note that emit_dht() suppresses any duplicate tables. * Note that emit_dht() suppresses any duplicate tables.
*/ */
if (!emit_multi_dht(cinfo)) {
for (i = 0; i < cinfo->comps_in_scan; i++) { for (i = 0; i < cinfo->comps_in_scan; i++) {
compptr = cinfo->cur_comp_info[i]; compptr = cinfo->cur_comp_info[i];
/* DC needs no table for refinement scan */ /* DC needs no table for refinement scan */
@@ -581,6 +760,7 @@ write_scan_header (j_compress_ptr cinfo)
emit_dht(cinfo, compptr->ac_tbl_no, TRUE); emit_dht(cinfo, compptr->ac_tbl_no, TRUE);
} }
} }
}
/* Emit DRI if required --- note that DRI value could change for each scan. /* Emit DRI if required --- note that DRI value could change for each scan.
* We avoid wasting space with unnecessary DRIs, however. * We avoid wasting space with unnecessary DRIs, however.
@@ -649,7 +829,7 @@ jinit_marker_writer (j_compress_ptr cinfo)
/* Create the subobject */ /* Create the subobject */
marker = (my_marker_ptr) marker = (my_marker_ptr)
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
SIZEOF(my_marker_writer)); sizeof(my_marker_writer));
cinfo->marker = (struct jpeg_marker_writer *) marker; cinfo->marker = (struct jpeg_marker_writer *) marker;
/* Initialize method pointers */ /* Initialize method pointers */
marker->pub.write_file_header = write_file_header; marker->pub.write_file_header = write_file_header;

View File

@@ -5,7 +5,7 @@
* Copyright (C) 1991-1997, Thomas G. Lane. * Copyright (C) 1991-1997, Thomas G. Lane.
* Modified 2003-2010 by Guido Vollbeding. * Modified 2003-2010 by Guido Vollbeding.
* libjpeg-turbo Modifications: * libjpeg-turbo Modifications:
* Copyright (C) 2010, D. R. Commander. * Copyright (C) 2010, 2014, D. R. Commander.
* mozjpeg Modifications: * mozjpeg Modifications:
* Copyright (C) 2014, Mozilla Corporation. * Copyright (C) 2014, Mozilla Corporation.
* For conditions of distribution and use, see the accompanying README file. * For conditions of distribution and use, see the accompanying README file.
@@ -20,41 +20,8 @@
#include "jinclude.h" #include "jinclude.h"
#include "jpeglib.h" #include "jpeglib.h"
#include "jpegcomp.h" #include "jpegcomp.h"
#include "jmemsys.h"
#include "jcmaster.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 */
trellis_pass /* trellis quantization 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[] */
/* fields for scan optimisation */
int pass_number_scan_opt_base; /* pass number where scan optimization begins */
unsigned char * scan_buffer[64]; /* buffer for a given scan */
unsigned long scan_size[64]; /* size for a given scan */
unsigned long best_cost; /* bit count for best frequency split */
int best_freq_split_idx_luma; /* index for best frequency split (luma) */
int best_freq_split_idx_chroma; /* index for best frequency split (chroma) */
int best_Al_luma; /* best value for Al found in scan search (luma) */
int best_Al_chroma; /* best value for Al found in scan search (luma) */
boolean interleave_chroma_dc; /* indicate whether to interleave chroma DC scans */
struct jpeg_destination_mgr * saved_dest; /* saved value of cinfo->dest */
} my_comp_master;
typedef my_comp_master * my_master_ptr;
/* /*
@@ -192,7 +159,7 @@ validate_script (j_compress_ptr cinfo)
/* -1 until that coefficient has been seen; then last Al for it */ /* -1 until that coefficient has been seen; then last Al for it */
#endif #endif
if (cinfo->optimize_scans) { if (cinfo->master->optimize_scans) {
cinfo->progressive_mode = TRUE; cinfo->progressive_mode = TRUE;
/* When we optimize scans, there is redundancy in the scan list /* When we optimize scans, there is redundancy in the scan list
* and this function will fail. Therefore skip all this checking * and this function will fail. Therefore skip all this checking
@@ -331,12 +298,18 @@ select_scan_parameters (j_compress_ptr cinfo)
my_master_ptr master = (my_master_ptr) cinfo->master; my_master_ptr master = (my_master_ptr) cinfo->master;
if (master->pass_number < master->pass_number_scan_opt_base) { if (master->pass_number < master->pass_number_scan_opt_base) {
cinfo->comps_in_scan = 1; cinfo->comps_in_scan = 1;
if (cinfo->use_scans_in_trellis) { if (cinfo->master->use_scans_in_trellis) {
cinfo->cur_comp_info[0] = &cinfo->comp_info[master->pass_number/(4*cinfo->trellis_num_loops)]; cinfo->cur_comp_info[0] =
cinfo->Ss = (master->pass_number%4 < 2) ? 1 : cinfo->trellis_freq_split+1; &cinfo->comp_info[master->pass_number /
cinfo->Se = (master->pass_number%4 < 2) ? cinfo->trellis_freq_split : DCTSIZE2-1; (4 * cinfo->master->trellis_num_loops)];
cinfo->Ss = (master->pass_number % 4 < 2) ?
1 : cinfo->master->trellis_freq_split + 1;
cinfo->Se = (master->pass_number % 4 < 2) ?
cinfo->master->trellis_freq_split : DCTSIZE2 - 1;
} else { } else {
cinfo->cur_comp_info[0] = &cinfo->comp_info[master->pass_number/(2*cinfo->trellis_num_loops)]; cinfo->cur_comp_info[0] =
&cinfo->comp_info[master->pass_number /
(2 * cinfo->master->trellis_num_loops)];
cinfo->Ss = 1; cinfo->Ss = 1;
cinfo->Se = DCTSIZE2-1; cinfo->Se = DCTSIZE2-1;
} }
@@ -354,16 +327,21 @@ select_scan_parameters (j_compress_ptr cinfo)
cinfo->Se = scanptr->Se; cinfo->Se = scanptr->Se;
cinfo->Ah = scanptr->Ah; cinfo->Ah = scanptr->Ah;
cinfo->Al = scanptr->Al; cinfo->Al = scanptr->Al;
if (cinfo->optimize_scans) { if (cinfo->master->optimize_scans) {
/* luma frequency split passes */ /* luma frequency split passes */
if (master->scan_number >= cinfo->num_scans_luma_dc+3*cinfo->Al_max_luma+2 && if (master->scan_number >= cinfo->master->num_scans_luma_dc +
master->scan_number < cinfo->num_scans_luma) 3 * cinfo->master->Al_max_luma + 2 &&
master->scan_number < cinfo->master->num_scans_luma)
cinfo->Al = master->best_Al_luma; cinfo->Al = master->best_Al_luma;
/* chroma frequency split passes */ /* chroma frequency split passes */
if (master->scan_number >= cinfo->num_scans_luma+cinfo->num_scans_chroma_dc+(6*cinfo->Al_max_chroma+4) && if (master->scan_number >= cinfo->master->num_scans_luma +
cinfo->master->num_scans_chroma_dc +
(6 * cinfo->master->Al_max_chroma + 4) &&
master->scan_number < cinfo->num_scans) master->scan_number < cinfo->num_scans)
cinfo->Al = master->best_Al_chroma; cinfo->Al = master->best_Al_chroma;
} }
/* save value for later retrieval during printout of scans */
master->actual_Al[master->scan_number] = cinfo->Al;
} }
else else
#endif #endif
@@ -481,7 +459,8 @@ METHODDEF(void)
prepare_for_pass (j_compress_ptr cinfo) prepare_for_pass (j_compress_ptr cinfo)
{ {
my_master_ptr master = (my_master_ptr) cinfo->master; my_master_ptr master = (my_master_ptr) cinfo->master;
cinfo->trellis_passes = master->pass_number < master->pass_number_scan_opt_base; cinfo->master->trellis_passes =
master->pass_number < master->pass_number_scan_opt_base;
switch (master->pass_type) { switch (master->pass_type) {
case main_pass: case main_pass:
@@ -496,12 +475,12 @@ prepare_for_pass (j_compress_ptr cinfo)
(*cinfo->prep->start_pass) (cinfo, JBUF_PASS_THRU); (*cinfo->prep->start_pass) (cinfo, JBUF_PASS_THRU);
} }
(*cinfo->fdct->start_pass) (cinfo); (*cinfo->fdct->start_pass) (cinfo);
(*cinfo->entropy->start_pass) (cinfo, cinfo->optimize_coding); (*cinfo->entropy->start_pass) (cinfo, (cinfo->optimize_coding || cinfo->master->trellis_quant) && !cinfo->arith_code);
(*cinfo->coef->start_pass) (cinfo, (*cinfo->coef->start_pass) (cinfo,
(master->total_passes > 1 ? (master->total_passes > 1 ?
JBUF_SAVE_AND_PASS : JBUF_PASS_THRU)); JBUF_SAVE_AND_PASS : JBUF_PASS_THRU));
(*cinfo->main->start_pass) (cinfo, JBUF_PASS_THRU); (*cinfo->main->start_pass) (cinfo, JBUF_PASS_THRU);
if (cinfo->optimize_coding) { if (cinfo->optimize_coding || cinfo->master->trellis_quant) {
/* No immediate data output; postpone writing frame/scan headers */ /* No immediate data output; postpone writing frame/scan headers */
master->pub.call_pass_startup = FALSE; master->pub.call_pass_startup = FALSE;
} else { } else {
@@ -534,7 +513,7 @@ prepare_for_pass (j_compress_ptr cinfo)
select_scan_parameters(cinfo); select_scan_parameters(cinfo);
per_scan_setup(cinfo); per_scan_setup(cinfo);
} }
if (cinfo->optimize_scans) { if (cinfo->master->optimize_scans) {
master->saved_dest = cinfo->dest; master->saved_dest = cinfo->dest;
cinfo->dest = NULL; cinfo->dest = NULL;
master->scan_size[master->scan_number] = 0; master->scan_size[master->scan_number] = 0;
@@ -550,17 +529,19 @@ prepare_for_pass (j_compress_ptr cinfo)
master->pub.call_pass_startup = FALSE; master->pub.call_pass_startup = FALSE;
break; break;
case trellis_pass: case trellis_pass:
if (master->pass_number%(cinfo->num_components*(cinfo->use_scans_in_trellis?4:2)) == 1 && cinfo->trellis_q_opt) { if (master->pass_number %
(cinfo->num_components * (cinfo->master->use_scans_in_trellis ? 4 : 2)) == 1 &&
cinfo->master->trellis_q_opt) {
int i, j; int i, j;
for (i = 0; i < NUM_QUANT_TBLS; i++) { for (i = 0; i < NUM_QUANT_TBLS; i++) {
for (j = 1; j < DCTSIZE2; j++) { for (j = 1; j < DCTSIZE2; j++) {
cinfo->norm_src[i][j] = 0.0; cinfo->master->norm_src[i][j] = 0.0;
cinfo->norm_coef[i][j] = 0.0; cinfo->master->norm_coef[i][j] = 0.0;
} }
} }
} }
(*cinfo->entropy->start_pass) (cinfo, TRUE); (*cinfo->entropy->start_pass) (cinfo, !cinfo->arith_code);
(*cinfo->coef->start_pass) (cinfo, JBUF_REQUANT); (*cinfo->coef->start_pass) (cinfo, JBUF_REQUANT);
master->pub.call_pass_startup = FALSE; master->pub.call_pass_startup = FALSE;
break; break;
@@ -613,7 +594,7 @@ copy_buffer (j_compress_ptr cinfo, int scan_idx)
for (i = 0; i < cinfo->scan_info[scan_idx].comps_in_scan; i++) for (i = 0; i < cinfo->scan_info[scan_idx].comps_in_scan; i++)
fprintf(stderr, "%s%d", (i==0)?"":",", cinfo->scan_info[scan_idx].component_index[i]); fprintf(stderr, "%s%d", (i==0)?"":",", cinfo->scan_info[scan_idx].component_index[i]);
fprintf(stderr, ": %d %d", cinfo->scan_info[scan_idx].Ss, cinfo->scan_info[scan_idx].Se); fprintf(stderr, ": %d %d", cinfo->scan_info[scan_idx].Ss, cinfo->scan_info[scan_idx].Se);
fprintf(stderr, " %d %d", cinfo->scan_info[scan_idx].Ah, cinfo->scan_info[scan_idx].Al); fprintf(stderr, " %d %d", cinfo->scan_info[scan_idx].Ah, master->actual_Al[scan_idx]);
fprintf(stderr, "\n"); fprintf(stderr, "\n");
} }
@@ -638,8 +619,12 @@ select_scans (j_compress_ptr cinfo, int next_scan_number)
my_master_ptr master = (my_master_ptr) cinfo->master; my_master_ptr master = (my_master_ptr) cinfo->master;
int base_scan_idx = 0; int base_scan_idx = 0;
int luma_freq_split_scan_start = cinfo->num_scans_luma_dc + 3 * cinfo->Al_max_luma + 2; int luma_freq_split_scan_start = cinfo->master->num_scans_luma_dc +
int chroma_freq_split_scan_start = cinfo->num_scans_luma+cinfo->num_scans_chroma_dc+(6*cinfo->Al_max_chroma+4); 3 * cinfo->master->Al_max_luma + 2;
int chroma_freq_split_scan_start = cinfo->master->num_scans_luma +
cinfo->master->num_scans_chroma_dc +
(6 * cinfo->master->Al_max_chroma + 4);
int passes_per_scan = cinfo->optimize_coding ? 2 : 1;
if (next_scan_number > 1 && next_scan_number <= luma_freq_split_scan_start) { if (next_scan_number > 1 && next_scan_number <= luma_freq_split_scan_start) {
if ((next_scan_number - 1) % 3 == 2) { if ((next_scan_number - 1) % 3 == 2) {
@@ -656,11 +641,12 @@ select_scans (j_compress_ptr cinfo, int next_scan_number)
master->best_Al_luma = Al; master->best_Al_luma = Al;
} else { } else {
master->scan_number = luma_freq_split_scan_start - 1; master->scan_number = luma_freq_split_scan_start - 1;
master->pass_number = 2 * master->scan_number + 1 + master->pass_number_scan_opt_base; master->pass_number = passes_per_scan * (master->scan_number + 1) - 1 + master->pass_number_scan_opt_base;
} }
} }
} else if (next_scan_number > luma_freq_split_scan_start && next_scan_number <= cinfo->num_scans_luma) { } else if (next_scan_number > luma_freq_split_scan_start &&
next_scan_number <= cinfo->master->num_scans_luma) {
if (next_scan_number == luma_freq_split_scan_start + 1) { if (next_scan_number == luma_freq_split_scan_start + 1) {
master->best_freq_split_idx_luma = 0; master->best_freq_split_idx_luma = 0;
master->best_cost = master->scan_size[next_scan_number-1]; master->best_cost = master->scan_size[next_scan_number-1];
@@ -680,21 +666,25 @@ select_scans (j_compress_ptr cinfo, int next_scan_number)
if ((idx == 2 && master->best_freq_split_idx_luma == 0) || if ((idx == 2 && master->best_freq_split_idx_luma == 0) ||
(idx == 3 && master->best_freq_split_idx_luma != 2) || (idx == 3 && master->best_freq_split_idx_luma != 2) ||
(idx == 4 && master->best_freq_split_idx_luma != 4)) { (idx == 4 && master->best_freq_split_idx_luma != 4)) {
master->scan_number = cinfo->num_scans_luma - 1; master->scan_number = cinfo->master->num_scans_luma - 1;
master->pass_number = 2 * master->scan_number + 1 + master->pass_number_scan_opt_base; master->pass_number = passes_per_scan * (master->scan_number + 1) - 1 + master->pass_number_scan_opt_base;
master->pub.is_last_pass = (master->pass_number == master->total_passes - 1); master->pub.is_last_pass = (master->pass_number == master->total_passes - 1);
} }
} }
} else if (cinfo->num_scans > cinfo->num_scans_luma) { } else if (cinfo->num_scans > cinfo->master->num_scans_luma) {
if (next_scan_number == cinfo->num_scans_luma+cinfo->num_scans_chroma_dc) { if (next_scan_number == cinfo->master->num_scans_luma +
base_scan_idx = cinfo->num_scans_luma; cinfo->master->num_scans_chroma_dc) {
base_scan_idx = cinfo->master->num_scans_luma;
master->interleave_chroma_dc = master->scan_size[base_scan_idx] <= master->scan_size[base_scan_idx+1] + master->scan_size[base_scan_idx+2]; master->interleave_chroma_dc = master->scan_size[base_scan_idx] <= master->scan_size[base_scan_idx+1] + master->scan_size[base_scan_idx+2];
} else if (next_scan_number > cinfo->num_scans_luma+cinfo->num_scans_chroma_dc && next_scan_number <= chroma_freq_split_scan_start) { } else if (next_scan_number > cinfo->master->num_scans_luma +
base_scan_idx = cinfo->num_scans_luma + cinfo->num_scans_chroma_dc; cinfo->master->num_scans_chroma_dc &&
next_scan_number <= chroma_freq_split_scan_start) {
base_scan_idx = cinfo->master->num_scans_luma +
cinfo->master->num_scans_chroma_dc;
if ((next_scan_number - base_scan_idx) % 6 == 4) { if ((next_scan_number - base_scan_idx) % 6 == 4) {
int Al = (next_scan_number - base_scan_idx) / 6; int Al = (next_scan_number - base_scan_idx) / 6;
int i; int i;
@@ -713,7 +703,7 @@ select_scans (j_compress_ptr cinfo, int next_scan_number)
master->best_Al_chroma = Al; master->best_Al_chroma = Al;
} else { } else {
master->scan_number = chroma_freq_split_scan_start - 1; master->scan_number = chroma_freq_split_scan_start - 1;
master->pass_number = 2 * master->scan_number + 1 + master->pass_number_scan_opt_base; master->pass_number = passes_per_scan * (master->scan_number + 1) - 1 + master->pass_number_scan_opt_base;
} }
} }
@@ -741,7 +731,7 @@ select_scans (j_compress_ptr cinfo, int next_scan_number)
(idx == 3 && master->best_freq_split_idx_chroma != 2) || (idx == 3 && master->best_freq_split_idx_chroma != 2) ||
(idx == 4 && master->best_freq_split_idx_chroma != 4)) { (idx == 4 && master->best_freq_split_idx_chroma != 4)) {
master->scan_number = cinfo->num_scans - 1; master->scan_number = cinfo->num_scans - 1;
master->pass_number = 2 * master->scan_number + 1 + master->pass_number_scan_opt_base; master->pass_number = passes_per_scan * (master->scan_number + 1) - 1 + master->pass_number_scan_opt_base;
master->pub.is_last_pass = (master->pass_number == master->total_passes - 1); master->pub.is_last_pass = (master->pass_number == master->total_passes - 1);
} }
} }
@@ -754,10 +744,11 @@ select_scans (j_compress_ptr cinfo, int next_scan_number)
copy_buffer(cinfo, 0); copy_buffer(cinfo, 0);
if (cinfo->num_scans > cinfo->num_scans_luma && !cinfo->one_dc_scan) { if (cinfo->num_scans > cinfo->master->num_scans_luma &&
base_scan_idx = cinfo->num_scans_luma; cinfo->master->dc_scan_opt_mode != 0) {
base_scan_idx = cinfo->master->num_scans_luma;
if (master->interleave_chroma_dc) if (master->interleave_chroma_dc && cinfo->master->dc_scan_opt_mode != 1)
copy_buffer(cinfo, base_scan_idx); copy_buffer(cinfo, base_scan_idx);
else { else {
copy_buffer(cinfo, base_scan_idx+1); copy_buffer(cinfo, base_scan_idx+1);
@@ -776,7 +767,7 @@ select_scans (j_compress_ptr cinfo, int next_scan_number)
for (Al = master->best_Al_luma-1; Al >= min_Al; Al--) for (Al = master->best_Al_luma-1; Al >= min_Al; Al--)
copy_buffer(cinfo, 3 + 3*Al); copy_buffer(cinfo, 3 + 3*Al);
if (cinfo->num_scans > cinfo->num_scans_luma) { if (cinfo->num_scans > cinfo->master->num_scans_luma) {
if (master->best_freq_split_idx_chroma == 0) { if (master->best_freq_split_idx_chroma == 0) {
copy_buffer(cinfo, chroma_freq_split_scan_start); copy_buffer(cinfo, chroma_freq_split_scan_start);
copy_buffer(cinfo, chroma_freq_split_scan_start+1); copy_buffer(cinfo, chroma_freq_split_scan_start+1);
@@ -788,7 +779,8 @@ select_scans (j_compress_ptr cinfo, int next_scan_number)
copy_buffer(cinfo, chroma_freq_split_scan_start+4*(master->best_freq_split_idx_chroma-1)+5); copy_buffer(cinfo, chroma_freq_split_scan_start+4*(master->best_freq_split_idx_chroma-1)+5);
} }
base_scan_idx = cinfo->num_scans_luma + cinfo->num_scans_chroma_dc; base_scan_idx = cinfo->master->num_scans_luma +
cinfo->master->num_scans_chroma_dc;
for (Al = master->best_Al_chroma-1; Al >= min_Al; Al--) { for (Al = master->best_Al_chroma-1; Al >= min_Al; Al--) {
copy_buffer(cinfo, base_scan_idx + 6*Al + 4); copy_buffer(cinfo, base_scan_idx + 6*Al + 4);
@@ -799,7 +791,7 @@ select_scans (j_compress_ptr cinfo, int next_scan_number)
for (Al = min_Al-1; Al >= 0; Al--) { for (Al = min_Al-1; Al >= 0; Al--) {
copy_buffer(cinfo, 3 + 3*Al); copy_buffer(cinfo, 3 + 3*Al);
if (cinfo->num_scans > cinfo->num_scans_luma) { if (cinfo->num_scans > cinfo->master->num_scans_luma) {
copy_buffer(cinfo, base_scan_idx + 6*Al + 4); copy_buffer(cinfo, base_scan_idx + 6*Al + 4);
copy_buffer(cinfo, base_scan_idx + 6*Al + 5); copy_buffer(cinfo, base_scan_idx + 6*Al + 5);
} }
@@ -832,7 +824,7 @@ finish_pass_master (j_compress_ptr cinfo)
/* next pass is either output of scan 0 (after optimization) /* next pass is either output of scan 0 (after optimization)
* or output of scan 1 (if no optimization). * or output of scan 1 (if no optimization).
*/ */
if (cinfo->trellis_quant) if (cinfo->master->trellis_quant)
master->pass_type = trellis_pass; master->pass_type = trellis_pass;
else { else {
master->pass_type = output_pass; master->pass_type = output_pass;
@@ -848,7 +840,7 @@ finish_pass_master (j_compress_ptr cinfo)
/* next pass is either optimization or output of next scan */ /* next pass is either optimization or output of next scan */
if (cinfo->optimize_coding) if (cinfo->optimize_coding)
master->pass_type = huff_opt_pass; master->pass_type = huff_opt_pass;
if (cinfo->optimize_scans) { if (cinfo->master->optimize_scans) {
(*cinfo->dest->term_destination)(cinfo); (*cinfo->dest->term_destination)(cinfo);
cinfo->dest = master->saved_dest; cinfo->dest = master->saved_dest;
select_scans(cinfo, master->scan_number + 1); select_scans(cinfo, master->scan_number + 1);
@@ -857,15 +849,21 @@ finish_pass_master (j_compress_ptr cinfo)
master->scan_number++; master->scan_number++;
break; break;
case trellis_pass: case trellis_pass:
master->pass_type = (cinfo->optimize_coding || master->pass_number < master->pass_number_scan_opt_base-1) ? huff_opt_pass : output_pass; if (cinfo->optimize_coding)
master->pass_type = huff_opt_pass;
else
master->pass_type = (master->pass_number < master->pass_number_scan_opt_base-1) ? trellis_pass : output_pass;
if ((master->pass_number+1)%(cinfo->num_components*(cinfo->use_scans_in_trellis?4:2)) == 0 && cinfo->trellis_q_opt) { if ((master->pass_number + 1) %
(cinfo->num_components * (cinfo->master->use_scans_in_trellis ? 4 : 2)) == 0 &&
cinfo->master->trellis_q_opt) {
int i, j; int i, j;
for (i = 0; i < NUM_QUANT_TBLS; i++) { for (i = 0; i < NUM_QUANT_TBLS; i++) {
for (j = 1; j < DCTSIZE2; j++) { for (j = 1; j < DCTSIZE2; j++) {
if (cinfo->norm_coef[i][j] != 0.0) { if (cinfo->master->norm_coef[i][j] != 0.0) {
int q = (int)(cinfo->norm_src[i][j] / cinfo->norm_coef[i][j] + 0.5); int q = (int)(cinfo->master->norm_src[i][j] /
cinfo->master->norm_coef[i][j] + 0.5);
if (q > 254) q = 254; if (q > 254) q = 254;
if (q < 1) q = 1; if (q < 1) q = 1;
cinfo->quant_tbl_ptrs[i]->quantval[j] = q; cinfo->quant_tbl_ptrs[i]->quantval[j] = q;
@@ -887,16 +885,13 @@ finish_pass_master (j_compress_ptr cinfo)
GLOBAL(void) GLOBAL(void)
jinit_c_master_control (j_compress_ptr cinfo, boolean transcode_only) jinit_c_master_control (j_compress_ptr cinfo, boolean transcode_only)
{ {
my_master_ptr master; my_master_ptr master = (my_master_ptr) cinfo->master;
master = (my_master_ptr)
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
SIZEOF(my_comp_master));
cinfo->master = (struct jpeg_comp_master *) master;
master->pub.prepare_for_pass = prepare_for_pass; master->pub.prepare_for_pass = prepare_for_pass;
master->pub.pass_startup = pass_startup; master->pub.pass_startup = pass_startup;
master->pub.finish_pass = finish_pass_master; master->pub.finish_pass = finish_pass_master;
master->pub.is_last_pass = FALSE; master->pub.is_last_pass = FALSE;
master->pub.call_pass_startup = FALSE;
/* Validate parameters, determine derived values */ /* Validate parameters, determine derived values */
initial_setup(cinfo, transcode_only); initial_setup(cinfo, transcode_only);
@@ -933,23 +928,24 @@ jinit_c_master_control (j_compress_ptr cinfo, boolean transcode_only)
else else
master->total_passes = cinfo->num_scans; master->total_passes = cinfo->num_scans;
if (cinfo->trellis_quant) { master->pass_number_scan_opt_base = 0;
if (cinfo->progressive_mode) if (cinfo->master->trellis_quant) {
master->total_passes += ((cinfo->use_scans_in_trellis) ? 4 : 2) * cinfo->num_components * cinfo->trellis_num_loops; if (cinfo->optimize_coding)
master->pass_number_scan_opt_base =
((cinfo->master->use_scans_in_trellis) ? 4 : 2) * cinfo->num_components *
cinfo->master->trellis_num_loops;
else else
master->total_passes += 1; master->pass_number_scan_opt_base =
((cinfo->master->use_scans_in_trellis) ? 2 : 1) * cinfo->num_components *
cinfo->master->trellis_num_loops + 1;
master->total_passes += master->pass_number_scan_opt_base;
} }
if (cinfo->optimize_scans) { if (cinfo->master->optimize_scans) {
int i; int i;
master->best_Al_chroma = 0; master->best_Al_chroma = 0;
for (i = 0; i < cinfo->num_scans; i++) for (i = 0; i < cinfo->num_scans; i++)
master->scan_buffer[i] = NULL; master->scan_buffer[i] = NULL;
} }
if (cinfo->trellis_quant)
master->pass_number_scan_opt_base = ((cinfo->use_scans_in_trellis) ? 4 : 2) * cinfo->num_components * cinfo->trellis_num_loops;
else
master->pass_number_scan_opt_base = 0;
} }

47
jcmaster.h Normal file
View File

@@ -0,0 +1,47 @@
/*
* jcmaster.h
*
* This file was part of the Independent JPEG Group's software:
* Copyright (C) 1991-1997, Thomas G. Lane.
* mozjpeg Modifications:
* Copyright (C) 2014, Mozilla Corporation.
* For conditions of distribution and use, see the accompanying README file.
*
* This file contains the master control structures for the JPEG compressor.
*/
/* 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 */
trellis_pass /* trellis quantization 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[] */
/* fields for scan optimisation */
int pass_number_scan_opt_base; /* pass number where scan optimization begins */
unsigned char * scan_buffer[64]; /* buffer for a given scan */
unsigned long scan_size[64]; /* size for a given scan */
int actual_Al[64]; /* actual value of Al used for a scan */
unsigned long best_cost; /* bit count for best frequency split */
int best_freq_split_idx_luma; /* index for best frequency split (luma) */
int best_freq_split_idx_chroma; /* index for best frequency split (chroma) */
int best_Al_luma; /* best value for Al found in scan search (luma) */
int best_Al_chroma; /* best value for Al found in scan search (luma) */
boolean interleave_chroma_dc; /* indicate whether to interleave chroma DC scans */
struct jpeg_destination_mgr * saved_dest; /* saved value of cinfo->dest */
} my_comp_master;
typedef my_comp_master * my_master_ptr;

View File

@@ -1,8 +1,10 @@
/* /*
* jcomapi.c * jcomapi.c
* *
* Copyright (C) 1994-1997, Thomas G. Lane. * This file was part of the Independent JPEG Group's software:
* This file is part of the Independent JPEG Group's software. * Copyright (C) 1994-1997, Thomas G. Lane.0
* It was modified by The libjpeg-turbo Project to include only code relevant
* to libjpeg-turbo.
* For conditions of distribution and use, see the accompanying README file. * For conditions of distribution and use, see the accompanying README file.
* *
* This file contains application interface routines that are used for both * This file contains application interface routines that are used for both
@@ -88,7 +90,7 @@ jpeg_alloc_quant_table (j_common_ptr cinfo)
JQUANT_TBL *tbl; JQUANT_TBL *tbl;
tbl = (JQUANT_TBL *) tbl = (JQUANT_TBL *)
(*cinfo->mem->alloc_small) (cinfo, JPOOL_PERMANENT, SIZEOF(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 */ tbl->sent_table = FALSE; /* make sure this is false in any new table */
return tbl; return tbl;
} }
@@ -100,7 +102,7 @@ jpeg_alloc_huff_table (j_common_ptr cinfo)
JHUFF_TBL *tbl; JHUFF_TBL *tbl;
tbl = (JHUFF_TBL *) tbl = (JHUFF_TBL *)
(*cinfo->mem->alloc_small) (cinfo, JPOOL_PERMANENT, SIZEOF(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 */ tbl->sent_table = FALSE; /* make sure this is false in any new table */
return tbl; return tbl;
} }

View File

@@ -12,11 +12,19 @@
/* Support arithmetic decoding */ /* Support arithmetic decoding */
#undef D_ARITH_CODING_SUPPORTED #undef D_ARITH_CODING_SUPPORTED
/* Support in-memory source/destination managers */ /*
#undef MEM_SRCDST_SUPPORTED * Define BITS_IN_JSAMPLE as either
* 8 for 8-bit sample values (the usual setting)
* 12 for 12-bit sample values
* Only 8 and 12 are legal data precisions for lossy JPEG according to the
* JPEG standard, and the IJG code does not support anything else!
* We do not support run-time selection of data precision, sorry.
*/
/* Compiler supports function prototypes. */ #define BITS_IN_JSAMPLE 8 /* use 8 or 12 */
#undef HAVE_PROTOTYPES
/* Define to 1 if you have the <locale.h> header file. */
#undef HAVE_LOCALE_H
/* Define to 1 if you have the <stddef.h> header file. */ /* Define to 1 if you have the <stddef.h> header file. */
#undef HAVE_STDDEF_H #undef HAVE_STDDEF_H
@@ -24,25 +32,27 @@
/* Define to 1 if you have the <stdlib.h> header file. */ /* Define to 1 if you have the <stdlib.h> header file. */
#undef HAVE_STDLIB_H #undef HAVE_STDLIB_H
/* Compiler supports 'unsigned char'. */ /* Define to 1 if the system has the type `unsigned char'. */
#undef HAVE_UNSIGNED_CHAR #undef HAVE_UNSIGNED_CHAR
/* Compiler supports 'unsigned short'. */ /* Define to 1 if the system has the type `unsigned short'. */
#undef HAVE_UNSIGNED_SHORT #undef HAVE_UNSIGNED_SHORT
/* Compiler does not support pointers to unspecified structures. */ /* Compiler does not support pointers to undefined structures. */
#undef INCOMPLETE_TYPES_BROKEN #undef INCOMPLETE_TYPES_BROKEN
/* Compiler has <strings.h> rather than standard <string.h>. */ /* Support in-memory source/destination managers */
#undef MEM_SRCDST_SUPPORTED
/* Define if you have BSD-like bzero and bcopy in <strings.h> rather than
memset/memcpy in <string.h>. */
#undef NEED_BSD_STRINGS #undef NEED_BSD_STRINGS
/* Linker requires that global names be unique in first 15 characters. */ /* Define if you need to include <sys/types.h> to get size_t. */
#undef NEED_SHORT_EXTERNAL_NAMES
/* Need to include <sys/types.h> in order to obtain size_t. */
#undef NEED_SYS_TYPES_H #undef NEED_SYS_TYPES_H
/* Broken compiler shifts signed values as an unsigned shift. */ /* Define if your (broken) compiler shifts signed values as if they were
unsigned. */
#undef RIGHT_SHIFT_IS_UNSIGNED #undef RIGHT_SHIFT_IS_UNSIGNED
/* Use accelerated SIMD routines. */ /* Use accelerated SIMD routines. */

View File

@@ -1,8 +1,10 @@
/* /*
* jconfig.txt * jconfig.txt
* *
* This file was part of the Independent JPEG Group's software:
* Copyright (C) 1991-1994, Thomas G. Lane. * Copyright (C) 1991-1994, Thomas G. Lane.
* This file is part of the Independent JPEG Group's software. * It was modified by The libjpeg-turbo Project to include only code relevant
* to libjpeg-turbo.
* For conditions of distribution and use, see the accompanying README file. * For conditions of distribution and use, see the accompanying README file.
* *
* This file documents the configuration options that are required to * This file documents the configuration options that are required to
@@ -23,11 +25,6 @@
* #define the symbol if yes, #undef it if no. * #define the symbol if yes, #undef it if no.
*/ */
/* Does your compiler support function prototypes?
* (If not, you also need to use ansi2knr, see install.txt)
*/
#define HAVE_PROTOTYPES
/* Does your compiler support the declaration "unsigned char" ? /* Does your compiler support the declaration "unsigned char" ?
* How about "unsigned short" ? * How about "unsigned short" ?
*/ */
@@ -48,7 +45,7 @@
* If you're not sure, leaving it undefined will work at some cost in speed. * If you're not sure, leaving it undefined will work at some cost in speed.
* If you defined HAVE_UNSIGNED_CHAR then the speed difference is minimal. * If you defined HAVE_UNSIGNED_CHAR then the speed difference is minimal.
*/ */
#undef CHAR_IS_UNSIGNED #undef __CHAR_UNSIGNED__
/* Define this if your system has an ANSI-conforming <stddef.h> file. /* Define this if your system has an ANSI-conforming <stddef.h> file.
*/ */
@@ -69,19 +66,6 @@
*/ */
#undef NEED_SYS_TYPES_H #undef NEED_SYS_TYPES_H
/* For 80x86 machines, you need to define NEED_FAR_POINTERS,
* unless you are using a large-data memory model or 80386 flat-memory mode.
* On less brain-damaged CPUs this symbol must not be defined.
* (Defining this symbol causes large data structures to be referenced through
* "far" pointers and to be allocated with a special version of malloc.)
*/
#undef NEED_FAR_POINTERS
/* Define this if your linker needs global names to be unique in less
* than the first 15 characters.
*/
#undef NEED_SHORT_EXTERNAL_NAMES
/* Although a real ANSI C compiler can deal perfectly well with pointers to /* Although a real ANSI C compiler can deal perfectly well with pointers to
* unspecified structures (see "incomplete types" in the spec), a few pre-ANSI * unspecified structures (see "incomplete types" in the spec), a few pre-ANSI
* and pseudo-ANSI compilers get confused. To keep one of these bozos happy, * and pseudo-ANSI compilers get confused. To keep one of these bozos happy,
@@ -130,6 +114,7 @@ typedef unsigned char boolean;
/* These defines indicate which image (non-JPEG) file formats are allowed. */ /* These defines indicate which image (non-JPEG) file formats are allowed. */
#define PNG_SUPPORTED /* PNG image file format */
#define BMP_SUPPORTED /* BMP image file format */ #define BMP_SUPPORTED /* BMP image file format */
#define GIF_SUPPORTED /* GIF image file format */ #define GIF_SUPPORTED /* GIF image file format */
#define PPM_SUPPORTED /* PBMPLUS PPM/PGM image file format */ #define PPM_SUPPORTED /* PBMPLUS PPM/PGM image file format */
@@ -143,12 +128,6 @@ typedef unsigned char boolean;
*/ */
#undef TWO_FILE_COMMANDLINE #undef TWO_FILE_COMMANDLINE
/* Define this if your system needs explicit cleanup of temporary files.
* This is crucial under MS-DOS, where the temporary "files" may be areas
* of extended memory; on most other systems it's not as important.
*/
#undef NEED_SIGNAL_CATCHER
/* By default, we open image files with fopen(...,"rb") or fopen(...,"wb"). /* By default, we open image files with fopen(...,"rb") or fopen(...,"wb").
* This is necessary on systems that distinguish text files from binary files, * This is necessary on systems that distinguish text files from binary files,
* and is harmless on most systems that don't. If you have one of the rare * and is harmless on most systems that don't. If you have one of the rare

11
jconfigint.h.in Normal file
View File

@@ -0,0 +1,11 @@
/* libjpeg-turbo build number */
#undef BUILD
/* How to obtain function inlining. */
#undef INLINE
/* Define to the full name of this package. */
#undef PACKAGE_NAME
/* Version number of package */
#undef VERSION

461
jcparam.c
View File

@@ -18,6 +18,7 @@
#define JPEG_INTERNALS #define JPEG_INTERNALS
#include "jinclude.h" #include "jinclude.h"
#include "jpeglib.h" #include "jpeglib.h"
#include "jstdhuff.c"
/* /*
@@ -69,7 +70,10 @@ jpeg_add_quant_table (j_compress_ptr cinfo, int which_tbl,
* The spec says that the values given produce "good" quality, and * The spec says that the values given produce "good" quality, and
* when divided by 2, "very good" quality. * when divided by 2, "very good" quality.
*/ */
static const unsigned int std_luminance_quant_tbl[DCTSIZE2] = { static const unsigned int std_luminance_quant_tbl[9][DCTSIZE2] = {
{
/* JPEG Annex K
*/
16, 11, 10, 16, 24, 40, 51, 61, 16, 11, 10, 16, 24, 40, 51, 61,
12, 12, 14, 19, 26, 58, 60, 55, 12, 12, 14, 19, 26, 58, 60, 55,
14, 13, 16, 24, 40, 57, 69, 56, 14, 13, 16, 24, 40, 57, 69, 56,
@@ -78,19 +82,10 @@ static const unsigned int std_luminance_quant_tbl[DCTSIZE2] = {
24, 35, 55, 64, 81, 104, 113, 92, 24, 35, 55, 64, 81, 104, 113, 92,
49, 64, 78, 87, 103, 121, 120, 101, 49, 64, 78, 87, 103, 121, 120, 101,
72, 92, 95, 98, 112, 100, 103, 99 72, 92, 95, 98, 112, 100, 103, 99
}; },
static const unsigned int std_chrominance_quant_tbl[DCTSIZE2] = { {
17, 18, 24, 47, 99, 99, 99, 99, /* flat
18, 21, 26, 66, 99, 99, 99, 99, */
24, 26, 56, 99, 99, 99, 99, 99,
47, 66, 99, 99, 99, 99, 99, 99,
99, 99, 99, 99, 99, 99, 99, 99,
99, 99, 99, 99, 99, 99, 99, 99,
99, 99, 99, 99, 99, 99, 99, 99,
99, 99, 99, 99, 99, 99, 99, 99
};
static const unsigned int flat_quant_tbl[DCTSIZE2] = {
16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
@@ -99,6 +94,198 @@ static const unsigned int flat_quant_tbl[DCTSIZE2] = {
16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
16, 16, 16, 16, 16, 16, 16, 16 16, 16, 16, 16, 16, 16, 16, 16
},
{
12, 17, 20, 21, 30, 34, 56, 63,
18, 20, 20, 26, 28, 51, 61, 55,
19, 20, 21, 26, 33, 58, 69, 55,
26, 26, 26, 30, 46, 87, 86, 66,
31, 33, 36, 40, 46, 96, 100, 73,
40, 35, 46, 62, 81, 100, 111, 91,
46, 66, 76, 86, 102, 121, 120, 101,
68, 90, 90, 96, 113, 102, 105, 103
},
{
/* From http://www.imagemagick.org/discourse-server/viewtopic.php?f=22&t=20333&p=98008#p98008
*/
16, 16, 16, 18, 25, 37, 56, 85,
16, 17, 20, 27, 34, 40, 53, 75,
16, 20, 24, 31, 43, 62, 91, 135,
18, 27, 31, 40, 53, 74, 106, 156,
25, 34, 43, 53, 69, 94, 131, 189,
37, 40, 62, 74, 94, 124, 169, 238,
56, 53, 91, 106, 131, 169, 226, 311,
85, 75, 135, 156, 189, 238, 311, 418
},
{
9, 10, 12, 14, 27, 32, 51, 62,
11, 12, 14, 19, 27, 44, 59, 73,
12, 14, 18, 25, 42, 59, 79, 78,
17, 18, 25, 42, 61, 92, 87, 92,
23, 28, 42, 75, 79, 112, 112, 99,
40, 42, 59, 84, 88, 124, 132, 111,
42, 64, 78, 95, 105, 126, 125, 99,
70, 75, 100, 102, 116, 100, 107, 98
},
{
/* Relevance of human vision to JPEG-DCT compression (1992) Klein, Silverstein and Carney.
*/
10, 12, 14, 19, 26, 38, 57, 86,
12, 18, 21, 28, 35, 41, 54, 76,
14, 21, 25, 32, 44, 63, 92, 136,
19, 28, 32, 41, 54, 75, 107, 157,
26, 35, 44, 54, 70, 95, 132, 190,
38, 41, 63, 75, 95, 125, 170, 239,
57, 54, 92, 107, 132, 170, 227, 312,
86, 76, 136, 157, 190, 239, 312, 419
},
{
/* DCTune perceptual optimization of compressed dental X-Rays (1997) Watson, Taylor, Borthwick
*/
7, 8, 10, 14, 23, 44, 95, 241,
8, 8, 11, 15, 25, 47, 102, 255,
10, 11, 13, 19, 31, 58, 127, 255,
14, 15, 19, 27, 44, 83, 181, 255,
23, 25, 31, 44, 72, 136, 255, 255,
44, 47, 58, 83, 136, 255, 255, 255,
95, 102, 127, 181, 255, 255, 255, 255,
241, 255, 255, 255, 255, 255, 255, 255
},
{
/* A visual detection model for DCT coefficient quantization (12/9/93) Ahumada, Watson, Peterson
*/
15, 11, 11, 12, 15, 19, 25, 32,
11, 13, 10, 10, 12, 15, 19, 24,
11, 10, 14, 14, 16, 18, 22, 27,
12, 10, 14, 18, 21, 24, 28, 33,
15, 12, 16, 21, 26, 31, 36, 42,
19, 15, 18, 24, 31, 38, 45, 53,
25, 19, 22, 28, 36, 45, 55, 65,
32, 24, 27, 33, 42, 53, 65, 77
},
{
/* An improved detection model for DCT coefficient quantization (1993) Peterson, Ahumada and Watson
*/
14, 10, 11, 14, 19, 25, 34, 45,
10, 11, 11, 12, 15, 20, 26, 33,
11, 11, 15, 18, 21, 25, 31, 38,
14, 12, 18, 24, 28, 33, 39, 47,
19, 15, 21, 28, 36, 43, 51, 59,
25, 20, 25, 33, 43, 54, 64, 74,
34, 26, 31, 39, 51, 64, 77, 91,
45, 33, 38, 47, 59, 74, 91, 108
}
};
static const unsigned int std_chrominance_quant_tbl[9][DCTSIZE2] = {
{
/* JPEG Annex K
*/
17, 18, 24, 47, 99, 99, 99, 99,
18, 21, 26, 66, 99, 99, 99, 99,
24, 26, 56, 99, 99, 99, 99, 99,
47, 66, 99, 99, 99, 99, 99, 99,
99, 99, 99, 99, 99, 99, 99, 99,
99, 99, 99, 99, 99, 99, 99, 99,
99, 99, 99, 99, 99, 99, 99, 99,
99, 99, 99, 99, 99, 99, 99, 99
},
{
/* flat
*/
16, 16, 16, 16, 16, 16, 16, 16,
16, 16, 16, 16, 16, 16, 16, 16,
16, 16, 16, 16, 16, 16, 16, 16,
16, 16, 16, 16, 16, 16, 16, 16,
16, 16, 16, 16, 16, 16, 16, 16,
16, 16, 16, 16, 16, 16, 16, 16,
16, 16, 16, 16, 16, 16, 16, 16,
16, 16, 16, 16, 16, 16, 16, 16
},
{
8, 12, 15, 15, 86, 96, 96, 98,
13, 13, 15, 26, 90, 96, 99, 98,
12, 15, 18, 96, 99, 99, 99, 99,
17, 16, 90, 96, 99, 99, 99, 99,
96, 96, 99, 99, 99, 99, 99, 99,
99, 99, 99, 99, 99, 99, 99, 99,
99, 99, 99, 99, 99, 99, 99, 99,
99, 99, 99, 99, 99, 99, 99, 99
},
{
/* From http://www.imagemagick.org/discourse-server/viewtopic.php?f=22&t=20333&p=98008#p98008
*/
16, 16, 16, 18, 25, 37, 56, 85,
16, 17, 20, 27, 34, 40, 53, 75,
16, 20, 24, 31, 43, 62, 91, 135,
18, 27, 31, 40, 53, 74, 106, 156,
25, 34, 43, 53, 69, 94, 131, 189,
37, 40, 62, 74, 94, 124, 169, 238,
56, 53, 91, 106, 131, 169, 226, 311,
85, 75, 135, 156, 189, 238, 311, 418
},
{
9, 10, 17, 19, 62, 89, 91, 97,
12, 13, 18, 29, 84, 91, 88, 98,
14, 19, 29, 93, 95, 95, 98, 97,
20, 26, 84, 88, 95, 95, 98, 94,
26, 86, 91, 93, 97, 99, 98, 99,
99, 100, 98, 99, 99, 99, 99, 99,
99, 99, 99, 99, 99, 99, 99, 99,
97, 97, 99, 99, 99, 99, 97, 99
},
{
/* Relevance of human vision to JPEG-DCT compression (1992) Klein, Silverstein and Carney.
* Copied from luma
*/
10, 12, 14, 19, 26, 38, 57, 86,
12, 18, 21, 28, 35, 41, 54, 76,
14, 21, 25, 32, 44, 63, 92, 136,
19, 28, 32, 41, 54, 75, 107, 157,
26, 35, 44, 54, 70, 95, 132, 190,
38, 41, 63, 75, 95, 125, 170, 239,
57, 54, 92, 107, 132, 170, 227, 312,
86, 76, 136, 157, 190, 239, 312, 419
},
{
/* DCTune perceptual optimization of compressed dental X-Rays (1997) Watson, Taylor, Borthwick
* Copied from luma
*/
7, 8, 10, 14, 23, 44, 95, 241,
8, 8, 11, 15, 25, 47, 102, 255,
10, 11, 13, 19, 31, 58, 127, 255,
14, 15, 19, 27, 44, 83, 181, 255,
23, 25, 31, 44, 72, 136, 255, 255,
44, 47, 58, 83, 136, 255, 255, 255,
95, 102, 127, 181, 255, 255, 255, 255,
241, 255, 255, 255, 255, 255, 255, 255
},
{
/* A visual detection model for DCT coefficient quantization (12/9/93) Ahumada, Watson, Peterson
* Copied from luma
*/
15, 11, 11, 12, 15, 19, 25, 32,
11, 13, 10, 10, 12, 15, 19, 24,
11, 10, 14, 14, 16, 18, 22, 27,
12, 10, 14, 18, 21, 24, 28, 33,
15, 12, 16, 21, 26, 31, 36, 42,
19, 15, 18, 24, 31, 38, 45, 53,
25, 19, 22, 28, 36, 45, 55, 65,
32, 24, 27, 33, 42, 53, 65, 77
},
{
/* An improved detection model for DCT coefficient quantization (1993) Peterson, Ahumada and Watson
* Copied from luma
*/
14, 10, 11, 14, 19, 25, 34, 45,
10, 11, 11, 12, 15, 20, 26, 33,
11, 11, 15, 18, 21, 25, 31, 38,
14, 12, 18, 24, 28, 33, 39, 47,
19, 15, 21, 28, 36, 43, 51, 59,
25, 20, 25, 33, 43, 54, 64, 74,
34, 26, 31, 39, 51, 64, 77, 91,
45, 33, 38, 47, 59, 74, 91, 108
}
}; };
#if JPEG_LIB_VERSION >= 70 #if JPEG_LIB_VERSION >= 70
@@ -110,17 +297,10 @@ jpeg_default_qtables (j_compress_ptr cinfo, boolean force_baseline)
*/ */
{ {
/* Set up two quantization tables using the specified scaling */ /* Set up two quantization tables using the specified scaling */
if (cinfo->use_flat_quant_tbl) { jpeg_add_quant_table(cinfo, 0, std_luminance_quant_tbl[cinfo->master->quant_tbl_master_idx],
jpeg_add_quant_table(cinfo, 0, flat_quant_tbl,
cinfo->q_scale_factor[0], force_baseline); cinfo->q_scale_factor[0], force_baseline);
jpeg_add_quant_table(cinfo, 1, flat_quant_tbl, jpeg_add_quant_table(cinfo, 1, std_chrominance_quant_tbl[cinfo->master->quant_tbl_master_idx],
cinfo->q_scale_factor[1], force_baseline); cinfo->q_scale_factor[1], force_baseline);
} else {
jpeg_add_quant_table(cinfo, 0, std_luminance_quant_tbl,
cinfo->q_scale_factor[0], force_baseline);
jpeg_add_quant_table(cinfo, 1, std_chrominance_quant_tbl,
cinfo->q_scale_factor[1], force_baseline);
}
} }
#endif #endif
@@ -135,30 +315,29 @@ jpeg_set_linear_quality (j_compress_ptr cinfo, int scale_factor,
*/ */
{ {
/* Set up two quantization tables using the specified scaling */ /* Set up two quantization tables using the specified scaling */
if (cinfo->use_flat_quant_tbl) { jpeg_add_quant_table(cinfo, 0, std_luminance_quant_tbl[cinfo->master->quant_tbl_master_idx],
jpeg_add_quant_table(cinfo, 0, flat_quant_tbl,
scale_factor, force_baseline); scale_factor, force_baseline);
jpeg_add_quant_table(cinfo, 1, flat_quant_tbl, jpeg_add_quant_table(cinfo, 1, std_chrominance_quant_tbl[cinfo->master->quant_tbl_master_idx],
scale_factor, force_baseline); scale_factor, force_baseline);
} else {
jpeg_add_quant_table(cinfo, 0, std_luminance_quant_tbl,
scale_factor, force_baseline);
jpeg_add_quant_table(cinfo, 1, std_chrominance_quant_tbl,
scale_factor, force_baseline);
}
} }
GLOBAL(int) GLOBAL(int)
jpeg_quality_scaling (int quality) jpeg_quality_scaling (int quality)
{
return jpeg_float_quality_scaling(quality);
}
GLOBAL(float)
jpeg_float_quality_scaling(float quality)
/* Convert a user-specified quality rating to a percentage scaling factor /* Convert a user-specified quality rating to a percentage scaling factor
* for an underlying quantization table, using our recommended scaling curve. * for an underlying quantization table, using our recommended scaling curve.
* The input 'quality' factor should be 0 (terrible) to 100 (very good). * The input 'quality' factor should be 0 (terrible) to 100 (very good).
*/ */
{ {
/* Safety limit on quality factor. Convert 0 to 1 to avoid zero divide. */ /* Safety limit on quality factor. Convert 0 to 1 to avoid zero divide. */
if (quality <= 0) quality = 1; if (quality <= 0.f) quality = 1.f;
if (quality > 100) quality = 100; if (quality > 100.f) quality = 100.f;
/* The basic table is used as-is (scaling 100) for a quality of 50. /* The basic table is used as-is (scaling 100) for a quality of 50.
* Qualities 50..100 are converted to scaling percentage 200 - 2*Q; * Qualities 50..100 are converted to scaling percentage 200 - 2*Q;
@@ -166,10 +345,10 @@ jpeg_quality_scaling (int quality)
* to make all the table entries 1 (hence, minimum quantization loss). * to make all the table entries 1 (hence, minimum quantization loss).
* Qualities 1..50 are converted to scaling percentage 5000/Q. * Qualities 1..50 are converted to scaling percentage 5000/Q.
*/ */
if (quality < 50) if (quality < 50.f)
quality = 5000 / quality; quality = 5000.f / quality;
else else
quality = 200 - quality*2; quality = 200.f - quality*2.f;
return quality; return quality;
} }
@@ -191,116 +370,6 @@ jpeg_set_quality (j_compress_ptr cinfo, int quality, boolean force_baseline)
} }
/*
* Huffman table setup routines
*/
LOCAL(void)
add_huff_table (j_compress_ptr cinfo,
JHUFF_TBL **htblptr, const UINT8 *bits, const UINT8 *val)
/* Define a Huffman table */
{
int nsymbols, len;
if (*htblptr == NULL)
*htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo);
/* Copy the number-of-symbols-of-each-code-length counts */
MEMCOPY((*htblptr)->bits, bits, SIZEOF((*htblptr)->bits));
/* Validate the counts. We do this here mainly so we can copy the right
* number of symbols from the val[] array, without risking marching off
* the end of memory. jchuff.c will do a more thorough test later.
*/
nsymbols = 0;
for (len = 1; len <= 16; len++)
nsymbols += bits[len];
if (nsymbols < 1 || nsymbols > 256)
ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);
MEMCOPY((*htblptr)->huffval, val, nsymbols * SIZEOF(UINT8));
/* Initialize sent_table FALSE so table will be written to JPEG file. */
(*htblptr)->sent_table = FALSE;
}
LOCAL(void)
std_huff_tables (j_compress_ptr cinfo)
/* Set up the standard Huffman tables (cf. JPEG standard section K.3) */
/* IMPORTANT: these are only valid for 8-bit data precision! */
{
static const UINT8 bits_dc_luminance[17] =
{ /* 0-base */ 0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 };
static const UINT8 val_dc_luminance[] =
{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
static const UINT8 bits_dc_chrominance[17] =
{ /* 0-base */ 0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 };
static const UINT8 val_dc_chrominance[] =
{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
static const UINT8 bits_ac_luminance[17] =
{ /* 0-base */ 0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 0x7d };
static const UINT8 val_ac_luminance[] =
{ 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12,
0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07,
0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08,
0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0,
0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16,
0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28,
0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49,
0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59,
0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,
0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79,
0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89,
0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98,
0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6,
0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5,
0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4,
0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2,
0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea,
0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
0xf9, 0xfa };
static const UINT8 bits_ac_chrominance[17] =
{ /* 0-base */ 0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 0x77 };
static const UINT8 val_ac_chrominance[] =
{ 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21,
0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71,
0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91,
0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0,
0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34,
0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26,
0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38,
0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48,
0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58,
0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68,
0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,
0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96,
0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5,
0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4,
0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3,
0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2,
0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda,
0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9,
0xea, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
0xf9, 0xfa };
add_huff_table(cinfo, &cinfo->dc_huff_tbl_ptrs[0],
bits_dc_luminance, val_dc_luminance);
add_huff_table(cinfo, &cinfo->ac_huff_tbl_ptrs[0],
bits_ac_luminance, val_ac_luminance);
add_huff_table(cinfo, &cinfo->dc_huff_tbl_ptrs[1],
bits_dc_chrominance, val_dc_chrominance);
add_huff_table(cinfo, &cinfo->ac_huff_tbl_ptrs[1],
bits_ac_chrominance, val_ac_chrominance);
}
/* /*
* Default parameter setup for compression. * Default parameter setup for compression.
* *
@@ -327,7 +396,7 @@ jpeg_set_defaults (j_compress_ptr cinfo)
if (cinfo->comp_info == NULL) if (cinfo->comp_info == NULL)
cinfo->comp_info = (jpeg_component_info *) cinfo->comp_info = (jpeg_component_info *)
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT, (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,
MAX_COMPONENTS * SIZEOF(jpeg_component_info)); MAX_COMPONENTS * sizeof(jpeg_component_info));
/* Initialize everything not dependent on the color space */ /* Initialize everything not dependent on the color space */
@@ -339,7 +408,7 @@ jpeg_set_defaults (j_compress_ptr cinfo)
/* Set up two quantization tables using default quality of 75 */ /* Set up two quantization tables using default quality of 75 */
jpeg_set_quality(cinfo, 75, TRUE); jpeg_set_quality(cinfo, 75, TRUE);
/* Set up two Huffman tables */ /* Set up two Huffman tables */
std_huff_tables(cinfo); std_huff_tables((j_common_ptr) cinfo);
/* Initialize default arithmetic coding conditioning */ /* Initialize default arithmetic coding conditioning */
for (i = 0; i < NUM_ARITH_TBLS; i++) { for (i = 0; i < NUM_ARITH_TBLS; i++) {
@@ -348,19 +417,9 @@ jpeg_set_defaults (j_compress_ptr cinfo)
cinfo->arith_ac_K[i] = 5; cinfo->arith_ac_K[i] = 5;
} }
#ifdef C_PROGRESSIVE_SUPPORTED
cinfo->scan_info = NULL;
cinfo->num_scans = 0;
if (!cinfo->use_moz_defaults) {
/* Default is no multiple-scan output */ /* Default is no multiple-scan output */
cinfo->scan_info = NULL; cinfo->scan_info = NULL;
cinfo->num_scans = 0; cinfo->num_scans = 0;
}
#else
/* Default is no multiple-scan output */
cinfo->scan_info = NULL;
cinfo->num_scans = 0;
#endif
/* Expect normal source image, not raw downsampled data */ /* Expect normal source image, not raw downsampled data */
cinfo->raw_data_in = FALSE; cinfo->raw_data_in = FALSE;
@@ -369,7 +428,7 @@ jpeg_set_defaults (j_compress_ptr cinfo)
cinfo->arith_code = FALSE; cinfo->arith_code = FALSE;
#ifdef ENTROPY_OPT_SUPPORTED #ifdef ENTROPY_OPT_SUPPORTED
if (cinfo->use_moz_defaults) if (cinfo->master->compress_profile == JCP_MAX_COMPRESSION)
/* By default, do extra passes to optimize entropy coding */ /* By default, do extra passes to optimize entropy coding */
cinfo->optimize_coding = TRUE; cinfo->optimize_coding = TRUE;
else else
@@ -396,6 +455,9 @@ jpeg_set_defaults (j_compress_ptr cinfo)
cinfo->do_fancy_downsampling = TRUE; cinfo->do_fancy_downsampling = TRUE;
#endif #endif
cinfo->master->overshoot_deringing =
cinfo->master->compress_profile == JCP_MAX_COMPRESSION;
/* No input smoothing */ /* No input smoothing */
cinfo->smoothing_factor = 0; cinfo->smoothing_factor = 0;
@@ -425,25 +487,30 @@ jpeg_set_defaults (j_compress_ptr cinfo)
jpeg_default_colorspace(cinfo); jpeg_default_colorspace(cinfo);
cinfo->one_dc_scan = TRUE; cinfo->master->dc_scan_opt_mode = 1;
#ifdef C_PROGRESSIVE_SUPPORTED #ifdef C_PROGRESSIVE_SUPPORTED
if (cinfo->use_moz_defaults) { if (cinfo->master->compress_profile == JCP_MAX_COMPRESSION) {
cinfo->optimize_scans = TRUE; cinfo->master->optimize_scans = TRUE;
jpeg_simple_progression(cinfo); jpeg_simple_progression(cinfo);
} else } else
cinfo->optimize_scans = FALSE; cinfo->master->optimize_scans = FALSE;
#endif #endif
cinfo->trellis_quant = cinfo->use_moz_defaults; cinfo->master->trellis_quant =
cinfo->lambda_log_scale1 = 16.0; cinfo->master->compress_profile == JCP_MAX_COMPRESSION;
cinfo->lambda_log_scale2 = 15.5; cinfo->master->lambda_log_scale1 = 14.75;
cinfo->master->lambda_log_scale2 = 16.5;
cinfo->master->quant_tbl_master_idx =
cinfo->master->compress_profile == JCP_MAX_COMPRESSION ? 3 : 0;
cinfo->use_lambda_weight_tbl = TRUE; cinfo->master->use_lambda_weight_tbl = TRUE;
cinfo->use_scans_in_trellis = FALSE; cinfo->master->use_scans_in_trellis = FALSE;
cinfo->trellis_freq_split = 8; cinfo->master->trellis_freq_split = 8;
cinfo->trellis_num_loops = 1; cinfo->master->trellis_num_loops = 1;
cinfo->trellis_q_opt = FALSE; cinfo->master->trellis_q_opt = FALSE;
cinfo->master->trellis_quant_dc = TRUE;
cinfo->master->trellis_delta_dc_weight = 0.0;
} }
@@ -676,7 +743,7 @@ jpeg_search_progression (j_compress_ptr cinfo)
} else if (ncomps == 1) { } else if (ncomps == 1) {
nscans = 23; nscans = 23;
} else { } else {
cinfo->num_scans_luma = 0; cinfo->master->num_scans_luma = 0;
return FALSE; return FALSE;
} }
@@ -691,16 +758,18 @@ jpeg_search_progression (j_compress_ptr cinfo)
cinfo->script_space_size = MAX(nscans, 64); cinfo->script_space_size = MAX(nscans, 64);
cinfo->script_space = (jpeg_scan_info *) cinfo->script_space = (jpeg_scan_info *)
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT, (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,
cinfo->script_space_size * SIZEOF(jpeg_scan_info)); cinfo->script_space_size * sizeof(jpeg_scan_info));
} }
scanptr = cinfo->script_space; scanptr = cinfo->script_space;
cinfo->scan_info = scanptr; cinfo->scan_info = scanptr;
cinfo->num_scans = nscans; cinfo->num_scans = nscans;
cinfo->Al_max_luma = 3; cinfo->master->Al_max_luma = 3;
cinfo->num_scans_luma_dc = 1; cinfo->master->num_scans_luma_dc = 1;
cinfo->num_frequency_splits = 5; cinfo->master->num_frequency_splits = 5;
cinfo->num_scans_luma = cinfo->num_scans_luma_dc + (3 * cinfo->Al_max_luma + 2) + (2 * cinfo->num_frequency_splits + 1); cinfo->master->num_scans_luma =
cinfo->master->num_scans_luma_dc + (3 * cinfo->master->Al_max_luma + 2) +
(2 * cinfo->master->num_frequency_splits + 1);
/* 23 scans for luma */ /* 23 scans for luma */
/* 1 scan for DC */ /* 1 scan for DC */
@@ -711,7 +780,7 @@ jpeg_search_progression (j_compress_ptr cinfo)
/* last 4 done conditionally */ /* last 4 done conditionally */
/* luma DC by itself */ /* luma DC by itself */
if (cinfo->one_dc_scan) if (cinfo->master->dc_scan_opt_mode == 0)
scanptr = fill_dc_scans(scanptr, ncomps, 0, 0); scanptr = fill_dc_scans(scanptr, ncomps, 0, 0);
else else
scanptr = fill_dc_scans(scanptr, 1, 0, 0); scanptr = fill_dc_scans(scanptr, 1, 0, 0);
@@ -719,7 +788,7 @@ jpeg_search_progression (j_compress_ptr cinfo)
scanptr = fill_a_scan(scanptr, 0, 1, 8, 0, 0); scanptr = fill_a_scan(scanptr, 0, 1, 8, 0, 0);
scanptr = fill_a_scan(scanptr, 0, 9, 63, 0, 0); scanptr = fill_a_scan(scanptr, 0, 9, 63, 0, 0);
for (Al = 0; Al < cinfo->Al_max_luma; Al++) { for (Al = 0; Al < cinfo->master->Al_max_luma; Al++) {
scanptr = fill_a_scan(scanptr, 0, 1, 63, Al+1, Al); scanptr = fill_a_scan(scanptr, 0, 1, 63, Al+1, Al);
scanptr = fill_a_scan(scanptr, 0, 1, 8, 0, Al+1); scanptr = fill_a_scan(scanptr, 0, 1, 8, 0, Al+1);
scanptr = fill_a_scan(scanptr, 0, 9, 63, 0, Al+1); scanptr = fill_a_scan(scanptr, 0, 9, 63, 0, Al+1);
@@ -727,17 +796,17 @@ jpeg_search_progression (j_compress_ptr cinfo)
scanptr = fill_a_scan(scanptr, 0, 1, 63, 0, 0); scanptr = fill_a_scan(scanptr, 0, 1, 63, 0, 0);
for (i = 0; i < cinfo->num_frequency_splits; i++) { for (i = 0; i < cinfo->master->num_frequency_splits; i++) {
scanptr = fill_a_scan(scanptr, 0, 1, frequency_split[i], 0, 0); scanptr = fill_a_scan(scanptr, 0, 1, frequency_split[i], 0, 0);
scanptr = fill_a_scan(scanptr, 0, frequency_split[i]+1, 63, 0, 0); scanptr = fill_a_scan(scanptr, 0, frequency_split[i]+1, 63, 0, 0);
} }
if (ncomps == 1) { if (ncomps == 1) {
cinfo->Al_max_chroma = 0; cinfo->master->Al_max_chroma = 0;
cinfo->num_scans_chroma_dc = 0; cinfo->master->num_scans_chroma_dc = 0;
} else { } else {
cinfo->Al_max_chroma = 2; cinfo->master->Al_max_chroma = 2;
cinfo->num_scans_chroma_dc = 3; cinfo->master->num_scans_chroma_dc = 3;
/* 41 scans for chroma */ /* 41 scans for chroma */
/* chroma DC combined */ /* chroma DC combined */
@@ -751,7 +820,7 @@ jpeg_search_progression (j_compress_ptr cinfo)
scanptr = fill_a_scan(scanptr, 2, 1, 8, 0, 0); scanptr = fill_a_scan(scanptr, 2, 1, 8, 0, 0);
scanptr = fill_a_scan(scanptr, 2, 9, 63, 0, 0); scanptr = fill_a_scan(scanptr, 2, 9, 63, 0, 0);
for (Al = 0; Al < cinfo->Al_max_chroma; Al++) { for (Al = 0; Al < cinfo->master->Al_max_chroma; Al++) {
scanptr = fill_a_scan(scanptr, 1, 1, 63, Al+1, Al); scanptr = fill_a_scan(scanptr, 1, 1, 63, Al+1, Al);
scanptr = fill_a_scan(scanptr, 2, 1, 63, Al+1, Al); scanptr = fill_a_scan(scanptr, 2, 1, 63, Al+1, Al);
scanptr = fill_a_scan(scanptr, 1, 1, 8, 0, Al+1); scanptr = fill_a_scan(scanptr, 1, 1, 8, 0, Al+1);
@@ -763,7 +832,7 @@ jpeg_search_progression (j_compress_ptr cinfo)
scanptr = fill_a_scan(scanptr, 1, 1, 63, 0, 0); scanptr = fill_a_scan(scanptr, 1, 1, 63, 0, 0);
scanptr = fill_a_scan(scanptr, 2, 1, 63, 0, 0); scanptr = fill_a_scan(scanptr, 2, 1, 63, 0, 0);
for (i = 0; i < cinfo->num_frequency_splits; i++) { for (i = 0; i < cinfo->master->num_frequency_splits; i++) {
scanptr = fill_a_scan(scanptr, 1, 1, frequency_split[i], 0, 0); scanptr = fill_a_scan(scanptr, 1, 1, frequency_split[i], 0, 0);
scanptr = fill_a_scan(scanptr, 1, frequency_split[i]+1, 63, 0, 0); scanptr = fill_a_scan(scanptr, 1, frequency_split[i]+1, 63, 0, 0);
scanptr = fill_a_scan(scanptr, 2, 1, frequency_split[i], 0, 0); scanptr = fill_a_scan(scanptr, 2, 1, frequency_split[i], 0, 0);
@@ -786,7 +855,7 @@ jpeg_simple_progression (j_compress_ptr cinfo)
int nscans; int nscans;
jpeg_scan_info * scanptr; jpeg_scan_info * scanptr;
if (cinfo->optimize_scans) { if (cinfo->master->optimize_scans) {
if (jpeg_search_progression(cinfo) == TRUE) if (jpeg_search_progression(cinfo) == TRUE)
return; return;
} }
@@ -802,7 +871,7 @@ jpeg_simple_progression (j_compress_ptr cinfo)
nscans = 10; nscans = 10;
} else { } else {
/* All-purpose script for other color spaces. */ /* All-purpose script for other color spaces. */
if (cinfo->use_moz_defaults == TRUE) { if (cinfo->master->compress_profile == JCP_MAX_COMPRESSION) {
if (ncomps > MAX_COMPS_IN_SCAN) if (ncomps > MAX_COMPS_IN_SCAN)
nscans = 5 * ncomps; /* 2 DC + 4 AC scans per component */ nscans = 5 * ncomps; /* 2 DC + 4 AC scans per component */
else else
@@ -826,7 +895,7 @@ jpeg_simple_progression (j_compress_ptr cinfo)
cinfo->script_space_size = MAX(nscans, 10); cinfo->script_space_size = MAX(nscans, 10);
cinfo->script_space = (jpeg_scan_info *) cinfo->script_space = (jpeg_scan_info *)
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT, (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,
cinfo->script_space_size * SIZEOF(jpeg_scan_info)); cinfo->script_space_size * sizeof(jpeg_scan_info));
} }
scanptr = cinfo->script_space; scanptr = cinfo->script_space;
cinfo->scan_info = scanptr; cinfo->scan_info = scanptr;
@@ -834,11 +903,16 @@ jpeg_simple_progression (j_compress_ptr cinfo)
if (ncomps == 3 && cinfo->jpeg_color_space == JCS_YCbCr) { if (ncomps == 3 && cinfo->jpeg_color_space == JCS_YCbCr) {
/* Custom script for YCbCr color images. */ /* Custom script for YCbCr color images. */
if (cinfo->use_moz_defaults == TRUE) { if (cinfo->master->compress_profile == JCP_MAX_COMPRESSION) {
/* scan defined in jpeg_scan_rgb.txt in jpgcrush */ /* scan defined in jpeg_scan_rgb.txt in jpgcrush */
/* Initial DC scan */ /* Initial DC scan */
if (cinfo->one_dc_scan) if (cinfo->master->dc_scan_opt_mode == 0)
scanptr = fill_dc_scans(scanptr, ncomps, 0, 0); scanptr = fill_dc_scans(scanptr, ncomps, 0, 0);
else if (cinfo->master->dc_scan_opt_mode == 1) {
scanptr = fill_a_scan(scanptr, 0, 0, 0, 0, 0);
scanptr = fill_a_scan(scanptr, 1, 0, 0, 0, 0);
scanptr = fill_a_scan(scanptr, 2, 0, 0, 0, 0);
}
else { else {
scanptr = fill_dc_scans(scanptr, 1, 0, 0); scanptr = fill_dc_scans(scanptr, 1, 0, 0);
scanptr = fill_a_scan_pair(scanptr, 1, 0, 0, 0, 0); scanptr = fill_a_scan_pair(scanptr, 1, 0, 0, 0, 0);
@@ -877,7 +951,7 @@ jpeg_simple_progression (j_compress_ptr cinfo)
} }
} else { } else {
/* All-purpose script for other color spaces. */ /* All-purpose script for other color spaces. */
if (cinfo->use_moz_defaults == TRUE) { if (cinfo->master->compress_profile == JCP_MAX_COMPRESSION) {
/* scan defined in jpeg_scan_bw.txt in jpgcrush */ /* scan defined in jpeg_scan_bw.txt in jpgcrush */
/* DC component, no successive approximation */ /* DC component, no successive approximation */
scanptr = fill_dc_scans(scanptr, ncomps, 0, 0); scanptr = fill_dc_scans(scanptr, ncomps, 0, 0);
@@ -902,5 +976,4 @@ jpeg_simple_progression (j_compress_ptr cinfo)
} }
} }
#endif /* C_PROGRESSIVE_SUPPORTED */ #endif /* C_PROGRESSIVE_SUPPORTED */

View File

@@ -1,10 +1,12 @@
/* /*
* jcphuff.c * jcphuff.c
* *
* This file was part of the Independent JPEG Group's software:
* Copyright (C) 1995-1997, Thomas G. Lane. * Copyright (C) 1995-1997, Thomas G. Lane.
* It was modified by The libjpeg-turbo Project to include only code relevant
* to libjpeg-turbo.
* mozjpeg Modifications: * mozjpeg Modifications:
* Copyright (C) 2014, Mozilla Corporation. * Copyright (C) 2014, Mozilla Corporation.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file. * For conditions of distribution and use, see the accompanying README file.
* *
* This file contains Huffman entropy encoding routines for progressive JPEG. * This file contains Huffman entropy encoding routines for progressive JPEG.
@@ -88,16 +90,16 @@ typedef phuff_entropy_encoder * phuff_entropy_ptr;
#endif #endif
/* Forward declarations */ /* Forward declarations */
METHODDEF(boolean) encode_mcu_DC_first JPP((j_compress_ptr cinfo, METHODDEF(boolean) encode_mcu_DC_first (j_compress_ptr cinfo,
JBLOCKROW *MCU_data)); JBLOCKROW *MCU_data);
METHODDEF(boolean) encode_mcu_AC_first JPP((j_compress_ptr cinfo, METHODDEF(boolean) encode_mcu_AC_first (j_compress_ptr cinfo,
JBLOCKROW *MCU_data)); JBLOCKROW *MCU_data);
METHODDEF(boolean) encode_mcu_DC_refine JPP((j_compress_ptr cinfo, METHODDEF(boolean) encode_mcu_DC_refine (j_compress_ptr cinfo,
JBLOCKROW *MCU_data)); JBLOCKROW *MCU_data);
METHODDEF(boolean) encode_mcu_AC_refine JPP((j_compress_ptr cinfo, METHODDEF(boolean) encode_mcu_AC_refine (j_compress_ptr cinfo,
JBLOCKROW *MCU_data)); JBLOCKROW *MCU_data);
METHODDEF(void) finish_pass_phuff JPP((j_compress_ptr cinfo)); METHODDEF(void) finish_pass_phuff (j_compress_ptr cinfo);
METHODDEF(void) finish_pass_gather_phuff JPP((j_compress_ptr cinfo)); METHODDEF(void) finish_pass_gather_phuff (j_compress_ptr cinfo);
/* /*
@@ -134,7 +136,7 @@ start_pass_phuff (j_compress_ptr cinfo, boolean gather_statistics)
if (entropy->bit_buffer == NULL) if (entropy->bit_buffer == NULL)
entropy->bit_buffer = (char *) entropy->bit_buffer = (char *)
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
MAX_CORR_BITS * SIZEOF(char)); MAX_CORR_BITS * sizeof(char));
} }
} }
if (gather_statistics) if (gather_statistics)
@@ -167,9 +169,9 @@ start_pass_phuff (j_compress_ptr cinfo, boolean gather_statistics)
if (entropy->count_ptrs[tbl] == NULL) if (entropy->count_ptrs[tbl] == NULL)
entropy->count_ptrs[tbl] = (long *) entropy->count_ptrs[tbl] = (long *)
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
257 * SIZEOF(long)); 257 * sizeof(long));
MEMZERO(entropy->count_ptrs[tbl], 257 * SIZEOF(long)); MEMZERO(entropy->count_ptrs[tbl], 257 * sizeof(long));
if (cinfo->trellis_passes) { if (cinfo->master->trellis_passes) {
/* When generating tables for trellis passes, make sure that all */ /* When generating tables for trellis passes, make sure that all */
/* codewords have an assigned length */ /* codewords have an assigned length */
int i, j; int i, j;
@@ -786,7 +788,7 @@ finish_pass_gather_phuff (j_compress_ptr cinfo)
/* It's important not to apply jpeg_gen_optimal_table more than once /* It's important not to apply jpeg_gen_optimal_table more than once
* per table, because it clobbers the input frequency counts! * per table, because it clobbers the input frequency counts!
*/ */
MEMZERO(did, SIZEOF(did)); MEMZERO(did, sizeof(did));
for (ci = 0; ci < cinfo->comps_in_scan; ci++) { for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
compptr = cinfo->cur_comp_info[ci]; compptr = cinfo->cur_comp_info[ci];
@@ -823,7 +825,7 @@ jinit_phuff_encoder (j_compress_ptr cinfo)
entropy = (phuff_entropy_ptr) entropy = (phuff_entropy_ptr)
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
SIZEOF(phuff_entropy_encoder)); sizeof(phuff_entropy_encoder));
cinfo->entropy = (struct jpeg_entropy_encoder *) entropy; cinfo->entropy = (struct jpeg_entropy_encoder *) entropy;
entropy->pub.start_pass = start_pass_phuff; entropy->pub.start_pass = start_pass_phuff;

View File

@@ -1,8 +1,10 @@
/* /*
* jcprepct.c * jcprepct.c
* *
* This file is part of the Independent JPEG Group's software:
* Copyright (C) 1994-1996, Thomas G. Lane. * Copyright (C) 1994-1996, Thomas G. Lane.
* This file is part of the Independent JPEG Group's software. * It was modified by The libjpeg-turbo Project to include only code relevant
* to libjpeg-turbo.
* For conditions of distribution and use, see the accompanying README file. * For conditions of distribution and use, see the accompanying README file.
* *
* This file contains the compression preprocessing controller. * This file contains the compression preprocessing controller.
@@ -278,7 +280,7 @@ create_context_buffer (j_compress_ptr cinfo)
fake_buffer = (JSAMPARRAY) fake_buffer = (JSAMPARRAY)
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
(cinfo->num_components * 5 * rgroup_height) * (cinfo->num_components * 5 * rgroup_height) *
SIZEOF(JSAMPROW)); sizeof(JSAMPROW));
for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
ci++, compptr++) { ci++, compptr++) {
@@ -293,7 +295,7 @@ create_context_buffer (j_compress_ptr cinfo)
(JDIMENSION) (3 * rgroup_height)); (JDIMENSION) (3 * rgroup_height));
/* Copy true buffer row pointers into the middle of the fake row array */ /* Copy true buffer row pointers into the middle of the fake row array */
MEMCOPY(fake_buffer + rgroup_height, true_buffer, MEMCOPY(fake_buffer + rgroup_height, true_buffer,
3 * rgroup_height * SIZEOF(JSAMPROW)); 3 * rgroup_height * sizeof(JSAMPROW));
/* Fill in the above and below wraparound pointers */ /* Fill in the above and below wraparound pointers */
for (i = 0; i < rgroup_height; i++) { for (i = 0; i < rgroup_height; i++) {
fake_buffer[i] = true_buffer[2 * rgroup_height + i]; fake_buffer[i] = true_buffer[2 * rgroup_height + i];
@@ -323,7 +325,7 @@ jinit_c_prep_controller (j_compress_ptr cinfo, boolean need_full_buffer)
prep = (my_prep_ptr) prep = (my_prep_ptr)
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
SIZEOF(my_prep_controller)); sizeof(my_prep_controller));
cinfo->prep = (struct jpeg_c_prep_controller *) prep; cinfo->prep = (struct jpeg_c_prep_controller *) prep;
prep->pub.start_pass = start_pass_prep; prep->pub.start_pass = start_pass_prep;

View File

@@ -1,9 +1,11 @@
/* /*
* jcsample.c * jcsample.c
* *
* This file was part of the Independent JPEG Group's software:
* Copyright (C) 1991-1996, Thomas G. Lane. * Copyright (C) 1991-1996, Thomas G. Lane.
* libjpeg-turbo Modifications:
* Copyright 2009 Pierre Ossman <ossman@cendio.se> for Cendio AB * Copyright 2009 Pierre Ossman <ossman@cendio.se> for Cendio AB
* This file is part of the Independent JPEG Group's software. * Copyright (C) 2014, MIPS Technologies, Inc., California
* For conditions of distribution and use, see the accompanying README file. * For conditions of distribution and use, see the accompanying README file.
* *
* This file contains downsampling routines. * This file contains downsampling routines.
@@ -53,9 +55,10 @@
/* Pointer to routine to downsample a single component */ /* Pointer to routine to downsample a single component */
typedef JMETHOD(void, downsample1_ptr, typedef void (*downsample1_ptr) (j_compress_ptr cinfo,
(j_compress_ptr cinfo, jpeg_component_info * compptr, jpeg_component_info * compptr,
JSAMPARRAY input_data, JSAMPARRAY output_data)); JSAMPARRAY input_data,
JSAMPARRAY output_data);
/* Private subobject */ /* Private subobject */
@@ -472,7 +475,7 @@ jinit_downsampler (j_compress_ptr cinfo)
downsample = (my_downsample_ptr) downsample = (my_downsample_ptr)
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
SIZEOF(my_downsampler)); sizeof(my_downsampler));
cinfo->downsample = (struct jpeg_downsampler *) downsample; cinfo->downsample = (struct jpeg_downsampler *) downsample;
downsample->pub.start_pass = start_pass_downsample; downsample->pub.start_pass = start_pass_downsample;
downsample->pub.downsample = sep_downsample; downsample->pub.downsample = sep_downsample;
@@ -504,14 +507,20 @@ jinit_downsampler (j_compress_ptr cinfo)
compptr->v_samp_factor * 2 == cinfo->max_v_samp_factor) { compptr->v_samp_factor * 2 == cinfo->max_v_samp_factor) {
#ifdef INPUT_SMOOTHING_SUPPORTED #ifdef INPUT_SMOOTHING_SUPPORTED
if (cinfo->smoothing_factor) { if (cinfo->smoothing_factor) {
#if defined(__mips__)
if (jsimd_can_h2v2_smooth_downsample())
downsample->methods[ci] = jsimd_h2v2_smooth_downsample;
else
#endif
downsample->methods[ci] = h2v2_smooth_downsample; downsample->methods[ci] = h2v2_smooth_downsample;
downsample->pub.need_context_rows = TRUE; downsample->pub.need_context_rows = TRUE;
} else } else {
#endif #endif
if (jsimd_can_h2v2_downsample()) if (jsimd_can_h2v2_downsample())
downsample->methods[ci] = jsimd_h2v2_downsample; downsample->methods[ci] = jsimd_h2v2_downsample;
else else
downsample->methods[ci] = h2v2_downsample; downsample->methods[ci] = h2v2_downsample;
}
} else if ((cinfo->max_h_samp_factor % compptr->h_samp_factor) == 0 && } else if ((cinfo->max_h_samp_factor % compptr->h_samp_factor) == 0 &&
(cinfo->max_v_samp_factor % compptr->v_samp_factor) == 0) { (cinfo->max_v_samp_factor % compptr->v_samp_factor) == 0) {
smoothok = FALSE; smoothok = FALSE;

Some files were not shown because too many files have changed in this diff Show More