]> granicus.if.org Git - libjpeg-turbo/log
libjpeg-turbo
6 years agoChangeLog.md: bump revision to prepare for beta
DRC [Thu, 22 Mar 2018 22:15:53 +0000 (17:15 -0500)]
ChangeLog.md: bump revision to prepare for beta

6 years agojcphuff.c: Fix compiler warning with Visual C++
DRC [Thu, 22 Mar 2018 22:14:15 +0000 (17:14 -0500)]
jcphuff.c: Fix compiler warning with Visual C++

GCC doesn't seem to care if we pass no arguments to the ENCODE_COEFS*
macros, but MSVC does.  Insert a no-op to make it happy.

6 years agoBump revision to 1.5.90 to prepare for beta
DRC [Thu, 22 Mar 2018 21:08:25 +0000 (16:08 -0500)]
Bump revision to 1.5.90 to prepare for beta

6 years agoLabel this release 2.0 instead of 1.6
DRC [Thu, 22 Mar 2018 21:04:29 +0000 (16:04 -0500)]
Label this release 2.0 instead of 1.6

This also pulls the formatting changes from
19c791cdac6df84418c66eb9d67cfa9703bc2461 into the TurboJPEG C API docs.

6 years agoChangeLog.md: clarification regarding AVX2
DRC [Thu, 22 Mar 2018 20:56:09 +0000 (15:56 -0500)]
ChangeLog.md: clarification regarding AVX2

6 years agoC/SSE2 optimization of encode_mcu_AC_first()
mayeut [Thu, 22 Mar 2018 16:36:43 +0000 (11:36 -0500)]
C/SSE2 optimization of encode_mcu_AC_first()

This commit adds C and SSE2 optimizations for the encode_mcu_AC_first()
function used in progressive Huffman encoding.

The image used for testing can be retrieved from this page:
https://blog.cloudflare.com/doubling-the-speed-of-jpegtran

All timings done on `Intel(R) Core(TM) i7-4870HQ CPU @ 2.50GHz`
clang version is `Apple LLVM version 9.0.0 (clang-900.0.39.2)`
gcc-5 version is `gcc-5 (Homebrew GCC 5.5.0) 5.5.0`
gcc-7 version is `gcc-7 (Homebrew GCC 7.2.0) 7.2.0`

Here are the results in comparison to libjpeg-turbo@293263c using
`time ./jpegtran -outfile /dev/null -progressive -optimise -copy none print_poster_0025.jpg`

C
clang x86_64: +19%
gcc-5 x86_64: +80%
gcc-7 x86_64: +57%
clang i386: +5%
gcc-5 i386: +59%
gcc-7 i386: +51%

SSE2
clang x86_64: +79%
gcc-5 x86_64: +158%
gcc-7 x86_64: +122%
clang i386: +71%
gcc-5 i386: +134%
gcc-7 i386: +135%

Discussion in libjpeg-turbo/libjpeg-turbo#46

6 years agoC/SSE2 optimization of encode_mcu_AC_refine()
mayeut [Fri, 2 Mar 2018 21:33:19 +0000 (22:33 +0100)]
C/SSE2 optimization of encode_mcu_AC_refine()

This commit adds C and SSE2 optimizations for the encode_mcu_AC_refine()
function used in progressive Huffman encoding.

The image used for testing can be retrieved from this page:
https://blog.cloudflare.com/doubling-the-speed-of-jpegtran

All timings done on `Intel(R) Core(TM) i7-4870HQ CPU @ 2.50GHz`
clang version is `Apple LLVM version 9.0.0 (clang-900.0.39.2)`
gcc-5 version is `gcc-5 (Homebrew GCC 5.5.0) 5.5.0`
gcc-7 version is `gcc-7 (Homebrew GCC 7.2.0) 7.2.0`

Here are the results in comparison to libjpeg-turbo@3c54642 using
`time ./jpegtran -outfile /dev/null -progressive -optimise -copy none print_poster_0025.jpg`

C
clang x86_64: +7%
gcc-5 x86_64: +30%
gcc-7 x86_64: +33%
clang i386: +0%
gcc-5 i386: +24%
gcc-7 i386: +23%

SSE2
clang x86_64: +42%
gcc-5 x86_64: +53%
gcc-7 x86_64: +64%
clang i386: +35%
gcc-5 i386: +46%
gcc-7 i386: +49%

Discussion in libjpeg-turbo/libjpeg-turbo#46

6 years agosimd/i386/jchuff-sse2.asm: Minor formatting tweak
DRC [Wed, 21 Mar 2018 18:03:30 +0000 (13:03 -0500)]
simd/i386/jchuff-sse2.asm: Minor formatting tweak

6 years agoFormat preprocessor macros more consistently
DRC [Sat, 17 Mar 2018 20:14:35 +0000 (15:14 -0500)]
Format preprocessor macros more consistently

Within the libjpeg API code, it seems to be more the convention than not
to separate the macro name and value by two or more spaces, which
improves general readability.  Making this consistent across all of
libjpeg-turbo is less about my individual preferences and more about
making it easy to automatically detect variations from our chosen
formatting convention.  I intend to release the script I'm using to
validate this stuff, once it matures and stabilizes a bit.

6 years agoAdditional code formatting tweaks
DRC [Fri, 16 Mar 2018 23:20:05 +0000 (18:20 -0500)]
Additional code formatting tweaks

Missed by previous analysis

6 years agoMerge branch 'master' into dev
DRC [Sat, 17 Mar 2018 05:27:49 +0000 (00:27 -0500)]
Merge branch 'master' into dev

6 years agoMake all get/putenv() calls compile-time optional
DRC [Sat, 17 Mar 2018 05:06:10 +0000 (00:06 -0500)]
Make all get/putenv() calls compile-time optional

* Modify the SIMD dispatchers so they guard their usage of getenv() with
  the existing NO_GETENV preprocessor definition.
* Introduce a new NO_PUTENV preprocessor definition to guard the
  usage of putenv() in the TurboJPEG API library.

This at least puts Windows Store compatibility within the realm of
possibility, although further steps are required.

6 years agoWin installer: allow install directories w/ spaces
DRC [Sat, 17 Mar 2018 01:34:18 +0000 (20:34 -0500)]
Win installer: allow install directories w/ spaces

6 years agoFix build with older MinGW releases
Cameron Cawley [Tue, 6 Mar 2018 22:10:14 +0000 (22:10 +0000)]
Fix build with older MinGW releases

Some MinGW implementations need stdint.h in order to define SIZE_MAX.

Regression caused by a09ba29a55b9a43d346421210d94370065eeaf53 and
not fully fixed by a0047bdea4d11dfeefb9ea797865b1a2ea0a665e.

Closes #220

6 years agoturbojpeg.c: Fix Windows build
DRC [Fri, 16 Mar 2018 19:09:53 +0000 (14:09 -0500)]
turbojpeg.c: Fix Windows build

Broken by previous commit.  Although turbojpeg.c no longer needs
tjutil.h on Un*x, it still needs to include that file on Windows in
order to use snprintf() and strcasecmp() (which, on Windows, are macros
that wrap _snprintf_s() and stricmp().)

6 years agoMerge branch 'master' into dev
DRC [Fri, 16 Mar 2018 07:16:41 +0000 (02:16 -0500)]
Merge branch 'master' into dev

6 years agoImprove code formatting consistency
DRC [Thu, 8 Mar 2018 16:55:20 +0000 (10:55 -0600)]
Improve code formatting consistency

With rare exceptions ...
- Always separate line continuation characters by one space from
  preceding code.
- Always use two-space indentation.  Never use tabs.
- Always use K&R-style conditional blocks.
- Always surround operators with spaces, except in raw assembly code.
- Always put a space after, but not before, a comma.
- Never put a space between type casts and variables/function calls.
- Never put a space between the function name and the argument list in
  function declarations and prototypes.
- Always surround braces ('{' and '}') with spaces.
- Always surround statements (if, for, else, catch, while, do, switch)
  with spaces.
- Always attach pointer symbols ('*' and '**') to the variable or
  function name.
- Always precede pointer symbols ('*' and '**') by a space in type
  casts.
- Use the MIN() macro from jpegint.h within the libjpeg and TurboJPEG
  API libraries (using min() from tjutil.h is still necessary for
  TJBench.)
- Where it makes sense (particularly in the TurboJPEG code), put a blank
  line after variable declaration blocks.
- Always separate statements in one-liners by two spaces.

The purpose of this was to ease maintenance on my part and also to make
it easier for contributors to figure out how to format patch
submissions.  This was admittedly confusing (even to me sometimes) when
we had 3 or 4 different style conventions in the same source tree.  The
new convention is more consistent with the formatting of other OSS code
bases.

This commit corrects deviations from the chosen formatting style in the
libjpeg API code and reformats the TurboJPEG API code such that it
conforms to the same standard.

NOTES:
- Although it is no longer necessary for the function name in function
  declarations to begin in Column 1 (this was historically necessary
  because of the ansi2knr utility, which allowed libjpeg to be built
  with non-ANSI compilers), we retain that formatting for the libjpeg
  code because it improves readability when using libjpeg's function
  attribute macros (GLOBAL(), etc.)
- This reformatting project was accomplished with the help of AStyle and
  Uncrustify, although neither was completely up to the task, and thus
  a great deal of manual tweaking was required.  Note to developers of
  code formatting utilities:  the libjpeg-turbo code base is an
  excellent test bed, because AFAICT, it breaks every single one of the
  utilities that are currently available.
- The legacy (MMX, SSE, 3DNow!) assembly code for i386 has been
  formatted to match the SSE2 code (refer to
  ff5685d5344273df321eb63a005eaae19d2496e3.)  I hadn't intended to
  bother with this, but the Loongson MMI implementation demonstrated
  that there is still academic value to the MMX implementation, as an
  algorithmic model for other 64-bit vector implementations.  Thus, it
  is desirable to improve its readability in the same manner as that of
  the SSE2 implementation.

6 years agousage.txt: Remove Alt-Space non-ASCII character
DRC [Fri, 16 Mar 2018 07:13:03 +0000 (02:13 -0500)]
usage.txt: Remove Alt-Space non-ASCII character

6 years agoFix build when RGB_{RED,GREEN,BLUE}!={0,1,2}
DRC [Tue, 13 Mar 2018 15:54:57 +0000 (10:54 -0500)]
Fix build when RGB_{RED,GREEN,BLUE}!={0,1,2}

Broken by aa7459050d7a50e1d8a99488902d41fbc118a50f

6 years agoTravis: OS X official builds now use YASM
DRC [Mon, 5 Mar 2018 18:50:19 +0000 (12:50 -0600)]
Travis: OS X official builds now use YASM

Because 367a838626576b4ff2a47cbd5a494199b800dc48

6 years agoLoongson MMI SIMD extensions
DRC [Thu, 1 Mar 2018 16:38:17 +0000 (10:38 -0600)]
Loongson MMI SIMD extensions

Based on:
https://github.com/zhuchen1911/libjpeg-turbo/commit/42aff4497bdaca3258279cafc74511e3c25454b8

Closes #158

6 years agoSIMD: Formatting tweaks + remove unnecessary code
DRC [Wed, 28 Feb 2018 22:24:03 +0000 (16:24 -0600)]
SIMD: Formatting tweaks + remove unnecessary code

+ "JSIMD_ARM_NEON" = "JSIMD_NEON"
+ "JSIMD_MIPS_DSPR2" = "JSIMD_DSPR2"
+ "*_mips_dspr2" = "*_dspr2"

It's obvious that "NEON" refers to Arm and "DSPr2" refers to MIPS, and
this naming convention is consistent with the other SIMD extensions.

6 years agoFix iOS/ARM[-64] build w/ newer versions of CMake
DRC [Tue, 27 Feb 2018 17:36:43 +0000 (11:36 -0600)]
Fix iOS/ARM[-64] build w/ newer versions of CMake

Newer versions of CMake (known to be the case with 3.7.x and 3.10.x)
fail to add a space between CMAKE_C_FLAGS and CMAKE_ASM_FLAGS, which
causes the build to fail when using the official build procedure.

Closes #216

6 years agoMake SIMD syms private for x86[-64]/Mach-O builds
DRC [Tue, 27 Feb 2018 01:41:59 +0000 (19:41 -0600)]
Make SIMD syms private for x86[-64]/Mach-O builds

... if building with YASM.  NASM doesn't currently support the necessary
directives.

Closes #212

6 years agoMerge branch 'master' into dev
DRC [Tue, 27 Feb 2018 00:43:40 +0000 (18:43 -0600)]
Merge branch 'master' into dev

Closes #214

6 years agoFix Win64 ABI conformance when using xmm8-xmm11
mayeut [Sat, 24 Feb 2018 13:50:56 +0000 (14:50 +0100)]
Fix Win64 ABI conformance when using xmm8-xmm11

Referring to https://docs.microsoft.com/en-US/cpp/build/stack-usage:

"All memory beyond the current address of RSP is considered volatile:
The OS, or a debugger, may overwrite this memory during a user debug
session, or an interrupt handler.  Thus, RSP must always be set before
attempting to read or write values to a stack frame."

Basically, if-- under extremely rare circumstances-- a context swap were
to occur between saving the values of xmm8-xmm11 and setting the new
value of rsp, the O/S might not preserve that area of the stack.  In
general, libjpeg-turbo should not be using xmm8-xmm11 before or after
the call to jsimd_huff_encode_one_block_sse2(), so this is probably a
non-issue, but it's still a good idea to fix it.

Based on
https://github.com/mayeut/libjpeg-turbo/commit/ff7d2030dd26c7b8c37ff540c594490198843f15

6 years agoFix BUILDING.md buglet ("--mfloat-abi=softfp")
Matthieu Darbois [Sat, 24 Feb 2018 17:00:51 +0000 (18:00 +0100)]
Fix BUILDING.md buglet ("--mfloat-abi=softfp")

(Introduced with the build system overhaul)

Closes #215

6 years agoFix Win64 ABI conformance issue in AVX2 ISLOW IDCT
mayeut [Sat, 24 Feb 2018 11:07:34 +0000 (12:07 +0100)]
Fix Win64 ABI conformance issue in AVX2 ISLOW IDCT

xmm8-xmm11 must be saved and restored, since the function uses
ymm8-ymm11.

Closes #211

6 years agoFix build with YASM
mayeut [Sat, 24 Feb 2018 13:20:59 +0000 (14:20 +0100)]
Fix build with YASM

vinserti128 requires all operands to be specified

6 years agoMake SIMD symbols private for MIPS ELF builds
mayeut [Fri, 23 Feb 2018 23:02:27 +0000 (00:02 +0100)]
Make SIMD symbols private for MIPS ELF builds

Closes #210

6 years agoMake SIMD symbols private for iOS ARM/ARM64 builds
mayeut [Fri, 23 Feb 2018 22:31:02 +0000 (23:31 +0100)]
Make SIMD symbols private for iOS ARM/ARM64 builds

6 years agoMake SIMD symbols private for x86[-64] ELF builds
mayeut [Fri, 23 Feb 2018 20:56:32 +0000 (21:56 +0100)]
Make SIMD symbols private for x86[-64] ELF builds

6 years ago32-bit AVX2 implementation of slow int inverse DCT
DRC [Fri, 23 Feb 2018 19:58:24 +0000 (13:58 -0600)]
32-bit AVX2 implementation of slow int inverse DCT

6 years ago32-bit AVX2 buglet: IS_ALIGNED_SSE=IS_ALIGNED_AVX
DRC [Fri, 23 Feb 2018 18:24:10 +0000 (12:24 -0600)]
32-bit AVX2 buglet: IS_ALIGNED_SSE=IS_ALIGNED_AVX

6 years ago64-bit AVX2 implementation of slow int inverse DCT
DRC [Fri, 23 Feb 2018 17:50:11 +0000 (11:50 -0600)]
64-bit AVX2 implementation of slow int inverse DCT

6 years ago32-bit AVX2 implementation of int sample conv.
DRC [Sun, 18 Feb 2018 04:15:58 +0000 (22:15 -0600)]
32-bit AVX2 implementation of int sample conv.

6 years ago32-bit AVX2 implementation of slow int forward DCT
DRC [Sun, 18 Feb 2018 02:31:30 +0000 (20:31 -0600)]
32-bit AVX2 implementation of slow int forward DCT

6 years ago64-bit AVX2 implementation of int sample conv.
DRC [Sun, 18 Feb 2018 01:39:53 +0000 (19:39 -0600)]
64-bit AVX2 implementation of int sample conv.

6 years ago64-bit AVX2 implementation of slow int forward DCT
DRC [Sat, 17 Feb 2018 23:32:25 +0000 (17:32 -0600)]
64-bit AVX2 implementation of slow int forward DCT

6 years agoAVX2: Introduce YMMBLOCK macro for readability
DRC [Sat, 17 Feb 2018 23:29:38 +0000 (17:29 -0600)]
AVX2: Introduce YMMBLOCK macro for readability

6 years agoProg Huff enc: bit count/branchless abs val opts
DRC [Wed, 14 Feb 2018 23:22:00 +0000 (17:22 -0600)]
Prog Huff enc: bit count/branchless abs val opts

Ported from baseline Huffman encoder.  This improves overall compression
performance by ~3-9% in my testing.

6 years agoMerge branch 'master' into dev
DRC [Wed, 14 Feb 2018 20:50:04 +0000 (14:50 -0600)]
Merge branch 'master' into dev

6 years agoREADME.md: Fix permissions
Ben Boeckel [Wed, 14 Feb 2018 20:41:36 +0000 (15:41 -0500)]
README.md: Fix permissions

6 years agoMerge branch 'master' into dev
DRC [Tue, 13 Feb 2018 22:34:21 +0000 (16:34 -0600)]
Merge branch 'master' into dev

6 years agoFix dithering bug in merged 4:2:0/RGB565 algorithm
DRC [Tue, 13 Feb 2018 22:14:03 +0000 (16:14 -0600)]
Fix dithering bug in merged 4:2:0/RGB565 algorithm

d0 should always be used for the first row, and d1 should always be used
for the second row.

Addresses concerns raised in #95, #81.

6 years agoMerge branch 'master' into dev
DRC [Fri, 5 Jan 2018 18:05:43 +0000 (12:05 -0600)]
Merge branch 'master' into dev

6 years agoTravis/OS X: Use 'brew bundle' + Brewfile
Stephen [Wed, 3 Jan 2018 15:56:12 +0000 (07:56 -0800)]
Travis/OS X: Use 'brew bundle' + Brewfile

This ensures that the build script will not fail if the Homebrew
dependencies are already installed.

7 years agoMerge branch 'master' into dev
DRC [Sat, 16 Dec 2017 15:34:28 +0000 (09:34 -0600)]
Merge branch 'master' into dev

7 years agojdarith.c: Fix two signed integer overflows
DRC [Sat, 16 Dec 2017 02:37:02 +0000 (20:37 -0600)]
jdarith.c: Fix two signed integer overflows

I guess I have to fix these, or Google Autofuzz is going to keep bugging
me about them.

Fixes #171
Fixes #197
Fixes #198

7 years agoBump version to 1.5.4 to prepare for new commits
DRC [Sat, 16 Dec 2017 02:05:58 +0000 (20:05 -0600)]
Bump version to 1.5.4 to prepare for new commits

7 years agoBUILDING.md: Adjust Android recipes for NDK r16+
DRC [Fri, 15 Dec 2017 22:45:25 +0000 (16:45 -0600)]
BUILDING.md: Adjust Android recipes for NDK r16+

NDK r16b moved some things around, so modify the Android build recipes
to take that into account while preserving compatibility with previous
NDK releases.

NOTE: the GCC 4.9 NDK toolchain is deprecated, so we will need to
develop new Android build recipes for libjpeg-turbo 1.6 that use the
Clang toolchain.

Closes #196

7 years agoFix whitespace errors 1.5.3
DRC [Fri, 8 Dec 2017 01:29:42 +0000 (19:29 -0600)]
Fix whitespace errors

7 years agoMerge branch 'master' into dev
DRC [Wed, 6 Dec 2017 18:20:24 +0000 (12:20 -0600)]
Merge branch 'master' into dev

+ acknowledge 1.5.3 release

7 years agojpeg_crop_scanlines: Handle gray images w/ samp!=1
DRC [Wed, 6 Dec 2017 17:59:04 +0000 (11:59 -0600)]
jpeg_crop_scanlines: Handle gray images w/ samp!=1

Since the sampling factor has no meaning for single-component images,
the decompressor ignores it, and jpeg_crop_scanlines() should as well.

Fixes #195

7 years agoFix lib state when skipping to end of 1-scan image
DRC [Tue, 5 Dec 2017 21:27:34 +0000 (15:27 -0600)]
Fix lib state when skipping to end of 1-scan image

If jpeg_skip_scanlines() is used to skip to the end of a single-scan
image, then we need to change the library state such that subsequent
calls to jpeg_consume_input() will return JPEG_REACHED_EOI rather than
JPEG_SUSPENDED.  (NOTE: not necessary for multi-scan images, since the
scans are processed prior to any call to jpeg_skip_scanlines().)

Unless I miss my guess, using jpeg_skip_scanlines() in this manner
will prevent any markers at the end of the JPEG image from being
read, but I don't think there is any way around that without actually
reading the data, which would defeat the purpose of
jpeg_skip_scanlines().

Fixes #194

7 years agoMerge branch 'master' into dev
DRC [Wed, 29 Nov 2017 20:36:39 +0000 (14:36 -0600)]
Merge branch 'master' into dev

7 years agoTravis: Work around xcode7.3 image bug
DRC [Wed, 29 Nov 2017 20:23:31 +0000 (14:23 -0600)]
Travis: Work around xcode7.3 image bug

Refer to travis-ci/travis-ci#8552.  This was supposed to be fixed on
November 15, then on November 28.  Travis blew through both deadlines,
so I have no confidence that the issue will be fixed as promised in a
timely manner.  Adding 'brew update' to .travis.yml slows the OS X
build, but there is no choice at the moment.

7 years agotjLoadImage(): Fix OOB array access w/TJPF_UNKNOWN
DRC [Sun, 19 Nov 2017 15:18:36 +0000 (09:18 -0600)]
tjLoadImage(): Fix OOB array access w/TJPF_UNKNOWN

Because the previous commit added a test for TJPF_UNKNOWN to tjunittest,
the ASAN CI build detected this issue.

7 years agotjLoadImage(): return TJPF_GRAY for grayscale BMPs
DRC [Sun, 19 Nov 2017 14:43:07 +0000 (08:43 -0600)]
tjLoadImage(): return TJPF_GRAY for grayscale BMPs

... if *pixelFormat=TJPF_UNKNOWN is passed to the function.

7 years agotjLoadImage(): Don't convert RGB to grayscale
DRC [Sat, 18 Nov 2017 17:33:05 +0000 (11:33 -0600)]
tjLoadImage(): Don't convert RGB to grayscale

Loading RGB image files into a grayscale buffer isn't a particularly
useful feature, given that libjpeg-turbo can perform this conversion
much more optimally (with SIMD acceleration on some platforms) during
the compression process.  Also, the RGB2GRAY() macro was not producing
deterministic cross-platform results because of variations in the
round-off behavior of various floating point implementations, so
`tjunittest -bmp` was failing in i386 builds.

7 years agoAdd TurboJPEG C example and clean up Java example
DRC [Fri, 17 Nov 2017 00:46:01 +0000 (18:46 -0600)]
Add TurboJPEG C example and clean up Java example

Also rename example.c --> example.txt and add a disclaimer to that file
so people will stop trying to compile it.

7 years agoTurboJPEG: Add alpha offset array/method
DRC [Fri, 17 Nov 2017 02:43:12 +0000 (20:43 -0600)]
TurboJPEG: Add alpha offset array/method

Also, set the red/green/blue offsets for TJPF_GRAY to -1 rather than 0.
It was undefined behavior for an application to use those arrays/methods
with TJPF_GRAY anyhow, and this makes it easier for applications to
programmatically detect whether a given pixel format has red, green, and
blue components.

7 years agoTurboJPEG C API: Add BMP/PPM load/save functions
DRC [Fri, 17 Nov 2017 00:09:07 +0000 (18:09 -0600)]
TurboJPEG C API: Add BMP/PPM load/save functions

The main justification for this is to provide new libjpeg-turbo users
with a quick & easy way of developing a complete JPEG
compression/decompression program without requiring them to build
libjpeg-turbo from source (which was necessary in order to use the
project-private bmp API) or to use external libraries.  These new
functions build upon significant enhancements to rdbmp.c, wrbmp.c,
rdppm.c, and wrppm.c which allow those engines to convert directly
between the native pixel format of the file and a pixel format
("colorspace" in libjpeg parlance) specified by the calling program.
rdbmp.c and wrbmp.c have also been modified such that the calling
program can choose to read or write image rows in the native (bottom-up)
order of the file format, thus eliminating the need to use an inversion
array.  tjLoadImage() and tjSaveImage() leverage these new underlying
features in order to significantly improve upon the performance of the
old bmp API.

Because these new functions cannot work without the libjpeg-turbo
colorspace extensions, the libjpeg-compatible code in turbojpeg.c has
been removed.  That code was only there to serve as an example of how
to use the TurboJPEG API on top of libjpeg, but more specific, buildable
examples now exist in the https://github.com/libjpeg-turbo/ijg
repository.

7 years agotjbenchtest: Test new TurboJPEG progressive flag
DRC [Thu, 16 Nov 2017 02:50:53 +0000 (20:50 -0600)]
tjbenchtest: Test new TurboJPEG progressive flag

7 years agoBuild: Fix 'tjtest' target on Windows
DRC [Wed, 15 Nov 2017 15:19:27 +0000 (09:19 -0600)]
Build: Fix 'tjtest' target on Windows

tjbenchtest and its Java derivatives are useful for rooting out hidden
problems with the more esoteric TJBench and TurboJPEG features.  For
instance, on Windows, running tjbenchtest uncovered
5fce2e942136cb70e5a30ff15a2d58b07947aa84.

This commit also causes tjbenchtest and tjbenchtest.java to append -yuv
and -alloc to their log file names, depending on the arguments passed,
and it causes the build system to clean up those log files when the
'testclean' target is built.

7 years agoMerge branch 'master' into dev
DRC [Sat, 18 Nov 2017 01:00:53 +0000 (19:00 -0600)]
Merge branch 'master' into dev

7 years agoTJExample: Fix array index OOB w/ 4:1:1 JPEG input
DRC [Sat, 18 Nov 2017 00:45:08 +0000 (18:45 -0600)]
TJExample: Fix array index OOB w/ 4:1:1 JPEG input

7 years agoCode formatting tweaks
DRC [Sat, 18 Nov 2017 00:15:42 +0000 (18:15 -0600)]
Code formatting tweaks

7 years agoUniquify tjbenchtest log file names based on args
DRC [Thu, 16 Nov 2017 01:39:45 +0000 (19:39 -0600)]
Uniquify tjbenchtest log file names based on args

+ clean up log files when 'make testclean' is invoked
+ fix 'tjbenchtest -yuv -alloc'
+ fix tjexampletest so that it creates images under /tmp
+ clean up tjexampletest

7 years agoTJExample.java: Don't ignore mistyped args
DRC [Thu, 16 Nov 2017 01:33:06 +0000 (19:33 -0600)]
TJExample.java: Don't ignore mistyped args

7 years agoDoc tweak: TJFLAG_ACCURATEDCT is the first flag
DRC [Tue, 14 Nov 2017 22:12:13 +0000 (16:12 -0600)]
Doc tweak: TJFLAG_ACCURATEDCT is the first flag

7 years agotjbench.exe: Fix decompression access violation
DRC [Tue, 14 Nov 2017 21:30:06 +0000 (15:30 -0600)]
tjbench.exe: Fix decompression access violation

The program crashed when a JPEG image was passed on the command line,
because we were mixing our metaphors vis-a-vis malloc()/free() and
tjAlloc()/tjFree() (malloc()/free() uses the tjbench.exe heap,
whereas tjAlloc()/tjFree() uses the turbojpeg.dll heap.)

7 years agoChangeLog.md: buglet
DRC [Tue, 14 Nov 2017 03:46:07 +0000 (21:46 -0600)]
ChangeLog.md: buglet

7 years agoBuild: Fix `make dist`
DRC [Tue, 14 Nov 2017 03:24:05 +0000 (21:24 -0600)]
Build: Fix `make dist`

Broken by previous commit

7 years agoFurther partial image decompression fixes
DRC [Tue, 14 Nov 2017 03:01:53 +0000 (21:01 -0600)]
Further partial image decompression fixes

- Referring to 073b0e88a192adebbb479ee2456beb089d8b5de7 and #185, the
  reason why BMP and RLE didn't (and won't) work with partial image
  decompression is that the output engines for both formats maintain a
  whole-image buffer, which is used to reverse the order of scanlines.
  However, it was straightforward to add -crop support for GIF and
  Targa, which is useful for testing partial image decompression along
  with color quantization.
- Such testing reproduced a bug reported by Mozilla (refer to PR #182)
  whereby jpeg_skip_scanlines() would segfault if color quantization was
  enabled.  To fix this issue, read_and_discard_scanlines() now sets up
  a dummy quantize function in the same manner that it sets up a dummy
  color conversion function.

Closes #182

7 years agoTJBench/TJUnitTest: Don't ignore mistyped args
DRC [Mon, 13 Nov 2017 22:00:35 +0000 (16:00 -0600)]
TJBench/TJUnitTest: Don't ignore mistyped args

7 years agoTurboJPEG C: Code formatting tweaks
DRC [Mon, 13 Nov 2017 14:15:50 +0000 (08:15 -0600)]
TurboJPEG C: Code formatting tweaks

7 years agodjpeg -crop: Exit gracefully with non-PPM formats
DRC [Thu, 9 Nov 2017 03:01:57 +0000 (21:01 -0600)]
djpeg -crop: Exit gracefully with non-PPM formats

... and document that only PPM/PGM output images are supported with the
-crop option for the moment.

I investigated the possibility of supporting -crop with -bmp, but even
after resetting the buffer dimensions, I still kept getting virtual
array access errors.  It seems that doing this the "right way" would
require creating a re-initialization function for each image format's
destination manager.  I'm disinclined to do that right now, given that
this feature was Google's baby (developed as a prerequisite for
including libjpeg-turbo in Android), and the -crop option in djpeg is
intended only as an example of how to use the partial image
decompression API.  Real-world applications would need to handle this
in their own destination managers.

It would probably be possible to make this work with Targa by employing
a similar hack to the one we used with PPM, but Targa isn't popular
enough to bother.

Fixes #185

7 years agoTurboJPEG C: Compiler warnings
DRC [Wed, 20 Sep 2017 19:55:54 +0000 (19:55 +0000)]
TurboJPEG C: Compiler warnings

Introduced in b9ab64d8dbee2db829e59357d335c151680f44f0.

7 years agoSRPM build: Define _libdir based on build arch
DRC [Wed, 20 Sep 2017 18:11:03 +0000 (18:11 +0000)]
SRPM build: Define _libdir based on build arch

Setting _libdir to CMAKE_INSTALL_FULL_LIBDIR only works when doing an
in-tree RPM build.  SRPMs are architecture-agnostic, so the spec needs
to compute_libdir at the time the SRPM is rebuilt, not at the time it
is generated.

This is a regression introduced when implementing the new CMake-based
cross-platform build system.

7 years agoMerge branch 'master' into dev
DRC [Wed, 20 Sep 2017 17:13:46 +0000 (17:13 +0000)]
Merge branch 'master' into dev

7 years agoPrevent "unmappable character" error in Java build
DRC [Wed, 20 Sep 2017 16:52:48 +0000 (16:52 +0000)]
Prevent "unmappable character" error in Java build

This was causing the build to fail when rebuilding libjpeg-turbo from
a source RPM.

7 years agoFix PowerPC 32-bit RPM build
DRC [Tue, 19 Sep 2017 20:01:34 +0000 (20:01 +0000)]
Fix PowerPC 32-bit RPM build

7 years agoFix 32-bit RPM build w/ newer RHEL/Fedora releases
DRC [Tue, 19 Sep 2017 18:03:49 +0000 (13:03 -0500)]
Fix 32-bit RPM build w/ newer RHEL/Fedora releases

The version of RPM on RHEL 5 and older platforms defines _libdir
as %{_exec_prefix}/%{_lib}, so defining _lib in the spec file redefined
_libdir.  However, newer versions of RPM (probably >= 4.6, since that
was the version that introduced the ISA macros) define _libdir as either
%{_prefix}/lib or %{_prefix}/lib64.  Thus, we need to explicitly
override _libdir in our spec file.

7 years agoPackaging: Use parallel make when rebuilding SRPM
DRC [Mon, 11 Sep 2017 15:06:22 +0000 (10:06 -0500)]
Packaging: Use parallel make when rebuilding SRPM

7 years agoTravis: Limit parallel make jobs to # of CPU cores
DRC [Mon, 11 Sep 2017 14:48:33 +0000 (09:48 -0500)]
Travis: Limit parallel make jobs to # of CPU cores

This tends to be faster than 'make -j', since it is making more wise
use of the available resources.

7 years agowrjpgcom: Fix comment typo
nyg [Tue, 5 Sep 2017 16:23:04 +0000 (18:23 +0200)]
wrjpgcom: Fix comment typo

Comment was copied/pasted from skip_variable() without making the
necessary modifications.

7 years agoMerge branch 'master' into dev
DRC [Sat, 2 Sep 2017 04:20:03 +0000 (04:20 +0000)]
Merge branch 'master' into dev

7 years agoTJUnitTest: Usage formatting tweaks
DRC [Sat, 2 Sep 2017 04:08:06 +0000 (04:08 +0000)]
TJUnitTest: Usage formatting tweaks

7 years agoJava: Fix TJUnitTest on big endian platforms
DRC [Sat, 2 Sep 2017 03:40:46 +0000 (03:40 +0000)]
Java: Fix TJUnitTest on big endian platforms

It is necessary for the C code to be aware of the machine's endianness,
which is why the TurboJPEG Java wrapper sets a different pixel format
for integer BufferedImages depending on ByteOrder.nativeOrder().
However, it isn't necessary to handle endianness in pure Java code such
as TJUnitTest (d'oh!)  This was a product of porting the C version of
TJUnitTest too literally, and of insufficient testing (historically,
the big endian systems I had available for testing didn't have Java.)

7 years agoBuild: Change ppc64le DEB arch to ppc64el
DRC [Fri, 1 Sep 2017 21:57:48 +0000 (21:57 +0000)]
Build: Change ppc64le DEB arch to ppc64el

This is the convention among Debian-based distros.

7 years agoMerge branch 'master' into dev
DRC [Fri, 1 Sep 2017 14:02:55 +0000 (09:02 -0500)]
Merge branch 'master' into dev

7 years agoBuild: Fix AltiVec detection on OS X Leopard
DRC [Fri, 1 Sep 2017 14:01:00 +0000 (09:01 -0500)]
Build: Fix AltiVec detection on OS X Leopard

The ability to directly access elements of an AltiVec vector is
apparently a more recent thing.

7 years agoBuild: Use -maltivec when testing AltiVec support
DRC [Fri, 1 Sep 2017 13:52:21 +0000 (13:52 +0000)]
Build: Use -maltivec when testing AltiVec support

Doesn't seem to be necessary with recent Linux/GCC configurations, but
it is definitely necessary with OS X.

7 years agoMerge branch 'master' into dev
DRC [Fri, 1 Sep 2017 01:57:19 +0000 (20:57 -0500)]
Merge branch 'master' into dev

7 years agoFix build on PowerPC SPE systems
DRC [Fri, 1 Sep 2017 01:10:08 +0000 (01:10 +0000)]
Fix build on PowerPC SPE systems

SPE systems don't support AltiVec instructions.

Fixes #172

7 years agoJava: Fix NullPointerException in YUVImage
DRC [Mon, 14 Aug 2017 15:54:27 +0000 (10:54 -0500)]
Java: Fix NullPointerException in YUVImage

planes == null is a valid argument to setBuf() if alloc == true, so we
need to make sure that planes is non-null before validating its length.
We also need to allocate one dimension of the planes array if it's null.

Fixes #168

7 years agoBump version to 1.5.3 to prepare for new commits
DRC [Mon, 14 Aug 2017 16:18:35 +0000 (11:18 -0500)]
Bump version to 1.5.3 to prepare for new commits

7 years agox86: Fix "short jump is out of range" w/ NASM<2.04 1.5.2
DRC [Fri, 7 Jul 2017 20:15:19 +0000 (15:15 -0500)]
x86: Fix "short jump is out of range" w/ NASM<2.04

7 years agoTJBench: Recover from non-fatal errors if possible
DRC [Thu, 29 Jun 2017 21:49:09 +0000 (16:49 -0500)]
TJBench: Recover from non-fatal errors if possible

Previously, -stoponwarning only had an effect on the underlying
TurboJPEG C functions, but TJBench still aborted if a non-fatal error
occurred.  This commit modifies the C version of TJBench such that it
always recovers from a non-fatal error unless -stoponwarning is
specified.  Furthermore, the benchmark stores the details of the last
non-fatal error and does not print any subsequent non-fatal error
messages unless they differ from the last one.

Due to limitations in the Java API (specifically, the fact that it
cannot communicate errors, fatal or otherwise, to the calling program
without throwing a TJException), it was only possible to make
decompression operations fully recoverable within TJBench.  With other
operations, -stoponwarning still has an effect on the underlying C
library but has no effect at the Java level.

The Java API documentation has been amended to reflect that only certain
methods are truly recoverable, regardless of the state of
TJ.FLAG_STOPONWARNING.