1 /* 2 * $RCSfile: MlibWarpRIF.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:09 $ 10 * $State: Exp $ 11 */ 12 package com.lightcrafts.media.jai.mlib; 13 import java.awt.RenderingHints; 14 import java.awt.image.RenderedImage; 15 import java.awt.image.renderable.ParameterBlock; 16 import java.awt.image.renderable.RenderedImageFactory; 17 import com.lightcrafts.mediax.jai.BorderExtender; 18 import com.lightcrafts.mediax.jai.ImageLayout; 19 import com.lightcrafts.mediax.jai.Interpolation; 20 import com.lightcrafts.mediax.jai.InterpolationNearest; 21 import com.lightcrafts.mediax.jai.InterpolationBilinear; 22 import com.lightcrafts.mediax.jai.InterpolationBicubic; 23 import com.lightcrafts.mediax.jai.InterpolationBicubic2; 24 import com.lightcrafts.mediax.jai.InterpolationTable; 25 import com.lightcrafts.mediax.jai.Warp; 26 import com.lightcrafts.mediax.jai.WarpGrid; 27 import com.lightcrafts.mediax.jai.WarpPolynomial; 28 import com.lightcrafts.media.jai.opimage.RIFUtil; 29 30 import com.sun.medialib.mlib.*; 31 32 /** 33 * A <code>RIF</code> supporting the "Warp" operation in the 34 * rendered image mode using MediaLib. 35 * 36 * @see com.lightcrafts.mediax.jai.operator.WarpDescriptor 37 * @see MlibWarpNearestOpImage 38 * @see MlibWarpBilinearOpImage 39 * @see MlibWarpBicubicOpImage 40 * 41 * @since 1.0 42 * 43 */ 44 public class MlibWarpRIF implements RenderedImageFactory { 45 46 /** Constructor. */ MlibWarpRIF()47 public MlibWarpRIF() {} 48 49 /** 50 * Creates a new instance of <code>MlibWarpOpImage</code> in 51 * the rendered image mode. 52 * 53 * @param args The source images. 54 * @param hints May contain rendering hints and destination image layout. 55 */ create(ParameterBlock args, RenderingHints hints)56 public RenderedImage create(ParameterBlock args, 57 RenderingHints hints) { 58 /* Get ImageLayout and TileCache from RenderingHints. */ 59 ImageLayout layout = RIFUtil.getImageLayoutHint(hints); 60 61 RenderedImage source = args.getRenderedSource(0); 62 63 64 if (!MediaLibAccessor.isMediaLibCompatible(args, layout) || 65 !MediaLibAccessor.hasSameNumBands(args, layout) || 66 // Medialib cannot deal with source image having tiles with any 67 // dimension greater than or equal to 32768 68 source.getTileWidth() >= 32768 || 69 source.getTileHeight() >= 32768) { 70 return null; 71 } 72 73 /* Get BorderExtender from hints if any. */ 74 BorderExtender extender = RIFUtil.getBorderExtenderHint(hints); 75 76 Warp warp = (Warp)args.getObjectParameter(0); 77 Interpolation interp = (Interpolation)args.getObjectParameter(1); 78 double[] backgroundValues = (double[])args.getObjectParameter(2); 79 80 int filter = -1; 81 if (interp instanceof InterpolationNearest) { 82 filter = Constants.MLIB_NEAREST; 83 } else if (interp instanceof InterpolationBilinear) { 84 filter = Constants.MLIB_BILINEAR; 85 } else if (interp instanceof InterpolationBicubic) { 86 filter = Constants.MLIB_BICUBIC; 87 } else if (interp instanceof InterpolationBicubic2) { 88 filter = Constants.MLIB_BICUBIC2; 89 } else if (interp instanceof InterpolationTable) { 90 ; 91 // filter = Constants.MLIB_TABLE; not defined yet; 92 } else { 93 /* Other kinds of interpolation cannot be handled via mlib. */ 94 return null; 95 } 96 97 if (warp instanceof WarpGrid) { 98 if (interp instanceof InterpolationTable){ 99 return new MlibWarpGridTableOpImage(source, 100 extender, hints, layout, 101 (WarpGrid)warp, 102 interp, 103 backgroundValues); 104 }else{ 105 return new MlibWarpGridOpImage(source, 106 extender, hints, layout, 107 (WarpGrid)warp, 108 interp, filter, 109 backgroundValues); 110 } 111 112 } else if (warp instanceof WarpPolynomial) { 113 if (interp instanceof InterpolationTable){ 114 return new MlibWarpPolynomialTableOpImage(source, 115 extender, hints, layout, 116 (WarpPolynomial)warp, 117 interp, 118 backgroundValues); 119 }else{ 120 return new MlibWarpPolynomialOpImage(source, 121 extender, hints, layout, 122 (WarpPolynomial)warp, 123 interp, filter, 124 backgroundValues); 125 } 126 } else { 127 return null; 128 } 129 130 } 131 } 132