1
0
mirror of https://github.com/libjpeg-turbo/libjpeg-turbo.git synced 2026-10-23 11:48:53 +03:00
Files
libjpeg-turbo/jna/TJ.java
DRC 57202c3b0a TJ: Don't expose TJSAMP_410/24 to TJ 3.1- callers
Otherwise the TurboJPEG 3.2 API would allow callers compiled against
TurboJPEG 3.1 and prior to set TJPARAM_SUBSAMP to a value that, from the
caller's point of view, is undefined.  tj3DecompressHeader() would also
potentially set TJPARAM_SUBSAMP to a value that would overflow the
caller's static tjMCUWidth[] and tjMCUHeight[] arrays.

The trick here is to redefine tj3Init() in the TurboJPEG header as a
macro that wraps a new undocumented function, tj3InitVersion(), and
passes it an API version constant (TURBOJPEG_VERSION_NUMBER = 3002000)
that is also defined in the header.  (This is a similar trick to the one
that the libjpeg v6a+ API uses for jpeg_create_*compress().)  The old
tj3Init() function is still exposed in the library, and it now calls
tj3InitVersion(..., 3001000) internally.  Based on the API version, the
API then sets and enforces an internal limit on the number of
chrominance subsampling options (TJ_NUMSAMP if the caller was compiled
against TurboJPEG 3.2+ or 7 otherwise.)

Thus, if an application is compiled against TurboJPEG 3.1-, it will
still call the old tj3Init() function, which sets the API version to
3.1 and doesn't expose TJSAMP_410 or TJSAMP_24.  If an application is
compiled against TurboJPEG 3.2+, then it will call the new
tj3InitVersion() function via the tj3Init() macro, which sets the API
version to 3.2 and exposes TJSAMP_410 and TJSAMP_24.

Ramifications:
- Applications compiled against TurboJPEG 3.2+ will not be able to use
  the TurboJPEG 3.1- API library at run time, because the
  tj3InitVersion() function will not be available.

- Applications compiled against TurboJPEG 3.1- will work the same
  regardless of whether they use the TurboJPEG 3.1- or 3.2+ API library
  at run time.

- Applications that weren't specifically developed for TurboJPEG 3.2+
  will not know about TJSAMP_410 or TJSAMP_24.  Thus, when decompressing
  or transforming without transposition, such applications will gain the
  ability to obtain the iMCU width/height of a 4:1:0 or 2:4 JPEG image,
  which is useful when adjusting the cropping region.  However, they
  will not gain any other abilities.
2026-03-26 11:07:19 -04:00

940 lines
38 KiB
Java

/*
* Copyright (C) 2026 D. R. Commander
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* - Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* - Neither the name of the libjpeg-turbo Project nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS",
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
import java.io.Closeable;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import com.sun.jna.Callback;
import com.sun.jna.ptr.IntByReference;
import com.sun.jna.Native;
import com.sun.jna.NativeLong;
import com.sun.jna.ptr.NativeLongByReference;
import com.sun.jna.Pointer;
import com.sun.jna.ptr.PointerByReference;
import com.sun.jna.Structure;
import com.sun.jna.Structure.FieldOrder;
@SuppressWarnings({ "checkstyle:JavadocVariable",
"checkstyle:VisibilityModifier" })
public final class TJ {
private TJ() {}
static {
Native.register("turbojpeg");
}
// ==========================================================================
// CONSTANTS
// ==========================================================================
public static final int TURBOJPEG_VERSION_NUMBER = 3002000;
public static final int NUMINIT = 3;
public static final int INIT_COMPRESS = 0;
public static final int INIT_DECOMPRESS = 1;
public static final int INIT_TRANSFORM = 2;
public static final int NUMSAMP = 9;
public static final int SAMP_444 = 0;
public static final int SAMP_422 = 1;
public static final int SAMP_420 = 2;
public static final int SAMP_GRAY = 3;
public static final int SAMP_440 = 4;
public static final int SAMP_411 = 5;
public static final int SAMP_441 = 6;
public static final int SAMP_410 = 7;
public static final int SAMP_24 = 8;
public static final int SAMP_UNKNOWN = -1;
public static final int[] MCU_WIDTH = { 8, 16, 16, 8, 8, 32, 8, 32, 16 };
public static final int[] MCU_HEIGHT = { 8, 8, 16, 8, 16, 8, 32, 16, 32 };
public static final int NUMPF = 12;
public static final int PF_RGB = 0;
public static final int PF_BGR = 1;
public static final int PF_RGBX = 2;
public static final int PF_BGRX = 3;
public static final int PF_XBGR = 4;
public static final int PF_XRGB = 5;
public static final int PF_GRAY = 6;
public static final int PF_RGBA = 7;
public static final int PF_BGRA = 8;
public static final int PF_ABGR = 9;
public static final int PF_ARGB = 10;
public static final int PF_CMYK = 11;
public static final int PF_UNKNOWN = -1;
public static final int[] RED_OFFSET = {
0, 2, 0, 2, 3, 1, -1, 0, 2, 3, 1, -1
};
public static final int[] GREEN_OFFSET = {
1, 1, 1, 1, 2, 2, -1, 1, 1, 2, 2, -1
};
public static final int[] BLUE_OFFSET = {
2, 0, 2, 0, 1, 3, -1, 2, 0, 1, 3, -1
};
public static final int[] ALPHA_OFFSET = {
-1, -1, -1, -1, -1, -1, -1, 3, 3, 0, 0, -1
};
public static final int[] PIXEL_SIZE = {
3, 3, 4, 4, 4, 4, 1, 4, 4, 4, 4, 4
};
public static final int NUMCS = 5;
public static final int CS_RGB = 0;
@SuppressWarnings("checkstyle:ConstantName")
public static final int CS_YCbCr = 1;
public static final int CS_GRAY = 2;
public static final int CS_CMYK = 3;
public static final int CS_YCCK = 4;
public static final int CS_DEFAULT = -1;
public static final int PARAM_STOPONWARNING = 0;
public static final int PARAM_BOTTOMUP = 1;
public static final int PARAM_NOREALLOC = 2;
public static final int PARAM_QUALITY = 3;
public static final int PARAM_SUBSAMP = 4;
public static final int PARAM_JPEGWIDTH = 5;
public static final int PARAM_JPEGHEIGHT = 6;
public static final int PARAM_PRECISION = 7;
public static final int PARAM_COLORSPACE = 8;
public static final int PARAM_FASTUPSAMPLE = 9;
public static final int PARAM_FASTDCT = 10;
public static final int PARAM_OPTIMIZE = 11;
public static final int PARAM_PROGRESSIVE = 12;
public static final int PARAM_SCANLIMIT = 13;
public static final int PARAM_ARITHMETIC = 14;
public static final int PARAM_LOSSLESS = 15;
public static final int PARAM_LOSSLESSPSV = 16;
public static final int PARAM_LOSSLESSPT = 17;
public static final int PARAM_RESTARTBLOCKS = 18;
public static final int PARAM_RESTARTROWS = 19;
public static final int PARAM_XDENSITY = 20;
public static final int PARAM_YDENSITY = 21;
public static final int PARAM_DENSITYUNITS = 22;
public static final int PARAM_MAXMEMORY = 23;
public static final int PARAM_MAXPIXELS = 24;
public static final int PARAM_SAVEMARKERS = 25;
public static final int NUMERR = 2;
public static final int ERR_WARNING = 0;
public static final int ERR_FATAL = 1;
public static final int NUMXOP = 8;
public static final int XOP_NONE = 0;
public static final int XOP_HFLIP = 1;
public static final int XOP_VFLIP = 2;
public static final int XOP_TRANSPOSE = 3;
public static final int XOP_TRANSVERSE = 4;
public static final int XOP_ROT90 = 5;
public static final int XOP_ROT180 = 6;
public static final int XOP_ROT270 = 7;
public static final int XOPT_PERFECT = (1 << 0);
public static final int XOPT_TRIM = (1 << 1);
public static final int XOPT_CROP = (1 << 2);
public static final int XOPT_GRAY = (1 << 3);
public static final int XOPT_NOOUTPUT = (1 << 4);
public static final int XOPT_PROGRESSIVE = (1 << 5);
public static final int XOPT_COPYNONE = (1 << 6);
public static final int XOPT_ARITHMETIC = (1 << 7);
public static final int XOPT_OPTIMIZE = (1 << 8);
// ==========================================================================
// STRUCTURES AND NESTED CLASSES
// ==========================================================================
// tjscalingfactor
@FieldOrder({ "num", "denom" })
public static class ScalingFactor extends Structure {
public int num, denom;
public ScalingFactor() {}
@SuppressWarnings("checkstyle:HiddenField")
public ScalingFactor(int num, int denom) {
this.num = num;
this.denom = denom;
}
public static class ByValue extends ScalingFactor
implements Structure.ByValue {
public ByValue() {}
public ByValue(int num, int denom) {
super(num, denom);
}
public ByValue(ScalingFactor sf) {
super(sf.num, sf.denom);
}
}
protected final List<String> getFieldOrder() {
return Arrays.asList("num", "denom");
}
};
public static final ScalingFactor UNSCALED = new ScalingFactor.ByValue(1, 1);
// tjregion
@FieldOrder({ "x", "y", "w", "h" })
public static class Region extends Structure {
public int x, y, w, h;
public Region() {}
@SuppressWarnings("checkstyle:HiddenField")
public Region(int x, int y, int w, int h) {
this.x = x;
this.y = y;
this.w = w;
this.h = h;
}
public static class ByValue extends Region implements Structure.ByValue {
public ByValue() {}
public ByValue(int x, int y, int w, int h) {
super(x, y, w, h);
}
public ByValue(Region r) {
super(r.x, r.y, r.w, r.h);
}
}
protected final List<String> getFieldOrder() {
return Arrays.asList("x", "y", "w", "h");
}
};
public static final Region UNCROPPED = new Region.ByValue(0, 0, 0, 0);
// tjtransform
public interface CustomFilterFunc extends Callback {
int invoke(Pointer coeffs, Region.ByValue arrayRegion,
Region.ByValue planeRegion, int componentID, int transformID,
Transform transform);
}
@FieldOrder({ "r", "op", "options", "data", "customFilter" })
public static class Transform extends Structure {
public Region r;
public int op, options;
public Pointer data;
public CustomFilterFunc customFilter;
public Transform() {}
@SuppressWarnings("checkstyle:HiddenField")
public Transform(Region r, int op, int options, Pointer data,
CustomFilterFunc customFilter) {
this.r.x = r.x;
this.r.y = r.y;
this.r.w = r.w;
this.r.h = r.h;
this.op = op;
this.options = options;
this.data = data;
this.customFilter = customFilter;
}
public static class ByValue extends Transform implements
Structure.ByValue {
public ByValue() {}
public ByValue(Region r, int op, int options, Pointer data,
CustomFilterFunc customFilter) {
super(r, op, options, data, customFilter);
}
public ByValue(Transform t) {
super(t.r, t.op, t.options, t.data, t.customFilter);
}
}
protected final List<String> getFieldOrder() {
return Arrays.asList("r", "op", "options", "data", "customFilter");
}
};
// TJSCALED()
public static int scaled(int dimension, ScalingFactor scalingFactor) {
if (scalingFactor == null || scalingFactor.denom == 0)
return dimension;
return ((dimension * scalingFactor.num + scalingFactor.denom - 1) /
scalingFactor.denom);
}
// Exception thrown by the convenience methods
public static final class Exception extends IOException {
public Exception(String message, int code) {
super(message);
if (errorCode >= 0 && errorCode < NUMERR)
errorCode = code;
}
// Equivalent of TJ.tj3GetErrorCode() when using the convenience methods
public int getErrorCode() {
return errorCode;
}
private int errorCode = ERR_FATAL;
}
// These com.sun.jna.Structure subclasses allow us to do the equivalent of
// passing an array of PointerByReference or NativeLongByReference instances,
// since JNA does not allow that. They are used solely by the lossless
// transformation methods.
@FieldOrder("pointer")
public static class PointerReference extends Structure {
public Pointer pointer;
protected final List<String> getFieldOrder() {
return Arrays.asList("pointer");
}
};
@FieldOrder("value")
public static class NativeLongReference extends Structure {
public NativeLong value;
protected final List<String> getFieldOrder() {
return Arrays.asList("value");
}
};
// This com.sun.jna.Pointer subclass allows TurboJPEG instance handles to be
// used with Java try-with-resources statements.
public static class Handle extends Pointer implements Closeable {
public Handle(int initType) throws Exception {
super(nativeValue(init(initType)));
}
public final void close() {
destroy(this);
}
}
// ==========================================================================
// METHODS
// ==========================================================================
public static native Pointer tj3InitVersion(int initType, int apiVersion);
public static Pointer tj3Init(int initType) {
return tj3InitVersion(initType, TURBOJPEG_VERSION_NUMBER);
}
public static Pointer init(int initType) throws Exception {
Pointer handle = tj3Init(initType);
if (handle == null)
throw new Exception(tj3GetErrorStr(handle), tj3GetErrorCode(handle));
return handle;
}
// --------------------------------------------------------------------------
public static native void tj3Destroy(Pointer handle);
public static void destroy(Pointer handle) {
tj3Destroy(handle);
}
// --------------------------------------------------------------------------
public static native String tj3GetErrorStr(Pointer handle);
// --------------------------------------------------------------------------
public static native int tj3GetErrorCode(Pointer handle);
// --------------------------------------------------------------------------
public static native int tj3Set(Pointer handle, int param, int value);
public static void set(Pointer handle, int param, int value)
throws Exception {
if (tj3Set(handle, param, value) < 0)
throw new Exception(tj3GetErrorStr(handle), tj3GetErrorCode(handle));
}
// --------------------------------------------------------------------------
public static native int tj3Get(Pointer handle, int param);
public static int get(Pointer handle, int param) {
return tj3Get(handle, param);
}
// --------------------------------------------------------------------------
public static native Pointer tj3Alloc(NativeLong bytes);
public static Pointer alloc(NativeLong bytes) {
return tj3Alloc(bytes);
}
// --------------------------------------------------------------------------
public static native void tj3Free(Pointer buffer);
public static void free(Pointer buffer) {
tj3Free(buffer);
}
// --------------------------------------------------------------------------
public static native NativeLong tj3JPEGBufSize(int width, int height,
int jpegSubsamp);
public static NativeLong jpegBufSize(int width, int height, int jpegSubsamp)
throws Exception {
NativeLong retval = tj3JPEGBufSize(width, height, jpegSubsamp);
if (retval.longValue() == 0)
throw new Exception(tj3GetErrorStr(null), tj3GetErrorCode(null));
return retval;
}
// --------------------------------------------------------------------------
public static native NativeLong tj3YUVBufSize(int width, int align,
int height, int subsamp);
public static NativeLong yuvBufSize(int width, int align, int height,
int subsamp) throws Exception {
NativeLong retval = tj3YUVBufSize(width, align, height, subsamp);
if (retval.longValue() == 0)
throw new Exception(tj3GetErrorStr(null), tj3GetErrorCode(null));
return retval;
}
// --------------------------------------------------------------------------
public static native NativeLong tj3YUVPlaneSize(int componentID, int width,
int stride, int height,
int subsamp);
public static NativeLong yuvPlaneSize(int componentID, int width, int stride,
int height, int subsamp)
throws Exception {
NativeLong retval = tj3YUVPlaneSize(componentID, width, stride, height,
subsamp);
if (retval.longValue() == 0)
throw new Exception(tj3GetErrorStr(null), tj3GetErrorCode(null));
return retval;
}
// --------------------------------------------------------------------------
public static native int tj3YUVPlaneWidth(int componentID, int width,
int subsamp);
public static int yuvPlaneWidth(int componentID, int width, int subsamp)
throws Exception {
int retval = tj3YUVPlaneWidth(componentID, width, subsamp);
if (retval == 0)
throw new Exception(tj3GetErrorStr(null), tj3GetErrorCode(null));
return retval;
}
// --------------------------------------------------------------------------
public static native int tj3YUVPlaneHeight(int componentID, int height,
int subsamp);
public static int yuvPlaneHeight(int componentID, int width, int subsamp)
throws Exception {
int retval = tj3YUVPlaneHeight(componentID, width, subsamp);
if (retval == 0)
throw new Exception(tj3GetErrorStr(null), tj3GetErrorCode(null));
return retval;
}
// --------------------------------------------------------------------------
public static native int tj3SetICCProfile(Pointer handle, Pointer iccBuf,
NativeLong iccSize);
public static void setICCProfile(Pointer handle, Pointer iccBuf,
NativeLong iccSize) throws Exception {
if (tj3SetICCProfile(handle, iccBuf, iccSize) < 0)
throw new Exception(tj3GetErrorStr(handle), tj3GetErrorCode(handle));
}
// --------------------------------------------------------------------------
public static native int tj3Compress8(Pointer handle, Pointer srcBuf,
int width, int pitch, int height,
int pixelFormat,
PointerByReference jpegBuf,
NativeLongByReference jpegSize);
public static void compress8(Pointer handle, Pointer srcBuf, int width,
int pitch, int height, int pixelFormat,
PointerByReference jpegBuf,
NativeLongByReference jpegSize)
throws Exception {
if (tj3Compress8(handle, srcBuf, width, pitch, height, pixelFormat,
jpegBuf, jpegSize) < 0)
throw new Exception(tj3GetErrorStr(handle), tj3GetErrorCode(handle));
}
// --------------------------------------------------------------------------
public static native int tj3Compress12(Pointer handle, Pointer srcBuf,
int width, int pitch, int height,
int pixelFormat,
PointerByReference jpegBuf,
NativeLongByReference jpegSize);
public static void compress12(Pointer handle, Pointer srcBuf, int width,
int pitch, int height, int pixelFormat,
PointerByReference jpegBuf,
NativeLongByReference jpegSize)
throws Exception {
if (tj3Compress12(handle, srcBuf, width, pitch, height, pixelFormat,
jpegBuf, jpegSize) < 0)
throw new Exception(tj3GetErrorStr(handle), tj3GetErrorCode(handle));
}
// --------------------------------------------------------------------------
public static native int tj3Compress16(Pointer handle, Pointer srcBuf,
int width, int pitch, int height,
int pixelFormat,
PointerByReference jpegBuf,
NativeLongByReference jpegSize);
public static void compress16(Pointer handle, Pointer srcBuf, int width,
int pitch, int height, int pixelFormat,
PointerByReference jpegBuf,
NativeLongByReference jpegSize)
throws Exception {
if (tj3Compress16(handle, srcBuf, width, pitch, height, pixelFormat,
jpegBuf, jpegSize) < 0)
throw new Exception(tj3GetErrorStr(handle), tj3GetErrorCode(handle));
}
// --------------------------------------------------------------------------
// srcPlanes
public static native int
tj3CompressFromYUVPlanes8(Pointer handle, PointerReference srcPlanes,
int width, int[] strides, int height,
PointerByReference jpegBuf,
NativeLongByReference jpegSize);
public static void compressFromYUVPlanes8(Pointer handle,
PointerReference[] srcPlanes,
int width, int[] strides,
int height,
PointerByReference jpegBuf,
NativeLongByReference jpegSize)
throws Exception {
if (tj3CompressFromYUVPlanes8(handle, srcPlanes[0], width, strides, height,
jpegBuf, jpegSize) < 0)
throw new Exception(tj3GetErrorStr(handle), tj3GetErrorCode(handle));
}
// --------------------------------------------------------------------------
public static native int tj3CompressFromYUV8(Pointer handle, Pointer srcBuf,
int width, int align,
int height,
PointerByReference jpegBuf,
NativeLongByReference jpegSize);
public static void compressFromYUV8(Pointer handle, Pointer srcBuf,
int width, int align, int height,
PointerByReference jpegBuf,
NativeLongByReference jpegSize)
throws Exception {
if (tj3CompressFromYUV8(handle, srcBuf, width, align, height, jpegBuf,
jpegSize) < 0)
throw new Exception(tj3GetErrorStr(handle), tj3GetErrorCode(handle));
}
// --------------------------------------------------------------------------
public static native int tj3EncodeYUVPlanes8(Pointer handle, Pointer srcBuf,
int width, int pitch,
int height, int pixelFormat,
PointerReference dstPlanes,
int[] strides);
public static void encodeYUVPlanes8(Pointer handle, Pointer srcBuf,
int width, int pitch, int height,
int pixelFormat,
PointerReference[] dstPlanes,
int[] strides) throws Exception {
if (tj3EncodeYUVPlanes8(handle, srcBuf, width, pitch, height, pixelFormat,
dstPlanes[0], strides) < 0)
throw new Exception(tj3GetErrorStr(handle), tj3GetErrorCode(handle));
}
// --------------------------------------------------------------------------
public static native int tj3EncodeYUV8(Pointer handle, Pointer srcBuf,
int width, int pitch, int height,
int pixelFormat, Pointer dstBuf,
int align);
public static void encodeYUV8(Pointer handle, Pointer srcBuf, int width,
int pitch, int height, int pixelFormat,
Pointer dstBuf, int align) throws Exception {
if (tj3EncodeYUV8(handle, srcBuf, width, pitch, height, pixelFormat,
dstBuf, align) < 0)
throw new Exception(tj3GetErrorStr(handle), tj3GetErrorCode(handle));
}
// --------------------------------------------------------------------------
public static native int tj3DecompressHeader(Pointer handle, Pointer jpegBuf,
NativeLong jpegSize);
public static void decompressHeader(Pointer handle, Pointer jpegBuf,
NativeLong jpegSize) throws Exception {
if (tj3DecompressHeader(handle, jpegBuf, jpegSize) < 0)
throw new Exception(tj3GetErrorStr(handle), tj3GetErrorCode(handle));
}
// --------------------------------------------------------------------------
public static native int tj3GetICCProfile(Pointer handle,
PointerByReference iccBuf,
NativeLongByReference iccSize);
public static void getICCProfile(Pointer handle, PointerByReference iccBuf,
NativeLongByReference iccSize)
throws Exception {
if (tj3GetICCProfile(handle, iccBuf, iccSize) < 0)
throw new Exception(tj3GetErrorStr(handle), tj3GetErrorCode(handle));
}
// --------------------------------------------------------------------------
public static native ScalingFactor
tj3GetScalingFactors(IntByReference numScalingFactors);
public static ScalingFactor[]
getScalingFactors(IntByReference numScalingFactors) throws Exception {
ScalingFactor retval = tj3GetScalingFactors(numScalingFactors);
if (retval == null)
throw new Exception(tj3GetErrorStr(null), tj3GetErrorCode(null));
if (numScalingFactors != null && numScalingFactors.getValue() > 0)
return (ScalingFactor[])retval.toArray(numScalingFactors.getValue());
return null;
}
// --------------------------------------------------------------------------
public static native int
tj3SetScalingFactor(Pointer handle, ScalingFactor.ByValue scalingFactor);
public static void setScalingFactor(Pointer handle,
ScalingFactor scalingFactor)
throws Exception {
ScalingFactor.ByValue sf =
(scalingFactor instanceof ScalingFactor.ByValue ?
(ScalingFactor.ByValue)scalingFactor :
new ScalingFactor.ByValue(scalingFactor));
if (tj3SetScalingFactor(handle, sf) < 0)
throw new Exception(tj3GetErrorStr(handle), tj3GetErrorCode(handle));
}
// --------------------------------------------------------------------------
public static native int tj3SetCroppingRegion(Pointer handle,
Region.ByValue croppingRegion);
public static void setCroppingRegion(Pointer handle, Region croppingRegion)
throws Exception {
Region.ByValue cr =
(croppingRegion instanceof Region.ByValue ?
(Region.ByValue)croppingRegion : new Region.ByValue(croppingRegion));
if (tj3SetCroppingRegion(handle, cr) < 0)
throw new Exception(tj3GetErrorStr(handle), tj3GetErrorCode(handle));
}
// --------------------------------------------------------------------------
public static native int tj3Decompress8(Pointer handle, Pointer jpegBuf,
NativeLong jpegSize, Pointer dstBuf,
int pitch, int pixelFormat);
public static void decompress8(Pointer handle, Pointer jpegBuf,
NativeLong jpegSize, Pointer dstBuf,
int pitch, int pixelFormat) throws Exception {
if (tj3Decompress8(handle, jpegBuf, jpegSize, dstBuf, pitch,
pixelFormat) < 0)
throw new Exception(tj3GetErrorStr(handle), tj3GetErrorCode(handle));
}
// --------------------------------------------------------------------------
public static native int tj3Decompress12(Pointer handle, Pointer jpegBuf,
NativeLong jpegSize, Pointer dstBuf,
int pitch, int pixelFormat);
public static void decompress12(Pointer handle, Pointer jpegBuf,
NativeLong jpegSize, Pointer dstBuf,
int pitch, int pixelFormat)
throws Exception {
if (tj3Decompress12(handle, jpegBuf, jpegSize, dstBuf, pitch,
pixelFormat) < 0)
throw new Exception(tj3GetErrorStr(handle), tj3GetErrorCode(handle));
}
// --------------------------------------------------------------------------
public static native int tj3Decompress16(Pointer handle, Pointer jpegBuf,
NativeLong jpegSize, Pointer dstBuf,
int pitch, int pixelFormat);
public static void decompress16(Pointer handle, Pointer jpegBuf,
NativeLong jpegSize, Pointer dstBuf,
int pitch, int pixelFormat)
throws Exception {
if (tj3Decompress16(handle, jpegBuf, jpegSize, dstBuf, pitch,
pixelFormat) < 0)
throw new Exception(tj3GetErrorStr(handle), tj3GetErrorCode(handle));
}
// --------------------------------------------------------------------------
public static native int
tj3DecompressToYUVPlanes8(Pointer handle, Pointer jpegBuf,
NativeLong jpegSize, PointerReference dstPlanes,
int[] strides);
public static void decompressToYUVPlanes8(Pointer handle, Pointer jpegBuf,
NativeLong jpegSize,
PointerReference[] dstPlanes,
int[] strides) throws Exception {
if (tj3DecompressToYUVPlanes8(handle, jpegBuf, jpegSize, dstPlanes[0],
strides) < 0)
throw new Exception(tj3GetErrorStr(handle), tj3GetErrorCode(handle));
}
// --------------------------------------------------------------------------
public static native int tj3DecompressToYUV8(Pointer handle,
Pointer jpegBuf,
NativeLong jpegSize,
Pointer dstBuf, int align);
public static void decompressToYUV8(Pointer handle, Pointer jpegBuf,
NativeLong jpegSize, Pointer dstBuf,
int align) throws Exception {
if (tj3DecompressToYUV8(handle, jpegBuf, jpegSize, dstBuf, align) < 0)
throw new Exception(tj3GetErrorStr(handle), tj3GetErrorCode(handle));
}
// --------------------------------------------------------------------------
public static native int tj3DecodeYUVPlanes8(Pointer handle,
PointerReference srcPlanes,
int[] strides, Pointer dstBuf,
int width, int pitch,
int height, int pixelFormat);
public static void decodeYUVPlanes8(Pointer handle,
PointerReference[] srcPlanes,
int[] strides, Pointer dstBuf, int width,
int pitch, int height, int pixelFormat)
throws Exception {
if (tj3DecodeYUVPlanes8(handle, srcPlanes[0], strides, dstBuf, width,
pitch, height, pixelFormat) < 0)
throw new Exception(tj3GetErrorStr(handle), tj3GetErrorCode(handle));
}
// --------------------------------------------------------------------------
public static native int tj3DecodeYUV8(Pointer handle, Pointer srcBuf,
int align, Pointer dstBuf, int width,
int pitch, int height,
int pixelFormat);
public static void decodeYUV8(Pointer handle, Pointer srcBuf, int align,
Pointer dstBuf, int width, int pitch,
int height, int pixelFormat) throws Exception {
if (tj3DecodeYUV8(handle, srcBuf, align, dstBuf, width, pitch, height,
pixelFormat) < 0)
throw new Exception(tj3GetErrorStr(handle), tj3GetErrorCode(handle));
}
// --------------------------------------------------------------------------
public static native NativeLong
tj3TransformBufSize(Pointer handle, Transform.ByValue transform);
public static NativeLong transformBufSize(Pointer handle,
Transform transform)
throws Exception {
Transform.ByValue t =
(transform instanceof Transform.ByValue ?
(Transform.ByValue)transform : new Transform.ByValue(transform));
NativeLong retval = tj3TransformBufSize(handle, t);
if (retval.longValue() == 0)
throw new Exception(tj3GetErrorStr(handle), tj3GetErrorCode(handle));
return retval;
}
// --------------------------------------------------------------------------
public static native int tj3Transform(Pointer handle, Pointer jpegBuf,
NativeLong jpegSize, int n,
PointerReference dstBufs,
NativeLongReference dstSizes,
Transform transforms);
public static void transform(Pointer handle, Pointer jpegBuf,
NativeLong jpegSize, int n,
PointerReference[] dstBufs,
NativeLongReference[] dstSizes,
Transform[] transforms) throws Exception {
if (tj3Transform(handle, jpegBuf, jpegSize, n, dstBufs[0], dstSizes[0],
transforms[0]) < 0)
throw new Exception(tj3GetErrorStr(handle), tj3GetErrorCode(handle));
}
// --------------------------------------------------------------------------
public static native Pointer tj3LoadImage8(Pointer handle, String filename,
IntByReference width, int align,
IntByReference height,
IntByReference pixelFormat);
public static Pointer loadImage8(Pointer handle, String filename,
IntByReference width, int align,
IntByReference height,
IntByReference pixelFormat)
throws Exception {
Pointer retval = tj3LoadImage8(handle, filename, width, align, height,
pixelFormat);
if (retval == null)
throw new Exception(tj3GetErrorStr(handle), tj3GetErrorCode(handle));
return retval;
}
// --------------------------------------------------------------------------
public static native Pointer tj3LoadImage12(Pointer handle, String filename,
IntByReference width, int align,
IntByReference height,
IntByReference pixelFormat);
public static Pointer loadImage12(Pointer handle, String filename,
IntByReference width, int align,
IntByReference height,
IntByReference pixelFormat)
throws Exception {
Pointer retval = tj3LoadImage12(handle, filename, width, align, height,
pixelFormat);
if (retval == null)
throw new Exception(tj3GetErrorStr(handle), tj3GetErrorCode(handle));
return retval;
}
// --------------------------------------------------------------------------
public static native Pointer tj3LoadImage16(Pointer handle, String filename,
IntByReference width, int align,
IntByReference height,
IntByReference pixelFormat);
public static Pointer loadImage16(Pointer handle, String filename,
IntByReference width, int align,
IntByReference height,
IntByReference pixelFormat)
throws Exception {
Pointer retval = tj3LoadImage16(handle, filename, width, align, height,
pixelFormat);
if (retval == null)
throw new Exception(tj3GetErrorStr(handle), tj3GetErrorCode(handle));
return retval;
}
// --------------------------------------------------------------------------
public static native int tj3SaveImage8(Pointer handle, String filename,
Pointer buffer, int width, int pitch,
int height, int pixelFormat);
public static void saveImage8(Pointer handle, String filename,
Pointer buffer, int width, int pitch,
int height, int pixelFormat) throws Exception {
if (tj3SaveImage8(handle, filename, buffer, width, pitch, height,
pixelFormat) < 0)
throw new Exception(tj3GetErrorStr(handle), tj3GetErrorCode(handle));
}
// --------------------------------------------------------------------------
public static native int tj3SaveImage12(Pointer handle, String filename,
Pointer buffer, int width, int pitch,
int height, int pixelFormat);
public static void saveImage12(Pointer handle, String filename,
Pointer buffer, int width, int pitch,
int height, int pixelFormat)
throws Exception {
if (tj3SaveImage12(handle, filename, buffer, width, pitch, height,
pixelFormat) < 0)
throw new Exception(tj3GetErrorStr(handle), tj3GetErrorCode(handle));
}
// --------------------------------------------------------------------------
public static native int tj3SaveImage16(Pointer handle, String filename,
Pointer buffer, int width, int pitch,
int height, int pixelFormat);
public static void saveImage16(Pointer handle, String filename,
Pointer buffer, int width, int pitch,
int height, int pixelFormat)
throws Exception {
if (tj3SaveImage16(handle, filename, buffer, width, pitch, height,
pixelFormat) < 0)
throw new Exception(tj3GetErrorStr(handle), tj3GetErrorCode(handle));
}
};