/* * JBoss, Home of Professional Open Source. * Copyright 2013, Red Hat, Inc., and individual contributors * as indicated by the @author tags. See the copyright.txt file in the * distribution for a full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.capedwarf.images.transform; import java.awt.geom.AffineTransform; import java.awt.image.AffineTransformOp; import java.awt.image.BufferedImage; import com.google.appengine.api.images.Transform; /** * @author <a href="mailto:marko.luksa@gmail.com">Marko Luksa</a> */ public class ResizeTransform extends CapedwarfTransform { public ResizeTransform(Transform transform) { super(transform); } @Override public BufferedImage applyTo(BufferedImage image) { double scaleXFactor = (double) getWidth() / image.getWidth(); double scaleYFactor = (double) getHeight() / image.getHeight(); if (isCropToFit()) { double maxFactor = Math.max(scaleXFactor, scaleYFactor); scaleXFactor = maxFactor; scaleYFactor = maxFactor; } else if (isRetainAspectRatio()) { double minFactor = Math.min(scaleXFactor, scaleYFactor); scaleXFactor = minFactor; scaleYFactor = minFactor; } AffineTransform tx = AffineTransform.getScaleInstance(scaleXFactor, scaleYFactor); AffineTransformOp op = new AffineTransformOp(tx, AffineTransformOp.TYPE_BILINEAR); BufferedImage transformedImage = op.filter(image, null); if (isCropToFit()) { transformedImage = transformedImage.getSubimage( (int) (getCropOffsetX() * (transformedImage.getWidth() - getWidth())), (int) (getCropOffsetY() * (transformedImage.getHeight() - getHeight())), getWidth(), getHeight()); } return transformedImage; } private boolean isRetainAspectRatio() { return !isAllowStretch(); } private int getWidth() { return (Integer) getFieldValue("width"); } private int getHeight() { return (Integer) getFieldValue("height"); } private boolean isCropToFit() { return (Boolean) getFieldValue("cropToFit"); } private float getCropOffsetX() { return (Float) getFieldValue("cropOffsetX"); } private float getCropOffsetY() { return (Float) getFieldValue("cropOffsetY"); } private boolean isAllowStretch() { return (Boolean) getFieldValue("allowStretch"); } }