/*******************************************************************************
* Copyright (c) 2016 Weasis Team and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Nicolas Roduit - initial API and implementation
*******************************************************************************/
package org.weasis.core.api.image.op;
import java.awt.RenderingHints;
import java.awt.Transparency;
import java.awt.color.ColorSpace;
import java.awt.image.BandedSampleModel;
import java.awt.image.ComponentColorModel;
import java.awt.image.ComponentSampleModel;
import java.awt.image.DataBuffer;
import java.awt.image.PixelInterleavedSampleModel;
import java.awt.image.RenderedImage;
import java.awt.image.SampleModel;
import java.awt.image.SinglePixelPackedSampleModel;
import java.awt.image.renderable.ParameterBlock;
import java.awt.image.renderable.RenderableImage;
import java.awt.image.renderable.RenderedImageFactory;
import javax.media.jai.ComponentSampleModelJAI;
import javax.media.jai.ImageLayout;
import javax.media.jai.JAI;
import javax.media.jai.OperationDescriptorImpl;
import javax.media.jai.ParameterBlockJAI;
import javax.media.jai.RenderableOp;
import javax.media.jai.RenderedOp;
import javax.media.jai.registry.RenderableRegistryMode;
import javax.media.jai.registry.RenderedRegistryMode;
import org.weasis.core.api.image.util.JAIUtil;
public class RectifyUShortToShortDataDescriptor extends OperationDescriptorImpl implements RenderedImageFactory {
/**
* The resource strings that provide the general documentation and specify the parameter list for this operation.
*/
private static final String[][] resources = { { "GlobalName", "RectifyUShortToShortData" }, //$NON-NLS-1$ //$NON-NLS-2$
{ "LocalName", "RectifyUShortToShortData" }, //$NON-NLS-1$ //$NON-NLS-2$
{ "Vendor", "" }, //$NON-NLS-1$ //$NON-NLS-2$
{ "Description", //$NON-NLS-1$
"Rectify image with unsigned short data to signed short data (Workaround for imageio codecs issue" }, //$NON-NLS-1$
{ "DocURL", "" }, //$NON-NLS-1$ //$NON-NLS-2$
{ "Version", "1.0" } //$NON-NLS-1$ //$NON-NLS-2$
};
private static final Class[] paramClasses = {};
/** The parameter name list for this operation. */
private static final String[] paramNames = {};
/** The parameter default value list for this operation. */
private static final Object[] paramDefaults = {};
private static final String[] supportedModes = { "rendered", "renderable" }; //$NON-NLS-1$ //$NON-NLS-2$
/** Constructor. */
public RectifyUShortToShortDataDescriptor() {
super(resources, supportedModes, 1, paramNames, paramClasses, paramDefaults, null);
}
/**
* Validates the input source and parameter.
*
* <p>
* In addition to the standard checks performed by the superclass method, this method checks that the source image
* has an integral data type.
*/
@Override
public boolean validateArguments(String modeName, ParameterBlock args, StringBuffer message) {
if (!super.validateArguments(modeName, args, message)) {
return false;
}
if (!modeName.equalsIgnoreCase("rendered")) { //$NON-NLS-1$
return true;
}
RenderedImage src = args.getRenderedSource(0);
int dtype = src.getSampleModel().getDataType();
if (dtype != DataBuffer.TYPE_USHORT) {
return false;
}
return true;
}
@Override
public RenderedImage create(ParameterBlock args, RenderingHints renderHints) {
// Get ImageLayout from renderHints if any.
RenderedImage src = args.getRenderedSource(0);
ImageLayout layout = JAIUtil.getImageLayoutHint(renderHints);
if (layout == null) {
layout = new ImageLayout(src);
}
// Create a sample model with signed short DataBuffer
SampleModel model = src.getSampleModel();
if (model instanceof ComponentSampleModel) {
final ComponentSampleModel cast = (ComponentSampleModel) model;
final int w = cast.getWidth();
final int h = cast.getHeight();
final int pixelStride = cast.getPixelStride();
final int scanlineStride = cast.getScanlineStride();
final int[] bankIndices = cast.getBankIndices();
final int[] bandOffsets = cast.getBandOffsets();
if (model instanceof BandedSampleModel) {
model = new BandedSampleModel(DataBuffer.TYPE_SHORT, w, h, scanlineStride, bankIndices, bandOffsets);
} else if (model instanceof PixelInterleavedSampleModel) {
model = new PixelInterleavedSampleModel(DataBuffer.TYPE_SHORT, w, h, pixelStride, scanlineStride,
bandOffsets);
} else if (model instanceof ComponentSampleModelJAI) {
model = new ComponentSampleModelJAI(DataBuffer.TYPE_SHORT, w, h, pixelStride, scanlineStride,
bankIndices, bandOffsets);
} else {
model = new ComponentSampleModel(DataBuffer.TYPE_SHORT, w, h, pixelStride, scanlineStride, bankIndices,
bandOffsets);
}
} else if (model instanceof SinglePixelPackedSampleModel) {
final SinglePixelPackedSampleModel cast = (SinglePixelPackedSampleModel) model;
final int scanlineStride = cast.getScanlineStride();
final int[] bitMasks = cast.getBitMasks();
model = new SinglePixelPackedSampleModel(DataBuffer.TYPE_SHORT, cast.getWidth(), cast.getHeight(),
scanlineStride, bitMasks);
}
RenderingHints hints = new RenderingHints(JAI.KEY_TRANSFORM_ON_COLORMAP, Boolean.FALSE);
layout.setSampleModel(model);
layout.setColorModel(new ComponentColorModel(ColorSpace.getInstance(ColorSpace.CS_GRAY), new int[] { 16 },
false, false, Transparency.OPAQUE, DataBuffer.TYPE_SHORT));
renderHints.add(new RenderingHints(JAI.KEY_IMAGE_LAYOUT, layout));
renderHints.add(hints);
return new RectifyUShortToShortDataOpImage(args.getRenderedSource(0), renderHints, layout);
}
public static RenderedOp create(RenderedImage source0, RenderingHints hints) {
ParameterBlockJAI pb = new ParameterBlockJAI("RectifyUShortToShortData", RenderedRegistryMode.MODE_NAME); //$NON-NLS-1$
pb.setSource("source0", source0); //$NON-NLS-1$
return JAI.create("RectifyUShortToShortData", pb, hints); //$NON-NLS-1$
}
public static RenderableOp createRenderable(RenderableImage source0, RenderingHints hints) {
ParameterBlockJAI pb = new ParameterBlockJAI("RectifyUShortToShortData", RenderableRegistryMode.MODE_NAME); //$NON-NLS-1$
pb.setSource("source0", source0); //$NON-NLS-1$
return JAI.createRenderable("RectifyUShortToShortData", pb, hints); //$NON-NLS-1$
}
}