01: /*
02: * $RCSfile: BoxFilterRIF.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:56:16 $
10: * $State: Exp $
11: */
12: package com.sun.media.jai.opimage;
13:
14: import java.awt.RenderingHints;
15: import java.awt.image.RenderedImage;
16: import java.awt.image.renderable.ParameterBlock;
17: import java.awt.image.renderable.RenderedImageFactory;
18: import java.util.Arrays;
19: import javax.media.jai.BorderExtender;
20: import javax.media.jai.ImageLayout;
21: import javax.media.jai.KernelJAI;
22: import java.util.Map;
23:
24: /**
25: * A <code>RIF</code> supporting the "BoxFilter" operation in the rendered
26: * image layer.
27: *
28: * @see javax.media.jai.operator.BoxFilterDescriptor
29: * @see com.sun.media.jai.opimage.SeparableConvolveOpImage
30: *
31: * @since EA4
32: *
33: */
34: public class BoxFilterRIF implements RenderedImageFactory {
35:
36: /** Constructor. */
37: public BoxFilterRIF() {
38: }
39:
40: /**
41: * Create a new instance of SeparableConvolveOpImage in the rendered layer.
42: * This method satisfies the implementation of RIF.
43: *
44: * @param paramBlock The source image and the convolution kernel.
45: */
46: public RenderedImage create(ParameterBlock paramBlock,
47: RenderingHints renderHints) {
48: // Get ImageLayout from renderHints if any.
49: ImageLayout layout = RIFUtil.getImageLayoutHint(renderHints);
50:
51: // Get BorderExtender from renderHints if any.
52: BorderExtender extender = RIFUtil
53: .getBorderExtenderHint(renderHints);
54:
55: // Get the operation parameters.
56: int width = paramBlock.getIntParameter(0);
57: int height = paramBlock.getIntParameter(1);
58: int xOrigin = paramBlock.getIntParameter(2);
59: int yOrigin = paramBlock.getIntParameter(3);
60:
61: // Allocate and initialize arrays.
62: float[] dataH = new float[width];
63: Arrays.fill(dataH, 1.0F / (float) width);
64: float[] dataV = null;
65: if (height == width) {
66: dataV = dataH;
67: } else {
68: dataV = new float[height];
69: Arrays.fill(dataV, 1.0F / (float) height);
70: }
71:
72: // Construct a separable kernel.
73: KernelJAI kernel = new KernelJAI(width, height, xOrigin,
74: yOrigin, dataH, dataV);
75:
76: // Construct and return the OpImage.
77: return new SeparableConvolveOpImage(paramBlock
78: .getRenderedSource(0), extender, renderHints, layout,
79: kernel);
80: }
81: }
|