blob: 8dd81d4d0e85cc149bb536524048a44ff815a9dd [file] [log] [blame]
package com.android.gallery3d.filtershow.presets;
import android.graphics.Bitmap;
import android.graphics.RectF;
import android.util.Log;
import com.android.gallery3d.filtershow.ImageStateAdapter;
import com.android.gallery3d.filtershow.filters.ImageFilter;
import com.android.gallery3d.filtershow.filters.ImageFilterStraighten;
import com.android.gallery3d.filtershow.imageshow.ImageShow;
import java.util.Vector;
public class ImagePreset {
private static final String LOGTAG = "ImagePreset";
ImageShow mEndPoint = null;
protected Vector<ImageFilter> mFilters = new Vector<ImageFilter>();
protected String mName = "Original";
protected String mHistoryName = "Original";
protected boolean mIsFxPreset = false;
enum FullRotate {
ZERO, NINETY, HUNDRED_HEIGHTY, TWO_HUNDRED_SEVENTY
}
protected FullRotate mFullRotate = FullRotate.ZERO;
protected float mStraightenRotate = 0;
protected float mStraightenZoom = 0;
protected boolean mHorizontalFlip = false;
protected boolean mVerticalFlip = false;
protected RectF mCrop = null;
public ImagePreset() {
setup();
}
public ImagePreset(ImagePreset source) {
try {
for (int i = 0; i < source.mFilters.size(); i++) {
add(source.mFilters.elementAt(i).clone());
}
} catch (java.lang.CloneNotSupportedException e) {
Log.v(LOGTAG, "Exception trying to clone: " + e);
}
mName = source.name();
mHistoryName = source.name();
mIsFxPreset = source.isFx();
mStraightenRotate = source.mStraightenRotate;
mStraightenZoom = source.mStraightenZoom;
}
public void setStraightenRotation(float rotate, float zoom) {
mStraightenRotate = rotate;
mStraightenZoom = zoom;
}
private Bitmap applyGeometry(Bitmap original) {
Bitmap bitmap = original;
if (mFullRotate != FullRotate.ZERO) {
// TODO
}
if (mStraightenRotate != 0) {
// TODO: keep the instances around
ImageFilter straighten = new ImageFilterStraighten(mStraightenRotate, mStraightenZoom);
straighten.apply(bitmap);
straighten = null;
}
return bitmap;
}
public boolean isFx() {
return mIsFxPreset;
}
public void setIsFx(boolean value) {
mIsFxPreset = value;
}
public void setName(String name) {
mName = name;
mHistoryName = name;
}
public void setHistoryName(String name) {
mHistoryName = name;
}
public boolean same(ImagePreset preset) {
if (preset.mFilters.size() != mFilters.size()) {
return false;
}
if (!mName.equalsIgnoreCase(preset.name())) {
return false;
}
if (mStraightenRotate != preset.mStraightenRotate) {
return false;
}
for (int i = 0; i < preset.mFilters.size(); i++) {
ImageFilter a = preset.mFilters.elementAt(i);
ImageFilter b = mFilters.elementAt(i);
if (!a.same(b)) {
return false;
}
}
return true;
}
public String name() {
return mName;
}
public String historyName() {
return mHistoryName;
}
public void add(ImageFilter filter) {
mFilters.add(filter);
}
public void remove(String filterName) {
ImageFilter filter = getFilter(filterName);
if (filter != null) {
mFilters.remove(filter);
}
}
public int getCount() {
return mFilters.size();
}
public ImageFilter getFilter(String name) {
for (int i = 0; i < mFilters.size(); i++) {
ImageFilter filter = mFilters.elementAt(i);
if (filter.getName().equalsIgnoreCase(name)) {
return filter;
}
}
return null;
}
public void setup() {
// do nothing here
}
public void setEndpoint(ImageShow image) {
mEndPoint = image;
}
public Bitmap apply(Bitmap original) {
// First we apply any transform -- 90 rotate, flip, straighten, crop
Bitmap bitmap = applyGeometry(original);
// TODO -- apply borders separately
ImageFilter borderFilter = null;
for (int i = 0; i < mFilters.size(); i++) {
ImageFilter filter = mFilters.elementAt(i);
if (filter.getName().equalsIgnoreCase("Border")) {
// TODO don't use the name as an id
borderFilter = filter;
} else {
filter.apply(bitmap);
}
}
if (borderFilter != null) {
borderFilter.apply(bitmap);
}
if (mEndPoint != null) {
mEndPoint.updateFilteredImage(bitmap);
}
return bitmap;
}
public void fillImageStateAdapter(ImageStateAdapter imageStateAdapter) {
if (imageStateAdapter == null) {
return;
}
imageStateAdapter.clear();
imageStateAdapter.addAll(mFilters);
imageStateAdapter.notifyDataSetChanged();
}
}