001    /*
002    Copyright 2006 Jerry Huxtable
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 com.github.sarxos.webcam.util.jh;
018    
019    import java.awt.Rectangle;
020    import java.awt.RenderingHints;
021    import java.awt.geom.Point2D;
022    import java.awt.geom.Rectangle2D;
023    import java.awt.image.BufferedImage;
024    import java.awt.image.BufferedImageOp;
025    import java.awt.image.ColorModel;
026    
027    
028    /**
029     * A convenience class which implements those methods of BufferedImageOp which
030     * are rarely changed.
031     */
032    public abstract class JHFilter implements BufferedImageOp, Cloneable {
033    
034            @Override
035            public BufferedImage createCompatibleDestImage(BufferedImage src, ColorModel dstCM) {
036                    if (dstCM == null)
037                            dstCM = src.getColorModel();
038                    return new BufferedImage(dstCM, dstCM.createCompatibleWritableRaster(src.getWidth(), src.getHeight()), dstCM.isAlphaPremultiplied(), null);
039            }
040    
041            @Override
042            public Rectangle2D getBounds2D(BufferedImage src) {
043                    return new Rectangle(0, 0, src.getWidth(), src.getHeight());
044            }
045    
046            @Override
047            public Point2D getPoint2D(Point2D srcPt, Point2D dstPt) {
048                    if (dstPt == null)
049                            dstPt = new Point2D.Double();
050                    dstPt.setLocation(srcPt.getX(), srcPt.getY());
051                    return dstPt;
052            }
053    
054            @Override
055            public RenderingHints getRenderingHints() {
056                    return null;
057            }
058    
059            /**
060             * A convenience method for getting ARGB pixels from an image. This tries to
061             * avoid the performance penalty of BufferedImage.getRGB unmanaging the
062             * image.
063             * 
064             * @param image a BufferedImage object
065             * @param x the left edge of the pixel block
066             * @param y the right edge of the pixel block
067             * @param width the width of the pixel arry
068             * @param height the height of the pixel arry
069             * @param pixels the array to hold the returned pixels. May be null.
070             * @return the pixels
071             * @see #setRGB
072             */
073            public int[] getRGB(BufferedImage image, int x, int y, int width, int height, int[] pixels) {
074                    int type = image.getType();
075                    if (type == BufferedImage.TYPE_INT_ARGB || type == BufferedImage.TYPE_INT_RGB)
076                            return (int[]) image.getRaster().getDataElements(x, y, width, height, pixels);
077                    return image.getRGB(x, y, width, height, pixels, 0, width);
078            }
079    
080            /**
081             * A convenience method for setting ARGB pixels in an image. This tries to
082             * avoid the performance penalty of BufferedImage.setRGB unmanaging the
083             * image.
084             * 
085             * @param image a BufferedImage object
086             * @param x the left edge of the pixel block
087             * @param y the right edge of the pixel block
088             * @param width the width of the pixel arry
089             * @param height the height of the pixel arry
090             * @param pixels the array of pixels to set
091             * @see #getRGB
092             */
093            public void setRGB(BufferedImage image, int x, int y, int width, int height, int[] pixels) {
094                    int type = image.getType();
095                    if (type == BufferedImage.TYPE_INT_ARGB || type == BufferedImage.TYPE_INT_RGB)
096                            image.getRaster().setDataElements(x, y, width, height, pixels);
097                    else
098                            image.setRGB(x, y, width, height, pixels, 0, width);
099            }
100    
101            @Override
102            public Object clone() {
103                    try {
104                            return super.clone();
105                    } catch (CloneNotSupportedException e) {
106                            return null;
107                    }
108            }
109    }