/* JAI-Ext - OpenSource Java Advanced Image Extensions Library * http://www.geo-solutions.it/ * Copyright 2014 GeoSolutions * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * http://www.apache.org/licenses/LICENSE-2.0 * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package it.geosolutions.jaiext.buffer; import it.geosolutions.jaiext.range.Range; import java.awt.RenderingHints; import java.awt.image.ColorModel; import java.awt.image.RenderedImage; import java.awt.image.SampleModel; import java.awt.image.renderable.ParameterBlock; import java.awt.image.renderable.RenderedImageFactory; import java.util.List; import java.util.Map; import javax.media.jai.BorderExtender; import javax.media.jai.ImageLayout; import javax.media.jai.JAI; import javax.media.jai.ROI; import javax.media.jai.RasterFactory; import com.sun.media.jai.opimage.RIFUtil; import com.sun.media.jai.util.JDKWorkarounds; public class BufferRIF implements RenderedImageFactory { public RenderedImage create(ParameterBlock pb, RenderingHints renderHints) { // Get ImageLayout from renderHints if any. ImageLayout layout = RIFUtil.getImageLayoutHint(renderHints); RenderedImage src = pb.getRenderedSource(0); Integer type = (Integer)pb.getIntParameter(9); if(type != null && !(layout == null && type == src.getSampleModel().getDataType())){ // Create or clone the ImageLayout. if(layout == null) { layout = new ImageLayout(src); } else { layout = (ImageLayout)layout.clone(); } boolean isDataTypeChange = false; // Get prospective destination SampleModel. SampleModel sampleModel = layout.getSampleModel(src); // Create a new SampleModel if the type is not as desired. if (sampleModel.getDataType() != type) { int tileWidth = layout.getTileWidth(src); int tileHeight = layout.getTileHeight(src); int numBands = src.getSampleModel().getNumBands(); SampleModel csm = RasterFactory.createComponentSampleModel(sampleModel, type, tileWidth, tileHeight, numBands); layout.setSampleModel(csm); isDataTypeChange = true; } // Check ColorModel. ColorModel colorModel = layout.getColorModel(null); if (colorModel != null && !JDKWorkarounds.areCompatibleDataModels(layout.getSampleModel(src), colorModel)) { // Clear the mask bit if incompatible. layout.unsetValid(ImageLayout.COLOR_MODEL_MASK); } // Check whether anything but the ColorModel is changing. if (layout.getSampleModel(src) == src.getSampleModel() && layout.getMinX(src) == src.getMinX() && layout.getMinY(src) == src.getMinY() && layout.getWidth(src) == src.getWidth() && layout.getHeight(src) == src.getHeight() && layout.getTileWidth(src) == src.getTileWidth() && layout.getTileHeight(src) == src.getTileHeight() && layout.getTileGridXOffset(src) == src.getTileGridXOffset() && layout.getTileGridYOffset(src) == src.getTileGridYOffset()) { if (layout.getColorModel(src) != src.getColorModel()) { // Remove TileCache hint from RenderingHints if present. if (renderHints != null && renderHints.containsKey(JAI.KEY_TILE_CACHE)) { renderHints = new RenderingHints((Map) renderHints); renderHints.remove(JAI.KEY_TILE_CACHE); } } } if (isDataTypeChange == true) { // Add JAI.KEY_REPLACE_INDEX_COLOR_MODEL hint to renderHints if (renderHints == null) { renderHints = new RenderingHints(JAI.KEY_REPLACE_INDEX_COLOR_MODEL, Boolean.TRUE); } else if (!renderHints.containsKey( JAI.KEY_REPLACE_INDEX_COLOR_MODEL)) { // If the user specified a value for this hint, we don't // want to change that renderHints.put(JAI.KEY_REPLACE_INDEX_COLOR_MODEL, Boolean.TRUE); } } } BorderExtender extender = (BorderExtender) pb.getObjectParameter(0); int leftPadding = pb.getIntParameter(1); int rightPadding = pb.getIntParameter(2); int topPadding = pb.getIntParameter(3); int bottomPadding = pb.getIntParameter(4); List<ROI> rois = (List<ROI>) pb.getObjectParameter(5); Range noData = (Range) pb.getObjectParameter(6); double destinationNoData = pb.getDoubleParameter(7); Double valueToCount = (Double) pb.getObjectParameter(8); double pixelArea = pb.getDoubleParameter(10); return new BufferOpImage(src, layout, renderHints, extender, leftPadding, rightPadding, topPadding, bottomPadding, rois, noData, destinationNoData, valueToCount, pixelArea); } }