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.type.KeyImpl;
041import lucee.runtime.type.Struct;
042import lucee.runtime.type.util.CollectionUtil;
043/**
044 * A Filter to pixellate images.
045 */
046public class BlockFilter extends TransformFilter  implements DynFiltering {
047        
048        private int blockSize = 2;
049
050        /**
051         * Set the pixel block size.
052         * @param blockSize the number of pixels along each block edge
053     * @min-value 1
054     * @max-value 100+
055     * @see #getBlockSize
056         */
057        public void setBlockSize(int blockSize) {
058                this.blockSize = blockSize;
059        }
060
061        /**
062         * Get the pixel block size.
063         * @return the number of pixels along each block edge
064     * @see #setBlockSize
065         */
066        public int getBlockSize() {
067                return blockSize;
068        }
069
070
071        public BlockFilter() {
072        }
073
074        protected void transformInverse(int x, int y, float[] out) {
075                out[0] = (x / blockSize) * blockSize;
076                out[1] = (y / blockSize) * blockSize;
077        }
078
079        public String toString() {
080                return "Stylize/Mosaic...";
081        }
082        public BufferedImage filter(BufferedImage src, Struct parameters) throws PageException {BufferedImage dst=null;//ImageUtil.createBufferedImage(src);
083                Object o;
084                if((o=parameters.removeEL(KeyImpl.init("BlockSize")))!=null)setBlockSize(ImageFilterUtil.toIntValue(o,"BlockSize"));
085                if((o=parameters.removeEL(KeyImpl.init("EdgeAction")))!=null)setEdgeAction(ImageFilterUtil.toString(o,"EdgeAction"));
086                if((o=parameters.removeEL(KeyImpl.init("Interpolation")))!=null)setInterpolation(ImageFilterUtil.toString(o,"Interpolation"));
087
088                // check for arguments not supported
089                if(parameters.size()>0) {
090                        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 [BlockSize, EdgeAction, Interpolation]");
091                }
092
093                return filter(src, dst);
094        }
095}
096