001/**
002 *
003 * Copyright (c) 2014, the Railo Company Ltd. All rights reserved.
004 *
005 * This library is free software; you can redistribute it and/or
006 * modify it under the terms of the GNU Lesser General Public
007 * License as published by the Free Software Foundation; either 
008 * version 2.1 of the License, or (at your option) any later version.
009 * 
010 * This library is distributed in the hope that it will be useful,
011 * but WITHOUT ANY WARRANTY; without even the implied warranty of
012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
013 * Lesser General Public License for more details.
014 * 
015 * You should have received a copy of the GNU Lesser General Public 
016 * License along with this library.  If not, see <http://www.gnu.org/licenses/>.
017 * 
018 **/
019/*
020*
021
022Licensed under the Apache License, Version 2.0 (the "License");
023you may not use this file except in compliance with the License.
024You may obtain a copy of the License at
025
026   http://www.apache.org/licenses/LICENSE-2.0
027
028Unless required by applicable law or agreed to in writing, software
029distributed under the License is distributed on an "AS IS" BASIS,
030WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
031See the License for the specific language governing permissions and
032limitations under the License.
033*/
034
035package lucee.runtime.img.filter;import java.awt.image.BufferedImage;
036
037import lucee.runtime.engine.ThreadLocalPageContext;
038import lucee.runtime.exp.FunctionException;
039import lucee.runtime.exp.PageException;
040import lucee.runtime.img.ImageUtil;
041import lucee.runtime.type.KeyImpl;
042import lucee.runtime.type.Struct;
043import lucee.runtime.type.util.CollectionUtil;
044
045
046
047/**
048 * A filter which simply multiplies pixel values by a given scale factor.
049 */
050public class RescaleFilter extends TransferFilter  implements DynFiltering {
051        
052        private float scale = 1.0f;
053        
054        public RescaleFilter() {
055    }
056    
057        public RescaleFilter(float scale) {
058                this.scale = scale;
059    }
060    
061    protected float transferFunction( float v ) {
062                return v * scale;
063        }
064
065        /**
066     * Specifies the scale factor.
067     * @param scale the scale factor.
068     * @min-value 1
069     * @max-value 5+
070     * @see #getScale
071     */
072        public void setScale(float scale) {
073                this.scale = scale;
074                initialized = false;
075        }
076        
077        /**
078     * Returns the scale factor.
079     * @return the scale factor.
080     * @see #setScale
081     */
082        public float getScale() {
083                return scale;
084        }
085
086        public String toString() {
087                return "Colors/Rescale...";
088        }
089
090        public BufferedImage filter(BufferedImage src, Struct parameters) throws PageException {BufferedImage dst=ImageUtil.createBufferedImage(src);
091                Object o;
092                if((o=parameters.removeEL(KeyImpl.init("Scale")))!=null)setScale(ImageFilterUtil.toFloatValue(o,"Scale"));
093                if((o=parameters.removeEL(KeyImpl.init("Dimensions")))!=null){
094                        int[] dim=ImageFilterUtil.toDimensions(o,"Dimensions");
095                        setDimensions(dim[0],dim[1]);
096                }
097
098                // check for arguments not supported
099                if(parameters.size()>0) {
100                        throw new FunctionException(ThreadLocalPageContext.get(), "ImageFilter", 3, "parameters", "the parameter"+(parameters.size()>1?"s":"")+" ["+CollectionUtil.getKeyList(parameters,", ")+"] "+(parameters.size()>1?"are":"is")+" not allowed, only the following parameters are supported [Scale, Dimensions]");
101                }
102
103                return filter(src, dst);
104        }
105}
106