001: /*
002: * $RCSfile: MlibIDFTRIF.java,v $
003: *
004: * Copyright (c) 2005 Sun Microsystems, Inc. All rights reserved.
005: *
006: * Use is subject to license terms.
007: *
008: * $Revision: 1.1 $
009: * $Date: 2005/02/11 04:55:58 $
010: * $State: Exp $
011: */
012: package com.sun.media.jai.mlib;
013:
014: import java.awt.RenderingHints;
015: import java.awt.image.RenderedImage;
016: import java.awt.image.renderable.ParameterBlock;
017: import java.awt.image.renderable.RenderedImageFactory;
018: import javax.media.jai.BorderExtender;
019: import javax.media.jai.EnumeratedParameter;
020: import javax.media.jai.ImageLayout;
021: import javax.media.jai.JAI;
022: import java.util.Map;
023: import javax.media.jai.operator.DFTDescriptor;
024: import com.sun.media.jai.opimage.DFTOpImage;
025: import com.sun.media.jai.opimage.FFT;
026: import com.sun.media.jai.opimage.RIFUtil;
027: import com.sun.media.jai.util.MathJAI;
028:
029: /**
030: * A <code>RIF</code> supporting the "IDFT" operation in the
031: * rendered image mode using MediaLib.
032: *
033: * @see javax.media.jai.operator.DFTDescriptor
034: * @see javax.media.jai.operator.IDFTDescriptor
035: * @see com.sun.media.jai.opimage.DFTOpImage
036: *
037: * @since EA4
038: *
039: */
040: public class MlibIDFTRIF implements RenderedImageFactory {
041:
042: /** Constructor. */
043: public MlibIDFTRIF() {
044: }
045:
046: /**
047: * Creates a new instance of <code>DFTOpImage</code> in
048: * the rendered image mode.
049: *
050: * @param args The source image.
051: * @param hints May contain rendering hints and destination image layout.
052: */
053: public RenderedImage create(ParameterBlock args,
054: RenderingHints hints) {
055: /* Get ImageLayout and TileCache from RenderingHints. */
056: ImageLayout layout = RIFUtil.getImageLayoutHint(hints);
057:
058: if (!MediaLibAccessor
059: .isMediaLibCompatible(new ParameterBlock())) {
060: return null;
061: }
062:
063: RenderedImage source = args.getRenderedSource(0);
064: EnumeratedParameter scalingType = (EnumeratedParameter) args
065: .getObjectParameter(0);
066: EnumeratedParameter dataNature = (EnumeratedParameter) args
067: .getObjectParameter(1);
068:
069: boolean isComplexSource = !dataNature
070: .equals(DFTDescriptor.REAL_TO_COMPLEX);
071: int numSourceBands = source.getSampleModel().getNumBands();
072:
073: // Use the two-dimensional mediaLib DFT if possible: it supports
074: // only data which have a single component (real or complex)
075: // per pixel and which have dimensions which are equal to a positive
076: // power of 2.
077: if (((isComplexSource && numSourceBands == 2) || (!isComplexSource && numSourceBands == 1))
078: && MlibDFTOpImage.isAcceptableSampleModel(source
079: .getSampleModel())) {
080: // If necessary, pad the source to ensure that
081: // both dimensions are positive powers of 2.
082: int sourceWidth = source.getWidth();
083: int sourceHeight = source.getHeight();
084: if (!MathJAI.isPositivePowerOf2(sourceWidth)
085: || !MathJAI.isPositivePowerOf2(sourceHeight)) {
086: ParameterBlock pb = new ParameterBlock();
087: pb.addSource(source);
088: pb.add(0);
089: pb.add(MathJAI.nextPositivePowerOf2(sourceWidth)
090: - sourceWidth);
091: pb.add(0);
092: pb.add(MathJAI.nextPositivePowerOf2(sourceHeight)
093: - sourceHeight);
094: pb.add(BorderExtender
095: .createInstance(BorderExtender.BORDER_ZERO));
096: source = JAI.create("border", pb);
097: }
098:
099: return new MlibDFTOpImage(source, hints, layout,
100: dataNature, false, scalingType);
101: } else { // General case
102: FFT fft = new FFTmediaLib(false, new Integer(scalingType
103: .getValue()), 2);
104:
105: return new DFTOpImage(source, hints, layout, dataNature,
106: fft);
107: }
108: }
109: }
|