package com.android.gallery3d.filtershow.imageshow;
-import android.graphics.*;
+import android.graphics.Bitmap;
+import android.graphics.Matrix;
+import android.graphics.Point;
+import android.graphics.Rect;
+import android.graphics.RectF;
import android.os.Handler;
import android.os.Message;
-import android.util.Log;
import com.android.gallery3d.filtershow.FilterShowActivity;
-import com.android.gallery3d.filtershow.HistoryAdapter;
-import com.android.gallery3d.filtershow.cache.*;
+import com.android.gallery3d.filtershow.history.HistoryManager;
+import com.android.gallery3d.filtershow.history.HistoryItem;
+import com.android.gallery3d.filtershow.pipeline.FilteringPipeline;
+import com.android.gallery3d.filtershow.cache.ImageLoader;
+import com.android.gallery3d.filtershow.pipeline.RenderingRequest;
+import com.android.gallery3d.filtershow.pipeline.RenderingRequestCaller;
import com.android.gallery3d.filtershow.filters.FilterRepresentation;
import com.android.gallery3d.filtershow.filters.ImageFilter;
-import com.android.gallery3d.filtershow.presets.ImagePreset;
+import com.android.gallery3d.filtershow.pipeline.Buffer;
+import com.android.gallery3d.filtershow.pipeline.SharedBuffer;
+import com.android.gallery3d.filtershow.pipeline.SharedPreset;
+import com.android.gallery3d.filtershow.pipeline.ImagePreset;
import com.android.gallery3d.filtershow.state.StateAdapter;
import java.util.Vector;
private static final String LOGTAG = "MasterImage";
private boolean DEBUG = false;
-
+ private static final boolean DISABLEZOOM = false;
private static MasterImage sMasterImage = null;
private static int sIconSeedSize = 128;
private static float sHistoryPreviewSize = 128.0f;
private ImageFilter mCurrentFilter = null;
private ImagePreset mPreset = null;
+ private ImagePreset mLoadedPreset = null;
private ImagePreset mGeometryOnlyPreset = null;
private ImagePreset mFiltersOnlyPreset = null;
- private TripleBufferBitmap mFilteredPreview = new TripleBufferBitmap();
+ private SharedBuffer mPreviewBuffer = new SharedBuffer();
+ private SharedPreset mPreviewPreset = new SharedPreset();
private Bitmap mGeometryOnlyBitmap = null;
private Bitmap mFiltersOnlyBitmap = null;
private Bitmap mHighresBitmap = null;
private ImageLoader mLoader = null;
- private HistoryAdapter mHistory = null;
+ private HistoryManager mHistory = null;
private StateAdapter mState = null;
private FilterShowActivity mActivity = null;
return mFiltersOnlyPreset;
}
- public synchronized void setPreset(ImagePreset preset, boolean addToHistory) {
- preset.showFilters();
+ public synchronized void setPreset(ImagePreset preset,
+ FilterRepresentation change,
+ boolean addToHistory) {
+ if (DEBUG) {
+ preset.showFilters();
+ }
mPreset = preset;
mPreset.setImageLoader(mLoader);
setGeometry();
mPreset.fillImageStateAdapter(mState);
if (addToHistory) {
- mHistory.addHistoryItem(mPreset);
+ HistoryItem historyItem = new HistoryItem(mPreset, change);
+ mHistory.addHistoryItem(historyItem);
}
updatePresets(true);
- GeometryMetadata geo = mPreset.mGeoData;
+ GeometryMetadata geo = mPreset.getGeometry();
if (!geo.equals(mPreviousGeometry)) {
notifyGeometryChange();
}
mPreviousGeometry = new GeometryMetadata(geo);
- }
-
- private void renderHistoryPreview() {
- ImagePreset historyPreset = mPreset;
- if (historyPreset != null) {
- Bitmap preview = mLoader.getOriginalBitmapSmall();
- if (preview != null) {
- float s = Math.min(preview.getWidth(), preview.getHeight());
- float f = sHistoryPreviewSize / s;
- int w = (int) (preview.getWidth() * f);
- int h = (int) (preview.getHeight() * f);
- Bitmap historyPreview = Bitmap.createScaledBitmap(preview, w, h, true);
- historyPreset.setPreviewImage(historyPreview);
- RenderingRequest.post(historyPreview,
- historyPreset, RenderingRequest.ICON_RENDERING, this);
- }
- }
+ mActivity.updateCategories();
}
private void setGeometry() {
}
float w = image.getWidth();
float h = image.getHeight();
- GeometryMetadata geo = mPreset.mGeoData;
+ GeometryMetadata geo = mPreset.getGeometry();
RectF pb = geo.getPhotoBounds();
if (w == pb.width() && h == pb.height()) {
return;
RectF r = new RectF(0, 0, w, h);
geo.setPhotoBounds(r);
geo.setCropBounds(r);
+ mPreset.setGeometry(geo);
}
public void onHistoryItemClick(int position) {
- setPreset(new ImagePreset(mHistory.getItem(position)), false);
+ HistoryItem historyItem = mHistory.getItem(position);
// We need a copy from the history
+ ImagePreset newPreset = new ImagePreset(historyItem.getImagePreset());
+ // don't need to add it to the history
+ setPreset(newPreset, historyItem.getFilterRepresentation(), false);
mHistory.setCurrentPreset(position);
}
- public HistoryAdapter getHistory() {
+ public HistoryManager getHistory() {
return mHistory;
}
return mState;
}
- public void setHistoryAdapter(HistoryAdapter adapter) {
+ public void setHistoryManager(HistoryManager adapter) {
mHistory = adapter;
}
}
public synchronized boolean hasModifications() {
+ // TODO: We need to have a better same effects check to see if two
+ // presets are functionally the same. Right now, we are relying on a
+ // stricter check as equals().
+ ImagePreset loadedPreset = getLoadedPreset();
if (mPreset == null) {
- return false;
+ if (loadedPreset == null) {
+ return false;
+ } else {
+ return loadedPreset.hasModifications();
+ }
+ } else {
+ if (loadedPreset == null) {
+ return mPreset.hasModifications();
+ } else {
+ return !mPreset.equals(getLoadedPreset());
+ }
}
- return mPreset.hasModifications();
}
- public TripleBufferBitmap getDoubleBuffer() {
- return mFilteredPreview;
+ public SharedBuffer getPreviewBuffer() {
+ return mPreviewBuffer;
+ }
+
+ public SharedPreset getPreviewPreset() {
+ return mPreviewPreset;
}
public void setOriginalGeometry(Bitmap originalBitmapLarge) {
- GeometryMetadata geo = getPreset().mGeoData;
+ GeometryMetadata geo = getPreset().getGeometry();
float w = originalBitmapLarge.getWidth();
float h = originalBitmapLarge.getHeight();
RectF r = new RectF(0, 0, w, h);
}
public Bitmap getFilteredImage() {
- return mFilteredPreview.getConsumer();
+ mPreviewBuffer.swapConsumerIfNeeded(); // get latest bitmap
+ Buffer consumer = mPreviewBuffer.getConsumer();
+ if (consumer != null) {
+ return consumer.getBitmap();
+ }
+ return null;
}
public Bitmap getFiltersOnlyImage() {
}
}
invalidatePreview();
- mActivity.enableSave(hasModifications());
}
public FilterRepresentation getCurrentFilterRepresentation() {
}
public void invalidatePreview() {
- mFilteredPreview.invalidate();
+ mPreviewPreset.enqueuePreset(mPreset);
+ mPreviewBuffer.invalidate();
invalidatePartialPreview();
invalidateHighresPreview();
needsUpdatePartialPreview();
}
private Matrix getImageToScreenMatrix(boolean reflectRotation) {
- GeometryMetadata geo = mPreset.mGeoData;
+ GeometryMetadata geo = mPreset.getGeometry();
if (geo == null || mLoader == null
|| mLoader.getOriginalBounds() == null
|| mImageShowSize.x == 0) {
Point translate = getTranslation();
float scaleFactor = getScaleFactor();
m.postTranslate(translate.x, translate.y);
- m.postScale(scaleFactor, scaleFactor, mImageShowSize.x/2.0f, mImageShowSize.y/2.0f);
+ m.postScale(scaleFactor, scaleFactor, mImageShowSize.x / 2.0f, mImageShowSize.y / 2.0f);
return m;
}
if (request.getBitmap() == null) {
return;
}
+
+ boolean needsCheckModification = false;
if (request.getType() == RenderingRequest.GEOMETRY_RENDERING) {
mGeometryOnlyBitmap = request.getBitmap();
+ needsCheckModification = true;
}
if (request.getType() == RenderingRequest.FILTERS_RENDERING) {
mFiltersOnlyBitmap = request.getBitmap();
+ needsCheckModification = true;
}
if (request.getType() == RenderingRequest.PARTIAL_RENDERING
&& request.getScaleFactor() == getScaleFactor()) {
mPartialBitmap = request.getBitmap();
notifyObservers();
+ needsCheckModification = true;
}
if (request.getType() == RenderingRequest.HIGHRES_RENDERING) {
mHighresBitmap = request.getBitmap();
notifyObservers();
+ needsCheckModification = true;
}
-
- if (request.getType() == RenderingRequest.ICON_RENDERING) {
- // History preview images
- ImagePreset preset = request.getOriginalImagePreset();
- preset.setPreviewImage(request.getBitmap());
- mHistory.notifyDataSetChanged();
+ if (needsCheckModification) {
+ mActivity.enableSave(hasModifications());
}
}
}
public void setScaleFactor(float scaleFactor) {
+ if (DISABLEZOOM) {
+ return;
+ }
if (scaleFactor == mScaleFactor) {
return;
}
}
public void setTranslation(Point translation) {
+ if (DISABLEZOOM) {
+ mTranslation.x = 0;
+ mTranslation.y = 0;
+ return;
+ }
mTranslation.x = translation.x;
mTranslation.y = translation.y;
needsUpdatePartialPreview();
}
public void setOriginalTranslation(Point originalTranslation) {
+ if (DISABLEZOOM) {
+ return;
+ }
mOriginalTranslation.x = originalTranslation.x;
mOriginalTranslation.y = originalTranslation.y;
}
}
public float getMaxScaleFactor() {
+ if (DISABLEZOOM) {
+ return 1;
+ }
return mMaxScaleFactor;
}
public boolean showsOriginal() {
return mShowsOriginal;
}
+
+ public void setLoadedPreset(ImagePreset preset) {
+ mLoadedPreset = preset;
+ }
+
+ public ImagePreset getLoadedPreset() {
+ return mLoadedPreset;
+ }
+
}