1 /*
2  * Copyright (C)2011-2013 D. R. Commander.  All Rights Reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions are met:
6  *
7  * - Redistributions of source code must retain the above copyright notice,
8  *   this list of conditions and the following disclaimer.
9  * - Redistributions in binary form must reproduce the above copyright notice,
10  *   this list of conditions and the following disclaimer in the documentation
11  *   and/or other materials provided with the distribution.
12  * - Neither the name of the libjpeg-turbo Project nor the names of its
13  *   contributors may be used to endorse or promote products derived from this
14  *   software without specific prior written permission.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS",
17  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19  * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
20  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26  * POSSIBILITY OF SUCH DAMAGE.
27  */
28 
29 package org.libjpegturbo.turbojpeg;
30 
31 /**
32  * TurboJPEG utility class (cannot be instantiated)
33  */
34 public final class TJ {
35 
36 
37   /**
38    * The number of chrominance subsampling options
39    */
40   public static final int NUMSAMP   = 6;
41   /**
42    * 4:4:4 chrominance subsampling (no chrominance subsampling).  The JPEG
43    * or YUV image will contain one chrominance component for every pixel in the
44    * source image.
45    */
46   public static final int SAMP_444  = 0;
47   /**
48    * 4:2:2 chrominance subsampling.  The JPEG or YUV image will contain one
49    * chrominance component for every 2x1 block of pixels in the source image.
50    */
51   public static final int SAMP_422  = 1;
52   /**
53    * 4:2:0 chrominance subsampling.  The JPEG or YUV image will contain one
54    * chrominance component for every 2x2 block of pixels in the source image.
55    */
56   public static final int SAMP_420  = 2;
57   /**
58    * Grayscale.  The JPEG or YUV image will contain no chrominance components.
59    */
60   public static final int SAMP_GRAY = 3;
61   /**
62    * 4:4:0 chrominance subsampling.  The JPEG or YUV image will contain one
63    * chrominance component for every 1x2 block of pixels in the source image.
64    * Note that 4:4:0 subsampling is not fully accelerated in libjpeg-turbo.
65    */
66   public static final int SAMP_440  = 4;
67   /**
68    * 4:1:1 chrominance subsampling.  The JPEG or YUV image will contain one
69    * chrominance component for every 4x1 block of pixels in the source image.
70    * JPEG images compressed with 4:1:1 subsampling will be almost exactly the
71    * same size as those compressed with 4:2:0 subsampling, and in the
72    * aggregate, both subsampling methods produce approximately the same
73    * perceptual quality.  However, 4:1:1 is better able to reproduce sharp
74    * horizontal features.  Note that 4:1:1 subsampling is not fully accelerated
75    * in libjpeg-turbo.
76    */
77   public static final int SAMP_411  = 5;
78 
79 
80   /**
81    * Returns the MCU block width for the given level of chrominance
82    * subsampling.
83    *
84    * @param subsamp the level of chrominance subsampling (one of
85    * <code>SAMP_*</code>)
86    *
87    * @return the MCU block width for the given level of chrominance
88    * subsampling.
89    */
getMCUWidth(int subsamp)90   public static int getMCUWidth(int subsamp) throws Exception {
91     if (subsamp < 0 || subsamp >= NUMSAMP)
92       throw new Exception("Invalid subsampling type");
93     return mcuWidth[subsamp];
94   }
95 
96   private static final int[] mcuWidth = {
97     8, 16, 16, 8, 8, 32
98   };
99 
100 
101   /**
102    * Returns the MCU block height for the given level of chrominance
103    * subsampling.
104    *
105    * @param subsamp the level of chrominance subsampling (one of
106    * <code>SAMP_*</code>)
107    *
108    * @return the MCU block height for the given level of chrominance
109    * subsampling.
110    */
getMCUHeight(int subsamp)111   public static int getMCUHeight(int subsamp) throws Exception {
112     if (subsamp < 0 || subsamp >= NUMSAMP)
113       throw new Exception("Invalid subsampling type");
114     return mcuHeight[subsamp];
115   }
116 
117   private static final int[] mcuHeight = {
118     8, 8, 16, 8, 16, 8
119   };
120 
121 
122   /**
123    * The number of pixel formats
124    */
125   public static final int NUMPF   = 12;
126   /**
127    * RGB pixel format.  The red, green, and blue components in the image are
128    * stored in 3-byte pixels in the order R, G, B from lowest to highest byte
129    * address within each pixel.
130    */
131   public static final int PF_RGB  = 0;
132   /**
133    * BGR pixel format.  The red, green, and blue components in the image are
134    * stored in 3-byte pixels in the order B, G, R from lowest to highest byte
135    * address within each pixel.
136    */
137   public static final int PF_BGR  = 1;
138   /**
139    * RGBX pixel format.  The red, green, and blue components in the image are
140    * stored in 4-byte pixels in the order R, G, B from lowest to highest byte
141    * address within each pixel.  The X component is ignored when compressing
142    * and undefined when decompressing.
143    */
144   public static final int PF_RGBX = 2;
145   /**
146    * BGRX pixel format.  The red, green, and blue components in the image are
147    * stored in 4-byte pixels in the order B, G, R from lowest to highest byte
148    * address within each pixel.  The X component is ignored when compressing
149    * and undefined when decompressing.
150    */
151   public static final int PF_BGRX = 3;
152   /**
153    * XBGR pixel format.  The red, green, and blue components in the image are
154    * stored in 4-byte pixels in the order R, G, B from highest to lowest byte
155    * address within each pixel.  The X component is ignored when compressing
156    * and undefined when decompressing.
157    */
158   public static final int PF_XBGR = 4;
159   /**
160    * XRGB pixel format.  The red, green, and blue components in the image are
161    * stored in 4-byte pixels in the order B, G, R from highest to lowest byte
162    * address within each pixel.  The X component is ignored when compressing
163    * and undefined when decompressing.
164    */
165   public static final int PF_XRGB = 5;
166   /**
167    * Grayscale pixel format.  Each 1-byte pixel represents a luminance
168    * (brightness) level from 0 to 255.
169    */
170   public static final int PF_GRAY = 6;
171   /**
172    * RGBA pixel format.  This is the same as {@link #PF_RGBX}, except that when
173    * decompressing, the X byte is guaranteed to be 0xFF, which can be
174    * interpreted as an opaque alpha channel.
175    */
176   public static final int PF_RGBA = 7;
177   /**
178    * BGRA pixel format.  This is the same as {@link #PF_BGRX}, except that when
179    * decompressing, the X byte is guaranteed to be 0xFF, which can be
180    * interpreted as an opaque alpha channel.
181    */
182   public static final int PF_BGRA = 8;
183   /**
184    * ABGR pixel format.  This is the same as {@link #PF_XBGR}, except that when
185    * decompressing, the X byte is guaranteed to be 0xFF, which can be
186    * interpreted as an opaque alpha channel.
187    */
188   public static final int PF_ABGR = 9;
189   /**
190    * ARGB pixel format.  This is the same as {@link #PF_XRGB}, except that when
191    * decompressing, the X byte is guaranteed to be 0xFF, which can be
192    * interpreted as an opaque alpha channel.
193    */
194   public static final int PF_ARGB = 10;
195   /**
196    * CMYK pixel format.  Unlike RGB, which is an additive color model used
197    * primarily for display, CMYK (Cyan/Magenta/Yellow/Key) is a subtractive
198    * color model used primarily for printing.  In the CMYK color model, the
199    * value of each color component typically corresponds to an amount of cyan,
200    * magenta, yellow, or black ink that is applied to a white background.  In
201    * order to convert between CMYK and RGB, it is necessary to use a color
202    * management system (CMS.)  A CMS will attempt to map colors within the
203    * printer's gamut to perceptually similar colors in the display's gamut and
204    * vice versa, but the mapping is typically not 1:1 or reversible, nor can it
205    * be defined with a simple formula.  Thus, such a conversion is out of scope
206    * for a codec library.  However, the TurboJPEG API allows for compressing
207    * CMYK pixels into a YCCK JPEG image (see {@link #CS_YCCK}) and
208    * decompressing YCCK JPEG images into CMYK pixels.
209    */
210   public static final int PF_CMYK = 11;
211 
212 
213   /**
214    * Returns the pixel size (in bytes) for the given pixel format.
215    *
216    * @param pixelFormat the pixel format (one of <code>PF_*</code>)
217    *
218    * @return the pixel size (in bytes) for the given pixel format.
219    */
getPixelSize(int pixelFormat)220   public static int getPixelSize(int pixelFormat) throws Exception {
221     if (pixelFormat < 0 || pixelFormat >= NUMPF)
222       throw new Exception("Invalid pixel format");
223     return pixelSize[pixelFormat];
224   }
225 
226   private static final int[] pixelSize = {
227     3, 3, 4, 4, 4, 4, 1, 4, 4, 4, 4, 4
228   };
229 
230 
231   /**
232    * For the given pixel format, returns the number of bytes that the red
233    * component is offset from the start of the pixel.  For instance, if a pixel
234    * of format <code>TJ.PF_BGRX</code> is stored in <code>char pixel[]</code>,
235    * then the red component will be
236    * <code>pixel[TJ.getRedOffset(TJ.PF_BGRX)]</code>.
237    *
238    * @param pixelFormat the pixel format (one of <code>PF_*</code>)
239    *
240    * @return the red offset for the given pixel format.
241    */
getRedOffset(int pixelFormat)242   public static int getRedOffset(int pixelFormat) throws Exception {
243     if (pixelFormat < 0 || pixelFormat >= NUMPF)
244       throw new Exception("Invalid pixel format");
245     return redOffset[pixelFormat];
246   }
247 
248   private static final int[] redOffset = {
249     0, 2, 0, 2, 3, 1, 0, 0, 2, 3, 1, -1
250   };
251 
252 
253   /**
254    * For the given pixel format, returns the number of bytes that the green
255    * component is offset from the start of the pixel.  For instance, if a pixel
256    * of format <code>TJ.PF_BGRX</code> is stored in <code>char pixel[]</code>,
257    * then the green component will be
258    * <code>pixel[TJ.getGreenOffset(TJ.PF_BGRX)]</code>.
259    *
260    * @param pixelFormat the pixel format (one of <code>PF_*</code>)
261    *
262    * @return the green offset for the given pixel format.
263    */
getGreenOffset(int pixelFormat)264   public static int getGreenOffset(int pixelFormat) throws Exception {
265     if (pixelFormat < 0 || pixelFormat >= NUMPF)
266       throw new Exception("Invalid pixel format");
267     return greenOffset[pixelFormat];
268   }
269 
270   private static final int[] greenOffset = {
271     1, 1, 1, 1, 2, 2, 0, 1, 1, 2, 2, -1
272   };
273 
274 
275   /**
276    * For the given pixel format, returns the number of bytes that the blue
277    * component is offset from the start of the pixel.  For instance, if a pixel
278    * of format <code>TJ.PF_BGRX</code> is stored in <code>char pixel[]</code>,
279    * then the blue component will be
280    * <code>pixel[TJ.getBlueOffset(TJ.PF_BGRX)]</code>.
281    *
282    * @param pixelFormat the pixel format (one of <code>PF_*</code>)
283    *
284    * @return the blue offset for the given pixel format.
285    */
getBlueOffset(int pixelFormat)286   public static int getBlueOffset(int pixelFormat) throws Exception {
287     if (pixelFormat < 0 || pixelFormat >= NUMPF)
288       throw new Exception("Invalid pixel format");
289     return blueOffset[pixelFormat];
290   }
291 
292   private static final int[] blueOffset = {
293     2, 0, 2, 0, 1, 3, 0, 2, 0, 1, 3, -1
294   };
295 
296 
297   /**
298    * The number of JPEG colorspaces
299    */
300   public static final int NUMCS = 5;
301   /**
302    * RGB colorspace.  When compressing the JPEG image, the R, G, and B
303    * components in the source image are reordered into image planes, but no
304    * colorspace conversion or subsampling is performed.  RGB JPEG images can be
305    * decompressed to any of the extended RGB pixel formats or grayscale, but
306    * they cannot be decompressed to YUV images.
307    */
308   public static final int CS_RGB = 0;
309   /**
310    * YCbCr colorspace.  YCbCr is not an absolute colorspace but rather a
311    * mathematical transformation of RGB designed solely for storage and
312    * transmission.  YCbCr images must be converted to RGB before they can
313    * actually be displayed.  In the YCbCr colorspace, the Y (luminance)
314    * component represents the black & white portion of the original image, and
315    * the Cb and Cr (chrominance) components represent the color portion of the
316    * original image.  Originally, the analog equivalent of this transformation
317    * allowed the same signal to drive both black & white and color televisions,
318    * but JPEG images use YCbCr primarily because it allows the color data to be
319    * optionally subsampled for the purposes of reducing bandwidth or disk
320    * space.  YCbCr is the most common JPEG colorspace, and YCbCr JPEG images
321    * can be compressed from and decompressed to any of the extended RGB pixel
322    * formats or grayscale, or they can be decompressed to YUV planar images.
323    */
324   public static final int CS_YCbCr = 1;
325   /**
326    * Grayscale colorspace.  The JPEG image retains only the luminance data (Y
327    * component), and any color data from the source image is discarded.
328    * Grayscale JPEG images can be compressed from and decompressed to any of
329    * the extended RGB pixel formats or grayscale, or they can be decompressed
330    * to YUV planar images.
331    */
332   public static final int CS_GRAY = 2;
333   /**
334    * CMYK colorspace.  When compressing the JPEG image, the C, M, Y, and K
335    * components in the source image are reordered into image planes, but no
336    * colorspace conversion or subsampling is performed.  CMYK JPEG images can
337    * only be decompressed to CMYK pixels.
338    */
339   public static final int CS_CMYK = 3;
340   /**
341    * YCCK colorspace.  YCCK (AKA "YCbCrK") is not an absolute colorspace but
342    * rather a mathematical transformation of CMYK designed solely for storage
343    * and transmission.  It is to CMYK as YCbCr is to RGB.  CMYK pixels can be
344    * reversibly transformed into YCCK, and as with YCbCr, the chrominance
345    * components in the YCCK pixels can be subsampled without incurring major
346    * perceptual loss.  YCCK JPEG images can only be compressed from and
347    * decompressed to CMYK pixels.
348    */
349   public static final int CS_YCCK = 4;
350 
351 
352   /**
353    * The uncompressed source/destination image is stored in bottom-up (Windows,
354    * OpenGL) order, not top-down (X11) order.
355    */
356   public static final int FLAG_BOTTOMUP     = 2;
357 
358   @Deprecated
359   public static final int FLAG_FORCEMMX     = 8;
360   @Deprecated
361   public static final int FLAG_FORCESSE     = 16;
362   @Deprecated
363   public static final int FLAG_FORCESSE2    = 32;
364   @Deprecated
365   public static final int FLAG_FORCESSE3    = 128;
366 
367   /**
368    * When decompressing an image that was compressed using chrominance
369    * subsampling, use the fastest chrominance upsampling algorithm available in
370    * the underlying codec.  The default is to use smooth upsampling, which
371    * creates a smooth transition between neighboring chrominance components in
372    * order to reduce upsampling artifacts in the decompressed image.
373    */
374   public static final int FLAG_FASTUPSAMPLE = 256;
375   /**
376    * Use the fastest DCT/IDCT algorithm available in the underlying codec.  The
377    * default if this flag is not specified is implementation-specific.  For
378    * example, the implementation of TurboJPEG for libjpeg[-turbo] uses the fast
379    * algorithm by default when compressing, because this has been shown to have
380    * only a very slight effect on accuracy, but it uses the accurate algorithm
381    * when decompressing, because this has been shown to have a larger effect.
382    */
383   public static final int FLAG_FASTDCT      =  2048;
384   /**
385    * Use the most accurate DCT/IDCT algorithm available in the underlying
386    * codec.  The default if this flag is not specified is
387    * implementation-specific.  For example, the implementation of TurboJPEG for
388    * libjpeg[-turbo] uses the fast algorithm by default when compressing,
389    * because this has been shown to have only a very slight effect on accuracy,
390    * but it uses the accurate algorithm when decompressing, because this has
391    * been shown to have a larger effect.
392    */
393   public static final int FLAG_ACCURATEDCT  =  4096;
394 
395 
396   /**
397    * Returns the maximum size of the buffer (in bytes) required to hold a JPEG
398    * image with the given width, height, and level of chrominance subsampling.
399    *
400    * @param width the width (in pixels) of the JPEG image
401    *
402    * @param height the height (in pixels) of the JPEG image
403    *
404    * @param jpegSubsamp the level of chrominance subsampling to be used when
405    * generating the JPEG image (one of {@link TJ TJ.SAMP_*})
406    *
407    * @return the maximum size of the buffer (in bytes) required to hold a JPEG
408    * image with the given width, height, and level of chrominance subsampling.
409    */
bufSize(int width, int height, int jpegSubsamp)410   public static native int bufSize(int width, int height, int jpegSubsamp)
411     throws Exception;
412 
413   /**
414    * Returns the size of the buffer (in bytes) required to hold a YUV planar
415    * image with the given width, height, and level of chrominance subsampling.
416    *
417    * @param width the width (in pixels) of the YUV image
418    *
419    * @param pad the width of each line in each plane of the image is padded to
420    * the nearest multiple of this number of bytes (must be a power of 2.)
421    *
422    * @param height the height (in pixels) of the YUV image
423    *
424    * @param subsamp the level of chrominance subsampling used in the YUV
425    * image (one of {@link TJ TJ.SAMP_*})
426    *
427    * @return the size of the buffer (in bytes) required to hold a YUV planar
428    * image with the given width, height, and level of chrominance subsampling.
429    */
bufSizeYUV(int width, int pad, int height, int subsamp)430   public static native int bufSizeYUV(int width, int pad, int height,
431                                       int subsamp)
432     throws Exception;
433 
434   /**
435    * @deprecated Use {@link #bufSizeYUV(int, int, int, int)} instead.
436    */
437   @Deprecated
bufSizeYUV(int width, int height, int subsamp)438   public static native int bufSizeYUV(int width, int height, int subsamp)
439     throws Exception;
440 
441   /**
442    * Returns the size of the buffer (in bytes) required to hold a YUV image
443    * plane with the given parameters.
444    *
445    * @param componentID ID number of the image plane (0 = Y, 1 = U/Cb,
446    * 2 = V/Cr)
447    *
448    * @param width width (in pixels) of the YUV image.  NOTE: this is the width
449    * of the whole image, not the plane width.
450    *
451    * @param stride bytes per line in the image plane.
452    *
453    * @param height height (in pixels) of the YUV image.  NOTE: this is the
454    * height of the whole image, not the plane height.
455    *
456    * @param subsamp the level of chrominance subsampling used in the YUV
457    * image (one of {@link TJ TJ.SAMP_*})
458    *
459    * @return the size of the buffer (in bytes) required to hold a YUV planar
460    * image with the given parameters.
461    */
planeSizeYUV(int componentID, int width, int stride, int height, int subsamp)462   public static native int planeSizeYUV(int componentID, int width, int stride,
463                                         int height, int subsamp)
464     throws Exception;
465 
466   /**
467    * Returns the plane width of a YUV image plane with the given parameters.
468    * Refer to {@link YUVImage YUVImage} for a description of plane width.
469    *
470    * @param componentID ID number of the image plane (0 = Y, 1 = U/Cb,
471    * 2 = V/Cr)
472    *
473    * @param width width (in pixels) of the YUV image
474    *
475    * @param subsamp the level of chrominance subsampling used in the YUV image
476    * (one of {@link TJ TJ.SAMP_*})
477    *
478    * @return the plane width of a YUV image plane with the given parameters.
479    */
planeWidth(int componentID, int width, int subsamp)480   public static native int planeWidth(int componentID, int width, int subsamp)
481     throws Exception;
482 
483   /**
484    * Returns the plane height of a YUV image plane with the given parameters.
485    * Refer to {@link YUVImage YUVImage} for a description of plane height.
486    *
487    * @param componentID ID number of the image plane (0 = Y, 1 = U/Cb,
488    * 2 = V/Cr)
489    *
490    * @param height height (in pixels) of the YUV image
491    *
492    * @param subsamp the level of chrominance subsampling used in the YUV image
493    * (one of {@link TJ TJ.SAMP_*})
494    *
495    * @return the plane height of a YUV image plane with the given parameters.
496    */
planeHeight(int componentID, int height, int subsamp)497   public static native int planeHeight(int componentID, int height,
498                                        int subsamp)
499     throws Exception;
500 
501   /**
502    * Returns a list of fractional scaling factors that the JPEG decompressor in
503    * this implementation of TurboJPEG supports.
504    *
505    * @return a list of fractional scaling factors that the JPEG decompressor in
506    * this implementation of TurboJPEG supports.
507    */
getScalingFactors()508   public static native TJScalingFactor[] getScalingFactors()
509     throws Exception;
510 
511   static {
TJLoader.load()512     TJLoader.load();
513   }
514 };
515