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