/*
** Copyright 2005 Huxtable.com. All rights reserved.
*/
package com.jhlabs.image;
import java.awt.image.*;
/**
* A filter which subtracts Gaussian blur from an image, sharpening it.
* @author Jerry Huxtable
*/
public class GlowFilter extends GaussianFilter {
static final long serialVersionUID = 5377089073023183684L;
private float amount = 0.5f;
public GlowFilter() {
radius = 2;
}
public void setAmount( float amount ) {
this.amount = amount;
}
public float getAmount() {
return amount;
}
public BufferedImage filter( BufferedImage src, BufferedImage dst ) {
int width = src.getWidth();
int height = src.getHeight();
if ( dst == null )
dst = createCompatibleDestImage( src, null );
int[] inPixels = new int[width*height];
int[] outPixels = new int[width*height];
src.getRGB( 0, 0, width, height, inPixels, 0, width );
if ( radius > 0 ) {
convolveAndTranspose(kernel, inPixels, outPixels, width, height, alpha, CLAMP_EDGES);
convolveAndTranspose(kernel, outPixels, inPixels, height, width, alpha, CLAMP_EDGES);
}
src.getRGB( 0, 0, width, height, outPixels, 0, width );
float a = 4*amount;
int index = 0;
for ( int y = 0; y < height; y++ ) {
for ( int x = 0; x < width; x++ ) {
int rgb1 = outPixels[index];
int r1 = (rgb1 >> 16) & 0xff;
int g1 = (rgb1 >> 8) & 0xff;
int b1 = rgb1 & 0xff;
int rgb2 = inPixels[index];
int r2 = (rgb2 >> 16) & 0xff;
int g2 = (rgb2 >> 8) & 0xff;
int b2 = rgb2 & 0xff;
r1 = PixelUtils.clamp( (int)(r1 + a * r2) );
g1 = PixelUtils.clamp( (int)(g1 + a * g2) );
b1 = PixelUtils.clamp( (int)(b1 + a * b2) );
inPixels[index] = (rgb1 & 0xff000000) | (r1 << 16) | (g1 << 8) | b1;
index++;
}
}
dst.setRGB( 0, 0, width, height, inPixels, 0, width );
return dst;
}
public String toString() {
return "Blur/Glow...";
}
}