1 /*
2  * $RCSfile: ShearRIF.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:43 $
10  * $State: Exp $
11  */
12 package com.lightcrafts.media.jai.opimage;
13 import java.awt.RenderingHints;
14 import java.awt.geom.AffineTransform;
15 import java.awt.image.DataBuffer;
16 import java.awt.image.MultiPixelPackedSampleModel;
17 import java.awt.image.SampleModel;
18 import java.awt.image.RenderedImage;
19 import java.awt.image.renderable.ParameterBlock;
20 import java.awt.image.renderable.RenderedImageFactory;
21 import com.lightcrafts.mediax.jai.EnumeratedParameter;
22 import com.lightcrafts.mediax.jai.BorderExtender;
23 import com.lightcrafts.mediax.jai.ImageLayout;
24 import com.lightcrafts.mediax.jai.Interpolation;
25 import com.lightcrafts.mediax.jai.InterpolationBicubic2;
26 import com.lightcrafts.mediax.jai.InterpolationBicubic;
27 import com.lightcrafts.mediax.jai.InterpolationBilinear;
28 import com.lightcrafts.mediax.jai.InterpolationNearest;
29 import com.lightcrafts.mediax.jai.operator.ShearDescriptor;
30 
31 /**
32  * @see AffineOpimage
33  */
34 public class ShearRIF implements RenderedImageFactory {
35 
36     /** Constructor. */
ShearRIF()37     public ShearRIF() {}
38 
39     /**
40      * Creates an shear operation as an instance of AffineOpImage.
41      */
create(ParameterBlock paramBlock, RenderingHints renderHints)42     public RenderedImage create(ParameterBlock paramBlock,
43                                 RenderingHints renderHints) {
44         // Get ImageLayout from renderHints if any.
45         ImageLayout layout = RIFUtil.getImageLayoutHint(renderHints);
46 
47 
48         // Get BorderExtender from renderHints if any.
49         BorderExtender extender = RIFUtil.getBorderExtenderHint(renderHints);
50 
51         RenderedImage source = paramBlock.getRenderedSource(0);
52 
53         float shear_amt = paramBlock.getFloatParameter(0);
54         EnumeratedParameter shear_dir =
55             (EnumeratedParameter)paramBlock.getObjectParameter(1);
56 
57         float xTrans = paramBlock.getFloatParameter(2);
58         float yTrans = paramBlock.getFloatParameter(3);
59 
60         Object arg1 = paramBlock.getObjectParameter(4);
61         Interpolation interp = (Interpolation)arg1;
62 
63         double[] backgroundValues = (double[])paramBlock.getObjectParameter(5);
64 
65         // Create the affine transform
66         AffineTransform tr = new AffineTransform();
67 
68         if (shear_dir.equals(ShearDescriptor.SHEAR_HORIZONTAL)) {
69             // SHEAR_HORIZONTAL
70             tr.setTransform(1.0, 0.0, shear_amt, 1.0, xTrans, 0.0);
71         } else {
72             // SHEAR_VERTICAL
73             tr.setTransform(1.0, shear_amt, 0.0, 1.0, 0.0, yTrans);
74         }
75 
76         // Do Affine
77         if (interp instanceof InterpolationNearest) {
78             SampleModel sm = source.getSampleModel();
79             boolean isBinary = (sm instanceof MultiPixelPackedSampleModel) &&
80                 (sm.getSampleSize(0) == 1) &&
81                 (sm.getDataType() == DataBuffer.TYPE_BYTE ||
82                  sm.getDataType() == DataBuffer.TYPE_USHORT ||
83                  sm.getDataType() == DataBuffer.TYPE_INT);
84             if(isBinary) {
85                 return new AffineNearestBinaryOpImage(source,
86                                                       extender,
87                                                       renderHints,
88                                                       layout,
89                                                       tr,
90                                                       interp,
91                                                       backgroundValues);
92             } else {
93                 return new AffineNearestOpImage(source, extender,
94                                                 renderHints,
95                                                 layout,
96                                                 tr,
97                                                 interp,
98                                                 backgroundValues);
99             }
100         } else if (interp instanceof InterpolationBilinear) {
101             return new AffineBilinearOpImage(source,
102                                              extender,
103                                              renderHints,
104                                              layout,
105                                              tr,
106                                              interp,
107                                              backgroundValues);
108         } else if (interp instanceof InterpolationBicubic) {
109             return new AffineBicubicOpImage(source,
110                                             extender,
111                                             renderHints,
112                                             layout,
113                                             tr,
114                                             interp,
115                                             backgroundValues);
116         } else if (interp instanceof InterpolationBicubic2) {
117             return new AffineBicubic2OpImage(source,
118                                              extender,
119                                              renderHints,
120                                              layout,
121                                              tr,
122                                              interp,
123                                              backgroundValues);
124         } else {
125             return new AffineGeneralOpImage(source,
126                                             extender,
127                                             renderHints,
128                                             layout,
129                                             tr,
130                                             interp,
131                                             backgroundValues);
132         }
133     }
134 }
135