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 }