blob: 2f4ca781320b235f5633c7bb762ea56dbb915657 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* @author Igor V. Stolyarov
* @version $Revision$
*/
package java.awt.image;
import java.util.Hashtable;
/**
* The CropImageFilter class crops a rectangular region of an source Image and
* provides a source for a new image containing the extracted region.
*
* @since Android 1.0
*/
public class CropImageFilter extends ImageFilter {
/**
* The HEIGHT.
*/
private final int X, Y, WIDTH, HEIGHT;
/**
* Instantiates a new CropImageFilter object with the specified rectangular
* area.
*
* @param x
* the X coordinate of rectangular area.
* @param y
* the Y coordinate of rectangular area.
* @param w
* the width of rectangular area.
* @param h
* the height of rectangular area.
*/
public CropImageFilter(int x, int y, int w, int h) {
X = x;
Y = y;
WIDTH = w;
HEIGHT = h;
}
@SuppressWarnings("unchecked")
@Override
public void setProperties(Hashtable<?, ?> props) {
Hashtable<Object, Object> fprops;
if (props == null) {
fprops = new Hashtable<Object, Object>();
} else {
fprops = (Hashtable<Object, Object>)props.clone();
}
String propName = "Crop Filters"; //$NON-NLS-1$
String prop = "x=" + X + "; y=" + Y + "; width=" + //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
WIDTH + "; height=" + HEIGHT; //$NON-NLS-1$
Object o = fprops.get(propName);
if (o != null) {
if (o instanceof String) {
prop = (String)o + "; " + prop; //$NON-NLS-1$
} else {
prop = o.toString() + "; " + prop; //$NON-NLS-1$
}
}
fprops.put(propName, prop);
consumer.setProperties(fprops);
}
@Override
public void setPixels(int x, int y, int w, int h, ColorModel model, int[] pixels, int off,
int scansize) {
if (x + w < X || X + WIDTH < x || y + h < Y || Y + HEIGHT < y) {
return;
}
int destX, destY, destWidth, destHeight, endX, endY, srcEndX, srcEndY;
int newOffset = off;
endX = X + WIDTH;
endY = Y + HEIGHT;
srcEndX = x + w;
srcEndY = y + h;
if (x <= X) {
destX = 0;
newOffset += X;
if (endX >= srcEndX) {
destWidth = srcEndX - X;
} else {
destWidth = WIDTH;
}
} else {
destX = x - X;
if (endX >= srcEndX) {
destWidth = w;
} else {
destWidth = endX - x;
}
}
if (y <= Y) {
newOffset += scansize * (Y - y);
destY = 0;
if (endY >= srcEndY) {
destHeight = srcEndY - Y;
} else {
destHeight = HEIGHT;
}
} else {
destY = y - Y;
if (endY >= srcEndY) {
destHeight = h;
} else {
destHeight = endY - y;
}
}
consumer.setPixels(destX, destY, destWidth, destHeight, model, pixels, newOffset, scansize);
}
@Override
public void setPixels(int x, int y, int w, int h, ColorModel model, byte[] pixels, int off,
int scansize) {
if (x + w < X || X + WIDTH < x || y + h < Y || Y + HEIGHT < y) {
return;
}
int destX, destY, destWidth, destHeight, endX, endY, srcEndX, srcEndY;
int newOffset = off;
endX = X + WIDTH;
endY = Y + HEIGHT;
srcEndX = x + w;
srcEndY = y + h;
if (x <= X) {
destX = 0;
newOffset += X;
if (endX >= srcEndX) {
destWidth = srcEndX - X;
} else {
destWidth = WIDTH;
}
} else {
destX = x - X;
if (endX >= srcEndX) {
destWidth = w;
} else {
destWidth = endX - x;
}
}
if (y <= Y) {
newOffset += scansize * (Y - y);
destY = 0;
if (endY >= srcEndY) {
destHeight = srcEndY - Y;
} else {
destHeight = HEIGHT;
}
} else {
destY = y - Y;
if (endY >= srcEndY) {
destHeight = h;
} else {
destHeight = endY - y;
}
}
consumer.setPixels(destX, destY, destWidth, destHeight, model, pixels, newOffset, scansize);
}
@Override
public void setDimensions(int w, int h) {
consumer.setDimensions(WIDTH, HEIGHT);
}
}