package org.auie.ui;

import org.auie.utils.UE;

import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.PaintFlagsDrawFilter;
import android.graphics.Path;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.Region;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;

@SuppressLint("NewApi")
public class UICircleImageView extends View{
	
	private Bitmap bitmap;
	private Bitmap dstBitmap;
	private boolean isXfermode = false;
	private Path path=new Path();
	private Paint paint = new Paint();
	private Rect bitmapRect = new Rect();
	private PaintFlagsDrawFilter pdf=new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG|Paint.FILTER_BITMAP_FLAG);
	private PorterDuffXfermode xfermode=new PorterDuffXfermode(PorterDuff.Mode.MULTIPLY);
	
	{
		paint.setStyle(Paint.Style.STROKE);
		paint.setFlags(Paint.ANTI_ALIAS_FLAG);
		paint.setAntiAlias(true);
	}
	
	public UICircleImageView(Context context) {
		super(context);
	}
	public UICircleImageView(Context context, AttributeSet attrs) {
		super(context, attrs);
	}
	public UICircleImageView(Context context, AttributeSet attrs, int defStyleAttr) {
		super(context, attrs, defStyleAttr);
	}
	public UICircleImageView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
		super(context, attrs, defStyleAttr, defStyleRes);
	}
	
	public void setImageBitmap(Bitmap bitmap){
		this.bitmap = bitmap;
		try {
			if (android.os.Build.VERSION.SDK_INT >= 11) {
				setLayerType(LAYER_TYPE_SOFTWARE, null);
			}
		} catch (Exception e) {
			isXfermode = true;
			Log.d(UE.TAG, e.toString());
		}
	}
	
	private Bitmap makeDst(int w, int h){
		Bitmap bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
		Canvas canvas = new Canvas(bitmap);
		Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
		paint.setColor(0xFFFFFFFF);
		canvas.drawOval(new RectF(0, 0, w, h), paint);
		return bitmap;
	}
	
	@Override
	protected void onDraw(Canvas canvas) {
		if (bitmap == null) {
			return;
		}
		if (isXfermode) {
			bitmapRect.set(0, 0, getWidth(), getHeight());
			canvas.save();
			canvas.setDrawFilter(pdf);
			path.reset();
			canvas.clipPath(path);
			path.addCircle(getWidth()/2, getWidth()/2, getHeight()/2, Path.Direction.CCW);
			canvas.clipPath(path, Region.Op.REPLACE);
			canvas.drawBitmap(bitmap, null, bitmapRect, paint);
			canvas.restore();
		}else {
			if (dstBitmap == null) {
				dstBitmap = makeDst(getWidth(), getHeight());
			}
			bitmapRect.set(0, 0, getWidth(), getHeight());
			canvas.save();
			canvas.setDrawFilter(pdf);
			canvas.drawBitmap(dstBitmap, 0, 0, paint);
			paint.setXfermode(xfermode);
			canvas.drawBitmap(bitmap, null, bitmapRect, paint);
			paint.setXfermode(null);
			canvas.restore();
		}
	}
}