From 1f014c32e66e00f4e6934f31beefae57ab51a477 Mon Sep 17 00:00:00 2001 From: DRC Date: Thu, 17 Mar 2011 07:39:25 +0000 Subject: [PATCH] Fix compression from/decompression to TYPE_INT_{RGB|BGR} BufferedImages on big endian platforms git-svn-id: svn+ssh://svn.code.sf.net/p/libjpeg-turbo/code/trunk@520 632fc199-4ca6-4c93-a231-07263d6284db --- .../libjpegturbo/turbojpeg/TJCompressor.java | 30 ++++++++++++++++--- .../turbojpeg/TJDecompressor.java | 16 ++++++++-- 2 files changed, 40 insertions(+), 6 deletions(-) diff --git a/java/org/libjpegturbo/turbojpeg/TJCompressor.java b/java/org/libjpegturbo/turbojpeg/TJCompressor.java index 832023ae..55a983fa 100644 --- a/java/org/libjpegturbo/turbojpeg/TJCompressor.java +++ b/java/org/libjpegturbo/turbojpeg/TJCompressor.java @@ -29,6 +29,7 @@ package org.libjpegturbo.turbojpeg; import java.awt.image.*; +import java.nio.*; /** * TurboJPEG compressor @@ -184,15 +185,25 @@ public class TJCompressor { 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_BYTE_GRAY: pixelFormat = TJ.PF_GRAY; break; case BufferedImage.TYPE_INT_BGR: - pixelFormat = TJ.PF_RGBX; intPixels = true; break; + if(byteOrder == ByteOrder.BIG_ENDIAN) + pixelFormat = TJ.PF_XBGR; + else + pixelFormat = TJ.PF_RGBX; + intPixels = true; break; case BufferedImage.TYPE_INT_RGB: - pixelFormat = TJ.PF_BGRX; intPixels = true; break; + if(byteOrder == ByteOrder.BIG_ENDIAN) + pixelFormat = TJ.PF_XRGB; + else + pixelFormat = TJ.PF_BGRX; + intPixels = true; break; default: throw new Exception("Unsupported BufferedImage format"); } @@ -313,15 +324,25 @@ public class TJCompressor { 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_BYTE_GRAY: pixelFormat = TJ.PF_GRAY; break; case BufferedImage.TYPE_INT_BGR: - pixelFormat = TJ.PF_RGBX; intPixels = true; break; + if(byteOrder == ByteOrder.BIG_ENDIAN) + pixelFormat = TJ.PF_XBGR; + else + pixelFormat = TJ.PF_RGBX; + intPixels = true; break; case BufferedImage.TYPE_INT_RGB: - pixelFormat = TJ.PF_BGRX; intPixels = true; break; + if(byteOrder == ByteOrder.BIG_ENDIAN) + pixelFormat = TJ.PF_XRGB; + else + pixelFormat = TJ.PF_BGRX; + intPixels = true; break; default: throw new Exception("Unsupported BufferedImage format"); } @@ -435,4 +456,5 @@ public class TJCompressor { private int subsamp = -1; private int jpegQuality = -1; private int compressedSize = 0; + private ByteOrder byteOrder = null; }; diff --git a/java/org/libjpegturbo/turbojpeg/TJDecompressor.java b/java/org/libjpegturbo/turbojpeg/TJDecompressor.java index 19f0c94a..79021fba 100644 --- a/java/org/libjpegturbo/turbojpeg/TJDecompressor.java +++ b/java/org/libjpegturbo/turbojpeg/TJDecompressor.java @@ -29,6 +29,7 @@ package org.libjpegturbo.turbojpeg; import java.awt.image.*; +import java.nio.*; /** * TurboJPEG decompressor @@ -378,15 +379,25 @@ public class TJDecompressor { if(scaledWidth != desiredWidth || scaledHeight != desiredHeight) throw new Exception("BufferedImage dimensions do not match a scaled image size that TurboJPEG is capable of generating."); int pixelFormat; boolean intPixels = false; + if(byteOrder == null) + byteOrder = ByteOrder.nativeOrder(); switch(dstImage.getType()) { case BufferedImage.TYPE_3BYTE_BGR: pixelFormat = TJ.PF_BGR; break; case BufferedImage.TYPE_BYTE_GRAY: pixelFormat = TJ.PF_GRAY; break; case BufferedImage.TYPE_INT_BGR: - pixelFormat = TJ.PF_RGBX; intPixels = true; break; + if(byteOrder == ByteOrder.BIG_ENDIAN) + pixelFormat = TJ.PF_XBGR; + else + pixelFormat = TJ.PF_RGBX; + intPixels = true; break; case BufferedImage.TYPE_INT_RGB: - pixelFormat = TJ.PF_BGRX; intPixels = true; break; + if(byteOrder == ByteOrder.BIG_ENDIAN) + pixelFormat = TJ.PF_XRGB; + else + pixelFormat = TJ.PF_BGRX; + intPixels = true; break; default: throw new Exception("Unsupported BufferedImage format"); } @@ -492,4 +503,5 @@ public class TJDecompressor { protected int jpegWidth = 0; protected int jpegHeight = 0; protected int jpegSubsamp = -1; + private ByteOrder byteOrder = null; };