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 import java.awt.*;
32 
33 /**
34  * Lossless transform parameters
35  */
36 public class TJTransform extends Rectangle {
37 
38   private static final long serialVersionUID = -127367705761430371L;
39 
40   /**
41    * The number of lossless transform operations
42    */
43   public static final int NUMOP         = 8;
44   /**
45    * Do not transform the position of the image pixels.
46    */
47   public static final int OP_NONE       = 0;
48   /**
49    * Flip (mirror) image horizontally.  This transform is imperfect if there
50    * are any partial MCU blocks on the right edge.
51    * @see #OPT_PERFECT
52    */
53   public static final int OP_HFLIP      = 1;
54   /**
55    * Flip (mirror) image vertically.  This transform is imperfect if there are
56    * any partial MCU blocks on the bottom edge.
57    * @see #OPT_PERFECT
58    */
59   public static final int OP_VFLIP      = 2;
60   /**
61    * Transpose image (flip/mirror along upper left to lower right axis).  This
62    * transform is always perfect.
63    * @see #OPT_PERFECT
64    */
65   public static final int OP_TRANSPOSE  = 3;
66   /**
67    * Transverse transpose image (flip/mirror along upper right to lower left
68    * axis).  This transform is imperfect if there are any partial MCU blocks in
69    * the image.
70    * @see #OPT_PERFECT
71    */
72   public static final int OP_TRANSVERSE = 4;
73   /**
74    * Rotate image clockwise by 90 degrees.  This transform is imperfect if
75    * there are any partial MCU blocks on the bottom edge.
76    * @see #OPT_PERFECT
77    */
78   public static final int OP_ROT90      = 5;
79   /**
80    * Rotate image 180 degrees.  This transform is imperfect if there are any
81    * partial MCU blocks in the image.
82    * @see #OPT_PERFECT
83    */
84   public static final int OP_ROT180     = 6;
85   /**
86    * Rotate image counter-clockwise by 90 degrees.  This transform is imperfect
87    * if there are any partial MCU blocks on the right edge.
88    * @see #OPT_PERFECT
89    */
90   public static final int OP_ROT270     = 7;
91 
92 
93   /**
94    * This option will cause {@link TJTransformer#transform
95    * TJTransformer.transform()} to throw an exception if the transform is not
96    * perfect.  Lossless transforms operate on MCU blocks, whose size depends on
97    * the level of chrominance subsampling used.  If the image's width or height
98    * is not evenly divisible by the MCU block size (see {@link TJ#getMCUWidth}
99    * and {@link TJ#getMCUHeight}), then there will be partial MCU blocks on the
100    * right and/or bottom edges.   It is not possible to move these partial MCU
101    * blocks to the top or left of the image, so any transform that would
102    * require that is "imperfect."  If this option is not specified, then any
103    * partial MCU blocks that cannot be transformed will be left in place, which
104    * will create odd-looking strips on the right or bottom edge of the image.
105    */
106   public static final int OPT_PERFECT  = 1;
107   /**
108    * This option will discard any partial MCU blocks that cannot be
109    * transformed.
110    */
111   public static final int OPT_TRIM     = 2;
112   /**
113    * This option will enable lossless cropping.
114    */
115   public static final int OPT_CROP     = 4;
116   /**
117    * This option will discard the color data in the input image and produce
118    * a grayscale output image.
119    */
120   public static final int OPT_GRAY     = 8;
121   /**
122    * This option will prevent {@link TJTransformer#transform
123    * TJTransformer.transform()} from outputting a JPEG image for this
124    * particular transform.  This can be used in conjunction with a custom
125    * filter to capture the transformed DCT coefficients without transcoding
126    * them.
127    */
128   public static final int OPT_NOOUTPUT = 16;
129 
130 
131   /**
132    * Create a new lossless transform instance.
133    */
TJTransform()134   public TJTransform() {
135   }
136 
137   /**
138    * Create a new lossless transform instance with the given parameters.
139    *
140    * @param x the left boundary of the cropping region.  This must be evenly
141    * divisible by the MCU block width (see {@link TJ#getMCUWidth})
142    *
143    * @param y the upper boundary of the cropping region.  This must be evenly
144    * divisible by the MCU block height (see {@link TJ#getMCUHeight})
145    *
146    * @param w the width of the cropping region.  Setting this to 0 is the
147    * equivalent of setting it to (width of the source JPEG image -
148    * <code>x</code>).
149    *
150    * @param h the height of the cropping region.  Setting this to 0 is the
151    * equivalent of setting it to (height of the source JPEG image -
152    * <code>y</code>).
153    *
154    * @param op one of the transform operations (<code>OP_*</code>)
155    *
156    * @param options the bitwise OR of one or more of the transform options
157    * (<code>OPT_*</code>)
158    *
159    * @param cf an instance of an object that implements the {@link
160    * TJCustomFilter} interface, or null if no custom filter is needed
161    */
TJTransform(int x, int y, int w, int h, int op, int options, TJCustomFilter cf)162   public TJTransform(int x, int y, int w, int h, int op, int options,
163                      TJCustomFilter cf) throws Exception {
164     super(x, y, w, h);
165     this.op = op;
166     this.options = options;
167     this.cf = cf;
168   }
169 
170   /**
171    * Create a new lossless transform instance with the given parameters.
172    *
173    * @param r a <code>Rectangle</code> instance that specifies the cropping
174    * region.  See {@link
175    * #TJTransform(int, int, int, int, int, int, TJCustomFilter)} for more
176    * detail.
177    *
178    * @param op one of the transform operations (<code>OP_*</code>)
179    *
180    * @param options the bitwise OR of one or more of the transform options
181    * (<code>OPT_*</code>)
182    *
183    * @param cf an instance of an object that implements the {@link
184    * TJCustomFilter} interface, or null if no custom filter is needed
185    */
TJTransform(Rectangle r, int op, int options, TJCustomFilter cf)186   public TJTransform(Rectangle r, int op, int options,
187                      TJCustomFilter cf) throws Exception {
188     super(r);
189     this.op = op;
190     this.options = options;
191     this.cf = cf;
192   }
193 
194   /**
195    * Transform operation (one of <code>OP_*</code>)
196    */
197   public int op = 0;
198 
199   /**
200    * Transform options (bitwise OR of one or more of <code>OPT_*</code>)
201    */
202   public int options = 0;
203 
204   /**
205    * Custom filter instance
206    */
207   public TJCustomFilter cf = null;
208 }
209