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
This commit is contained in:
@@ -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;
|
||||
@@ -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,8 +236,7 @@ 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;
|
||||
@@ -304,8 +298,7 @@ class TJBench
|
||||
|
||||
|
||||
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;
|
||||
@@ -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;
|
||||
@@ -510,7 +502,7 @@ class TJBench
|
||||
_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) {
|
||||
@@ -583,10 +575,9 @@ class TJBench
|
||||
}
|
||||
|
||||
|
||||
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();
|
||||
|
||||
@@ -641,8 +632,7 @@ class TJBench
|
||||
}
|
||||
|
||||
|
||||
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;
|
||||
@@ -751,7 +741,7 @@ class TJBench
|
||||
} catch(Exception e) {}
|
||||
if (temp2 <= 0) temp2 = 1;
|
||||
if (temp1 > 0) {
|
||||
TJScalingFactor scalingFactors[] = TJ.getScalingFactors();
|
||||
TJScalingFactor[] scalingFactors = TJ.getScalingFactors();
|
||||
for (int j = 0; j < scalingFactors.length; j++) {
|
||||
if ((double)temp1 / (double)temp2 ==
|
||||
(double)scalingFactors[j].getNum() /
|
||||
|
||||
@@ -53,10 +53,13 @@ public class TJExample implements TJCustomFilter {
|
||||
System.out.print(" output image by a factor of M/N (M/N = ");
|
||||
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 ");
|
||||
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 (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;
|
||||
|
||||
@@ -115,9 +119,10 @@ public class TJExample implements TJCustomFilter {
|
||||
|
||||
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[i].length() < 2)
|
||||
continue;
|
||||
if (argv[i].length() > 2 &&
|
||||
argv[i].substring(0, 3).equalsIgnoreCase("-sc")) {
|
||||
int match = 0;
|
||||
if (i < argv.length - 1) {
|
||||
String[] scaleArg = argv[++i].split("/");
|
||||
@@ -128,7 +133,8 @@ public class TJExample implements TJCustomFilter {
|
||||
for (int j = 0; j < sf.length; j++) {
|
||||
if (tempsf.equals(sf[j])) {
|
||||
scaleFactor = sf[j];
|
||||
match = 1; break;
|
||||
match = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -137,26 +143,32 @@ public class TJExample implements TJCustomFilter {
|
||||
}
|
||||
if (argv[i].equalsIgnoreCase("-h") || argv[i].equalsIgnoreCase("-?"))
|
||||
usage();
|
||||
if(argv[i].length() > 2
|
||||
&& argv[i].substring(0, 3).equalsIgnoreCase("-sa")) {
|
||||
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"))
|
||||
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) {
|
||||
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"))
|
||||
xform.options |= TJTransform.OPT_GRAY;
|
||||
@@ -176,20 +188,26 @@ public class TJExample implements TJCustomFilter {
|
||||
xform.op = TJTransform.OP_ROT270;
|
||||
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"))
|
||||
@@ -212,7 +230,8 @@ public class TJExample implements TJCustomFilter {
|
||||
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)
|
||||
@@ -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());
|
||||
@@ -268,10 +288,10 @@ public class TJExample implements TJCustomFilter {
|
||||
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.");
|
||||
@@ -280,23 +300,23 @@ public class TJExample implements TJCustomFilter {
|
||||
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");
|
||||
System.out.print("Dest. Image (" + outFormat + "): " + width + " x " +
|
||||
height + " pixels");
|
||||
|
||||
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);
|
||||
} else if (outFormat.equalsIgnoreCase("jpg")) {
|
||||
System.out.println(", " + sampName[outSubsamp] +
|
||||
" subsampling, quality = " + outQual);
|
||||
TJCompressor tjc = new TJCompressor();
|
||||
int jpegSize;
|
||||
byte[] jpegBuf;
|
||||
@@ -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 {
|
||||
Rectangle planeRegion, int componentIndex,
|
||||
int transformIndex, TJTransform transform)
|
||||
throws Exception {
|
||||
for (int i = 0; i < bufferRegion.width * bufferRegion.height; i++) {
|
||||
coeffBuffer.put(i, (short)(-coeffBuffer.get(i)));
|
||||
}
|
||||
}
|
||||
|
||||
static TJScalingFactor sf [] = null;
|
||||
static TJScalingFactor[] sf = null;
|
||||
};
|
||||
|
||||
@@ -50,48 +50,48 @@ public class TJUnitTest {
|
||||
System.exit(1);
|
||||
}
|
||||
|
||||
private final static String subNameLong[] = {
|
||||
private static final String[] subNameLong = {
|
||||
"4:4:4", "4:2:2", "4:2:0", "GRAY", "4:4:0"
|
||||
};
|
||||
private final static String subName[] = {
|
||||
private static final String[] subName = {
|
||||
"444", "422", "420", "GRAY", "440"
|
||||
};
|
||||
|
||||
private final static String pixFormatStr[] = {
|
||||
private static final String[] pixFormatStr = {
|
||||
"RGB", "BGR", "RGBX", "BGRX", "XBGR", "XRGB", "Grayscale",
|
||||
"RGBA", "BGRA", "ABGR", "ARGB"
|
||||
};
|
||||
|
||||
private final static int alphaOffset[] = {
|
||||
private static final int[] alphaOffset = {
|
||||
-1, -1, -1, -1, -1, -1, -1, 3, 3, 0, 0
|
||||
};
|
||||
|
||||
private final static int _3byteFormats[] = {
|
||||
private static final int[] _3byteFormats = {
|
||||
TJ.PF_RGB, TJ.PF_BGR
|
||||
};
|
||||
private final static int _3byteFormatsBI[] = {
|
||||
private static final int[] _3byteFormatsBI = {
|
||||
BufferedImage.TYPE_3BYTE_BGR
|
||||
};
|
||||
private final static int _4byteFormats[] = {
|
||||
private static final int[] _4byteFormats = {
|
||||
TJ.PF_RGBX, TJ.PF_BGRX, TJ.PF_XBGR, TJ.PF_XRGB
|
||||
};
|
||||
private final static int _4byteFormatsBI[] = {
|
||||
private static final int[] _4byteFormatsBI = {
|
||||
BufferedImage.TYPE_INT_BGR, BufferedImage.TYPE_INT_RGB,
|
||||
BufferedImage.TYPE_4BYTE_ABGR, BufferedImage.TYPE_4BYTE_ABGR_PRE,
|
||||
BufferedImage.TYPE_INT_ARGB, BufferedImage.TYPE_INT_ARGB_PRE
|
||||
};
|
||||
private final static int onlyGray[] = {
|
||||
private static final int[] onlyGray = {
|
||||
TJ.PF_GRAY
|
||||
};
|
||||
private final static int onlyGrayBI[] = {
|
||||
private static final int[] onlyGrayBI = {
|
||||
BufferedImage.TYPE_BYTE_GRAY
|
||||
};
|
||||
private final static int onlyRGB[] = {
|
||||
private static final int[] onlyRGB = {
|
||||
TJ.PF_RGB
|
||||
};
|
||||
|
||||
private final static int YUVENCODE = 1;
|
||||
private final static int YUVDECODE = 2;
|
||||
private static final int YUVENCODE = 1;
|
||||
private static final int YUVDECODE = 2;
|
||||
private static int yuv = 0;
|
||||
private static boolean bi = false;
|
||||
|
||||
@@ -149,7 +149,6 @@ public class TJUnitTest {
|
||||
return "Unknown";
|
||||
}
|
||||
|
||||
|
||||
private static double getTime() {
|
||||
return (double)System.nanoTime() / 1.0e9;
|
||||
}
|
||||
@@ -169,10 +168,12 @@ public class TJUnitTest {
|
||||
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;
|
||||
if (((row / 8) + (col / 8)) % 2 == 0)
|
||||
buf[index] = (row < halfway) ? (byte)255 : 0;
|
||||
else buf[index] = (row < halfway) ? 76 : (byte)226;
|
||||
else
|
||||
buf[index] = (row < halfway) ? 76 : (byte)226;
|
||||
}
|
||||
}
|
||||
return;
|
||||
@@ -181,19 +182,21 @@ public class TJUnitTest {
|
||||
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;
|
||||
if (((row / 8) + (col / 8)) % 2 == 0) {
|
||||
if (row < halfway) {
|
||||
buf[index + roffset] = (byte)255;
|
||||
buf[index + goffset] = (byte)255;
|
||||
buf[index + boffset] = (byte)255;
|
||||
}
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
buf[index + roffset] = (byte)255;
|
||||
if(row >= 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -211,19 +214,21 @@ public class TJUnitTest {
|
||||
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;
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -232,18 +237,17 @@ public class TJUnitTest {
|
||||
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();
|
||||
@@ -256,8 +260,8 @@ public class TJUnitTest {
|
||||
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");
|
||||
throw new Exception("\nComp. " + vname + " at " + row + "," + col +
|
||||
" should be " + cv + ", not " + v + "\n");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -265,8 +269,8 @@ public class TJUnitTest {
|
||||
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");
|
||||
throw new Exception("\nComp. " + vname + " at " + row + "," + col +
|
||||
" should be 0, not " + v + "\n");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -274,13 +278,14 @@ public class TJUnitTest {
|
||||
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");
|
||||
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);
|
||||
@@ -295,7 +300,8 @@ public class TJUnitTest {
|
||||
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];
|
||||
@@ -305,32 +311,27 @@ public class TJUnitTest {
|
||||
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 {
|
||||
} 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) {
|
||||
checkVal0(row, col, g, "G");
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
checkVal255(row, col, g, "G");
|
||||
}
|
||||
checkVal0(row, col, b, "B");
|
||||
@@ -339,8 +340,7 @@ public class TJUnitTest {
|
||||
checkVal255(row, col, a, "A");
|
||||
}
|
||||
}
|
||||
}
|
||||
catch(Exception e) {
|
||||
} catch(Exception e) {
|
||||
System.out.println(e);
|
||||
retval = 0;
|
||||
}
|
||||
@@ -352,7 +352,9 @@ public class TJUnitTest {
|
||||
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;
|
||||
@@ -376,7 +379,8 @@ public class TJUnitTest {
|
||||
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;
|
||||
@@ -386,32 +390,27 @@ public class TJUnitTest {
|
||||
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 {
|
||||
} 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) {
|
||||
checkVal0(row, col, g, "G");
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
checkVal255(row, col, g, "G");
|
||||
}
|
||||
checkVal0(row, col, b, "B");
|
||||
@@ -420,8 +419,7 @@ public class TJUnitTest {
|
||||
checkVal255(row, col, a, "A");
|
||||
}
|
||||
}
|
||||
}
|
||||
catch(Exception e) {
|
||||
} catch(Exception e) {
|
||||
System.out.println(e);
|
||||
retval = 0;
|
||||
}
|
||||
@@ -433,7 +431,9 @@ public class TJUnitTest {
|
||||
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,14 +442,14 @@ 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) {
|
||||
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();
|
||||
@@ -457,8 +457,7 @@ public class TJUnitTest {
|
||||
int[] buf = db.getData();
|
||||
return checkIntBuf(buf, img.getWidth(), pitch, img.getHeight(), pf,
|
||||
subsamp, sf, flags);
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
ComponentSampleModel sm = (ComponentSampleModel)img.getSampleModel();
|
||||
int pitch = sm.getScanlineStride();
|
||||
DataBufferByte db = (DataBufferByte)wr.getDataBuffer();
|
||||
@@ -480,25 +479,28 @@ public class TJUnitTest {
|
||||
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);
|
||||
throw new Exception("\nIncorrect size " + size + ". Should be " +
|
||||
correctsize);
|
||||
|
||||
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 < 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -511,13 +513,11 @@ public class TJUnitTest {
|
||||
if (((row * vsf / 8) + (col * hsf / 8)) % 2 == 0) {
|
||||
checkVal(row, col, u, "U", 128);
|
||||
checkVal(row, col, v, "V", 128);
|
||||
}
|
||||
else {
|
||||
} 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,8 +525,7 @@ public class TJUnitTest {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
catch(Exception e) {
|
||||
} catch(Exception e) {
|
||||
System.out.println(e);
|
||||
retval = 0;
|
||||
}
|
||||
@@ -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) {
|
||||
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);
|
||||
}
|
||||
@@ -616,35 +619,39 @@ public class TJUnitTest {
|
||||
tjc.setSubsamp(subsamp);
|
||||
tjc.setJPEGQuality(jpegQual);
|
||||
if (bi) {
|
||||
if(yuv == YUVENCODE) tjc.encodeYUV(img, dstBuf, flags);
|
||||
else tjc.compress(img, dstBuf, flags);
|
||||
}
|
||||
else {
|
||||
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";
|
||||
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)
|
||||
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);
|
||||
@@ -667,26 +675,30 @@ public class TJUnitTest {
|
||||
if (bi) {
|
||||
pf = biTypePF(imgType);
|
||||
pfStr = biTypeStr(imgType);
|
||||
}
|
||||
else pfStr = pixFormatStr[pf];
|
||||
} else
|
||||
pfStr = pixFormatStr[pf];
|
||||
|
||||
System.out.print("JPEG -> ");
|
||||
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 (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;
|
||||
@@ -696,19 +708,21 @@ public class TJUnitTest {
|
||||
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)
|
||||
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";
|
||||
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);
|
||||
}
|
||||
@@ -719,30 +733,31 @@ public class TJUnitTest {
|
||||
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 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();
|
||||
TJScalingFactor[] sf = TJ.getScalingFactors();
|
||||
for (i = 0; i < sf.length; i++)
|
||||
decompTest(tjd, jpegBuf, jpegSize, w, h, pf, baseName, subsamp,
|
||||
flags, sf[i]);
|
||||
}
|
||||
else
|
||||
} else
|
||||
decompTest(tjd, jpegBuf, jpegSize, w, h, pf, baseName, subsamp,
|
||||
flags, new TJScalingFactor(1, 1));
|
||||
System.out.print("\n");
|
||||
@@ -755,8 +770,10 @@ public class TJUnitTest {
|
||||
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();
|
||||
@@ -765,14 +782,16 @@ public class TJUnitTest {
|
||||
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;
|
||||
tjc.close();
|
||||
tjd.close();
|
||||
return;
|
||||
} else
|
||||
flags |= TJ.FLAG_BOTTOMUP;
|
||||
}
|
||||
size = compTest(tjc, dstBuf, w, h, pf, baseName, subsamp, 100,
|
||||
flags);
|
||||
@@ -782,8 +801,7 @@ public class TJUnitTest {
|
||||
baseName, subsamp, flags);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch(Exception e) {
|
||||
} catch(Exception e) {
|
||||
if (tjc != null) tjc.close();
|
||||
if (tjd != null) tjd.close();
|
||||
throw e;
|
||||
@@ -828,22 +846,22 @@ public class TJUnitTest {
|
||||
}
|
||||
}
|
||||
System.out.println("Done. ");
|
||||
}
|
||||
catch(Exception e) {
|
||||
} catch(Exception e) {
|
||||
if (tjc != null) tjc.close();
|
||||
throw e;
|
||||
}
|
||||
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("-?"))
|
||||
if (argv[i].equalsIgnoreCase("-yuv"))
|
||||
doyuv = true;
|
||||
if (argv[i].substring(0, 1).equalsIgnoreCase("-h") ||
|
||||
argv[i].equalsIgnoreCase("-?"))
|
||||
usage();
|
||||
if (argv[i].equalsIgnoreCase("-bi")) {
|
||||
bi = true;
|
||||
@@ -851,8 +869,10 @@ public class TJUnitTest {
|
||||
}
|
||||
}
|
||||
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(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);
|
||||
doTest(35, 39, bi ? _4byteFormatsBI : _4byteFormats, TJ.SAMP_422,
|
||||
@@ -870,7 +890,8 @@ public class TJUnitTest {
|
||||
testName);
|
||||
doTest(41, 35, bi ? _4byteFormatsBI : _4byteFormats, TJ.SAMP_GRAY,
|
||||
testName);
|
||||
if(!doyuv && !bi) bufSizeTest();
|
||||
if (!doyuv && !bi)
|
||||
bufSizeTest();
|
||||
if (doyuv && !bi) {
|
||||
yuv = YUVDECODE;
|
||||
doTest(48, 48, onlyRGB, TJ.SAMP_444, "javatest_yuv0");
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
/**
|
||||
@@ -80,7 +80,7 @@ final public class TJ {
|
||||
return mcuWidth[subsamp];
|
||||
}
|
||||
|
||||
final private static int mcuWidth[] = {
|
||||
private static final int[] mcuWidth = {
|
||||
8, 16, 16, 8, 8
|
||||
};
|
||||
|
||||
@@ -101,7 +101,7 @@ final public class TJ {
|
||||
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;
|
||||
|
||||
|
||||
/**
|
||||
@@ -194,7 +194,7 @@ final public class TJ {
|
||||
return pixelSize[pixelFormat];
|
||||
}
|
||||
|
||||
final private static int pixelSize[] = {
|
||||
private static final int[] pixelSize = {
|
||||
3, 3, 4, 4, 4, 4, 1, 4, 4, 4, 4
|
||||
};
|
||||
|
||||
@@ -216,7 +216,7 @@ final public class TJ {
|
||||
return redOffset[pixelFormat];
|
||||
}
|
||||
|
||||
final private static int redOffset[] = {
|
||||
private static final int[] redOffset = {
|
||||
0, 2, 0, 2, 3, 1, 0, 0, 2, 3, 1
|
||||
};
|
||||
|
||||
@@ -238,7 +238,7 @@ final public class TJ {
|
||||
return greenOffset[pixelFormat];
|
||||
}
|
||||
|
||||
final private static int greenOffset[] = {
|
||||
private static final int[] greenOffset = {
|
||||
1, 1, 1, 1, 2, 2, 0, 1, 1, 2, 2
|
||||
};
|
||||
|
||||
@@ -260,7 +260,7 @@ final public class TJ {
|
||||
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 {
|
||||
|
||||
@@ -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";
|
||||
|
||||
/**
|
||||
@@ -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 {
|
||||
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)
|
||||
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;
|
||||
@@ -187,15 +190,20 @@ public class TJCompressor {
|
||||
public void compress(byte[] dstBuf, int flags) throws Exception {
|
||||
if (dstBuf == null || flags < 0)
|
||||
throw new Exception("Invalid argument in compress()");
|
||||
if(srcBuf == null) throw new Exception(NO_ASSOC_ERROR);
|
||||
if(jpegQuality < 0) throw new Exception("JPEG Quality not set");
|
||||
if(subsamp < 0) throw new Exception("Subsampling level not set");
|
||||
if (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);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -235,7 +243,8 @@ public class TJCompressor {
|
||||
throw new Exception("Invalid argument in compress()");
|
||||
int width = srcImage.getWidth();
|
||||
int height = srcImage.getHeight();
|
||||
int pixelFormat; boolean intPixels = false;
|
||||
int pixelFormat;
|
||||
boolean intPixels = false;
|
||||
if (byteOrder == null)
|
||||
byteOrder = ByteOrder.nativeOrder();
|
||||
switch(srcImage.getType()) {
|
||||
@@ -264,8 +273,10 @@ 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 (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();
|
||||
@@ -274,12 +285,12 @@ 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 {
|
||||
} else {
|
||||
ComponentSampleModel sm =
|
||||
(ComponentSampleModel)srcImage.getSampleModel();
|
||||
int pixelSize = sm.getPixelStride();
|
||||
@@ -290,7 +301,8 @@ public class TJCompressor {
|
||||
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);
|
||||
@@ -342,8 +354,10 @@ public class TJCompressor {
|
||||
public void encodeYUV(byte[] dstBuf, int flags) throws Exception {
|
||||
if (dstBuf == null || flags < 0)
|
||||
throw new Exception("Invalid argument in compress()");
|
||||
if(srcBuf == null) throw new Exception(NO_ASSOC_ERROR);
|
||||
if(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);
|
||||
compressedSize = TJ.bufSizeYUV(srcWidth, srcHeight, subsamp);
|
||||
@@ -361,7 +375,8 @@ public class TJCompressor {
|
||||
public byte[] encodeYUV(int flags) throws Exception {
|
||||
if (srcWidth < 1 || srcHeight < 1)
|
||||
throw new Exception(NO_ASSOC_ERROR);
|
||||
if(subsamp < 0) throw new Exception("Subsampling level not set");
|
||||
if (subsamp < 0)
|
||||
throw new Exception("Subsampling level not set");
|
||||
byte[] buf = new byte[TJ.bufSizeYUV(srcWidth, srcHeight, subsamp)];
|
||||
encodeYUV(buf, flags);
|
||||
return buf;
|
||||
@@ -425,8 +440,7 @@ public class TJCompressor {
|
||||
int[] buf = db.getData();
|
||||
encodeYUV(buf, width, pitch, height, pixelFormat, dstBuf, subsamp,
|
||||
flags);
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
ComponentSampleModel sm =
|
||||
(ComponentSampleModel)srcImage.getSampleModel();
|
||||
int pixelSize = sm.getPixelStride();
|
||||
@@ -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();
|
||||
}
|
||||
};
|
||||
|
||||
@@ -69,7 +69,7 @@ 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,
|
||||
void customFilter(ShortBuffer coeffBuffer, Rectangle bufferRegion,
|
||||
Rectangle planeRegion, int componentID, int transformID,
|
||||
TJTransform transform)
|
||||
throws Exception;
|
||||
|
||||
@@ -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";
|
||||
|
||||
/**
|
||||
@@ -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,7 +123,8 @@ public class TJDecompressor {
|
||||
* associated with this decompressor instance
|
||||
*/
|
||||
public int getSubsamp() throws Exception {
|
||||
if(jpegSubsamp < 0) throw new Exception(NO_ASSOC_ERROR);
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -175,9 +180,11 @@ public class TJDecompressor {
|
||||
throw new Exception(NO_ASSOC_ERROR);
|
||||
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++) {
|
||||
scaledWidth = sf[i].getScaled(jpegWidth);
|
||||
@@ -215,9 +222,11 @@ public class TJDecompressor {
|
||||
throw new Exception(NO_ASSOC_ERROR);
|
||||
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++) {
|
||||
scaledWidth = sf[i].getScaled(jpegWidth);
|
||||
@@ -284,12 +293,13 @@ 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);
|
||||
@@ -331,13 +341,14 @@ public class TJDecompressor {
|
||||
*/
|
||||
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)
|
||||
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,7 +372,8 @@ 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 (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);
|
||||
@@ -440,12 +452,13 @@ 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);
|
||||
@@ -510,11 +523,11 @@ public class TJDecompressor {
|
||||
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 {
|
||||
} else {
|
||||
ComponentSampleModel sm =
|
||||
(ComponentSampleModel)dstImage.getSampleModel();
|
||||
int pixelSize = sm.getPixelStride();
|
||||
@@ -550,7 +563,8 @@ public class TJDecompressor {
|
||||
* decompressed image
|
||||
*/
|
||||
public BufferedImage decompress(int desiredWidth, int desiredHeight,
|
||||
int bufferedImageType, int flags) throws Exception {
|
||||
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);
|
||||
@@ -571,9 +585,8 @@ public class TJDecompressor {
|
||||
protected void finalize() throws Throwable {
|
||||
try {
|
||||
close();
|
||||
}
|
||||
catch(Exception e) {}
|
||||
finally {
|
||||
} catch(Exception e) {
|
||||
} finally {
|
||||
super.finalize();
|
||||
}
|
||||
};
|
||||
|
||||
@@ -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,7 +125,7 @@ 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;
|
||||
|
||||
|
||||
/**
|
||||
@@ -162,7 +162,9 @@ public class TJTransform extends Rectangle {
|
||||
public TJTransform(int x, int y, int w, int h, int op, int options,
|
||||
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;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -184,7 +186,9 @@ public class TJTransform extends Rectangle {
|
||||
public TJTransform(Rectangle r, int op, int options,
|
||||
TJCustomFilter cf) throws Exception {
|
||||
super(r);
|
||||
this.op = op; this.options = options; this.cf = cf;
|
||||
this.op = op;
|
||||
this.options = options;
|
||||
this.cf = cf;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -94,7 +94,8 @@ public class TJTransformer extends TJDecompressor {
|
||||
*/
|
||||
public void transform(byte[][] dstBufs, TJTransform[] transforms,
|
||||
int flags) throws Exception {
|
||||
if(jpegBuf == null) throw new Exception("JPEG buffer not initialized");
|
||||
if (jpegBuf == null)
|
||||
throw new Exception("JPEG buffer not initialized");
|
||||
transformedSizes = transform(jpegBuf, jpegBufSize, dstBufs, transforms,
|
||||
flags);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user