001    /*
002    *
003    
004    Licensed under the Apache License, Version 2.0 (the "License");
005    you may not use this file except in compliance with the License.
006    You may obtain a copy of the License at
007    
008       http://www.apache.org/licenses/LICENSE-2.0
009    
010    Unless required by applicable law or agreed to in writing, software
011    distributed under the License is distributed on an "AS IS" BASIS,
012    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013    See the License for the specific language governing permissions and
014    limitations under the License.
015    */
016    
017    package railo.runtime.img.filter;import java.awt.Graphics2D;
018    import java.awt.Image;
019    import java.awt.image.BufferedImage;
020    import java.awt.image.ColorModel;
021    
022    import railo.runtime.exp.PageException;
023    import railo.runtime.img.ImageUtil;
024    import railo.runtime.op.Caster;
025    import railo.runtime.type.KeyImpl;
026    import railo.runtime.type.Struct;
027    
028    
029    /**
030     * Scales an image using the area-averaging algorithm, which can't be done with AffineTransformOp.
031     */
032    public class ScaleFilter extends AbstractBufferedImageOp  implements DynFiltering {
033    
034            private int width;
035            private int height;
036    
037        /**
038         * Construct a ScaleFilter.
039         */
040            public ScaleFilter() {
041                    this(32, 32);
042            }
043    
044        /**
045             * @param width the width to set
046             */
047            public void setWidth(int width) {
048                    this.width = width;
049            }
050    
051            /**
052             * @param height the height to set
053             */
054            public void setHeight(int height) {
055                    this.height = height;
056            }
057    
058            /**
059         * Construct a ScaleFilter.
060         * @param width the width to scale to
061         * @param height the height to scale to
062         */
063            public ScaleFilter( int width, int height ) {
064                    this.width = width;
065                    this.height = height;
066            }
067    
068        public BufferedImage filter( BufferedImage src, BufferedImage dst ) {
069            int w = src.getWidth();
070            int h = src.getHeight();
071    
072                    if ( dst == null ) {
073                            ColorModel dstCM = src.getColorModel();
074                            dst = new BufferedImage(dstCM, dstCM.createCompatibleWritableRaster(w, h), dstCM.isAlphaPremultiplied(), null);
075                    }
076    
077                    //Image scaleImage = 
078                    src.getScaledInstance( w, h, Image.SCALE_AREA_AVERAGING );
079                    Graphics2D g = dst.createGraphics();
080                    g.drawImage( src, 0, 0, width, height, null );
081                    g.dispose();
082    
083            return dst;
084        }
085    
086            public String toString() {
087                    return "Distort/Scale";
088            }
089    
090            public BufferedImage filter(BufferedImage src, Struct parameters) throws PageException {BufferedImage dst=ImageUtil.createBufferedImage(src);
091                    int width=Caster.toIntValue(parameters.get(KeyImpl.init("Width")));
092                    int height=Caster.toIntValue(parameters.get(KeyImpl.init("Height")));
093                    setHeight(height);
094                    setWidth(width);
095                    
096                    dst=ImageUtil.createBufferedImage(dst,width,height);
097                    
098                    
099                    return filter(src, dst);
100            }
101    }