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.Color;
036import java.awt.image.BufferedImage;
037
038import lucee.runtime.engine.ThreadLocalPageContext;
039import lucee.runtime.exp.FunctionException;
040import lucee.runtime.exp.PageException;
041import lucee.runtime.img.ImageUtil;
042import lucee.runtime.type.KeyImpl;
043import lucee.runtime.type.Struct;
044import lucee.runtime.type.util.CollectionUtil;
045
046public class HSBAdjustFilter extends PointFilter  implements DynFiltering {
047        
048        public float hFactor, sFactor, bFactor;
049        private float[] hsb = new float[3];
050        
051        public HSBAdjustFilter() {
052                this(0, 0, 0);
053        }
054
055        public HSBAdjustFilter(float r, float g, float b) {
056                hFactor = r;
057                sFactor = g;
058                bFactor = b;
059                canFilterIndexColorModel = true;
060        }
061
062        public void setHFactor( float hFactor ) {
063                this.hFactor = hFactor;
064        }
065        
066        public float getHFactor() {
067                return hFactor;
068        }
069        
070        public void setSFactor( float sFactor ) {
071                this.sFactor = sFactor;
072        }
073        
074        public float getSFactor() {
075                return sFactor;
076        }
077        
078        public void setBFactor( float bFactor ) {
079                this.bFactor = bFactor;
080        }
081        
082        public float getBFactor() {
083                return bFactor;
084        }
085        
086        public int filterRGB(int x, int y, int rgb) {
087                int a = rgb & 0xff000000;
088                int r = (rgb >> 16) & 0xff;
089                int g = (rgb >> 8) & 0xff;
090                int b = rgb & 0xff;
091                Color.RGBtoHSB(r, g, b, hsb);
092                hsb[0] += hFactor;
093                while (hsb[0] < 0)
094                        hsb[0] += Math.PI*2;
095                hsb[1] += sFactor;
096                if (hsb[1] < 0)
097                        hsb[1] = 0;
098                else if (hsb[1] > 1.0)
099                        hsb[1] = 1.0f;
100                hsb[2] += bFactor;
101                if (hsb[2] < 0)
102                        hsb[2] = 0;
103                else if (hsb[2] > 1.0)
104                        hsb[2] = 1.0f;
105                rgb = Color.HSBtoRGB(hsb[0], hsb[1], hsb[2]);
106                return a | (rgb & 0xffffff);
107        }
108
109        public String toString() {
110                return "Colors/Adjust HSB...";
111        }
112        public BufferedImage filter(BufferedImage src, Struct parameters) throws PageException {BufferedImage dst=ImageUtil.createBufferedImage(src);
113                Object o;
114                if((o=parameters.removeEL(KeyImpl.init("HFactor")))!=null)setHFactor(ImageFilterUtil.toFloatValue(o,"HFactor"));
115                if((o=parameters.removeEL(KeyImpl.init("SFactor")))!=null)setSFactor(ImageFilterUtil.toFloatValue(o,"SFactor"));
116                if((o=parameters.removeEL(KeyImpl.init("BFactor")))!=null)setBFactor(ImageFilterUtil.toFloatValue(o,"BFactor"));
117                if((o=parameters.removeEL(KeyImpl.init("Dimensions")))!=null){
118                        int[] dim=ImageFilterUtil.toDimensions(o,"Dimensions");
119                        setDimensions(dim[0],dim[1]);
120                }
121
122                // check for arguments not supported
123                if(parameters.size()>0) {
124                        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 [HFactor, SFactor, BFactor, Dimensions]");
125                }
126
127                return filter(src, dst);
128        }
129}
130