/*
* HaoRan ImageFilter Classes v0.3
* Copyright (C) 2012 Zhenjun Dai
*
* This library is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by the
* Free Software Foundation; either version 2.1 of the License, or (at your
* option) any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
* for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this library; if not, write to the Free Software Foundation.
*/
package com.marshalchen.common.uimodule.ImageFilter;
import java.nio.Buffer;
import java.nio.ByteBuffer;
import java.nio.IntBuffer;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import com.marshalchen.common.uimodule.ImageFilter.RadialDistortionFilter.Point;
import android.util.Log;
public class SupernovaFilter implements IImageFilter{
Point _pt ;
double _radius ;
int _count ;
static int RAND_MAX = 0x7fff;
double[] _spoke ;
int[] _spokecolor ;
public SupernovaFilter(int cr, int radius, int count){
this(new Point(0.0f, 0.0f), cr, radius, count);
}
public SupernovaFilter(Point pt, int cr, int radius, int count)
{
_pt = pt ;
_radius = BoundParam1(radius) ;
_count = BoundParam1(count) ;
_spoke = new double[BoundParam1(count)];
_spokecolor = new int[BoundParam1(count)];
for (int i=0 ; i < _count ; i++)
{
_spoke[i] = get_gauss() ;
_spokecolor[i] = cr ;
}
}
static double get_gauss()
{
double s = 0 ;
for (int i=0 ; i < 6 ; i++)
s = s + NoiseFilter.getRandomInt(-255, 255) / (double)(RAND_MAX + 1.0) ;
return s / 6.0 ;
}
static int BoundParam1 (int n)
{
return ((n >= 1) ? n : 1) ;
}
//@Override
public Image process(Image imageIn) {
if((_pt.X + _pt.Y) <= 0){
_pt.X = imageIn.getWidth() /2;
_pt.Y = imageIn.getHeight() /2;
}
for(int x = 0 ; x < (imageIn.getWidth() - 1) ; x++){
for(int y = 0 ; y < (imageIn.getHeight() - 1) ; y++){
int[] pixel = new int[3];
pixel[0] = imageIn.getRComponent(x, y);
pixel[1] = imageIn.getGComponent(x, y);
pixel[2] = imageIn.getBComponent(x, y);
double u = (x - _pt.X + 0.001) / _radius ;
double v = (y - _pt.Y + 0.001) / _radius ;
double t = (Math.atan2 (u, v) / (2 * LIB_PI) + 0.51) * _count ;
int i = (int)Math.floor(t) ;
t -= i ;
i %= _count ;
double w1 = _spoke[i] * (1-t) + _spoke[(i+1) % _count] * t ;
w1 = w1 * w1 ;
double w = 1.0 / Math.sqrt (u*u + v*v) * 0.9 ;
double fRatio = Function.FClampDouble(w, 0.0, 1.0) ;
double ws = Function.FClampDouble (w1 * w, 0.0, 1.0) ;
for (int m=0 ; m < 3 ; m++)
{
int[] _spokecolorm = new int[3];
_spokecolorm[0] = _spokecolor[i] &0xFF0000>>16;
_spokecolorm[1] = _spokecolor[i] &0x00FF00>>8;
_spokecolorm[2] = _spokecolor[i] &0x0000FF;
int[] _spokecolorcount = new int[3];
_spokecolorcount[0] = _spokecolor[(i+1) % _count] &0xFF0000>>16;
_spokecolorcount[1] = _spokecolor[(i+1) % _count] &0x00FF00>>8;
_spokecolorcount[2] = _spokecolor[(i+1) % _count] &0x0000FF;
double spokecol = _spokecolorm[m]/255.0 * (1-t) +_spokecolorcount[m]/255.0 * t ;
double r;
if (w > 1.0)
r = Function.FClampDouble (spokecol * w, 0.0, 1.0);
else {
r = pixel[m]/255.0 * (1.0 - fRatio) + spokecol * fRatio ;
}
r += ws ;
pixel[m] = Function.FClamp0255 (r*255) ;
imageIn.setPixelColor(x, y, pixel[0], pixel[1], pixel[2]);
}
}
}
return imageIn;
}
}