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