/*******************************************************************************
* 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;
import java.awt.image.RenderedImage;
import java.awt.image.renderable.ParameterBlock;
import javax.media.jai.Interpolation;
import javax.media.jai.JAI;
import org.weasis.core.api.Messages;
import org.weasis.core.api.gui.util.MathUtil;
import org.weasis.core.api.image.util.ImageToolkit;
public class ZoomOp extends AbstractOp {
public static final String OP_NAME = Messages.getString("ZoomOperation.title"); //$NON-NLS-1$
public static final String[] INTERPOLATIONS =
{ Messages.getString("ZoomOperation.nearest"), Messages.getString("ZoomOperation.bilinear"), //$NON-NLS-1$ //$NON-NLS-2$
Messages.getString("ZoomOperation.bicubic"), Messages.getString("ZoomOperation.bicubic2") }; //$NON-NLS-1$ //$NON-NLS-2$
/**
* Set a zoom factor in x-axis (Required parameter).
*
* Double value.
*/
public static final String P_RATIO_X = "ratio.x"; //$NON-NLS-1$
/**
* Set a zoom factor in y-axis (Required parameter).
*
* Double value.
*/
public static final String P_RATIO_Y = "ratio.y"; //$NON-NLS-1$
/**
* Set the interpolation type (Optional parameter).
*
* Integer value. Default value is bilinear interpolation. See javax.media.jai.Interpolation.
*/
public static final String P_INTERPOLATION = "interpolation"; //$NON-NLS-1$
public ZoomOp() {
setName(OP_NAME);
}
public ZoomOp(ZoomOp op) {
super(op);
}
@Override
public ZoomOp copy() {
return new ZoomOp(this);
}
@Override
public void process() throws Exception {
RenderedImage source = (RenderedImage) params.get(Param.INPUT_IMG);
RenderedImage result = source;
Double zoomFactorX = (Double) params.get(P_RATIO_X);
Double zoomFactorY = (Double) params.get(P_RATIO_Y);
if (zoomFactorX != null && zoomFactorY != null && (MathUtil.isDifferent(zoomFactorX, 1.0) || MathUtil.isDifferent(zoomFactorY, 1.0))) {
ParameterBlock pb = new ParameterBlock();
pb.addSource(source);
pb.add(Math.abs(zoomFactorX.floatValue()));
pb.add(Math.abs(zoomFactorY.floatValue()));
pb.add(0.0f);
pb.add(0.0f);
pb.add(getInterpolation());
result = JAI.create("scale", pb, ImageToolkit.NOCACHE_HINT); //$NON-NLS-1$
}
params.put(Param.OUTPUT_IMG, result);
}
public Interpolation getInterpolation() {
Integer interpolation = (Integer) params.get(P_INTERPOLATION);
if (interpolation == null || interpolation < 0 || interpolation > 3) {
interpolation = 1;
}
return Interpolation.getInstance(interpolation);
}
}