From 67bee8683db22050e346e0d002c5969da854d582 Mon Sep 17 00:00:00 2001 From: DRC Date: Sat, 27 Apr 2013 12:36:07 +0000 Subject: [PATCH] Code formatting tweaks git-svn-id: svn+ssh://svn.code.sf.net/p/libjpeg-turbo/code/branches/1.3.x@968 632fc199-4ca6-4c93-a231-07263d6284db --- java/TJBench.java | 532 ++++++++------- java/TJExample.java | 221 ++++--- java/TJUnitTest.java | 608 +++++++++--------- java/org/libjpegturbo/turbojpeg/TJ.java | 84 +-- .../libjpegturbo/turbojpeg/TJCompressor.java | 131 ++-- .../turbojpeg/TJCustomFilter.java | 6 +- .../turbojpeg/TJDecompressor.java | 155 +++-- .../turbojpeg/TJScalingFactor.java | 2 +- .../libjpegturbo/turbojpeg/TJTransform.java | 42 +- .../libjpegturbo/turbojpeg/TJTransformer.java | 25 +- 10 files changed, 933 insertions(+), 873 deletions(-) diff --git a/java/TJBench.java b/java/TJBench.java index 2f27b8e..c8cca5f 100644 --- a/java/TJBench.java +++ b/java/TJBench.java @@ -32,40 +32,37 @@ import javax.imageio.*; import java.util.*; import org.libjpegturbo.turbojpeg.*; -class TJBench -{ +class TJBench { + static final int YUVENCODE = 1; static final int YUVDECODE = 2; static int flags = 0, yuv = 0, quiet = 0, pf = TJ.PF_BGR; static boolean decompOnly, doTile; - static final String pixFormatStr[] = { + static final String[] pixFormatStr = { "RGB", "BGR", "RGBX", "BGRX", "XBGR", "XRGB", "GRAY" }; - static final String subNameLong[] = { + static final String[] subNameLong = { "4:4:4", "4:2:2", "4:2:0", "GRAY", "4:4:0" }; - static final String subName[] = { + static final String[] subName = { "444", "422", "420", "GRAY", "440" }; static TJScalingFactor sf; - static int nsf = 0; static int xformOp = TJTransform.OP_NONE, xformOpt = 0; static double benchTime = 5.0; - static final double getTime() - { + static final double getTime() { return (double)System.nanoTime() / 1.0e9; } - static String sigFig(double val, int figs) - { + static String sigFig(double val, int figs) { String format; int digitsAfterDecimal = figs - (int)Math.ceil(Math.log10(Math.abs(val))); if (digitsAfterDecimal < 1) @@ -76,19 +73,18 @@ class TJBench } - static byte[] loadImage(String fileName, int[] w, int[] h, int pf) - throws Exception - { + static byte[] loadImage(String fileName, int[] w, int[] h, int pixelFormat) + throws Exception { BufferedImage img = ImageIO.read(new File(fileName)); if (img == null) throw new Exception("Could not read " + fileName); w[0] = img.getWidth(); h[0] = img.getHeight(); - int rgb[] = img.getRGB(0, 0, w[0], h[0], null, 0, w[0]); - int ps = TJ.getPixelSize(pf); - int rindex = TJ.getRedOffset(pf); - int gindex = TJ.getGreenOffset(pf); - int bindex = TJ.getBlueOffset(pf); + int[] rgb = img.getRGB(0, 0, w[0], h[0], null, 0, w[0]); + int ps = TJ.getPixelSize(pixelFormat); + int rindex = TJ.getRedOffset(pixelFormat); + int gindex = TJ.getGreenOffset(pixelFormat); + int bindex = TJ.getBlueOffset(pixelFormat); byte[] dstBuf = new byte[w[0] * h[0] * ps]; int pixels = w[0] * h[0], dstPtr = 0, rgbPtr = 0; while (pixels-- > 0) { @@ -102,15 +98,14 @@ class TJBench } - static void saveImage(String fileName, byte[] srcBuf, int w, int h, int pf) - throws Exception - { + static void saveImage(String fileName, byte[] srcBuf, int w, int h, + int pixelFormat) throws Exception { BufferedImage img = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB); int pixels = w * h, srcPtr = 0; - int ps = TJ.getPixelSize(pf); - int rindex = TJ.getRedOffset(pf); - int gindex = TJ.getGreenOffset(pf); - int bindex = TJ.getBlueOffset(pf); + int ps = TJ.getPixelSize(pixelFormat); + int rindex = TJ.getRedOffset(pixelFormat); + int gindex = TJ.getGreenOffset(pixelFormat); + int bindex = TJ.getBlueOffset(pixelFormat); for (int y = 0; y < h; y++) { for (int x = 0; x < w; x++, srcPtr += ps) { int pixel = (srcBuf[srcPtr + rindex] & 0xff) << 16 | @@ -127,8 +122,7 @@ class TJBench static void decompTest(byte[] srcBuf, byte[][] jpegBuf, int[] jpegSize, byte[] dstBuf, int w, int h, int subsamp, int jpegQual, String fileName, int tilew, int tileh) - throws Exception - { + throws Exception { String qualStr = new String(""), sizeStr, tempStr; TJDecompressor tjd; double start, elapsed; @@ -137,12 +131,12 @@ class TJBench int scaledw = (yuv == YUVDECODE) ? w : sf.getScaled(w); int scaledh = (yuv == YUVDECODE) ? h : sf.getScaled(h); int pitch = scaledw * ps; - + if (jpegQual > 0) qualStr = new String("_Q" + jpegQual); - + tjd = new TJDecompressor(); - + int bufSize = (yuv == YUVDECODE ? yuvSize : pitch * scaledh); if (dstBuf == null) dstBuf = new byte[bufSize]; @@ -150,18 +144,18 @@ class TJBench /* Set the destination buffer to gray so we know whether the decompressor attempted to write to it */ Arrays.fill(dstBuf, (byte)127); - + /* Execute once to preload cache */ tjd.setJPEGImage(jpegBuf[0], jpegSize[0]); if (yuv == YUVDECODE) tjd.decompressToYUV(dstBuf, flags); else tjd.decompress(dstBuf, scaledw, pitch, scaledh, pf, flags); - + /* Benchmark */ for (i = 0, start = getTime(); (elapsed = getTime() - start) < benchTime; i++) { - int tile=0; + int tile = 0; if (yuv == YUVDECODE) tjd.decompressToYUV(dstBuf, flags); else { @@ -188,7 +182,7 @@ class TJBench System.out.format(" Dest. throughput: %f Megapixels/sec\n", (double)(w * h) / 1000000. * (double)i / elapsed); } - + if (yuv == YUVDECODE) { tempStr = fileName + "_" + subName[subsamp] + qualStr + ".yuv"; FileOutputStream fos = new FileOutputStream(tempStr); @@ -221,7 +215,8 @@ class TJBench int lum = (int)((double)(srcBuf[rindex] & 0xff) * 0.299 + (double)(srcBuf[gindex] & 0xff) * 0.587 + (double)(srcBuf[bindex] & 0xff) * 0.114 + 0.5); - if (lum > 255) lum = 255; if (lum < 0) lum = 0; + if (lum > 255) lum = 255; + if (lum < 0) lum = 0; dstBuf[rindex] = (byte)Math.abs((dstBuf[rindex] & 0xff) - lum); dstBuf[gindex] = (byte)Math.abs((dstBuf[gindex] & 0xff) - lum); dstBuf[bindex] = (byte)Math.abs((dstBuf[bindex] & 0xff) - lum); @@ -241,39 +236,38 @@ class TJBench static void doTestYUV(byte[] srcBuf, int w, int h, int subsamp, - String fileName) throws Exception - { + 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) { @@ -301,11 +295,10 @@ class TJBench 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; byte[] tmpBuf; byte[][] jpegBuf; @@ -313,12 +306,12 @@ class TJBench double start, elapsed; int totalJpegSize = 0, tilew, tileh, i; int ps = TJ.getPixelSize(pf), ntilesw = 1, ntilesh = 1, pitch = w * ps; - + if (yuv == YUVENCODE) { doTestYUV(srcBuf, w, h, subsamp, fileName); return; } - + tmpBuf = new byte[pitch * h]; if (quiet == 0) @@ -328,7 +321,7 @@ class TJBench subNameLong[subsamp], jpegQual); tjc = new TJCompressor(); - + for (tilew = doTile ? 8 : w, tileh = doTile ? 8 : h; ; tilew *= 2, tileh *= 2) { if (tilew > w) @@ -340,7 +333,7 @@ class TJBench jpegBuf = new byte[ntilesw * ntilesh][TJ.bufSize(tilew, tileh, subsamp)]; jpegSize = new int[ntilesw * ntilesh]; - + /* Compression test */ if (quiet == 1) System.out.format("%s\t%s\t%s\t%d\t", pixFormatStr[pf], @@ -354,7 +347,7 @@ class TJBench /* Execute once to preload cache */ tjc.compress(jpegBuf[0], flags); - + /* Benchmark */ for (i = 0, start = getTime(); (elapsed = getTime() - start) < benchTime; i++) { @@ -403,11 +396,11 @@ class TJBench if (quiet == 0) System.out.println("Reference image written to " + tempStr); } - + /* Decompression test */ decompTest(srcBuf, jpegBuf, jpegSize, tmpBuf, w, h, subsamp, jpegQual, fileName, tilew, tileh); - + for (i = 0; i < ntilesw * ntilesh; i++) jpegBuf[i] = null; jpegBuf = null; jpegSize = null; @@ -418,8 +411,7 @@ class TJBench } - static void doDecompTest(String fileName) throws Exception - { + static void doDecompTest(String fileName) throws Exception { TJTransformer tjt; byte[][] jpegBuf; byte[] srcBuf; @@ -430,7 +422,7 @@ class TJBench int ntilesw = 1, ntilesh = 1; double start, elapsed; int ps = TJ.getPixelSize(pf), tile; - + FileInputStream fis = new FileInputStream(fileName); int srcSize = (int)fis.getChannel().size(); srcBuf = new byte[srcSize]; @@ -447,7 +439,7 @@ class TJBench w = tjt.getWidth(); h = tjt.getHeight(); subsamp = tjt.getSubsamp(); - + if (quiet == 1) { System.out.println("All performance values in Mpixels/sec\n"); System.out.format("Bitmap\tBitmap\tJPEG\t%s %s \tXform\tComp\tDecomp\n", @@ -459,7 +451,7 @@ class TJBench subNameLong[subsamp], pixFormatStr[pf], (flags & TJ.FLAG_BOTTOMUP) != 0 ? "Bottom-up" : "Top-down"); } - + for (int tilew = doTile ? 16 : w, tileh = doTile ? 16 : h; ; tilew *= 2, tileh *= 2) { if (tilew > w) @@ -468,7 +460,7 @@ class TJBench tileh = h; ntilesw = (w + tilew - 1) / tilew; ntilesh = (h + tileh - 1) / tileh; - + _w = w; _h = h; _tilew = tilew; _tileh = tileh; if (quiet == 0) { System.out.format("\n%s size: %d x %d", (doTile ? "Tile" : "Image"), @@ -477,13 +469,13 @@ class TJBench System.out.format(" --> %d x %d", sf.getScaled(_w), sf.getScaled(_h)); System.out.println(""); - } else if (quiet==1) { + } else if (quiet == 1) { System.out.format("%s\t%s\t%s\t", pixFormatStr[pf], (flags & TJ.FLAG_BOTTOMUP) != 0 ? "BU" : "TD", subNameLong[subsamp]); System.out.format("%-4d %-4d\t", tilew, tileh); } - + _subsamp = subsamp; if (doTile || xformOp != TJTransform.OP_NONE || xformOpt != 0) { if (xformOp == TJTransform.OP_TRANSPOSE || @@ -492,7 +484,7 @@ class TJBench xformOp == TJTransform.OP_ROT270) { _w = h; _h = w; _tilew = tileh; _tileh = tilew; } - + if ((xformOpt & TJTransform.OPT_GRAY) != 0) _subsamp = TJ.SAMP_GRAY; if (xformOp == TJTransform.OP_HFLIP || @@ -509,8 +501,8 @@ class TJBench _h = _h - (_h % TJ.getMCUWidth(_subsamp)); _ntilesw = (_w + _tilew - 1) / _tilew; _ntilesh = (_h + _tileh - 1) / _tileh; - - TJTransform t[] = new TJTransform[_ntilesw * _ntilesh]; + + TJTransform[] t = new TJTransform[_ntilesw * _ntilesh]; jpegBuf = new byte[_ntilesw * _ntilesh][TJ.bufSize(_tilew, _tileh, subsamp)]; for (y = 0, tile = 0; y < _h; y += _tileh) { @@ -527,17 +519,17 @@ class TJBench jpegBuf[tile] = null; } } - + start = getTime(); tjt.transform(jpegBuf, t, flags); jpegSize = tjt.getTransformedSizes(); elapsed = getTime() - start; - + t = null; - + for (tile = 0, totalJpegSize = 0; tile < _ntilesw * _ntilesh; tile++) totalJpegSize += jpegSize[tile]; - + if (quiet != 0) { System.out.format("%s%c%s%c", sigFig((double)(w * h) / 1000000. / elapsed, 4), @@ -564,7 +556,7 @@ class TJBench jpegSize[0] = srcSize; System.arraycopy(srcBuf, 0, jpegBuf[0], 0, srcSize); } - + if (w == tilew) _tilew = _w; if (h == tileh) @@ -574,19 +566,18 @@ class TJBench fileName, _tilew, _tileh); else if (quiet == 1) System.out.println("N/A"); - + jpegBuf = null; jpegSize = null; - + if (tilew == w && tileh == h) break; } } - - - static void usage() throws Exception - { + + + static void usage() throws Exception { int i; - TJScalingFactor scalingFactors[] = TJ.getScalingFactors(); + TJScalingFactor[] scalingFactors = TJ.getScalingFactors(); int nsf = scalingFactors.length; String className = new TJBench().getClass().getName(); @@ -639,224 +630,223 @@ class TJBench System.out.println("test will be performed for all quality values in the range.\n"); System.exit(1); } - - - public static void main(String argv[]) - { + + + public static void main(String[] argv) { byte[] srcBuf = null; int w = 0, h = 0; int minQual = -1, maxQual = -1; int minArg = 1; int retval = 0; try { - if (argv.length < minArg) - usage(); - - String tempStr = argv[0].toLowerCase(); - if (tempStr.endsWith(".jpg") || tempStr.endsWith(".jpeg")) - decompOnly = true; - - System.out.println(""); - - if (argv.length > minArg) { - 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 (argv.length < minArg) + usage(); + + String tempStr = argv[0].toLowerCase(); + if (tempStr.endsWith(".jpg") || tempStr.endsWith(".jpeg")) + decompOnly = true; + + System.out.println(""); + + if (argv.length > minArg) { + 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; - if (argv.length < minArg) - usage(); - try { - minQual = Integer.parseInt(argv[1]); - } catch (NumberFormatException e) {} - if (minQual < 1 || minQual > 100) - throw new Exception("Quality must be between 1 and 100."); - int dashIndex = argv[1].indexOf('-'); - if (dashIndex > 0 && argv[1].length() > dashIndex + 1) { + if (!decompOnly && yuv != YUVENCODE) { + minArg = 2; + if (argv.length < minArg) + usage(); try { - maxQual = Integer.parseInt(argv[1].substring(dashIndex + 1)); + minQual = Integer.parseInt(argv[1]); } catch (NumberFormatException e) {} - } - if (maxQual < 1 || maxQual > 100) - maxQual = minQual; - } - - if (argv.length > minArg) { - for (int i = minArg; i < argv.length; i++) { - if (argv[i].equalsIgnoreCase("-tile")) { - 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")) { - System.out.println("Using fast upsampling code\n"); - flags |= TJ.FLAG_FASTUPSAMPLE; - } - if (argv[i].equalsIgnoreCase("-fastdct")) { - System.out.println("Using fastest DCT/IDCT algorithm\n"); - flags |= TJ.FLAG_FASTDCT; - } - if (argv[i].equalsIgnoreCase("-accuratedct")) { - System.out.println("Using most accurate DCT/IDCT algorithm\n"); - flags |= TJ.FLAG_ACCURATEDCT; - } - if (argv[i].equalsIgnoreCase("-rgb")) - pf = TJ.PF_RGB; - if (argv[i].equalsIgnoreCase("-rgbx")) - pf = TJ.PF_RGBX; - if (argv[i].equalsIgnoreCase("-bgr")) - pf = TJ.PF_BGR; - if (argv[i].equalsIgnoreCase("-bgrx")) - pf = TJ.PF_BGRX; - if (argv[i].equalsIgnoreCase("-xbgr")) - pf = TJ.PF_XBGR; - if (argv[i].equalsIgnoreCase("-xrgb")) - pf = TJ.PF_XRGB; - if (argv[i].equalsIgnoreCase("-bottomup")) - flags |= TJ.FLAG_BOTTOMUP; - if (argv[i].equalsIgnoreCase("-quiet")) - quiet = 1; - if (argv[i].equalsIgnoreCase("-qq")) - quiet = 2; - if (argv[i].equalsIgnoreCase("-scale") && i < argv.length - 1) { - int temp1 = 0, temp2 = 0; - boolean match = false, scanned = true; - Scanner scanner = new Scanner(argv[++i]).useDelimiter("/"); + if (minQual < 1 || minQual > 100) + throw new Exception("Quality must be between 1 and 100."); + int dashIndex = argv[1].indexOf('-'); + if (dashIndex > 0 && argv[1].length() > dashIndex + 1) { try { - temp1 = scanner.nextInt(); - temp2 = scanner.nextInt(); - } catch(Exception e) {} - if (temp2 <= 0) temp2 = 1; - if (temp1 > 0) { - TJScalingFactor scalingFactors[] = TJ.getScalingFactors(); - for (int j = 0; j < scalingFactors.length; j++) { - if ((double)temp1 / (double)temp2 == - (double)scalingFactors[j].getNum() / - (double)scalingFactors[j].getDenom()) { - sf = scalingFactors[j]; - match = true; break; - } - } - if (!match) usage(); - } else - usage(); - } - if (argv[i].equalsIgnoreCase("-hflip")) - xformOp = TJTransform.OP_HFLIP; - if (argv[i].equalsIgnoreCase("-vflip")) - xformOp = TJTransform.OP_VFLIP; - if (argv[i].equalsIgnoreCase("-transpose")) - xformOp = TJTransform.OP_TRANSPOSE; - if (argv[i].equalsIgnoreCase("-transverse")) - xformOp = TJTransform.OP_TRANSVERSE; - if (argv[i].equalsIgnoreCase("-rot90")) - xformOp = TJTransform.OP_ROT90; - if (argv[i].equalsIgnoreCase("-rot180")) - xformOp = TJTransform.OP_ROT180; - if (argv[i].equalsIgnoreCase("-rot270")) - xformOp = TJTransform.OP_ROT270; - if (argv[i].equalsIgnoreCase("-grayscale")) - xformOpt |= TJTransform.OPT_GRAY; - if (argv[i].equalsIgnoreCase("-nooutput")) - xformOpt |= TJTransform.OPT_NOOUTPUT; - if (argv[i].equalsIgnoreCase("-benchtime") && i < argv.length - 1) { - double temp = -1; - try { - temp = Double.parseDouble(argv[++i]); + maxQual = Integer.parseInt(argv[1].substring(dashIndex + 1)); } catch (NumberFormatException e) {} - if (temp > 0.0) - benchTime = temp; - else + } + if (maxQual < 1 || maxQual > 100) + maxQual = minQual; + } + + if (argv.length > minArg) { + for (int i = minArg; i < argv.length; i++) { + if (argv[i].equalsIgnoreCase("-tile")) { + 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")) { + System.out.println("Using fast upsampling code\n"); + flags |= TJ.FLAG_FASTUPSAMPLE; + } + if (argv[i].equalsIgnoreCase("-fastdct")) { + System.out.println("Using fastest DCT/IDCT algorithm\n"); + flags |= TJ.FLAG_FASTDCT; + } + if (argv[i].equalsIgnoreCase("-accuratedct")) { + System.out.println("Using most accurate DCT/IDCT algorithm\n"); + flags |= TJ.FLAG_ACCURATEDCT; + } + if (argv[i].equalsIgnoreCase("-rgb")) + pf = TJ.PF_RGB; + if (argv[i].equalsIgnoreCase("-rgbx")) + pf = TJ.PF_RGBX; + if (argv[i].equalsIgnoreCase("-bgr")) + pf = TJ.PF_BGR; + if (argv[i].equalsIgnoreCase("-bgrx")) + pf = TJ.PF_BGRX; + if (argv[i].equalsIgnoreCase("-xbgr")) + pf = TJ.PF_XBGR; + if (argv[i].equalsIgnoreCase("-xrgb")) + pf = TJ.PF_XRGB; + if (argv[i].equalsIgnoreCase("-bottomup")) + flags |= TJ.FLAG_BOTTOMUP; + if (argv[i].equalsIgnoreCase("-quiet")) + quiet = 1; + if (argv[i].equalsIgnoreCase("-qq")) + quiet = 2; + if (argv[i].equalsIgnoreCase("-scale") && i < argv.length - 1) { + int temp1 = 0, temp2 = 0; + boolean match = false, scanned = true; + Scanner scanner = new Scanner(argv[++i]).useDelimiter("/"); + try { + temp1 = scanner.nextInt(); + temp2 = scanner.nextInt(); + } catch(Exception e) {} + if (temp2 <= 0) temp2 = 1; + if (temp1 > 0) { + TJScalingFactor[] scalingFactors = TJ.getScalingFactors(); + for (int j = 0; j < scalingFactors.length; j++) { + if ((double)temp1 / (double)temp2 == + (double)scalingFactors[j].getNum() / + (double)scalingFactors[j].getDenom()) { + sf = scalingFactors[j]; + match = true; break; + } + } + if (!match) usage(); + } else + usage(); + } + if (argv[i].equalsIgnoreCase("-hflip")) + xformOp = TJTransform.OP_HFLIP; + if (argv[i].equalsIgnoreCase("-vflip")) + xformOp = TJTransform.OP_VFLIP; + if (argv[i].equalsIgnoreCase("-transpose")) + xformOp = TJTransform.OP_TRANSPOSE; + if (argv[i].equalsIgnoreCase("-transverse")) + xformOp = TJTransform.OP_TRANSVERSE; + if (argv[i].equalsIgnoreCase("-rot90")) + xformOp = TJTransform.OP_ROT90; + if (argv[i].equalsIgnoreCase("-rot180")) + xformOp = TJTransform.OP_ROT180; + if (argv[i].equalsIgnoreCase("-rot270")) + xformOp = TJTransform.OP_ROT270; + if (argv[i].equalsIgnoreCase("-grayscale")) + xformOpt |= TJTransform.OPT_GRAY; + if (argv[i].equalsIgnoreCase("-nooutput")) + xformOpt |= TJTransform.OPT_NOOUTPUT; + if (argv[i].equalsIgnoreCase("-benchtime") && i < argv.length - 1) { + double temp = -1; + try { + temp = Double.parseDouble(argv[++i]); + } catch (NumberFormatException e) {} + if (temp > 0.0) + benchTime = temp; + else + usage(); + } + if (argv[i].equalsIgnoreCase("-?")) usage(); } - if (argv[i].equalsIgnoreCase("-?")) - usage(); } - } - if (sf == null) - sf = new TJScalingFactor(1, 1); - - if ((sf.getNum() != 1 || sf.getDenom() != 1) && doTile) { - System.out.println("Disabling tiled compression/decompression tests, because those tests do not"); - System.out.println("work when scaled decompression is enabled."); - 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 or decoding is enabled.\n"); - doTile = false; - } - - if (!decompOnly) { - int[] width = new int[1], height = new int[1]; - srcBuf = loadImage(argv[0], width, height, pf); - w = width[0]; h = height[0]; - int index = -1; - if ((index = argv[0].indexOf('.')) >= 0) - argv[0] = argv[0].substring(0, index); - } - - if (quiet == 1 && !decompOnly) { - System.out.println("All performance values in Mpixels/sec\n"); - System.out.format("Bitmap\tBitmap\tJPEG\tJPEG\t%s %s \tComp\tComp\tDecomp\n", - (doTile ? "Tile " : "Image"), (doTile ? "Tile " : "Image")); - System.out.println("Format\tOrder\tSubsamp\tQual\tWidth Height\tPerf \tRatio\tPerf\n"); - } - - if (decompOnly) { - doDecompTest(argv[0]); - System.out.println(""); - System.exit(retval); - } + if (sf == null) + sf = new TJScalingFactor(1, 1); - System.gc(); - for (int i = maxQual; i >= minQual; i--) - doTest(srcBuf, w, h, TJ.SAMP_GRAY, i, argv[0]); - System.out.println(""); - System.gc(); - for (int i = maxQual; i >= minQual; i--) - doTest(srcBuf, w, h, TJ.SAMP_420, i, argv[0]); - System.out.println(""); - System.gc(); - for (int i = maxQual; i >= minQual; i--) - doTest(srcBuf, w, h, TJ.SAMP_422, i, argv[0]); - System.out.println(""); - System.gc(); - for (int i = maxQual; i >= minQual; i--) - doTest(srcBuf, w, h, TJ.SAMP_444, i, argv[0]); - System.out.println(""); + if ((sf.getNum() != 1 || sf.getDenom() != 1) && doTile) { + System.out.println("Disabling tiled compression/decompression tests, because those tests do not"); + System.out.println("work when scaled decompression is enabled."); + 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 or decoding is enabled.\n"); + doTile = false; + } + + if (!decompOnly) { + int[] width = new int[1], height = new int[1]; + srcBuf = loadImage(argv[0], width, height, pf); + w = width[0]; h = height[0]; + int index = -1; + if ((index = argv[0].indexOf('.')) >= 0) + argv[0] = argv[0].substring(0, index); + } + + if (quiet == 1 && !decompOnly) { + System.out.println("All performance values in Mpixels/sec\n"); + System.out.format("Bitmap\tBitmap\tJPEG\tJPEG\t%s %s \tComp\tComp\tDecomp\n", + (doTile ? "Tile " : "Image"), (doTile ? "Tile " : "Image")); + System.out.println("Format\tOrder\tSubsamp\tQual\tWidth Height\tPerf \tRatio\tPerf\n"); + } + + if (decompOnly) { + doDecompTest(argv[0]); + System.out.println(""); + System.exit(retval); + } + + System.gc(); + for (int i = maxQual; i >= minQual; i--) + doTest(srcBuf, w, h, TJ.SAMP_GRAY, i, argv[0]); + System.out.println(""); + System.gc(); + for (int i = maxQual; i >= minQual; i--) + doTest(srcBuf, w, h, TJ.SAMP_420, i, argv[0]); + System.out.println(""); + System.gc(); + for (int i = maxQual; i >= minQual; i--) + doTest(srcBuf, w, h, TJ.SAMP_422, i, argv[0]); + System.out.println(""); + System.gc(); + for (int i = maxQual; i >= minQual; i--) + doTest(srcBuf, w, h, TJ.SAMP_444, i, argv[0]); + System.out.println(""); } catch (Exception e) { System.out.println("ERROR: " + e.getMessage()); e.printStackTrace(); retval = -1; } - + System.exit(retval); } diff --git a/java/TJExample.java b/java/TJExample.java index 1480941..a4971a4 100644 --- a/java/TJExample.java +++ b/java/TJExample.java @@ -51,12 +51,15 @@ public class TJExample implements TJCustomFilter { System.out.println("Options:\n"); System.out.println("-scale M/N = if the input image is a JPEG file, scale the width/height of the"); System.out.print(" output image by a factor of M/N (M/N = "); - for(int i = 0; i < sf.length; i++) { + for (int i = 0; i < sf.length; i++) { System.out.print(sf[i].getNum() + "/" + sf[i].getDenom()); - if(sf.length == 2 && i != sf.length - 1) System.out.print(" or "); - else if(sf.length > 2) { - if(i != sf.length - 1) System.out.print(", "); - if(i == sf.length - 2) System.out.print("or "); + if (sf.length == 2 && i != sf.length - 1) + System.out.print(" or "); + else if (sf.length > 2) { + if (i != sf.length - 1) + System.out.print(", "); + if (i == sf.length - 2) + System.out.print("or "); } } System.out.println(")\n"); @@ -90,13 +93,14 @@ public class TJExample implements TJCustomFilter { System.exit(1); } - private final static String sampName[] = { + private static final String[] sampName = { "4:4:4", "4:2:2", "4:2:0", "Grayscale", "4:4:0" }; - public static void main(String argv[]) { + public static void main(String[] argv) { - BufferedImage img = null; byte[] bmpBuf = null; + BufferedImage img = null; + byte[] bmpBuf = null; TJTransform xform = new TJTransform(); int flags = 0; @@ -104,7 +108,7 @@ public class TJExample implements TJCustomFilter { sf = TJ.getScalingFactors(); - if(argv.length < 2) { + if (argv.length < 2) { usage(); } @@ -113,119 +117,134 @@ public class TJExample implements TJCustomFilter { int outSubsamp = -1, outQual = 95; boolean display = false; - if(argv.length > 1) { - for(int i = 1; i < argv.length; i++) { - if(argv[i].length() < 2) continue; - if(argv[i].length() > 2 - && argv[i].substring(0, 3).equalsIgnoreCase("-sc")) { + if (argv.length > 1) { + for (int i = 1; i < argv.length; i++) { + if (argv[i].length() < 2) + continue; + if (argv[i].length() > 2 && + argv[i].substring(0, 3).equalsIgnoreCase("-sc")) { int match = 0; - if(i < argv.length - 1) { + if (i < argv.length - 1) { String[] scaleArg = argv[++i].split("/"); - if(scaleArg.length == 2) { + if (scaleArg.length == 2) { TJScalingFactor tempsf = new TJScalingFactor(Integer.parseInt(scaleArg[0]), - Integer.parseInt(scaleArg[1])); - for(int j = 0; j < sf.length; j++) { - if(tempsf.equals(sf[j])) { + Integer.parseInt(scaleArg[1])); + for (int j = 0; j < sf.length; j++) { + if (tempsf.equals(sf[j])) { scaleFactor = sf[j]; - match = 1; break; + match = 1; + break; } } } } - if(match != 1) usage(); + if (match != 1) usage(); } - if(argv[i].equalsIgnoreCase("-h") || argv[i].equalsIgnoreCase("-?")) + if (argv[i].equalsIgnoreCase("-h") || argv[i].equalsIgnoreCase("-?")) usage(); - if(argv[i].length() > 2 - && argv[i].substring(0, 3).equalsIgnoreCase("-sa")) { - if(i < argv.length - 1) { + if (argv[i].length() > 2 && + argv[i].substring(0, 3).equalsIgnoreCase("-sa")) { + if (i < argv.length - 1) { i++; - if(argv[i].substring(0, 1).equalsIgnoreCase("g")) + if (argv[i].substring(0, 1).equalsIgnoreCase("g")) outSubsamp = TJ.SAMP_GRAY; - else if(argv[i].equals("444")) outSubsamp = TJ.SAMP_444; - else if(argv[i].equals("422")) outSubsamp = TJ.SAMP_422; - else if(argv[i].equals("420")) outSubsamp = TJ.SAMP_420; - else usage(); - } - else usage(); + else if (argv[i].equals("444")) + outSubsamp = TJ.SAMP_444; + else if (argv[i].equals("422")) + outSubsamp = TJ.SAMP_422; + else if (argv[i].equals("420")) + outSubsamp = TJ.SAMP_420; + else + usage(); + } else + usage(); } - if(argv[i].substring(0, 2).equalsIgnoreCase("-q")) { - if(i < argv.length - 1) { + if (argv[i].substring(0, 2).equalsIgnoreCase("-q")) { + if (i < argv.length - 1) { int qual = Integer.parseInt(argv[++i]); - if(qual >= 1 && qual <= 100) outQual = qual; - else usage(); - } - else usage(); + if (qual >= 1 && qual <= 100) + outQual = qual; + else + usage(); + } else + usage(); } - if(argv[i].substring(0, 2).equalsIgnoreCase("-g")) + if (argv[i].substring(0, 2).equalsIgnoreCase("-g")) xform.options |= TJTransform.OPT_GRAY; - if(argv[i].equalsIgnoreCase("-hflip")) + if (argv[i].equalsIgnoreCase("-hflip")) xform.op = TJTransform.OP_HFLIP; - if(argv[i].equalsIgnoreCase("-vflip")) + if (argv[i].equalsIgnoreCase("-vflip")) xform.op = TJTransform.OP_VFLIP; - if(argv[i].equalsIgnoreCase("-transpose")) + if (argv[i].equalsIgnoreCase("-transpose")) xform.op = TJTransform.OP_TRANSPOSE; - if(argv[i].equalsIgnoreCase("-transverse")) + if (argv[i].equalsIgnoreCase("-transverse")) xform.op = TJTransform.OP_TRANSVERSE; - if(argv[i].equalsIgnoreCase("-rot90")) + if (argv[i].equalsIgnoreCase("-rot90")) xform.op = TJTransform.OP_ROT90; - if(argv[i].equalsIgnoreCase("-rot180")) + if (argv[i].equalsIgnoreCase("-rot180")) xform.op = TJTransform.OP_ROT180; - if(argv[i].equalsIgnoreCase("-rot270")) + if (argv[i].equalsIgnoreCase("-rot270")) xform.op = TJTransform.OP_ROT270; - if(argv[i].equalsIgnoreCase("-custom")) + if (argv[i].equalsIgnoreCase("-custom")) xform.cf = new TJExample(); - else if(argv[i].length() > 2 - && argv[i].substring(0, 2).equalsIgnoreCase("-c")) { - if(i >= argv.length - 1) usage(); + else if (argv[i].length() > 2 && + argv[i].substring(0, 2).equalsIgnoreCase("-c")) { + if (i >= argv.length - 1) + usage(); String[] cropArg = argv[++i].split(","); - if(cropArg.length != 3) usage(); + if (cropArg.length != 3) + usage(); String[] dimArg = cropArg[2].split("[xX]"); - if(dimArg.length != 2) usage(); + if (dimArg.length != 2) + usage(); int tempx = Integer.parseInt(cropArg[0]); int tempy = Integer.parseInt(cropArg[1]); int tempw = Integer.parseInt(dimArg[0]); int temph = Integer.parseInt(dimArg[1]); - if(tempx < 0 || tempy < 0 || tempw < 0 || temph < 0) usage(); - xform.x = tempx; xform.y = tempy; - xform.width = tempw; xform.height = temph; + if (tempx < 0 || tempy < 0 || tempw < 0 || temph < 0) + usage(); + xform.x = tempx; + xform.y = tempy; + xform.width = tempw; + xform.height = temph; xform.options |= TJTransform.OPT_CROP; } - if(argv[i].substring(0, 2).equalsIgnoreCase("-d")) + if (argv[i].substring(0, 2).equalsIgnoreCase("-d")) display = true; - if(argv[i].equalsIgnoreCase("-fastupsample")) { + if (argv[i].equalsIgnoreCase("-fastupsample")) { System.out.println("Using fast upsampling code"); flags |= TJ.FLAG_FASTUPSAMPLE; } - if(argv[i].equalsIgnoreCase("-fastdct")) { + if (argv[i].equalsIgnoreCase("-fastdct")) { System.out.println("Using fastest DCT/IDCT algorithm"); flags |= TJ.FLAG_FASTDCT; } - if(argv[i].equalsIgnoreCase("-accuratedct")) { + if (argv[i].equalsIgnoreCase("-accuratedct")) { System.out.println("Using most accurate DCT/IDCT algorithm"); flags |= TJ.FLAG_ACCURATEDCT; } } } String[] inFileTokens = argv[0].split("\\."); - if(inFileTokens.length > 1) + if (inFileTokens.length > 1) inFormat = inFileTokens[inFileTokens.length - 1]; String[] outFileTokens; - if(display) outFormat = "bmp"; + if (display) + outFormat = "bmp"; else { outFileTokens = argv[1].split("\\."); - if(outFileTokens.length > 1) + if (outFileTokens.length > 1) outFormat = outFileTokens[outFileTokens.length - 1]; } File file = new File(argv[0]); int width, height; - if(inFormat.equalsIgnoreCase("jpg")) { + if (inFormat.equalsIgnoreCase("jpg")) { FileInputStream fis = new FileInputStream(file); int inputSize = fis.available(); - if(inputSize < 1) { + if (inputSize < 1) { System.out.println("Input file contains no data"); System.exit(1); } @@ -234,27 +253,28 @@ public class TJExample implements TJCustomFilter { fis.close(); TJDecompressor tjd; - if(xform.op != TJTransform.OP_NONE || xform.options != 0 - || xform.cf != null) { + if (xform.op != TJTransform.OP_NONE || xform.options != 0 || + xform.cf != null) { TJTransformer tjt = new TJTransformer(inputBuf); - TJTransform t[] = new TJTransform[1]; + TJTransform[] t = new TJTransform[1]; t[0] = xform; t[0].options |= TJTransform.OPT_TRIM; TJDecompressor[] tjdx = tjt.transform(t, 0); tjd = tjdx[0]; - } - else tjd = new TJDecompressor(inputBuf); + } else + tjd = new TJDecompressor(inputBuf); width = tjd.getWidth(); height = tjd.getHeight(); int inSubsamp = tjd.getSubsamp(); - System.out.println("Source Image: " + width + " x " + height - + " pixels, " + sampName[inSubsamp] + " subsampling"); - if(outSubsamp < 0) outSubsamp = inSubsamp; + System.out.println("Source Image: " + width + " x " + height + + " pixels, " + sampName[inSubsamp] + " subsampling"); + if (outSubsamp < 0) + outSubsamp = inSubsamp; - if(outFormat.equalsIgnoreCase("jpg") - && (xform.op != TJTransform.OP_NONE || xform.options != 0) - && scaleFactor.isOne()) { + if (outFormat.equalsIgnoreCase("jpg") && + (xform.op != TJTransform.OP_NONE || xform.options != 0) && + scaleFactor.isOne()) { file = new File(argv[1]); FileOutputStream fos = new FileOutputStream(file); fos.write(tjd.getJPEGBuf(), 0, tjd.getJPEGSize()); @@ -265,45 +285,45 @@ public class TJExample implements TJCustomFilter { width = scaleFactor.getScaled(width); height = scaleFactor.getScaled(height); - if(!outFormat.equalsIgnoreCase("jpg")) + if (!outFormat.equalsIgnoreCase("jpg")) img = tjd.decompress(width, height, BufferedImage.TYPE_INT_RGB, flags); - else bmpBuf = tjd.decompress(width, 0, height, TJ.PF_BGRX, flags); + else + bmpBuf = tjd.decompress(width, 0, height, TJ.PF_BGRX, flags); tjd.close(); - } - else { + } else { img = ImageIO.read(file); if (img == null) throw new Exception("Input image type not supported."); width = img.getWidth(); height = img.getHeight(); - if(outSubsamp < 0) { - if(img.getType() == BufferedImage.TYPE_BYTE_GRAY) + if (outSubsamp < 0) { + if (img.getType() == BufferedImage.TYPE_BYTE_GRAY) outSubsamp = TJ.SAMP_GRAY; - else outSubsamp = TJ.SAMP_444; + else + outSubsamp = TJ.SAMP_444; } } System.gc(); - if(!display) - System.out.print("Dest. Image (" + outFormat + "): " + width + " x " - + height + " pixels"); + if (!display) + System.out.print("Dest. Image (" + outFormat + "): " + width + " x " + + height + " pixels"); - if(display) { + if (display) { ImageIcon icon = new ImageIcon(img); JLabel label = new JLabel(icon, JLabel.CENTER); JOptionPane.showMessageDialog(null, label, "Output Image", - JOptionPane.PLAIN_MESSAGE); - } - else if(outFormat.equalsIgnoreCase("jpg")) { - System.out.println(", " + sampName[outSubsamp] - + " subsampling, quality = " + outQual); + JOptionPane.PLAIN_MESSAGE); + } else if (outFormat.equalsIgnoreCase("jpg")) { + System.out.println(", " + sampName[outSubsamp] + + " subsampling, quality = " + outQual); TJCompressor tjc = new TJCompressor(); int jpegSize; byte[] jpegBuf; tjc.setSubsamp(outSubsamp); tjc.setJPEGQuality(outQual); - if(img != null) + if (img != null) jpegBuf = tjc.compress(img, flags); else { tjc.setSourceImage(bmpBuf, width, 0, height, TJ.PF_BGRX); @@ -316,27 +336,26 @@ public class TJExample implements TJCustomFilter { FileOutputStream fos = new FileOutputStream(file); fos.write(jpegBuf, 0, jpegSize); fos.close(); - } - else { + } else { System.out.print("\n"); file = new File(argv[1]); ImageIO.write(img, outFormat, file); } - } - catch(Exception e) { + } catch(Exception e) { e.printStackTrace(); System.exit(-1); } } public void customFilter(ShortBuffer coeffBuffer, Rectangle bufferRegion, - Rectangle planeRegion, int componentIndex, int transformIndex, - TJTransform transform) throws Exception { - for(int i=0; i= halfway) buf[index + goffset] = (byte)255; + if (row >= halfway) + buf[index + goffset] = (byte)255; } - if (aoffset >= 0) buf[index + aoffset] = (byte)255; + if (aoffset >= 0) + buf[index + aoffset] = (byte)255; } } } private static void initIntBuf(int[] buf, int w, int pitch, int h, int pf, - int flags) throws Exception { + int flags) throws Exception { int rshift = TJ.getRedOffset(pf) * 8; int gshift = TJ.getGreenOffset(pf) * 8; int bshift = TJ.getBlueOffset(pf) * 8; @@ -207,43 +210,44 @@ public class TJUnitTest { int index, row, col, halfway = 16; Arrays.fill(buf, 0); - for(row = 0; row < h; row++) { - for(col = 0; col < w; col++) { - if((flags & TJ.FLAG_BOTTOMUP) != 0) + for (row = 0; row < h; row++) { + for (col = 0; col < w; col++) { + if ((flags & TJ.FLAG_BOTTOMUP) != 0) index = pitch * (h - row - 1) + col; - else index = pitch * row + col; - if(((row / 8) + (col / 8)) % 2 == 0) { - if(row < halfway) { + else + index = pitch * row + col; + if (((row / 8) + (col / 8)) % 2 == 0) { + if (row < halfway) { buf[index] |= (255 << rshift); buf[index] |= (255 << gshift); buf[index] |= (255 << bshift); } - } - else { + } else { buf[index] |= (255 << rshift); - if(row >= halfway) buf[index] |= (255 << gshift); + if (row >= halfway) + buf[index] |= (255 << gshift); } - if (ashift >= 0) buf[index] |= (255 << ashift); + if (ashift >= 0) + buf[index] |= (255 << ashift); } } } private static void initImg(BufferedImage img, int pf, int flags) - throws Exception { + throws Exception { WritableRaster wr = img.getRaster(); int imgType = img.getType(); - if(imgType == BufferedImage.TYPE_INT_RGB - || imgType == BufferedImage.TYPE_INT_BGR - || imgType == BufferedImage.TYPE_INT_ARGB - || imgType == BufferedImage.TYPE_INT_ARGB_PRE) { + if (imgType == BufferedImage.TYPE_INT_RGB || + imgType == BufferedImage.TYPE_INT_BGR || + imgType == BufferedImage.TYPE_INT_ARGB || + imgType == BufferedImage.TYPE_INT_ARGB_PRE) { SinglePixelPackedSampleModel sm = (SinglePixelPackedSampleModel)img.getSampleModel(); int pitch = sm.getScanlineStride(); DataBufferInt db = (DataBufferInt)wr.getDataBuffer(); int[] buf = db.getData(); initIntBuf(buf, img.getWidth(), pitch, img.getHeight(), pf, flags); - } - else { + } else { ComponentSampleModel sm = (ComponentSampleModel)img.getSampleModel(); int pitch = sm.getScanlineStride(); DataBufferByte db = (DataBufferByte)wr.getDataBuffer(); @@ -253,34 +257,35 @@ public class TJUnitTest { } private static void checkVal(int row, int col, int v, String vname, int cv) - throws Exception { + throws Exception { v = (v < 0) ? v + 256 : v; - if(v < cv - 1 || v > cv + 1) { - throw new Exception("\nComp. " + vname + " at " + row + "," + col - + " should be " + cv + ", not " + v + "\n"); + if (v < cv - 1 || v > cv + 1) { + throw new Exception("\nComp. " + vname + " at " + row + "," + col + + " should be " + cv + ", not " + v + "\n"); } } private static void checkVal0(int row, int col, int v, String vname) - throws Exception { + throws Exception { v = (v < 0) ? v + 256 : v; - if(v > 1) { - throw new Exception("\nComp. " + vname + " at " + row + "," + col - + " should be 0, not " + v + "\n"); + if (v > 1) { + throw new Exception("\nComp. " + vname + " at " + row + "," + col + + " should be 0, not " + v + "\n"); } } private static void checkVal255(int row, int col, int v, String vname) - throws Exception { + throws Exception { v = (v < 0) ? v + 256 : v; - if(v < 254) { - throw new Exception("\nComp. " + vname + " at " + row + "," + col - + " should be 255, not " + v + "\n"); + if (v < 254) { + throw new Exception("\nComp. " + vname + " at " + row + "," + col + + " should be 255, not " + v + "\n"); } } private static int checkBuf(byte[] buf, int w, int pitch, int h, int pf, - int subsamp, TJScalingFactor sf, int flags) throws Exception { + int subsamp, TJScalingFactor sf, int flags) + throws Exception { int roffset = TJ.getRedOffset(pf); int goffset = TJ.getGreenOffset(pf); int boffset = TJ.getBlueOffset(pf); @@ -291,68 +296,65 @@ public class TJUnitTest { int blockSize = 8 * sf.getNum() / sf.getDenom(); try { - for(row = 0; row < halfway; row++) { - for(col = 0; col < w; col++) { - if((flags & TJ.FLAG_BOTTOMUP) != 0) + for (row = 0; row < halfway; row++) { + for (col = 0; col < w; col++) { + if ((flags & TJ.FLAG_BOTTOMUP) != 0) index = pitch * (h - row - 1) + col * ps; - else index = pitch * row + col * ps; + else + index = pitch * row + col * ps; byte r = buf[index + roffset]; byte g = buf[index + goffset]; byte b = buf[index + boffset]; byte a = aoffset >= 0 ? buf[index + aoffset] : (byte)255; - if(((row / blockSize) + (col / blockSize)) % 2 == 0) { - if(row < halfway) { + if (((row / blockSize) + (col / blockSize)) % 2 == 0) { + if (row < halfway) { checkVal255(row, col, r, "R"); checkVal255(row, col, g, "G"); checkVal255(row, col, b, "B"); - } - else { + } else { checkVal0(row, col, r, "R"); checkVal0(row, col, g, "G"); checkVal0(row, col, b, "B"); } - } - else { - if(subsamp == TJ.SAMP_GRAY) { - if(row < halfway) { + } else { + if (subsamp == TJ.SAMP_GRAY) { + if (row < halfway) { checkVal(row, col, r, "R", 76); checkVal(row, col, g, "G", 76); checkVal(row, col, b, "B", 76); - } - else { + } else { checkVal(row, col, r, "R", 226); checkVal(row, col, g, "G", 226); checkVal(row, col, b, "B", 226); } - } - else { + } else { checkVal255(row, col, r, "R"); - if(row < halfway) { + if (row < halfway) { checkVal0(row, col, g, "G"); - } - else { + } else { checkVal255(row, col, g, "G"); } - checkVal0(row, col, b, "B"); + checkVal0(row, col, b, "B"); } } checkVal255(row, col, a, "A"); } } - } - catch(Exception e) { + } catch(Exception e) { System.out.println(e); retval = 0; } - if(retval == 0) { + if (retval == 0) { System.out.print("\n"); - for(row = 0; row < h; row++) { - for(col = 0; col < w; col++) { + for (row = 0; row < h; row++) { + for (col = 0; col < w; col++) { int r = buf[pitch * row + col * ps + roffset]; int g = buf[pitch * row + col * ps + goffset]; int b = buf[pitch * row + col * ps + boffset]; - if(r < 0) r += 256; if(g < 0) g += 256; if(b < 0) b += 256; + if (r < 0) r += 256; + if (g < 0) g += 256; + if (b < 0) b += 256; System.out.format("%3d/%3d/%3d ", r, g, b); } System.out.print("\n"); @@ -362,7 +364,8 @@ public class TJUnitTest { } private static int checkIntBuf(int[] buf, int w, int pitch, int h, int pf, - int subsamp, TJScalingFactor sf, int flags) throws Exception { + int subsamp, TJScalingFactor sf, int flags) + throws Exception { int rshift = TJ.getRedOffset(pf) * 8; int gshift = TJ.getGreenOffset(pf) * 8; int bshift = TJ.getBlueOffset(pf) * 8; @@ -372,46 +375,42 @@ public class TJUnitTest { int blockSize = 8 * sf.getNum() / sf.getDenom(); try { - for(row = 0; row < halfway; row++) { - for(col = 0; col < w; col++) { - if((flags & TJ.FLAG_BOTTOMUP) != 0) + for (row = 0; row < halfway; row++) { + for (col = 0; col < w; col++) { + if ((flags & TJ.FLAG_BOTTOMUP) != 0) index = pitch * (h - row - 1) + col; - else index = pitch * row + col; + else + index = pitch * row + col; int r = (buf[index] >> rshift) & 0xFF; int g = (buf[index] >> gshift) & 0xFF; int b = (buf[index] >> bshift) & 0xFF; int a = ashift >= 0 ? (buf[index] >> ashift) & 0xFF : 255; - if(((row / blockSize) + (col / blockSize)) % 2 == 0) { - if(row < halfway) { + if (((row / blockSize) + (col / blockSize)) % 2 == 0) { + if (row < halfway) { checkVal255(row, col, r, "R"); checkVal255(row, col, g, "G"); checkVal255(row, col, b, "B"); - } - else { + } else { checkVal0(row, col, r, "R"); checkVal0(row, col, g, "G"); checkVal0(row, col, b, "B"); } - } - else { - if(subsamp == TJ.SAMP_GRAY) { - if(row < halfway) { + } else { + if (subsamp == TJ.SAMP_GRAY) { + if (row < halfway) { checkVal(row, col, r, "R", 76); checkVal(row, col, g, "G", 76); checkVal(row, col, b, "B", 76); - } - else { + } else { checkVal(row, col, r, "R", 226); checkVal(row, col, g, "G", 226); checkVal(row, col, b, "B", 226); } - } - else { + } else { checkVal255(row, col, r, "R"); - if(row < halfway) { + if (row < halfway) { checkVal0(row, col, g, "G"); - } - else { + } else { checkVal255(row, col, g, "G"); } checkVal0(row, col, b, "B"); @@ -420,20 +419,21 @@ public class TJUnitTest { checkVal255(row, col, a, "A"); } } - } - catch(Exception e) { + } catch(Exception e) { System.out.println(e); retval = 0; } - if(retval == 0) { + if (retval == 0) { System.out.print("\n"); - for(row = 0; row < h; row++) { - for(col = 0; col < w; col++) { + for (row = 0; row < h; row++) { + for (col = 0; col < w; col++) { int r = (buf[pitch * row + col] >> rshift) & 0xFF; int g = (buf[pitch * row + col] >> gshift) & 0xFF; int b = (buf[pitch * row + col] >> bshift) & 0xFF; - if(r < 0) r += 256; if(g < 0) g += 256; if(b < 0) b += 256; + if (r < 0) r += 256; + if (g < 0) g += 256; + if (b < 0) b += 256; System.out.format("%3d/%3d/%3d ", r, g, b); } System.out.print("\n"); @@ -442,29 +442,28 @@ public class TJUnitTest { return retval; } - private static int checkImg(BufferedImage img, int pf, - int subsamp, TJScalingFactor sf, int flags) throws Exception { + private static int checkImg(BufferedImage img, int pf, int subsamp, + TJScalingFactor sf, int flags) throws Exception { WritableRaster wr = img.getRaster(); int imgType = img.getType(); - if(imgType == BufferedImage.TYPE_INT_RGB - || imgType == BufferedImage.TYPE_INT_BGR - || imgType == BufferedImage.TYPE_INT_ARGB - || imgType == BufferedImage.TYPE_INT_ARGB_PRE) { - SinglePixelPackedSampleModel sm = + if (imgType == BufferedImage.TYPE_INT_RGB || + imgType == BufferedImage.TYPE_INT_BGR || + imgType == BufferedImage.TYPE_INT_ARGB || + imgType == BufferedImage.TYPE_INT_ARGB_PRE) { + SinglePixelPackedSampleModel sm = (SinglePixelPackedSampleModel)img.getSampleModel(); int pitch = sm.getScanlineStride(); DataBufferInt db = (DataBufferInt)wr.getDataBuffer(); int[] buf = db.getData(); return checkIntBuf(buf, img.getWidth(), pitch, img.getHeight(), pf, - subsamp, sf, flags); - } - else { + subsamp, sf, flags); + } else { ComponentSampleModel sm = (ComponentSampleModel)img.getSampleModel(); int pitch = sm.getScanlineStride(); DataBufferByte db = (DataBufferByte)wr.getDataBuffer(); byte[] buf = db.getData(); return checkBuf(buf, img.getWidth(), pitch, img.getHeight(), pf, subsamp, - sf, flags); + sf, flags); } } @@ -473,51 +472,52 @@ public class TJUnitTest { } private static int checkBufYUV(byte[] buf, int size, int w, int h, - int subsamp) throws Exception { + int subsamp) throws Exception { int row, col; - int hsf = TJ.getMCUWidth(subsamp)/8, vsf = TJ.getMCUHeight(subsamp)/8; + 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, 4), uvpitch = PAD(cw, 4); int retval = 1; - int correctsize = ypitch * ph - + (subsamp == TJ.SAMP_GRAY ? 0 : uvpitch * ch * 2); + int correctsize = ypitch * ph + + (subsamp == TJ.SAMP_GRAY ? 0 : uvpitch * ch * 2); int halfway = 16; try { - if(size != correctsize) - throw new Exception("\nIncorrect size " + size + ". Should be " - + correctsize); + if (size != correctsize) + throw new Exception("\nIncorrect size " + size + ". Should be " + + correctsize); - for(row = 0; row < ph; row++) { - for(col = 0; col < pw; col++) { + for (row = 0; row < ph; row++) { + for (col = 0; col < pw; col++) { byte y = buf[ypitch * row + col]; - if(((row / 8) + (col / 8)) % 2 == 0) { - if(row < halfway) checkVal255(row, col, y, "Y"); - else checkVal0(row, col, y, "Y"); - } - else { - if(row < halfway) checkVal(row, col, y, "Y", 76); - else checkVal(row, col, y, "Y", 226); + if (((row / 8) + (col / 8)) % 2 == 0) { + if (row < halfway) + checkVal255(row, col, y, "Y"); + else + checkVal0(row, col, y, "Y"); + } else { + if (row < halfway) + checkVal(row, col, y, "Y", 76); + else + checkVal(row, col, y, "Y", 226); } } } - if(subsamp != TJ.SAMP_GRAY) { + if (subsamp != TJ.SAMP_GRAY) { halfway = 16 / vsf; - for(row = 0; row < ch; row++) { - for(col = 0; col < cw; col++) { + for (row = 0; row < ch; row++) { + for (col = 0; col < cw; col++) { byte u = buf[ypitch * ph + (uvpitch * row + col)], - v = buf[ypitch * ph + uvpitch * ch + (uvpitch * row + col)]; - if(((row * vsf / 8) + (col * hsf / 8)) % 2 == 0) { + v = buf[ypitch * ph + uvpitch * ch + (uvpitch * row + col)]; + if (((row * vsf / 8) + (col * hsf / 8)) % 2 == 0) { checkVal(row, col, u, "U", 128); checkVal(row, col, v, "V", 128); - } - else { - if(row < halfway) { + } else { + if (row < halfway) { checkVal(row, col, u, "U", 85); checkVal255(row, col, v, "V"); - } - else { + } else { checkVal0(row, col, u, "U"); checkVal(row, col, v, "V", 149); } @@ -525,35 +525,34 @@ public class TJUnitTest { } } } - } - catch(Exception e) { + } catch(Exception e) { System.out.println(e); retval = 0; } - if(retval == 0) { - for(row = 0; row < ph; row++) { - for(col = 0; col < pw; col++) { + if (retval == 0) { + for (row = 0; row < ph; row++) { + for (col = 0; col < pw; col++) { int y = buf[ypitch * row + col]; - if(y < 0) y += 256; + if (y < 0) y += 256; System.out.format("%3d ", y); } System.out.print("\n"); } System.out.print("\n"); - for(row = 0; row < ch; row++) { - for(col = 0; col < cw; col++) { + for (row = 0; row < ch; row++) { + for (col = 0; col < cw; col++) { int u = buf[ypitch * ph + (uvpitch * row + col)]; - if(u < 0) u += 256; + if (u < 0) u += 256; System.out.format("%3d ", u); } System.out.print("\n"); } System.out.print("\n"); - for(row = 0; row < ch; row++) { - for(col = 0; col < cw; col++) { + for (row = 0; row < ch; row++) { + for (col = 0; col < cw; col++) { int v = buf[ypitch * ph + uvpitch * ch + (uvpitch * row + col)]; - if(v < 0) v += 256; + if (v < 0) v += 256; System.out.format("%3d ", v); } System.out.print("\n"); @@ -565,7 +564,7 @@ public class TJUnitTest { } private static void writeJPEG(byte[] jpegBuf, int jpegBufSize, - String filename) throws Exception { + String filename) throws Exception { File file = new File(filename); FileOutputStream fos = new FileOutputStream(file); fos.write(jpegBuf, 0, jpegBufSize); @@ -573,8 +572,8 @@ public class TJUnitTest { } private static int compTest(TJCompressor tjc, byte[] dstBuf, int w, - int h, int pf, String baseName, int subsamp, int jpegQual, - int flags) throws Exception { + int h, int pf, String baseName, int subsamp, + int jpegQual, int flags) throws Exception { String tempstr; byte[] srcBuf = null; BufferedImage img = null; @@ -585,28 +584,32 @@ public class TJUnitTest { if (bi) { pf = biTypePF(imgType); pfStr = biTypeStr(imgType); - } - else pfStr = pixFormatStr[pf]; + } else + pfStr = pixFormatStr[pf]; ps = TJ.getPixelSize(pf); 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 (bi) + System.out.print("(" + pixFormatStr[pf] + ") "); + if ((flags & TJ.FLAG_BOTTOMUP) != 0) + System.out.print("Bottom-Up"); + else + System.out.print("Top-Down "); System.out.print(" -> " + subNameLong[subsamp] + " "); - if(yuv == YUVENCODE) System.out.print("YUV ... "); - else System.out.print("Q" + jpegQual + " ... "); + if (yuv == YUVENCODE) + System.out.print("YUV ... "); + else + System.out.print("Q" + jpegQual + " ... "); - if(bi) { + if (bi) { img = new BufferedImage(w, h, imgType); initImg(img, pf, flags); - tempstr = baseName + "_enc_" + pfStr + "_" - + (((flags & TJ.FLAG_BOTTOMUP) != 0) ? "BU" : "TD") + "_" - + subName[subsamp] + "_Q" + jpegQual + ".png"; + tempstr = baseName + "_enc_" + pfStr + "_" + + (((flags & TJ.FLAG_BOTTOMUP) != 0) ? "BU" : "TD") + "_" + + subName[subsamp] + "_Q" + jpegQual + ".png"; File file = new File(tempstr); ImageIO.write(img, "png", file); - } - else { + } else { srcBuf = new byte[w * h * ps + 1]; initBuf(srcBuf, w, w * ps, h, pf, flags); } @@ -615,36 +618,40 @@ public class TJUnitTest { t = getTime(); tjc.setSubsamp(subsamp); tjc.setJPEGQuality(jpegQual); - if(bi) { - if(yuv == YUVENCODE) tjc.encodeYUV(img, dstBuf, flags); - else tjc.compress(img, dstBuf, flags); - } - else { + if (bi) { + if (yuv == YUVENCODE) + tjc.encodeYUV(img, dstBuf, flags); + else + tjc.compress(img, dstBuf, flags); + } else { tjc.setSourceImage(srcBuf, w, 0, h, pf); - if(yuv == YUVENCODE) tjc.encodeYUV(dstBuf, flags); - else tjc.compress(dstBuf, flags); + 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 + "_" - + (((flags & TJ.FLAG_BOTTOMUP) != 0) ? "BU" : "TD") + "_" - + subName[subsamp] + ".yuv"; + if (yuv == YUVENCODE) + tempstr = baseName + "_enc_" + pfStr + "_" + + (((flags & TJ.FLAG_BOTTOMUP) != 0) ? "BU" : "TD") + "_" + + subName[subsamp] + ".yuv"; else - tempstr = baseName + "_enc_" + pfStr + "_" - + (((flags & TJ.FLAG_BOTTOMUP) != 0) ? "BU" : "TD") + "_" - + subName[subsamp] + "_Q" + jpegQual + ".jpg"; + tempstr = baseName + "_enc_" + pfStr + "_" + + (((flags & TJ.FLAG_BOTTOMUP) != 0) ? "BU" : "TD") + "_" + + subName[subsamp] + "_Q" + jpegQual + ".jpg"; writeJPEG(dstBuf, size, tempstr); - if(yuv == YUVENCODE) { - if(checkBufYUV(dstBuf, size, w, h, subsamp) == 1) + if (yuv == YUVENCODE) { + if (checkBufYUV(dstBuf, size, w, h, subsamp) == 1) System.out.print("Passed."); else { - System.out.print("FAILED!"); exitStatus = -1; + System.out.print("FAILED!"); + exitStatus = -1; } - } - else System.out.print("Done."); + } else + System.out.print("Done."); System.out.format(" %.6f ms\n", t * 1000.); System.out.println(" Result in " + tempstr); @@ -652,8 +659,9 @@ public class TJUnitTest { } private static void decompTest(TJDecompressor tjd, byte[] jpegBuf, - int jpegSize, int w, int h, int pf, String baseName, int subsamp, - int flags, TJScalingFactor sf) throws Exception { + int jpegSize, int w, int h, int pf, + String baseName, int subsamp, int flags, + TJScalingFactor sf) throws Exception { String pfStr, tempstr; double t; int scaledWidth = sf.getScaled(w); @@ -662,134 +670,144 @@ public class TJUnitTest { BufferedImage img = null; byte[] dstBuf = null; - if(yuv == YUVENCODE) return; + if (yuv == YUVENCODE) return; if (bi) { pf = biTypePF(imgType); pfStr = biTypeStr(imgType); - } - else pfStr = pixFormatStr[pf]; + } else + pfStr = pixFormatStr[pf]; System.out.print("JPEG -> "); - if(yuv == YUVDECODE) + if (yuv == YUVDECODE) System.out.print("YUV " + subName[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()) + 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("... "); + else + System.out.print("... "); } t = getTime(); tjd.setJPEGImage(jpegBuf, jpegSize); - if(tjd.getWidth() != w || tjd.getHeight() != h - || tjd.getSubsamp() != subsamp) + if (tjd.getWidth() != w || tjd.getHeight() != h || + tjd.getSubsamp() != subsamp) throw new Exception("Incorrect JPEG header"); temp1 = scaledWidth; temp2 = scaledHeight; temp1 = tjd.getScaledWidth(temp1, temp2); temp2 = tjd.getScaledHeight(temp1, temp2); - if(temp1 != scaledWidth || temp2 != scaledHeight) + if (temp1 != scaledWidth || temp2 != scaledHeight) throw new Exception("Scaled size mismatch"); - if(yuv == YUVDECODE) dstBuf = tjd.decompressToYUV(flags); + if (yuv == YUVDECODE) + dstBuf = tjd.decompressToYUV(flags); else { - if(bi) + if (bi) img = tjd.decompress(scaledWidth, scaledHeight, imgType, flags); - else dstBuf = tjd.decompress(scaledWidth, 0, scaledHeight, pf, flags); + else + dstBuf = tjd.decompress(scaledWidth, 0, scaledHeight, pf, flags); } t = getTime() - t; - if(bi) { - tempstr = baseName + "_dec_" + pfStr + "_" - + (((flags & TJ.FLAG_BOTTOMUP) != 0) ? "BU" : "TD") + "_" - + subName[subsamp] + "_" + (double)sf.getNum() / (double)sf.getDenom() - + "x" + ".png"; + if (bi) { + tempstr = baseName + "_dec_" + pfStr + "_" + + (((flags & TJ.FLAG_BOTTOMUP) != 0) ? "BU" : "TD") + "_" + + subName[subsamp] + "_" + + (double)sf.getNum() / (double)sf.getDenom() + "x" + ".png"; File file = new File(tempstr); ImageIO.write(img, "png", file); } - if(yuv == YUVDECODE) { - if(checkBufYUV(dstBuf, dstBuf.length, w, h, subsamp) == 1) + if (yuv == YUVDECODE) { + if (checkBufYUV(dstBuf, dstBuf.length, w, h, subsamp) == 1) System.out.print("Passed."); else { System.out.print("FAILED!"); exitStatus = -1; } - } - else { - if((bi && checkImg(img, pf, subsamp, sf, flags) == 1) - || (!bi && checkBuf(dstBuf, scaledWidth, scaledWidth - * TJ.getPixelSize(pf), scaledHeight, pf, subsamp, sf, flags) == 1)) + } else { + if ((bi && checkImg(img, pf, subsamp, sf, flags) == 1) || + (!bi && checkBuf(dstBuf, scaledWidth, + scaledWidth * TJ.getPixelSize(pf), scaledHeight, pf, + subsamp, sf, flags) == 1)) System.out.print("Passed."); else { - System.out.print("FAILED!"); exitStatus = -1; + System.out.print("FAILED!"); + exitStatus = -1; } } System.out.format(" %.6f ms\n", t * 1000.); } private static void decompTest(TJDecompressor tjd, byte[] jpegBuf, - int jpegSize, int w, int h, int pf, String baseName, int subsamp, - int flags) throws Exception { + int jpegSize, int w, int h, int pf, + String baseName, int subsamp, + int flags) throws Exception { int i; - if((subsamp == TJ.SAMP_444 || subsamp == TJ.SAMP_GRAY) && yuv == 0) { - TJScalingFactor sf[] = TJ.getScalingFactors(); - for(i = 0; i < sf.length; i++) + if ((subsamp == TJ.SAMP_444 || subsamp == TJ.SAMP_GRAY) && yuv == 0) { + TJScalingFactor[] sf = TJ.getScalingFactors(); + for (i = 0; i < sf.length; i++) decompTest(tjd, jpegBuf, jpegSize, w, h, pf, baseName, subsamp, - flags, sf[i]); - } - else + flags, sf[i]); + } else decompTest(tjd, jpegBuf, jpegSize, w, h, pf, baseName, subsamp, - flags, new TJScalingFactor(1, 1)); + flags, new TJScalingFactor(1, 1)); System.out.print("\n"); } private static void doTest(int w, int h, int[] formats, int subsamp, - String baseName) throws Exception { + String baseName) throws Exception { TJCompressor tjc = null; TJDecompressor tjd = null; int size; byte[] dstBuf; - if(yuv == YUVENCODE) dstBuf = new byte[TJ.bufSizeYUV(w, h, subsamp)]; - else dstBuf = new byte[TJ.bufSize(w, h, subsamp)]; + if (yuv == YUVENCODE) + dstBuf = new byte[TJ.bufSizeYUV(w, h, subsamp)]; + else + dstBuf = new byte[TJ.bufSize(w, h, subsamp)]; try { tjc = new TJCompressor(); - tjd = new TJDecompressor(); + tjd = new TJDecompressor(); - for(int pf : formats) { - for(int i = 0; i < 2; i++) { + for (int pf : formats) { + for (int i = 0; i < 2; i++) { int flags = 0; - if (subsamp == TJ.SAMP_422 || subsamp == TJ.SAMP_420 - || subsamp == TJ.SAMP_440) + if (subsamp == TJ.SAMP_422 || subsamp == TJ.SAMP_420 || + subsamp == TJ.SAMP_440) flags |= TJ.FLAG_FASTUPSAMPLE; - if(i == 1) { - if(yuv == YUVDECODE) { - tjc.close(); tjd.close(); return; - } - else flags |= TJ.FLAG_BOTTOMUP; + if (i == 1) { + if (yuv == YUVDECODE) { + tjc.close(); + tjd.close(); + return; + } else + flags |= TJ.FLAG_BOTTOMUP; } size = compTest(tjc, dstBuf, w, h, pf, baseName, subsamp, 100, - flags); + 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) decompTest(tjd, dstBuf, size, w, h, pf + (TJ.PF_RGBA - TJ.PF_RGBX), - baseName, subsamp, flags); + baseName, subsamp, flags); } } - } - catch(Exception e) { - if(tjc != null) tjc.close(); - if(tjd != null) tjd.close(); + } catch(Exception e) { + if (tjc != null) tjc.close(); + if (tjd != null) tjd.close(); throw e; } - if(tjc != null) tjc.close(); - if(tjd != null) tjd.close(); + if (tjc != null) tjc.close(); + if (tjd != null) tjd.close(); } private static void bufSizeTest() throws Exception { @@ -801,15 +819,15 @@ public class TJUnitTest { try { tjc = new TJCompressor(); System.out.println("Buffer size regression test"); - for(subsamp = 0; subsamp < TJ.NUMSAMP; subsamp++) { - for(w = 1; w < 48; w++) { + for (subsamp = 0; subsamp < TJ.NUMSAMP; subsamp++) { + for (w = 1; w < 48; w++) { int maxh = (w == 1) ? 2048 : 48; - for(h = 1; h < maxh; h++) { - if(h % 100 == 0) + for (h = 1; h < maxh; h++) { + if (h % 100 == 0) 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]; jpegBuf = 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); } tjc.setSourceImage(srcBuf, w, 0, h, TJ.PF_BGRX); @@ -819,7 +837,7 @@ public class TJUnitTest { srcBuf = new byte[h * w * 4]; jpegBuf = 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); } tjc.setSourceImage(srcBuf, h, 0, w, TJ.PF_BGRX); @@ -828,50 +846,53 @@ public class TJUnitTest { } } System.out.println("Done. "); - } - catch(Exception e) { - if(tjc != null) tjc.close(); + } catch(Exception e) { + if (tjc != null) tjc.close(); throw e; } - if(tjc != null) tjc.close(); + if (tjc != null) tjc.close(); } - public static void main(String argv[]) { + public static void main(String[] argv) { try { String testName = "javatest"; boolean doyuv = false; - for(int i = 0; i < argv.length; i++) { - if(argv[i].equalsIgnoreCase("-yuv")) doyuv = true; - if(argv[i].substring(0, 1).equalsIgnoreCase("-h") - || argv[i].equalsIgnoreCase("-?")) + for (int i = 0; i < argv.length; i++) { + if (argv[i].equalsIgnoreCase("-yuv")) + doyuv = true; + if (argv[i].substring(0, 1).equalsIgnoreCase("-h") || + argv[i].equalsIgnoreCase("-?")) usage(); - if(argv[i].equalsIgnoreCase("-bi")) { + if (argv[i].equalsIgnoreCase("-bi")) { bi = true; testName = "javabitest"; } } - if(doyuv) yuv = YUVENCODE; - doTest(35, 39, bi ? _3byteFormatsBI : _3byteFormats, TJ.SAMP_444, testName); - doTest(39, 41, bi ? _4byteFormatsBI : _4byteFormats, TJ.SAMP_444, testName); + if (doyuv) yuv = YUVENCODE; + doTest(35, 39, bi ? _3byteFormatsBI : _3byteFormats, TJ.SAMP_444, + testName); + doTest(39, 41, bi ? _4byteFormatsBI : _4byteFormats, TJ.SAMP_444, + testName); doTest(41, 35, bi ? _3byteFormatsBI : _3byteFormats, TJ.SAMP_422, - testName); + testName); doTest(35, 39, bi ? _4byteFormatsBI : _4byteFormats, TJ.SAMP_422, - testName); + testName); doTest(39, 41, bi ? _3byteFormatsBI : _3byteFormats, TJ.SAMP_420, - testName); + testName); doTest(41, 35, bi ? _4byteFormatsBI : _4byteFormats, TJ.SAMP_420, - testName); + testName); doTest(35, 39, bi ? _3byteFormatsBI : _3byteFormats, TJ.SAMP_440, - testName); + testName); doTest(39, 41, bi ? _4byteFormatsBI : _4byteFormats, TJ.SAMP_440, - testName); + testName); doTest(35, 39, bi ? onlyGrayBI : onlyGray, TJ.SAMP_GRAY, testName); doTest(39, 41, bi ? _3byteFormatsBI : _3byteFormats, TJ.SAMP_GRAY, - testName); + testName); doTest(41, 35, bi ? _4byteFormatsBI : _4byteFormats, TJ.SAMP_GRAY, - testName); - if(!doyuv && !bi) bufSizeTest(); - if(doyuv && !bi) { + testName); + if (!doyuv && !bi) + bufSizeTest(); + if (doyuv && !bi) { yuv = YUVDECODE; doTest(48, 48, onlyRGB, TJ.SAMP_444, "javatest_yuv0"); doTest(35, 39, onlyRGB, TJ.SAMP_444, "javatest_yuv1"); @@ -886,8 +907,7 @@ public class TJUnitTest { doTest(48, 48, onlyGray, TJ.SAMP_GRAY, "javatest_yuv0"); doTest(39, 41, onlyGray, TJ.SAMP_GRAY, "javatest_yuv1"); } - } - catch(Exception e) { + } catch(Exception e) { e.printStackTrace(); exitStatus = -1; } diff --git a/java/org/libjpegturbo/turbojpeg/TJ.java b/java/org/libjpegturbo/turbojpeg/TJ.java index ca6616d..f182f96 100644 --- a/java/org/libjpegturbo/turbojpeg/TJ.java +++ b/java/org/libjpegturbo/turbojpeg/TJ.java @@ -31,38 +31,38 @@ package org.libjpegturbo.turbojpeg; /** * TurboJPEG utility class (cannot be instantiated) */ -final public class TJ { +public final class TJ { /** * The number of chrominance subsampling options */ - final public static int NUMSAMP = 5; + public static final int NUMSAMP = 5; /** * 4:4:4 chrominance subsampling (no chrominance subsampling). The JPEG * or YUV image will contain one chrominance component for every pixel in the * source image. */ - final public static int SAMP_444 = 0; + public static final int SAMP_444 = 0; /** * 4:2:2 chrominance subsampling. The JPEG or YUV image will contain one * chrominance component for every 2x1 block of pixels in the source image. */ - final public static int SAMP_422 = 1; + public static final int SAMP_422 = 1; /** * 4:2:0 chrominance subsampling. The JPEG or YUV image will contain one * chrominance component for every 2x2 block of pixels in the source image. */ - final public static int SAMP_420 = 2; + public static final int SAMP_420 = 2; /** * Grayscale. The JPEG or YUV image will contain no chrominance components. */ - final public static int SAMP_GRAY = 3; + public static final int SAMP_GRAY = 3; /** * 4:4:0 chrominance subsampling. The JPEG or YUV image will contain one * chrominance component for every 1x2 block of pixels in the source image. */ - final public static int SAMP_440 = 4; + public static final int SAMP_440 = 4; /** @@ -75,12 +75,12 @@ final public class TJ { * @return the MCU block width for the given level of chrominance subsampling */ public static int getMCUWidth(int subsamp) throws Exception { - if(subsamp < 0 || subsamp >= NUMSAMP) + if (subsamp < 0 || subsamp >= NUMSAMP) throw new Exception("Invalid subsampling type"); return mcuWidth[subsamp]; } - final private static int mcuWidth[] = { + private static final int[] mcuWidth = { 8, 16, 16, 8, 8 }; @@ -96,12 +96,12 @@ final public class TJ { * subsampling */ public static int getMCUHeight(int subsamp) throws Exception { - if(subsamp < 0 || subsamp >= NUMSAMP) + if (subsamp < 0 || subsamp >= NUMSAMP) throw new Exception("Invalid subsampling type"); return mcuHeight[subsamp]; } - final private static int mcuHeight[] = { + private static final int[] mcuHeight = { 8, 8, 16, 8, 16 }; @@ -109,76 +109,76 @@ final public class TJ { /** * The number of pixel formats */ - final public static int NUMPF = 11; + public static final int NUMPF = 11; /** * RGB pixel format. The red, green, and blue components in the image are * stored in 3-byte pixels in the order R, G, B from lowest to highest byte * address within each pixel. */ - final public static int PF_RGB = 0; + public static final int PF_RGB = 0; /** * BGR pixel format. The red, green, and blue components in the image are * stored in 3-byte pixels in the order B, G, R from lowest to highest byte * address within each pixel. */ - final public static int PF_BGR = 1; + public static final int PF_BGR = 1; /** * RGBX pixel format. The red, green, and blue components in the image are * stored in 4-byte pixels in the order R, G, B from lowest to highest byte * address within each pixel. The X component is ignored when compressing * and undefined when decompressing. */ - final public static int PF_RGBX = 2; + public static final int PF_RGBX = 2; /** * BGRX pixel format. The red, green, and blue components in the image are * stored in 4-byte pixels in the order B, G, R from lowest to highest byte * address within each pixel. The X component is ignored when compressing * and undefined when decompressing. */ - final public static int PF_BGRX = 3; + public static final int PF_BGRX = 3; /** * XBGR pixel format. The red, green, and blue components in the image are * stored in 4-byte pixels in the order R, G, B from highest to lowest byte * address within each pixel. The X component is ignored when compressing * and undefined when decompressing. */ - final public static int PF_XBGR = 4; + public static final int PF_XBGR = 4; /** * XRGB pixel format. The red, green, and blue components in the image are * stored in 4-byte pixels in the order B, G, R from highest to lowest byte * address within each pixel. The X component is ignored when compressing * and undefined when decompressing. */ - final public static int PF_XRGB = 5; + public static final int PF_XRGB = 5; /** * Grayscale pixel format. Each 1-byte pixel represents a luminance * (brightness) level from 0 to 255. */ - final public static int PF_GRAY = 6; + public static final int PF_GRAY = 6; /** * RGBA pixel format. This is the same as {@link #PF_RGBX}, except that when * decompressing, the X byte is guaranteed to be 0xFF, which can be * interpreted as an opaque alpha channel. */ - final public static int PF_RGBA = 7; + public static final int PF_RGBA = 7; /** * BGRA pixel format. This is the same as {@link #PF_BGRX}, except that when * decompressing, the X byte is guaranteed to be 0xFF, which can be * interpreted as an opaque alpha channel. */ - final public static int PF_BGRA = 8; + public static final int PF_BGRA = 8; /** * ABGR pixel format. This is the same as {@link #PF_XBGR}, except that when * decompressing, the X byte is guaranteed to be 0xFF, which can be * interpreted as an opaque alpha channel. */ - final public static int PF_ABGR = 9; + public static final int PF_ABGR = 9; /** * ARGB pixel format. This is the same as {@link #PF_XRGB}, except that when * decompressing, the X byte is guaranteed to be 0xFF, which can be * interpreted as an opaque alpha channel. */ - final public static int PF_ARGB = 10; + public static final int PF_ARGB = 10; /** @@ -189,12 +189,12 @@ final public class TJ { * @return the pixel size (in bytes) for the given pixel format */ public static int getPixelSize(int pixelFormat) throws Exception { - if(pixelFormat < 0 || pixelFormat >= NUMPF) + if (pixelFormat < 0 || pixelFormat >= NUMPF) throw new Exception("Invalid pixel format"); return pixelSize[pixelFormat]; } - final private static int pixelSize[] = { + private static final int[] pixelSize = { 3, 3, 4, 4, 4, 4, 1, 4, 4, 4, 4 }; @@ -211,12 +211,12 @@ final public class TJ { * @return the red offset for the given pixel format */ public static int getRedOffset(int pixelFormat) throws Exception { - if(pixelFormat < 0 || pixelFormat >= NUMPF) + if (pixelFormat < 0 || pixelFormat >= NUMPF) throw new Exception("Invalid pixel format"); return redOffset[pixelFormat]; } - final private static int redOffset[] = { + private static final int[] redOffset = { 0, 2, 0, 2, 3, 1, 0, 0, 2, 3, 1 }; @@ -233,12 +233,12 @@ final public class TJ { * @return the green offset for the given pixel format */ public static int getGreenOffset(int pixelFormat) throws Exception { - if(pixelFormat < 0 || pixelFormat >= NUMPF) + if (pixelFormat < 0 || pixelFormat >= NUMPF) throw new Exception("Invalid pixel format"); return greenOffset[pixelFormat]; } - final private static int greenOffset[] = { + private static final int[] greenOffset = { 1, 1, 1, 1, 2, 2, 0, 1, 1, 2, 2 }; @@ -255,12 +255,12 @@ final public class TJ { * @return the blue offset for the given pixel format */ public static int getBlueOffset(int pixelFormat) throws Exception { - if(pixelFormat < 0 || pixelFormat >= NUMPF) + if (pixelFormat < 0 || pixelFormat >= NUMPF) throw new Exception("Invalid pixel format"); return blueOffset[pixelFormat]; } - final private static int blueOffset[] = { + private static final int[] blueOffset = { 2, 0, 2, 0, 1, 3, 0, 2, 0, 1, 3 }; @@ -269,27 +269,27 @@ final public class TJ { * The uncompressed source/destination image is stored in bottom-up (Windows, * OpenGL) order, not top-down (X11) order. */ - final public static int FLAG_BOTTOMUP = 2; + public static final int FLAG_BOTTOMUP = 2; /** * Turn off CPU auto-detection and force TurboJPEG to use MMX code * (if the underlying codec supports it.) */ - final public static int FLAG_FORCEMMX = 8; + public static final int FLAG_FORCEMMX = 8; /** * Turn off CPU auto-detection and force TurboJPEG to use SSE code * (if the underlying codec supports it.) */ - final public static int FLAG_FORCESSE = 16; + public static final int FLAG_FORCESSE = 16; /** * Turn off CPU auto-detection and force TurboJPEG to use SSE2 code * (if the underlying codec supports it.) */ - final public static int FLAG_FORCESSE2 = 32; + public static final int FLAG_FORCESSE2 = 32; /** * Turn off CPU auto-detection and force TurboJPEG to use SSE3 code * (if the underlying codec supports it.) */ - final public static int FLAG_FORCESSE3 = 128; + public static final int FLAG_FORCESSE3 = 128; /** * When decompressing an image that was compressed using chrominance * subsampling, use the fastest chrominance upsampling algorithm available in @@ -297,7 +297,7 @@ final public class TJ { * creates a smooth transition between neighboring chrominance components in * order to reduce upsampling artifacts in the decompressed image. */ - final public static int FLAG_FASTUPSAMPLE = 256; + public static final int FLAG_FASTUPSAMPLE = 256; /** * Use the fastest DCT/IDCT algorithm available in the underlying codec. The * default if this flag is not specified is implementation-specific. The @@ -306,7 +306,7 @@ final public class TJ { * effect on accuracy, but it uses the accurate algorithm when decompressing, * because this has been shown to have a larger effect. */ - final public static int FLAG_FASTDCT = 2048; + public static final int FLAG_FASTDCT = 2048; /** * Use the most accurate DCT/IDCT algorithm available in the underlying * codec. The default if this flag is not specified is @@ -316,7 +316,7 @@ final public class TJ { * accurate algorithm when decompressing, because this has been shown to have * a larger effect. */ - final public static int FLAG_ACCURATEDCT = 4096; + public static final int FLAG_ACCURATEDCT = 4096; /** @@ -333,7 +333,7 @@ final public class TJ { * @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 */ - public native static int bufSize(int width, int height, int jpegSubsamp) + public static native int bufSize(int width, int height, int jpegSubsamp) throws Exception; /** @@ -350,7 +350,7 @@ final public class TJ { * @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 */ - public native static int bufSizeYUV(int width, int height, + public static native int bufSizeYUV(int width, int height, int subsamp) throws Exception; @@ -361,7 +361,7 @@ final public class TJ { * @return a list of fractional scaling factors that the JPEG decompressor in * this implementation of TurboJPEG supports */ - public native static TJScalingFactor[] getScalingFactors() + public static native TJScalingFactor[] getScalingFactors() throws Exception; static { diff --git a/java/org/libjpegturbo/turbojpeg/TJCompressor.java b/java/org/libjpegturbo/turbojpeg/TJCompressor.java index f46eee9..24c122b 100644 --- a/java/org/libjpegturbo/turbojpeg/TJCompressor.java +++ b/java/org/libjpegturbo/turbojpeg/TJCompressor.java @@ -36,7 +36,7 @@ import java.nio.*; */ public class TJCompressor { - private final static String NO_ASSOC_ERROR = + private static final String NO_ASSOC_ERROR = "No source image is associated with this instance"; /** @@ -63,7 +63,7 @@ public class TJCompressor { * {@link TJ TJ.PF_*}) */ public TJCompressor(byte[] srcImage, int width, int pitch, int height, - int pixelFormat) throws Exception { + int pixelFormat) throws Exception { setSourceImage(srcImage, width, pitch, height, pixelFormat); } @@ -88,7 +88,7 @@ public class TJCompressor { * {@link TJ TJ.PF_*}) */ public TJCompressor(byte[] srcImage, int x, int y, int width, int pitch, - int height, int pixelFormat) throws Exception { + int height, int pixelFormat) throws Exception { setSourceImage(srcImage, x, y, width, pitch, height, pixelFormat); } @@ -123,15 +123,18 @@ public class TJCompressor { * {@link TJ TJ.PF_*}) */ public void setSourceImage(byte[] srcImage, int x, int y, int width, - int pitch, int height, int pixelFormat) throws Exception { - if(handle == 0) init(); - if(srcImage == null || x < 0 || y < 0 || width < 1 || height < 1 - || pitch < 0 || pixelFormat < 0 || pixelFormat >= TJ.NUMPF) + int pitch, int height, int pixelFormat) + throws Exception { + if (handle == 0) init(); + if (srcImage == null || x < 0 || y < 0 || width < 1 || height < 1 || + pitch < 0 || pixelFormat < 0 || pixelFormat >= TJ.NUMPF) throw new Exception("Invalid argument in setSourceImage()"); srcBuf = srcImage; srcWidth = width; - if(pitch == 0) srcPitch = width * TJ.getPixelSize(pixelFormat); - else srcPitch = pitch; + if (pitch == 0) + srcPitch = width * TJ.getPixelSize(pixelFormat); + else + srcPitch = pitch; srcHeight = height; srcPixelFormat = pixelFormat; srcX = x; @@ -143,7 +146,7 @@ public class TJCompressor { * {@link #setSourceImage(byte[], int, int, int, int, int, int)} instead. */ public void setSourceImage(byte[] srcImage, int width, int pitch, - int height, int pixelFormat) throws Exception { + int height, int pixelFormat) throws Exception { setSourceImage(srcImage, 0, 0, width, pitch, height, pixelFormat); srcX = srcY = -1; } @@ -157,7 +160,7 @@ public class TJCompressor { * {@link TJ TJ.SAMP_*}) */ public void setSubsamp(int newSubsamp) throws Exception { - if(newSubsamp < 0 || newSubsamp >= TJ.NUMSAMP) + if (newSubsamp < 0 || newSubsamp >= TJ.NUMSAMP) throw new Exception("Invalid argument in setSubsamp()"); subsamp = newSubsamp; } @@ -169,7 +172,7 @@ public class TJCompressor { * 100 = best) */ public void setJPEGQuality(int quality) throws Exception { - if(quality < 1 || quality > 100) + if (quality < 1 || quality > 100) throw new Exception("Invalid argument in setJPEGQuality()"); jpegQuality = quality; } @@ -185,17 +188,22 @@ public class TJCompressor { * @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) + 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 (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 (srcX >= 0 && srcY >= 0) compressedSize = compress(srcBuf, srcX, srcY, srcWidth, srcPitch, - srcHeight, srcPixelFormat, dstBuf, subsamp, jpegQuality, flags); + srcHeight, srcPixelFormat, dstBuf, subsamp, + jpegQuality, flags); else - compressedSize = compress(srcBuf, srcWidth, srcPitch, - srcHeight, srcPixelFormat, dstBuf, subsamp, jpegQuality, flags); + compressedSize = compress(srcBuf, srcWidth, srcPitch, srcHeight, + srcPixelFormat, dstBuf, subsamp, jpegQuality, + flags); } /** @@ -209,7 +217,7 @@ public class TJCompressor { * #getCompressedSize} to obtain the size of the JPEG image. */ public byte[] compress(int flags) throws Exception { - if(srcWidth < 1 || srcHeight < 1) + if (srcWidth < 1 || srcHeight < 1) throw new Exception(NO_ASSOC_ERROR); byte[] buf = new byte[TJ.bufSize(srcWidth, srcHeight, subsamp)]; compress(buf, flags); @@ -230,13 +238,14 @@ public class TJCompressor { * @param flags the bitwise OR of one or more of {@link TJ TJ.FLAG_*} */ public void compress(BufferedImage srcImage, byte[] dstBuf, int flags) - throws Exception { - if(srcImage == null || dstBuf == null || flags < 0) + throws Exception { + if (srcImage == null || dstBuf == null || flags < 0) throw new Exception("Invalid argument in compress()"); int width = srcImage.getWidth(); int height = srcImage.getHeight(); - int pixelFormat; boolean intPixels = false; - if(byteOrder == null) + int pixelFormat; + boolean intPixels = false; + if (byteOrder == null) byteOrder = ByteOrder.nativeOrder(); switch(srcImage.getType()) { case BufferedImage.TYPE_3BYTE_BGR: @@ -247,7 +256,7 @@ public class TJCompressor { case BufferedImage.TYPE_BYTE_GRAY: pixelFormat = TJ.PF_GRAY; break; case BufferedImage.TYPE_INT_BGR: - if(byteOrder == ByteOrder.BIG_ENDIAN) + if (byteOrder == ByteOrder.BIG_ENDIAN) pixelFormat = TJ.PF_XBGR; else pixelFormat = TJ.PF_RGBX; @@ -255,7 +264,7 @@ public class TJCompressor { case BufferedImage.TYPE_INT_RGB: case BufferedImage.TYPE_INT_ARGB: case BufferedImage.TYPE_INT_ARGB_PRE: - if(byteOrder == ByteOrder.BIG_ENDIAN) + if (byteOrder == ByteOrder.BIG_ENDIAN) pixelFormat = TJ.PF_XRGB; else pixelFormat = TJ.PF_BGRX; @@ -264,9 +273,11 @@ public class TJCompressor { throw new Exception("Unsupported BufferedImage format"); } 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 (jpegQuality < 0) + throw new Exception("JPEG Quality not set"); + if (subsamp < 0) + throw new Exception("Subsampling level not set"); + if (intPixels) { SinglePixelPackedSampleModel sm = (SinglePixelPackedSampleModel)srcImage.getSampleModel(); int pitch = sm.getScanlineStride(); @@ -274,26 +285,27 @@ public class TJCompressor { int[] buf = db.getData(); if (srcX >= 0 && srcY >= 0) compressedSize = compress(buf, srcX, srcY, width, pitch, height, - pixelFormat, dstBuf, subsamp, jpegQuality, flags); + pixelFormat, dstBuf, subsamp, jpegQuality, + flags); else compressedSize = compress(buf, width, pitch, height, pixelFormat, - dstBuf, subsamp, jpegQuality, flags); - } - else { + dstBuf, subsamp, jpegQuality, flags); + } else { ComponentSampleModel sm = (ComponentSampleModel)srcImage.getSampleModel(); 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"); int pitch = sm.getScanlineStride(); DataBufferByte db = (DataBufferByte)wr.getDataBuffer(); byte[] buf = db.getData(); if (srcX >= 0 && srcY >= 0) compressedSize = compress(buf, srcX, srcY, width, pitch, height, - pixelFormat, dstBuf, subsamp, jpegQuality, flags); + pixelFormat, dstBuf, subsamp, jpegQuality, + flags); else compressedSize = compress(buf, width, pitch, height, pixelFormat, - dstBuf, subsamp, jpegQuality, flags); + dstBuf, subsamp, jpegQuality, flags); } } @@ -340,12 +352,14 @@ public class TJCompressor { * @param flags the bitwise OR of one or more of {@link TJ TJ.FLAG_*} */ public void encodeYUV(byte[] dstBuf, int flags) throws Exception { - if(dstBuf == null || flags < 0) + if (dstBuf == null || flags < 0) throw new Exception("Invalid argument in compress()"); - if(srcBuf == null) throw new Exception(NO_ASSOC_ERROR); - if(subsamp < 0) throw new Exception("Subsampling level not set"); + if (srcBuf == null) + throw new Exception(NO_ASSOC_ERROR); + if (subsamp < 0) + throw new Exception("Subsampling level not set"); encodeYUV(srcBuf, srcWidth, srcPitch, srcHeight, - srcPixelFormat, dstBuf, subsamp, flags); + srcPixelFormat, dstBuf, subsamp, flags); compressedSize = TJ.bufSizeYUV(srcWidth, srcHeight, subsamp); } @@ -359,9 +373,10 @@ public class TJCompressor { * @return a buffer containing a YUV planar image */ public byte[] encodeYUV(int flags) throws Exception { - if(srcWidth < 1 || srcHeight < 1) + if (srcWidth < 1 || srcHeight < 1) throw new Exception(NO_ASSOC_ERROR); - if(subsamp < 0) throw new Exception("Subsampling level not set"); + if (subsamp < 0) + throw new Exception("Subsampling level not set"); byte[] buf = new byte[TJ.bufSizeYUV(srcWidth, srcHeight, subsamp)]; encodeYUV(buf, flags); return buf; @@ -383,12 +398,12 @@ public class TJCompressor { */ public void encodeYUV(BufferedImage srcImage, byte[] dstBuf, int flags) throws Exception { - if(srcImage == null || dstBuf == null || flags < 0) + if (srcImage == null || dstBuf == null || flags < 0) throw new Exception("Invalid argument in encodeYUV()"); int width = srcImage.getWidth(); int height = srcImage.getHeight(); int pixelFormat; boolean intPixels = false; - if(byteOrder == null) + if (byteOrder == null) byteOrder = ByteOrder.nativeOrder(); switch(srcImage.getType()) { case BufferedImage.TYPE_3BYTE_BGR: @@ -399,7 +414,7 @@ public class TJCompressor { case BufferedImage.TYPE_BYTE_GRAY: pixelFormat = TJ.PF_GRAY; break; case BufferedImage.TYPE_INT_BGR: - if(byteOrder == ByteOrder.BIG_ENDIAN) + if (byteOrder == ByteOrder.BIG_ENDIAN) pixelFormat = TJ.PF_XBGR; else pixelFormat = TJ.PF_RGBX; @@ -407,7 +422,7 @@ public class TJCompressor { case BufferedImage.TYPE_INT_RGB: case BufferedImage.TYPE_INT_ARGB: case BufferedImage.TYPE_INT_ARGB_PRE: - if(byteOrder == ByteOrder.BIG_ENDIAN) + if (byteOrder == ByteOrder.BIG_ENDIAN) pixelFormat = TJ.PF_XRGB; else pixelFormat = TJ.PF_BGRX; @@ -416,27 +431,26 @@ public class TJCompressor { throw new Exception("Unsupported BufferedImage format"); } WritableRaster wr = srcImage.getRaster(); - if(subsamp < 0) throw new Exception("Subsampling level not set"); - if(intPixels) { + if (subsamp < 0) throw new Exception("Subsampling level not set"); + if (intPixels) { SinglePixelPackedSampleModel sm = (SinglePixelPackedSampleModel)srcImage.getSampleModel(); int pitch = sm.getScanlineStride(); DataBufferInt db = (DataBufferInt)wr.getDataBuffer(); int[] buf = db.getData(); encodeYUV(buf, width, pitch, height, pixelFormat, dstBuf, subsamp, - flags); - } - else { + flags); + } else { ComponentSampleModel sm = (ComponentSampleModel)srcImage.getSampleModel(); 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"); int pitch = sm.getScanlineStride(); DataBufferByte db = (DataBufferByte)wr.getDataBuffer(); byte[] buf = db.getData(); encodeYUV(buf, width, pitch, height, pixelFormat, dstBuf, subsamp, - flags); + flags); } compressedSize = TJ.bufSizeYUV(width, height, subsamp); } @@ -453,9 +467,9 @@ public class TJCompressor { * * @return a buffer containing a YUV planar image */ - public byte[] encodeYUV(BufferedImage srcImage, int flags) - throws Exception { - if(subsamp < 0) throw new Exception("Subsampling level not set"); + public byte[] encodeYUV(BufferedImage srcImage, int flags) throws Exception { + if (subsamp < 0) + throw new Exception("Subsampling level not set"); int width = srcImage.getWidth(); int height = srcImage.getHeight(); byte[] buf = new byte[TJ.bufSizeYUV(width, height, subsamp)]; @@ -484,9 +498,8 @@ public class TJCompressor { protected void finalize() throws Throwable { try { close(); - } - catch(Exception e) {} - finally { + } catch(Exception e) { + } finally { super.finalize(); } }; diff --git a/java/org/libjpegturbo/turbojpeg/TJCustomFilter.java b/java/org/libjpegturbo/turbojpeg/TJCustomFilter.java index 412e6a5..6e46fa1 100644 --- a/java/org/libjpegturbo/turbojpeg/TJCustomFilter.java +++ b/java/org/libjpegturbo/turbojpeg/TJCustomFilter.java @@ -69,8 +69,8 @@ public interface TJCustomFilter { * @param transform a {@link TJTransform} instance that specifies the * parameters and/or cropping region for this transform */ - public void customFilter(ShortBuffer coeffBuffer, Rectangle bufferRegion, - Rectangle planeRegion, int componentID, int transformID, - TJTransform transform) + void customFilter(ShortBuffer coeffBuffer, Rectangle bufferRegion, + Rectangle planeRegion, int componentID, int transformID, + TJTransform transform) throws Exception; } diff --git a/java/org/libjpegturbo/turbojpeg/TJDecompressor.java b/java/org/libjpegturbo/turbojpeg/TJDecompressor.java index 4530d41..c4bb5a3 100644 --- a/java/org/libjpegturbo/turbojpeg/TJDecompressor.java +++ b/java/org/libjpegturbo/turbojpeg/TJDecompressor.java @@ -36,7 +36,7 @@ import java.nio.*; */ public class TJDecompressor { - private final static String NO_ASSOC_ERROR = + private static final String NO_ASSOC_ERROR = "No JPEG image is associated with this instance"; /** @@ -82,7 +82,7 @@ public class TJDecompressor { * @param imageSize size of the JPEG image (in bytes) */ public void setJPEGImage(byte[] jpegImage, int imageSize) throws Exception { - if(jpegImage == null || imageSize < 1) + if (jpegImage == null || imageSize < 1) throw new Exception("Invalid argument in setJPEGImage()"); jpegBuf = jpegImage; jpegBufSize = imageSize; @@ -97,7 +97,8 @@ public class TJDecompressor { * instance */ public int getWidth() throws Exception { - if(jpegWidth < 1) throw new Exception(NO_ASSOC_ERROR); + if (jpegWidth < 1) + throw new Exception(NO_ASSOC_ERROR); return jpegWidth; } @@ -109,7 +110,8 @@ public class TJDecompressor { * instance */ public int getHeight() throws Exception { - if(jpegHeight < 1) throw new Exception(NO_ASSOC_ERROR); + if (jpegHeight < 1) + throw new Exception(NO_ASSOC_ERROR); return jpegHeight; } @@ -121,8 +123,9 @@ public class TJDecompressor { * associated with this decompressor instance */ public int getSubsamp() throws Exception { - if(jpegSubsamp < 0) throw new Exception(NO_ASSOC_ERROR); - if(jpegSubsamp >= TJ.NUMSAMP) + if (jpegSubsamp < 0) + throw new Exception(NO_ASSOC_ERROR); + if (jpegSubsamp >= TJ.NUMSAMP) throw new Exception("JPEG header information is invalid"); return jpegSubsamp; } @@ -133,7 +136,8 @@ public class TJDecompressor { * @return the JPEG image buffer associated with this decompressor instance */ public byte[] getJPEGBuf() throws Exception { - if(jpegBuf == null) throw new Exception(NO_ASSOC_ERROR); + if (jpegBuf == null) + throw new Exception(NO_ASSOC_ERROR); return jpegBuf; } @@ -145,7 +149,8 @@ public class TJDecompressor { * decompressor instance */ public int getJPEGSize() throws Exception { - if(jpegBufSize < 1) throw new Exception(NO_ASSOC_ERROR); + if (jpegBufSize < 1) + throw new Exception(NO_ASSOC_ERROR); return jpegBufSize; } @@ -170,22 +175,24 @@ public class TJDecompressor { * height */ public int getScaledWidth(int desiredWidth, int desiredHeight) - throws Exception { - if(jpegWidth < 1 || jpegHeight < 1) + throws Exception { + if (jpegWidth < 1 || jpegHeight < 1) throw new Exception(NO_ASSOC_ERROR); - if(desiredWidth < 0 || desiredHeight < 0) + if (desiredWidth < 0 || desiredHeight < 0) throw new Exception("Invalid argument in getScaledWidth()"); - TJScalingFactor sf[] = TJ.getScalingFactors(); - if(desiredWidth == 0) desiredWidth = jpegWidth; - if(desiredHeight == 0) desiredHeight = jpegHeight; + TJScalingFactor[] sf = TJ.getScalingFactors(); + if (desiredWidth == 0) + desiredWidth = jpegWidth; + if (desiredHeight == 0) + desiredHeight = jpegHeight; int scaledWidth = jpegWidth, scaledHeight = jpegHeight; - for(int i = 0; i < sf.length; i++) { + for (int i = 0; i < sf.length; i++) { scaledWidth = sf[i].getScaled(jpegWidth); scaledHeight = sf[i].getScaled(jpegHeight); - if(scaledWidth <= desiredWidth && scaledHeight <= desiredHeight) + if (scaledWidth <= desiredWidth && scaledHeight <= desiredHeight) break; } - if(scaledWidth > desiredWidth || scaledHeight > desiredHeight) + if (scaledWidth > desiredWidth || scaledHeight > desiredHeight) throw new Exception("Could not scale down to desired image dimensions"); return scaledWidth; } @@ -210,22 +217,24 @@ public class TJDecompressor { * height */ public int getScaledHeight(int desiredWidth, int desiredHeight) - throws Exception { - if(jpegWidth < 1 || jpegHeight < 1) + throws Exception { + if (jpegWidth < 1 || jpegHeight < 1) throw new Exception(NO_ASSOC_ERROR); - if(desiredWidth < 0 || desiredHeight < 0) + if (desiredWidth < 0 || desiredHeight < 0) throw new Exception("Invalid argument in getScaledHeight()"); - TJScalingFactor sf[] = TJ.getScalingFactors(); - if(desiredWidth == 0) desiredWidth = jpegWidth; - if(desiredHeight == 0) desiredHeight = jpegHeight; + TJScalingFactor[] sf = TJ.getScalingFactors(); + if (desiredWidth == 0) + desiredWidth = jpegWidth; + if (desiredHeight == 0) + desiredHeight = jpegHeight; int scaledWidth = jpegWidth, scaledHeight = jpegHeight; - for(int i = 0; i < sf.length; i++) { + for (int i = 0; i < sf.length; i++) { scaledWidth = sf[i].getScaled(jpegWidth); scaledHeight = sf[i].getScaled(jpegHeight); - if(scaledWidth <= desiredWidth && scaledHeight <= desiredHeight) + if (scaledWidth <= desiredWidth && scaledHeight <= desiredHeight) break; } - if(scaledWidth > desiredWidth || scaledHeight > desiredHeight) + if (scaledWidth > desiredWidth || scaledHeight > desiredHeight) throw new Exception("Could not scale down to desired image dimensions"); return scaledHeight; } @@ -284,15 +293,16 @@ public class TJDecompressor { * @param flags the bitwise OR of one or more of {@link TJ TJ.FLAG_*} */ public void decompress(byte[] dstBuf, int x, int y, int desiredWidth, - int pitch, int desiredHeight, int pixelFormat, int flags) - throws Exception { - if(jpegBuf == null) throw new Exception(NO_ASSOC_ERROR); - if(dstBuf == null || x < 0 || y < 0 || desiredWidth < 0 || pitch < 0 - || desiredHeight < 0 || pixelFormat < 0 || pixelFormat >= TJ.NUMPF - || flags < 0) + int pitch, int desiredHeight, int pixelFormat, + int flags) throws Exception { + if (jpegBuf == null) + throw new Exception(NO_ASSOC_ERROR); + if (dstBuf == null || x < 0 || y < 0 || desiredWidth < 0 || pitch < 0 || + desiredHeight < 0 || pixelFormat < 0 || pixelFormat >= TJ.NUMPF || + flags < 0) throw new Exception("Invalid argument in decompress()"); decompress(jpegBuf, jpegBufSize, dstBuf, x, y, desiredWidth, pitch, - desiredHeight, pixelFormat, flags); + desiredHeight, pixelFormat, flags); } /** @@ -300,10 +310,10 @@ public class TJDecompressor { * {@link #decompress(byte[], int, int, int, int, int, int, int)} instead. */ public void decompress(byte[] dstBuf, int desiredWidth, int pitch, - int desiredHeight, int pixelFormat, int flags) - throws Exception { + int desiredHeight, int pixelFormat, int flags) + throws Exception { decompress(dstBuf, 0, 0, desiredWidth, pitch, desiredHeight, pixelFormat, - flags); + flags); } /** @@ -330,14 +340,15 @@ public class TJDecompressor { * @return a buffer containing the decompressed image */ public byte[] decompress(int desiredWidth, int pitch, int desiredHeight, - int pixelFormat, int flags) throws Exception { - if(desiredWidth < 0 || pitch < 0 || desiredHeight < 0 - || pixelFormat < 0 || pixelFormat >= TJ.NUMPF || flags < 0) + int pixelFormat, int flags) throws Exception { + if (desiredWidth < 0 || pitch < 0 || desiredHeight < 0 || + pixelFormat < 0 || pixelFormat >= TJ.NUMPF || flags < 0) throw new Exception("Invalid argument in decompress()"); int pixelSize = TJ.getPixelSize(pixelFormat); int scaledWidth = getScaledWidth(desiredWidth, desiredHeight); int scaledHeight = getScaledHeight(desiredWidth, desiredHeight); - if(pitch == 0) pitch = scaledWidth * pixelSize; + if (pitch == 0) + pitch = scaledWidth * pixelSize; byte[] buf = new byte[pitch * scaledHeight]; decompress(buf, desiredWidth, pitch, desiredHeight, pixelFormat, flags); return buf; @@ -361,13 +372,14 @@ public class TJDecompressor { * @param flags the bitwise OR of one or more of {@link TJ TJ.FLAG_*} */ public void decompressToYUV(byte[] dstBuf, int flags) throws Exception { - if(jpegBuf == null) throw new Exception(NO_ASSOC_ERROR); - if(dstBuf == null || flags < 0) + if (jpegBuf == null) + throw new Exception(NO_ASSOC_ERROR); + if (dstBuf == null || flags < 0) throw new Exception("Invalid argument in decompressToYUV()"); decompressToYUV(jpegBuf, jpegBufSize, dstBuf, flags); } - + /** * Decompress the JPEG source image associated with this decompressor * instance and return a buffer containing a YUV planar image. See {@link @@ -378,11 +390,11 @@ public class TJDecompressor { * @return a buffer containing a YUV planar image */ public byte[] decompressToYUV(int flags) throws Exception { - if(flags < 0) + if (flags < 0) throw new Exception("Invalid argument in decompressToYUV()"); - if(jpegWidth < 1 || jpegHeight < 1 || jpegSubsamp < 0) + if (jpegWidth < 1 || jpegHeight < 1 || jpegSubsamp < 0) throw new Exception(NO_ASSOC_ERROR); - if(jpegSubsamp >= TJ.NUMSAMP) + if (jpegSubsamp >= TJ.NUMSAMP) throw new Exception("JPEG header information is invalid"); byte[] buf = new byte[TJ.bufSizeYUV(jpegWidth, jpegHeight, jpegSubsamp)]; decompressToYUV(buf, flags); @@ -440,15 +452,16 @@ public class TJDecompressor { * @param flags the bitwise OR of one or more of {@link TJ TJ.FLAG_*} */ public void decompress(int[] dstBuf, int x, int y, int desiredWidth, - int stride, int desiredHeight, int pixelFormat, int flags) - throws Exception { - if(jpegBuf == null) throw new Exception(NO_ASSOC_ERROR); - if(dstBuf == null || x < 0 || y < 0 || desiredWidth < 0 || stride < 0 - || desiredHeight < 0 || pixelFormat < 0 || pixelFormat >= TJ.NUMPF - || flags < 0) + int stride, int desiredHeight, int pixelFormat, + int flags) throws Exception { + if (jpegBuf == null) + throw new Exception(NO_ASSOC_ERROR); + if (dstBuf == null || x < 0 || y < 0 || desiredWidth < 0 || stride < 0 || + desiredHeight < 0 || pixelFormat < 0 || pixelFormat >= TJ.NUMPF || + flags < 0) throw new Exception("Invalid argument in decompress()"); decompress(jpegBuf, jpegBufSize, dstBuf, x, y, desiredWidth, stride, - desiredHeight, pixelFormat, flags); + desiredHeight, pixelFormat, flags); } /** @@ -462,16 +475,16 @@ public class TJDecompressor { * @param flags the bitwise OR of one or more of {@link TJ TJ.FLAG_*} */ 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()"); int desiredWidth = dstImage.getWidth(); int desiredHeight = dstImage.getHeight(); int scaledWidth = getScaledWidth(desiredWidth, desiredHeight); int 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."); int pixelFormat; boolean intPixels = false; - if(byteOrder == null) + if (byteOrder == null) byteOrder = ByteOrder.nativeOrder(); switch(dstImage.getType()) { case BufferedImage.TYPE_3BYTE_BGR: @@ -482,20 +495,20 @@ public class TJDecompressor { case BufferedImage.TYPE_BYTE_GRAY: pixelFormat = TJ.PF_GRAY; break; case BufferedImage.TYPE_INT_BGR: - if(byteOrder == ByteOrder.BIG_ENDIAN) + if (byteOrder == ByteOrder.BIG_ENDIAN) pixelFormat = TJ.PF_XBGR; else pixelFormat = TJ.PF_RGBX; intPixels = true; break; case BufferedImage.TYPE_INT_RGB: - if(byteOrder == ByteOrder.BIG_ENDIAN) + if (byteOrder == ByteOrder.BIG_ENDIAN) pixelFormat = TJ.PF_XRGB; else pixelFormat = TJ.PF_BGRX; intPixels = true; break; case BufferedImage.TYPE_INT_ARGB: case BufferedImage.TYPE_INT_ARGB_PRE: - if(byteOrder == ByteOrder.BIG_ENDIAN) + if (byteOrder == ByteOrder.BIG_ENDIAN) pixelFormat = TJ.PF_ARGB; else pixelFormat = TJ.PF_BGRA; @@ -504,21 +517,21 @@ public class TJDecompressor { throw new Exception("Unsupported BufferedImage format"); } WritableRaster wr = dstImage.getRaster(); - if(intPixels) { + if (intPixels) { SinglePixelPackedSampleModel sm = (SinglePixelPackedSampleModel)dstImage.getSampleModel(); int pitch = sm.getScanlineStride(); DataBufferInt db = (DataBufferInt)wr.getDataBuffer(); int[] buf = db.getData(); - if(jpegBuf == null) throw new Exception(NO_ASSOC_ERROR); + if (jpegBuf == null) + throw new Exception(NO_ASSOC_ERROR); decompress(jpegBuf, jpegBufSize, buf, scaledWidth, pitch, scaledHeight, - pixelFormat, flags); - } - else { + pixelFormat, flags); + } else { ComponentSampleModel sm = (ComponentSampleModel)dstImage.getSampleModel(); 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"); int pitch = sm.getScanlineStride(); DataBufferByte db = (DataBufferByte)wr.getDataBuffer(); @@ -550,13 +563,14 @@ public class TJDecompressor { * decompressed image */ public BufferedImage decompress(int desiredWidth, int desiredHeight, - int bufferedImageType, int flags) throws Exception { - if(desiredWidth < 0 || desiredHeight < 0 || flags < 0) + int bufferedImageType, int flags) + throws Exception { + if (desiredWidth < 0 || desiredHeight < 0 || flags < 0) throw new Exception("Invalid argument in decompress()"); int scaledWidth = getScaledWidth(desiredWidth, desiredHeight); int scaledHeight = getScaledHeight(desiredWidth, desiredHeight); BufferedImage img = new BufferedImage(scaledWidth, scaledHeight, - bufferedImageType); + bufferedImageType); decompress(img, flags); return img; } @@ -571,9 +585,8 @@ public class TJDecompressor { protected void finalize() throws Throwable { try { close(); - } - catch(Exception e) {} - finally { + } catch(Exception e) { + } finally { super.finalize(); } }; diff --git a/java/org/libjpegturbo/turbojpeg/TJScalingFactor.java b/java/org/libjpegturbo/turbojpeg/TJScalingFactor.java index d71ceee..4e7363f 100644 --- a/java/org/libjpegturbo/turbojpeg/TJScalingFactor.java +++ b/java/org/libjpegturbo/turbojpeg/TJScalingFactor.java @@ -34,7 +34,7 @@ package org.libjpegturbo.turbojpeg; public class TJScalingFactor { public TJScalingFactor(int num, int denom) throws Exception { - if(num < 1 || denom < 1) + if (num < 1 || denom < 1) throw new Exception("Numerator and denominator must be >= 1"); this.num = num; this.denom = denom; diff --git a/java/org/libjpegturbo/turbojpeg/TJTransform.java b/java/org/libjpegturbo/turbojpeg/TJTransform.java index cfbc896..b464ffd 100644 --- a/java/org/libjpegturbo/turbojpeg/TJTransform.java +++ b/java/org/libjpegturbo/turbojpeg/TJTransform.java @@ -40,54 +40,54 @@ public class TJTransform extends Rectangle { /** * The number of lossless transform operations */ - final public static int NUMOP = 8; + public static final int NUMOP = 8; /** * Do not transform the position of the image pixels. */ - final public static int OP_NONE = 0; + public static final int OP_NONE = 0; /** * Flip (mirror) image horizontally. This transform is imperfect if there * are any partial MCU blocks on the right edge. * @see #OPT_PERFECT */ - final public static int OP_HFLIP = 1; + public static final int OP_HFLIP = 1; /** * Flip (mirror) image vertically. This transform is imperfect if there are * any partial MCU blocks on the bottom edge. * @see #OPT_PERFECT */ - final public static int OP_VFLIP = 2; + public static final int OP_VFLIP = 2; /** * Transpose image (flip/mirror along upper left to lower right axis). This * transform is always perfect. * @see #OPT_PERFECT */ - final public static int OP_TRANSPOSE = 3; + public static final int OP_TRANSPOSE = 3; /** * Transverse transpose image (flip/mirror along upper right to lower left * axis). This transform is imperfect if there are any partial MCU blocks in * the image. * @see #OPT_PERFECT */ - final public static int OP_TRANSVERSE = 4; + public static final int OP_TRANSVERSE = 4; /** * Rotate image clockwise by 90 degrees. This transform is imperfect if * there are any partial MCU blocks on the bottom edge. * @see #OPT_PERFECT */ - final public static int OP_ROT90 = 5; + public static final int OP_ROT90 = 5; /** * Rotate image 180 degrees. This transform is imperfect if there are any * partial MCU blocks in the image. * @see #OPT_PERFECT */ - final public static int OP_ROT180 = 6; + public static final int OP_ROT180 = 6; /** * Rotate image counter-clockwise by 90 degrees. This transform is imperfect * if there are any partial MCU blocks on the right edge. * @see #OPT_PERFECT */ - final public static int OP_ROT270 = 7; + public static final int OP_ROT270 = 7; /** @@ -103,21 +103,21 @@ public class TJTransform extends Rectangle { * partial MCU blocks that cannot be transformed will be left in place, which * will create odd-looking strips on the right or bottom edge of the image. */ - final public static int OPT_PERFECT = 1; + public static final int OPT_PERFECT = 1; /** * This option will discard any partial MCU blocks that cannot be * transformed. */ - final public static int OPT_TRIM = 2; + public static final int OPT_TRIM = 2; /** * This option will enable lossless cropping. */ - final public static int OPT_CROP = 4; + public static final int OPT_CROP = 4; /** * This option will discard the color data in the input image and produce * a grayscale output image. */ - final public static int OPT_GRAY = 8; + public static final int OPT_GRAY = 8; /** * This option will prevent {@link TJTransformer#transform * TJTransformer.transform()} from outputting a JPEG image for this @@ -125,9 +125,9 @@ public class TJTransform extends Rectangle { * filter to capture the transformed DCT coefficients without transcoding * them. */ - final public static int OPT_NOOUTPUT = 16; + public static final int OPT_NOOUTPUT = 16; + - /** * Create a new lossless transform instance. */ @@ -160,9 +160,11 @@ public class TJTransform extends Rectangle { * TJCustomFilter} interface, or null if no custom filter is needed */ public TJTransform(int x, int y, int w, int h, int op, int options, - TJCustomFilter cf) throws Exception { + TJCustomFilter cf) throws Exception { super(x, y, w, h); - this.op = op; this.options = options; this.cf = cf; + this.op = op; + this.options = options; + this.cf = cf; } /** @@ -182,9 +184,11 @@ public class TJTransform extends Rectangle { * TJCustomFilter} interface, or null if no custom filter is needed */ public TJTransform(Rectangle r, int op, int options, - TJCustomFilter cf) throws Exception { + TJCustomFilter cf) throws Exception { super(r); - this.op = op; this.options = options; this.cf = cf; + this.op = op; + this.options = options; + this.cf = cf; } /** diff --git a/java/org/libjpegturbo/turbojpeg/TJTransformer.java b/java/org/libjpegturbo/turbojpeg/TJTransformer.java index 72c87cd..f84eaa1 100644 --- a/java/org/libjpegturbo/turbojpeg/TJTransformer.java +++ b/java/org/libjpegturbo/turbojpeg/TJTransformer.java @@ -93,12 +93,13 @@ public class TJTransformer extends TJDecompressor { * @param flags the bitwise OR of one or more of {@link TJ TJ.FLAG_*} */ public void transform(byte[][] dstBufs, TJTransform[] transforms, - int flags) throws Exception { - if(jpegBuf == null) throw new Exception("JPEG buffer not initialized"); + int flags) throws Exception { + if (jpegBuf == null) + throw new Exception("JPEG buffer not initialized"); transformedSizes = transform(jpegBuf, jpegBufSize, dstBufs, transforms, - flags); + flags); } - + /** * Losslessly transform the JPEG image associated with this transformer * instance and return an array of {@link TJDecompressor} instances, each of @@ -116,23 +117,23 @@ public class TJTransformer extends TJDecompressor { public TJDecompressor[] transform(TJTransform[] transforms, int flags) throws Exception { byte[][] dstBufs = new byte[transforms.length][]; - if(jpegWidth < 1 || jpegHeight < 1) + if (jpegWidth < 1 || jpegHeight < 1) throw new Exception("JPEG buffer not initialized"); - for(int i = 0; i < transforms.length; i++) { + for (int i = 0; i < transforms.length; i++) { int w = jpegWidth, h = jpegHeight; - if((transforms[i].options & TJTransform.OPT_CROP) != 0) { - if(transforms[i].width != 0) w = transforms[i].width; - if(transforms[i].height != 0) h = transforms[i].height; + if ((transforms[i].options & TJTransform.OPT_CROP) != 0) { + if (transforms[i].width != 0) w = transforms[i].width; + if (transforms[i].height != 0) h = transforms[i].height; } dstBufs[i] = new byte[TJ.bufSize(w, h, jpegSubsamp)]; } TJDecompressor[] tjd = new TJDecompressor[transforms.length]; transform(dstBufs, transforms, flags); - for(int i = 0; i < transforms.length; i++) + for (int i = 0; i < transforms.length; i++) tjd[i] = new TJDecompressor(dstBufs[i], transformedSizes[i]); return tjd; } - + /** * Returns an array containing the sizes of the transformed JPEG images from * the most recent call to {@link #transform transform()}. @@ -141,7 +142,7 @@ public class TJTransformer extends TJDecompressor { * the most recent call to {@link #transform transform()} */ public int[] getTransformedSizes() throws Exception { - if(transformedSizes == null) + if (transformedSizes == null) throw new Exception("No image has been transformed yet"); return transformedSizes; } -- 2.40.0