package com.watabou.gltextures;

import android.graphics.Bitmap;
import android.graphics.RectF;

import com.watabou.glwrap.Texture;

public class SmartTexture extends Texture {

	public int width;
	public int height;

	public int fModeMin;
	public int fModeMax;

	public int wModeH;
	public int wModeV;

	public Bitmap bitmap;

	public Atlas atlas;

	protected SmartTexture() {
		//useful for subclasses which want to manage their own texture data
		// in cases where android.graphics.bitmap isn't fast enough.

		//subclasses which use this MUST also override some mix of reload/generate/bind
	}

	public SmartTexture(Bitmap bitmap) {
		this(bitmap, NEAREST, CLAMP, false);
	}

	public SmartTexture(Bitmap bitmap, int filtering, int wrapping, boolean premultiplied) {

		this.bitmap = bitmap;
		width = bitmap.getWidth();
		height = bitmap.getHeight();
		this.fModeMin = this.fModeMax = filtering;
		this.wModeH = this.wModeV = wrapping;
		this.premultiplied = premultiplied;

	}

	@Override
	protected void generate() {
		super.generate();
		bitmap( bitmap, premultiplied );
		filter( fModeMin, fModeMax );
		wrap( wModeH, wModeV );
	}

	@Override
	public void filter(int minMode, int maxMode) {
		fModeMin = minMode;
		fModeMax = maxMode;
		if (id != -1)
			super.filter( fModeMin, fModeMax );
	}

	@Override
	public void wrap( int s, int t ) {
		wModeH = s;
		wModeV = t;
		if (id != -1)
			super.wrap( wModeH, wModeV );
	}

	@Override
	public void bitmap(Bitmap bitmap) {
		bitmap(bitmap, false);
	}

	public void bitmap(Bitmap bitmap, boolean premultiplied) {
		if (premultiplied) {
			super.bitmap(bitmap);
		} else {
			handMade(bitmap, true);
		}

		this.bitmap = bitmap;
		width = bitmap.getWidth();
		height = bitmap.getHeight();
	}

	public void reload() {
		id = -1;
		generate();
	}

	@Override
	public void delete() {

		super.delete();

		if (bitmap != null)
			bitmap.recycle();
		bitmap = null;
	}

	public RectF uvRect(int left, int top, int right, int bottom) {
		return new RectF(
				(float) left / width,
				(float) top / height,
				(float) right / width,
				(float) bottom / height);
	}
}