/* * HaoRan ImageFilter Classes v0.4 * 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.Date; import android.graphics.Point; import android.util.Log; public class TileReflectionFilter implements IImageFilter{ // angle ==> radian double AngleToRadian (int nAngle) {return IImageFilter.LIB_PI * nAngle / 180.0;} double m_sin, m_cos ; double m_scale ; double m_curvature ; final int aasamples = 17; Point[] m_aapt = new Point[aasamples]; byte m_focusType; int m_size = 24; /** Constructor \n param -45 <= nAngle <= 45 \n param 2 <= nSquareSize <= 200 \n param -20 <= nCurvature <= 20 */ public TileReflectionFilter (int nSquareSize, int nCurvature, int nAngle, byte focusType) { nAngle = Function.FClamp (nAngle, -45, 45) ; m_sin = Math.sin (AngleToRadian(nAngle)) ; m_cos = Math.cos (AngleToRadian(nAngle)) ; nSquareSize = Function.FClamp (nSquareSize, 2, 200) ; m_scale = IImageFilter.LIB_PI / nSquareSize ; m_focusType = focusType; nCurvature = Function.FClamp (nCurvature, -20, 20) ; if (nCurvature == 0) nCurvature = 1 ; m_curvature = nCurvature * nCurvature / 10.0 * (Math.abs(nCurvature)/nCurvature) ; for (int i=0 ; i < aasamples ; i++) { double x = (i * 4) / (double)aasamples, y = i / (double)aasamples ; x = x - (int)x ; m_aapt[i] = new Point((int)(m_cos * x + m_sin * y), (int)(m_cos * y - m_sin * x)); } } public TileReflectionFilter(int nSquareSize, int nCurvature) { this(nSquareSize, nCurvature, 45, (byte)0); } public Image process(Image imageIn) { { int r, g, b; int width = imageIn.getWidth(); int height = imageIn.getHeight(); double hw = width / 2.0; double hh = imageIn.getHeight() / 2.0; int ratio = width > height ? height * 32768 / width : width * 32768 / height; // Calculate center, min and max int cx = width >> 1; int cy = height >> 1; int max = cx * cx + cy * cy; int min = (int)(max * 0.5); int diff = max - min; for(int x = 0 ; x < width ; x++){ for(int y = 0 ; y < height ; y++){ if (m_focusType == 1)//��Բ { // Calculate distance to center and adapt aspect ratio int dx = cx - x; int dy = cy - y; if (imageIn.getWidth() > imageIn.getHeight()) { dy = (dy * ratio) >> 14; } else { dx = (dx * ratio) >> 14; } int distSq = dx * dx + dy * dy; if (distSq <= min) continue; } else if (m_focusType == 2)//������ { boolean inarray = false; if ((x < m_size) && (y < height - x) && (y >= x)) inarray = true; // left else if ((y < m_size) && (x < width - y) && (x >= y)) inarray = true; // top else if ((x > width - m_size) && (y >= width - x) && (y < height + x - width)) inarray = true; // right else if (y > height - m_size) inarray = true; // bottom if (!inarray) continue; } int i = (int)(x - hw); int j = (int)(y - hh); b=0; g=0; r=0; for (int mm=0 ; mm < aasamples ; mm++){ double u = i + m_aapt[mm].x ; double v = j - m_aapt[mm].y ; double s = m_cos * u + m_sin * v ; double t = -m_sin * u + m_cos * v ; s += m_curvature * Math.tan(s * m_scale) ; t += m_curvature * Math.tan(t * m_scale) ; u = m_cos * s - m_sin * t ; v = m_sin * s + m_cos * t ; int xSample = (int)(hw + u) ; int ySample = (int)(hh + v) ; xSample = Function.FClamp (xSample, 0, width -1) ; ySample = Function.FClamp (ySample, 0, height-1) ; r += imageIn.getRComponent(xSample, ySample); g += imageIn.getGComponent(xSample, ySample); b += imageIn.getBComponent(xSample, ySample); } imageIn.setPixelColor(x, y, Image.SAFECOLOR(r/aasamples), Image.SAFECOLOR(g/aasamples), Image.SAFECOLOR(b/aasamples)); } } return imageIn; } } }