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 draws a gradient interpolated between four colors defined at the corners of the image.
049 */
050public class FourColorFilter extends PointFilter  implements DynFiltering {
051        
052        private int width;
053        private int height;
054        private int colorNW;
055        private int colorNE;
056        private int colorSW;
057        private int colorSE;
058        private int rNW, gNW, bNW;
059        private int rNE, gNE, bNE;
060        private int rSW, gSW, bSW;
061        private int rSE, gSE, bSE;
062
063        public FourColorFilter() {
064                setColorNW( 0xffff0000 );
065                setColorNE( 0xffff00ff );
066                setColorSW( 0xff0000ff );
067                setColorSE( 0xff00ffff );
068        }
069
070        public void setColorNW( int color ) {
071                this.colorNW = color;
072                rNW = (color >> 16) & 0xff;
073                gNW = (color >> 8) & 0xff;
074                bNW = color & 0xff;
075        }
076
077        public int getColorNW() {
078                return colorNW;
079        }
080
081        public void setColorNE( int color ) {
082                this.colorNE = color;
083                rNE = (color >> 16) & 0xff;
084                gNE = (color >> 8) & 0xff;
085                bNE = color & 0xff;
086        }
087
088        public int getColorNE() {
089                return colorNE;
090        }
091
092        public void setColorSW( int color ) {
093                this.colorSW = color;
094                rSW = (color >> 16) & 0xff;
095                gSW = (color >> 8) & 0xff;
096                bSW = color & 0xff;
097        }
098
099        public int getColorSW() {
100                return colorSW;
101        }
102
103        public void setColorSE( int color ) {
104                this.colorSE = color;
105                rSE = (color >> 16) & 0xff;
106                gSE = (color >> 8) & 0xff;
107                bSE = color & 0xff;
108        }
109
110        public int getColorSE() {
111                return colorSE;
112        }
113
114        public void setDimensions(int width, int height) {
115                this.width = width;
116                this.height = height;
117                super.setDimensions(width, height);
118        }
119
120        public int filterRGB(int x, int y, int rgb) {
121                float fx = (float)x / width;
122                float fy = (float)y / height;
123                float p, q;
124
125                p = rNW + (rNE - rNW) * fx;
126                q = rSW + (rSE - rSW) * fx;
127                int r = (int)( p + (q - p) * fy + 0.5f );
128
129                p = gNW + (gNE - gNW) * fx;
130                q = gSW + (gSE - gSW) * fx;
131                int g = (int)( p + (q - p) * fy + 0.5f );
132
133                p = bNW + (bNE - bNW) * fx;
134                q = bSW + (bSE - bSW) * fx;
135                int b = (int)( p + (q - p) * fy + 0.5f );
136
137                return 0xff000000 | (r << 16) | (g << 8) | b;
138        }
139        
140        public String toString() {
141                return "Texture/Four Color Fill...";
142        }
143        public BufferedImage filter(BufferedImage src, Struct parameters) throws PageException {BufferedImage dst=ImageUtil.createBufferedImage(src);
144                Object o;
145                if((o=parameters.removeEL(KeyImpl.init("ColorNW")))!=null)setColorNW(ImageFilterUtil.toIntValue(o,"ColorNW"));
146                if((o=parameters.removeEL(KeyImpl.init("ColorNE")))!=null)setColorNE(ImageFilterUtil.toIntValue(o,"ColorNE"));
147                if((o=parameters.removeEL(KeyImpl.init("ColorSW")))!=null)setColorSW(ImageFilterUtil.toIntValue(o,"ColorSW"));
148                if((o=parameters.removeEL(KeyImpl.init("ColorSE")))!=null)setColorSE(ImageFilterUtil.toIntValue(o,"ColorSE"));
149                if((o=parameters.removeEL(KeyImpl.init("Dimensions")))!=null){
150                        int[] dim=ImageFilterUtil.toDimensions(o,"Dimensions");
151                        setDimensions(dim[0],dim[1]);
152                }
153
154                // check for arguments not supported
155                if(parameters.size()>0) {
156                        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 [ColorNW, ColorNE, ColorSW, ColorSE, Dimensions]");
157                }
158
159                return filter(src, dst);
160        }
161}