01: /*
02: * $RCSfile: MlibFilteredSubsampleRIF.java,v $
03: *
04: * Copyright (c) 2005 Sun Microsystems, Inc. All rights reserved.
05: *
06: * Use is subject to license terms.
07: *
08: * $Revision: 1.1 $
09: * $Date: 2005/02/11 04:55:57 $
10: * $State: Exp $
11: */package com.sun.media.jai.mlib;
12:
13: import java.awt.RenderingHints;
14: import java.awt.image.RenderedImage;
15: import java.awt.image.DataBuffer;
16: import java.awt.image.SampleModel;
17: import java.awt.image.MultiPixelPackedSampleModel;
18: import java.awt.image.renderable.RenderedImageFactory;
19: import java.awt.image.renderable.ParameterBlock;
20: import java.util.Map;
21: import javax.media.jai.BorderExtender;
22: import javax.media.jai.ImageLayout;
23: import javax.media.jai.Interpolation;
24: import javax.media.jai.JAI;
25:
26: /**
27: * <p> Class implementing the RIF interface for the MlibFilteredSubsample
28: * operator. An instance of this class should be registered with the
29: * OperationRegistry with operation name "FilteredSubsample."
30: *
31: * <p> This code is very similar to FilteredSubsampleRIF.
32: */
33: public class MlibFilteredSubsampleRIF implements RenderedImageFactory {
34:
35: /** Default constructor (there is no input). */
36: public MlibFilteredSubsampleRIF() {
37: }
38:
39: /**
40: * Creates a new instance of SubsampleOpImage in the rendered layer.
41: * This method satisfies the implementation of RIF.
42: *
43: * @param paramBlock The source image, the X and Y scale factors.
44: * @param renderHints RenderingHints.
45: */
46: public RenderedImage create(ParameterBlock paramBlock,
47: RenderingHints renderHints) {
48:
49: BorderExtender extender = renderHints == null ? null
50: : (BorderExtender) renderHints
51: .get(JAI.KEY_BORDER_EXTENDER);
52: ImageLayout layout = renderHints == null ? null
53: : (ImageLayout) renderHints.get(JAI.KEY_IMAGE_LAYOUT);
54:
55: // Test for media lib compatibility
56: if (!MediaLibAccessor.isMediaLibCompatible(paramBlock, layout)
57: || !MediaLibAccessor
58: .hasSameNumBands(paramBlock, layout)) {
59: return null;
60: }
61:
62: RenderedImage source = paramBlock.getRenderedSource(0);
63: SampleModel sm = source.getSampleModel();
64: boolean isBilevel = (sm instanceof MultiPixelPackedSampleModel)
65: && (sm.getSampleSize(0) == 1)
66: && (sm.getDataType() == DataBuffer.TYPE_BYTE
67: || sm.getDataType() == DataBuffer.TYPE_USHORT || sm
68: .getDataType() == DataBuffer.TYPE_INT);
69: if (isBilevel) {
70: // Let Java code handle it, reformatting is slower
71: return null;
72: }
73:
74: int scaleX = paramBlock.getIntParameter(0);
75: int scaleY = paramBlock.getIntParameter(1);
76: float[] qsFilter = (float[]) paramBlock.getObjectParameter(2);
77: Interpolation interp = (Interpolation) paramBlock
78: .getObjectParameter(3);
79:
80: return new MlibFilteredSubsampleOpImage(source, extender,
81: (Map) renderHints, layout, scaleX, scaleY, qsFilter,
82: interp);
83: } // create
84:
85: } // MlibFilteredSubsampleRIF
|