1 /*
2  * $RCSfile: MlibShearRIF.java,v $
3  *
4  * Copyright (c) 2005 Sun Microsystems, Inc. All rights reserved.
5  *
6  * Use is subject to license terms.
7  *
8  * $Revision: 1.1 $
9  * $Date: 2005/02/11 04:56:06 $
10  * $State: Exp $
11  */
12 package com.lightcrafts.media.jai.mlib;
13 import java.awt.RenderingHints;
14 import java.awt.geom.AffineTransform;
15 import java.awt.image.RenderedImage;
16 import java.awt.image.renderable.ParameterBlock;
17 import java.awt.image.renderable.RenderedImageFactory;
18 import com.lightcrafts.mediax.jai.EnumeratedParameter;
19 import com.lightcrafts.mediax.jai.BorderExtender;
20 import com.lightcrafts.mediax.jai.ImageLayout;
21 import com.lightcrafts.mediax.jai.Interpolation;
22 import com.lightcrafts.mediax.jai.InterpolationBicubic2;
23 import com.lightcrafts.mediax.jai.InterpolationBicubic;
24 import com.lightcrafts.mediax.jai.InterpolationBilinear;
25 import com.lightcrafts.mediax.jai.InterpolationNearest;
26 import com.lightcrafts.mediax.jai.InterpolationTable;
27 import com.lightcrafts.mediax.jai.operator.ShearDescriptor;
28 import com.lightcrafts.media.jai.opimage.RIFUtil;
29 
30 /**
31  * A <code>RIF</code> supporting the "Shear" operation in the
32  * rendered image mode using MediaLib.
33  *
34  * @see com.lightcrafts.mediax.jai.operator.ShearDescriptor
35  * @see MlibAffineOpImage
36  */
37 public class MlibShearRIF implements RenderedImageFactory {
38 
39     /** Constructor. */
MlibShearRIF()40     public MlibShearRIF() {}
41 
42     /**
43      * Creates a new instance of <code>MlibAffineOpImage</code> in
44      * the rendered image mode.
45      *
46      * @param args  The source image, the <code>AffineTransform</code>,
47      *              and the <code>Interpolation</code>.
48      * @param hints  May contain rendering hints and destination image layout.
49      */
create(ParameterBlock args, RenderingHints hints)50     public RenderedImage create(ParameterBlock args,
51                                 RenderingHints hints) {
52         /* Get ImageLayout and TileCache from RenderingHints. */
53         ImageLayout layout = RIFUtil.getImageLayoutHint(hints);
54 
55         Interpolation interp = (Interpolation)args.getObjectParameter(4);
56 
57         RenderedImage source = args.getRenderedSource(0);
58 
59         if (!MediaLibAccessor.isMediaLibCompatible(args, layout) ||
60             !MediaLibAccessor.hasSameNumBands(args, layout) ||
61 	    // Medialib cannot deal with source image having tiles with any
62 	    // dimension greater than or equal to 32768
63 	    source.getTileWidth() >= 32768 ||
64 	    source.getTileHeight() >= 32768) {
65             return null;
66         }
67 
68         /* Get BorderExtender from hints if any. */
69         BorderExtender extender = RIFUtil.getBorderExtenderHint(hints);
70 
71         float shear_amt = args.getFloatParameter(0);
72         EnumeratedParameter shear_dir =
73             (EnumeratedParameter)args.getObjectParameter(1);
74         float xTrans = args.getFloatParameter(2);
75         float yTrans = args.getFloatParameter(3);
76         double[] backgroundValues = (double[])args.getObjectParameter(5);
77 
78         // Create the affine transform
79         AffineTransform tr = new AffineTransform();
80 
81         if (shear_dir.equals(ShearDescriptor.SHEAR_HORIZONTAL)) {
82             // SHEAR_HORIZONTAL
83             tr.setTransform(1.0, 0.0, shear_amt, 1.0, xTrans, 0.0);
84         } else {
85             // SHEAR_VERTICAL
86             tr.setTransform(1.0, shear_amt, 0.0, 1.0, 0.0, yTrans);
87         }
88 
89         if (interp instanceof InterpolationNearest) {
90             return new MlibAffineNearestOpImage(source, extender,
91                                                 hints, layout,
92                                                 tr,
93                                                 interp,
94                                                 backgroundValues);
95         } else if (interp instanceof InterpolationBilinear) {
96             return new MlibAffineBilinearOpImage(source,
97                                                  extender, hints, layout,
98                                                  tr,
99                                                  interp,
100                                                  backgroundValues);
101         } else if (interp instanceof InterpolationBicubic ||
102                    interp instanceof InterpolationBicubic2) {
103             return new MlibAffineBicubicOpImage(source,
104                                                 extender, hints, layout,
105                                                 tr,
106                                                 interp,
107                                                 backgroundValues);
108         } else if (interp instanceof InterpolationTable) {
109             return new MlibAffineTableOpImage(source,
110                                               extender, hints, layout,
111                                               tr,
112                                               interp,
113                                               backgroundValues);
114         } else {
115            return null;
116         }
117     }
118 }
119