From 977489b60c2375cd084a481e03c9878c03e6b077 Mon Sep 17 00:00:00 2001 From: nicolasroard Date: Wed, 26 Jun 2013 14:33:15 -0700 Subject: Cleanup in ImagePreset Move GeometryMetadata to the list of filters Change-Id: I0bef13ca0d9cb41e68eddd108000ff7bd426b313 --- .../gallery3d/filtershow/FilterShowActivity.java | 10 +- .../gallery3d/filtershow/filters/ImageFilter.java | 2 +- .../filtershow/imageshow/GeometryMetadata.java | 2 +- .../gallery3d/filtershow/imageshow/ImageShow.java | 16 +-- .../filtershow/imageshow/MasterImage.java | 9 +- .../gallery3d/filtershow/presets/ImagePreset.java | 119 +++++++++++++-------- .../gallery3d/filtershow/ui/FilterIconButton.java | 4 +- 7 files changed, 99 insertions(+), 63 deletions(-) diff --git a/src/com/android/gallery3d/filtershow/FilterShowActivity.java b/src/com/android/gallery3d/filtershow/FilterShowActivity.java index 2ac7e981b..9512ff088 100644 --- a/src/com/android/gallery3d/filtershow/FilterShowActivity.java +++ b/src/com/android/gallery3d/filtershow/FilterShowActivity.java @@ -462,7 +462,15 @@ public class FilterShowActivity extends FragmentActivity implements OnItemClickL if (representation == null) { return; } - useFilterRepresentation(representation); + + // TODO: this check is needed because the GeometryMetadata doesn't quite + // follow the same pattern as the other filters to update/sync their values. + // We thus need to not call useFilterRepresentation() for now, as it + // would override the current Geometry. Once GeometryMetadata is fixed, + // let's remove the check and call useFilterRepresentation all the time. + if (!(representation instanceof GeometryMetadata)) { + useFilterRepresentation(representation); + } // show representation Editor mCurrentEditor = mEditorPlaceHolder.showEditor(representation.getEditorId()); diff --git a/src/com/android/gallery3d/filtershow/filters/ImageFilter.java b/src/com/android/gallery3d/filtershow/filters/ImageFilter.java index 6481e108e..5ac87c665 100644 --- a/src/com/android/gallery3d/filtershow/filters/ImageFilter.java +++ b/src/com/android/gallery3d/filtershow/filters/ImageFilter.java @@ -89,7 +89,7 @@ public abstract class ImageFilter implements Cloneable { protected Matrix getOriginalToScreenMatrix(int w, int h) { ImagePreset preset = getEnvironment().getImagePreset(); - GeometryMetadata geo = getEnvironment().getImagePreset().mGeoData; + GeometryMetadata geo = getEnvironment().getImagePreset().getGeometry(); Matrix originalToScreen = geo.getOriginalToScreen(true, preset.getImageLoader().getOriginalBounds().width(), preset.getImageLoader().getOriginalBounds().height(), diff --git a/src/com/android/gallery3d/filtershow/imageshow/GeometryMetadata.java b/src/com/android/gallery3d/filtershow/imageshow/GeometryMetadata.java index 77dbd5e7b..af18372eb 100644 --- a/src/com/android/gallery3d/filtershow/imageshow/GeometryMetadata.java +++ b/src/com/android/gallery3d/filtershow/imageshow/GeometryMetadata.java @@ -38,7 +38,7 @@ import java.util.LinkedHashSet; import java.util.List; public class GeometryMetadata extends FilterRepresentation { - private static final String SERIALIZATION_NAME = "GEOM"; + public static final String SERIALIZATION_NAME = "GEOM"; private static final String LOGTAG = "GeometryMetadata"; private float mScaleFactor = 1.0f; private float mRotation = 0; diff --git a/src/com/android/gallery3d/filtershow/imageshow/ImageShow.java b/src/com/android/gallery3d/filtershow/imageshow/ImageShow.java index 1b9398397..13f18dc45 100644 --- a/src/com/android/gallery3d/filtershow/imageshow/ImageShow.java +++ b/src/com/android/gallery3d/filtershow/imageshow/ImageShow.java @@ -89,7 +89,7 @@ public class ImageShow extends View implements OnGestureListener, InteractionMode mInteractionMode = InteractionMode.NONE; protected GeometryMetadata getGeometry() { - return new GeometryMetadata(getImagePreset().mGeoData); + return new GeometryMetadata(getImagePreset().getGeometry()); } private FilterShowActivity mActivity = null; @@ -161,12 +161,12 @@ public class ImageShow extends View implements OnGestureListener, public Rect getImageBounds() { Rect dst = new Rect(); - getImagePreset().mGeoData.getPhotoBounds().roundOut(dst); + getImagePreset().getGeometry().getPhotoBounds().roundOut(dst); return dst; } public Rect getImageCropBounds() { - return GeometryMath.roundNearest(getImagePreset().mGeoData.getPreviewCropBounds()); + return GeometryMath.roundNearest(getImagePreset().getGeometry().getPreviewCropBounds()); } /* consider moving the following 2 methods into a subclass */ @@ -177,7 +177,7 @@ public class ImageShow extends View implements OnGestureListener, * @return Image to Screen transformation matrix */ protected Matrix getImageToScreenMatrix(boolean reflectRotation) { - GeometryMetadata geo = getImagePreset().mGeoData; + GeometryMetadata geo = getImagePreset().getGeometry(); if (geo == null || mImageLoader == null || mImageLoader.getOriginalBounds() == null) { return new Matrix(); @@ -377,15 +377,15 @@ public class ImageShow extends View implements OnGestureListener, return; float w = image.getWidth(); float h = image.getHeight(); - GeometryMetadata geo = getImagePreset().mGeoData; + GeometryMetadata geo = getImagePreset().getGeometry(); RectF pb = geo.getPhotoBounds(); if (w == pb.width() && h == pb.height()) { return; } RectF r = new RectF(0, 0, w, h); - getImagePreset().mGeoData.setPhotoBounds(r); - getImagePreset().mGeoData.setCropBounds(r); - + geo.setPhotoBounds(r); + geo.setCropBounds(r); + getImagePreset().setGeometry(geo); } public void updateImage() { diff --git a/src/com/android/gallery3d/filtershow/imageshow/MasterImage.java b/src/com/android/gallery3d/filtershow/imageshow/MasterImage.java index 4ea944b7b..839f638c1 100644 --- a/src/com/android/gallery3d/filtershow/imageshow/MasterImage.java +++ b/src/com/android/gallery3d/filtershow/imageshow/MasterImage.java @@ -151,7 +151,7 @@ public class MasterImage implements RenderingRequestCaller { mHistory.addHistoryItem(mPreset); } updatePresets(true); - GeometryMetadata geo = mPreset.mGeoData; + GeometryMetadata geo = mPreset.getGeometry(); if (!geo.equals(mPreviousGeometry)) { notifyGeometryChange(); } @@ -182,7 +182,7 @@ public class MasterImage implements RenderingRequestCaller { } 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; @@ -190,6 +190,7 @@ public class MasterImage implements RenderingRequestCaller { RectF r = new RectF(0, 0, w, h); geo.setPhotoBounds(r); geo.setCropBounds(r); + mPreset.setGeometry(geo); } public void onHistoryItemClick(int position) { @@ -242,7 +243,7 @@ public class MasterImage implements RenderingRequestCaller { } 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); @@ -349,7 +350,7 @@ public class MasterImage implements RenderingRequestCaller { } private Matrix getImageToScreenMatrix(boolean reflectRotation) { - GeometryMetadata geo = mPreset.mGeoData; + GeometryMetadata geo = mPreset.getGeometry(); if (geo == null || mLoader == null || mLoader.getOriginalBounds() == null || mImageShowSize.x == 0) { diff --git a/src/com/android/gallery3d/filtershow/presets/ImagePreset.java b/src/com/android/gallery3d/filtershow/presets/ImagePreset.java index 7b226099d..11502afda 100644 --- a/src/com/android/gallery3d/filtershow/presets/ImagePreset.java +++ b/src/com/android/gallery3d/filtershow/presets/ImagePreset.java @@ -63,19 +63,16 @@ public class ImagePreset { private boolean mDoApplyGeometry = true; private boolean mDoApplyFilters = true; - public final GeometryMetadata mGeoData = new GeometryMetadata(); private boolean mPartialRendering = false; private Rect mPartialRenderingBounds; private Bitmap mPreviewImage; public ImagePreset() { - setup(); } public ImagePreset(String historyName) { setHistoryName(historyName); - setup(); } public ImagePreset(ImagePreset source, String historyName) { @@ -88,7 +85,17 @@ public class ImagePreset { public ImagePreset(ImagePreset source) { try { for (int i = 0; i < source.mFilters.size(); i++) { - FilterRepresentation representation = source.mFilters.elementAt(i).clone(); + FilterRepresentation representation = null; + FilterRepresentation sourceRepresentation = source.mFilters.elementAt(i); + if (sourceRepresentation instanceof GeometryMetadata) { + GeometryMetadata geoData = new GeometryMetadata(); + GeometryMetadata srcGeo = (GeometryMetadata) sourceRepresentation; + geoData.set(srcGeo); + representation = geoData; + } else { + // TODO: get rid of clone()... + representation = sourceRepresentation.clone(); + } addFilter(representation); } } catch (java.lang.CloneNotSupportedException e) { @@ -99,8 +106,6 @@ public class ImagePreset { mIsFxPreset = source.isFx(); mImageLoader = source.getImageLoader(); mPreviewImage = source.getPreviewImage(); - - mGeoData.set(source.mGeoData); } public FilterRepresentation getFilterRepresentation(int position) { @@ -184,15 +189,24 @@ public class ImagePreset { } public synchronized GeometryMetadata getGeometry() { - return mGeoData; + for (FilterRepresentation representation : mFilters) { + if (representation instanceof GeometryMetadata) { + return (GeometryMetadata) representation; + } + } + GeometryMetadata geo = new GeometryMetadata(); + mFilters.add(0, geo); // Hard Requirement for now -- Geometry ought to be first. + return geo; } public boolean hasModifications() { - if (mGeoData.hasModifications()) { - return true; - } for (int i = 0; i < mFilters.size(); i++) { FilterRepresentation filter = mFilters.elementAt(i); + if (filter instanceof GeometryMetadata) { + if (((GeometryMetadata) filter).hasModifications()) { + return true; + } + } if (!filter.isNil() && !filter.getName().equalsIgnoreCase("none")) { return true; } @@ -201,10 +215,12 @@ public class ImagePreset { } public boolean isPanoramaSafe() { - if (mGeoData.hasModifications()) { - return false; - } for (FilterRepresentation representation : mFilters) { + if (representation instanceof GeometryMetadata) { + if (((GeometryMetadata) representation).hasModifications()) { + return false; + } + } if (representation.getFilterType() == FilterRepresentation.TYPE_BORDER && !representation.isNil()) { return false; @@ -221,8 +237,11 @@ public class ImagePreset { return true; } - public synchronized void setGeometry(GeometryMetadata m) { - mGeoData.set(m); + public synchronized void setGeometry(GeometryMetadata representation) { + GeometryMetadata geoData = getGeometry(); + if (geoData != representation) { + geoData.set(representation); + } MasterImage.getImage().notifyGeometryChange(); } @@ -284,7 +303,7 @@ public class ImagePreset { return false; } - if (mDoApplyGeometry && !mGeoData.equals(preset.mGeoData)) { + if (mDoApplyGeometry && !getGeometry().equals(preset.getGeometry())) { return false; } @@ -298,6 +317,10 @@ public class ImagePreset { for (int i = 0; i < preset.mFilters.size(); i++) { FilterRepresentation a = preset.mFilters.elementAt(i); FilterRepresentation b = mFilters.elementAt(i); + if (a instanceof GeometryMetadata) { + // Note: Geometry will always be at the same place + continue; + } if (!a.same(b)) { return false; } @@ -308,7 +331,7 @@ public class ImagePreset { } public int similarUpTo(ImagePreset preset) { - if (!mGeoData.equals(preset.mGeoData)) { + if (!getGeometry().equals(preset.getGeometry())) { return -1; } @@ -412,9 +435,6 @@ public class ImagePreset { } public FilterRepresentation getRepresentation(FilterRepresentation filterRepresentation) { - if (filterRepresentation instanceof GeometryMetadata) { - return mGeoData; - } for (int i = 0; i < mFilters.size(); i++) { FilterRepresentation representation = mFilters.elementAt(i); if (representation.getFilterClass() == filterRepresentation.getFilterClass()) { @@ -424,10 +444,6 @@ public class ImagePreset { return null; } - public void setup() { - // do nothing here - } - public Bitmap apply(Bitmap original, FilterEnvironment environment) { Bitmap bitmap = original; bitmap = applyFilters(bitmap, -1, -1, environment); @@ -438,8 +454,9 @@ public class ImagePreset { // Apply any transform -- 90 rotate, flip, straighten, crop // Returns a new bitmap. if (mDoApplyGeometry) { - mGeoData.synchronizeRepresentation(); - bitmap = environment.applyRepresentation(mGeoData, bitmap); + GeometryMetadata geoData = getGeometry(); + geoData.synchronizeRepresentation(); + bitmap = environment.applyRepresentation(geoData, bitmap); } return bitmap; } @@ -481,6 +498,10 @@ public class ImagePreset { representation = mFilters.elementAt(i); representation.synchronizeRepresentation(); } + if (representation instanceof GeometryMetadata) { + // skip the geometry as it's already applied. + continue; + } if (representation.getFilterType() == FilterRepresentation.TYPE_BORDER) { // for now, let's skip the border as it will be applied in applyBorder() // TODO: might be worth getting rid of applyBorder. @@ -532,6 +553,10 @@ public class ImagePreset { representation = mFilters.elementAt(i); representation.synchronizeRepresentation(); } + if (representation instanceof GeometryMetadata) { + // skip the geometry as it's already applied. + continue; + } if (representation.getFilterType() == FilterRepresentation.TYPE_BORDER) { // for now, let's skip the border as it will be applied in applyBorder() continue; @@ -545,9 +570,6 @@ public class ImagePreset { } public boolean canDoPartialRendering() { - if (mGeoData.hasModifications()) { - return false; - } if (ImageLoader.getZoomOrientation() != ImageLoader.ORI_NORMAL) { return false; } @@ -556,6 +578,10 @@ public class ImagePreset { synchronized (mFilters) { representation = mFilters.elementAt(i); } + if (representation instanceof GeometryMetadata + && ((GeometryMetadata) representation).hasModifications()) { + return false; + } if (!representation.supportsPartialRendering()) { return false; } @@ -568,13 +594,11 @@ public class ImagePreset { return; } Vector states = new Vector(); - // TODO: supports Geometry representations in the state panel. - if (false && mGeoData != null && mGeoData.hasModifications()) { - State geo = new State("Geometry"); - geo.setFilterRepresentation(mGeoData); - states.add(geo); - } for (FilterRepresentation filter : mFilters) { + if (filter instanceof GeometryMetadata) { + // TODO: supports Geometry representations in the state panel. + continue; + } State state = new State(filter.getName()); state.setFilterRepresentation(filter); states.add(state); @@ -631,10 +655,11 @@ public class ImagePreset { try { writer.beginObject(); writer.name(PRESET_NAME).value(name); - writer.name(mGeoData.getSerializationName()); + GeometryMetadata geoData = getGeometry(); + writer.name(geoData.getSerializationName()); writer.beginObject(); { - String[][] rep = mGeoData.serializeRepresentation(); + String[][] rep = geoData.serializeRepresentation(); for (int i = 0; i < rep.length; i++) { writer.name(rep[i][0]); writer.value(rep[i][1]); @@ -644,6 +669,9 @@ public class ImagePreset { for (int i = 0; i < numFilters; i++) { FilterRepresentation filter = mFilters.get(i); + if (filter instanceof GeometryMetadata) { + continue; + } String sname = filter.getSerializationName(); writer.name(sname); writer.beginObject(); @@ -685,22 +713,21 @@ public class ImagePreset { while (sreader.hasNext()) { String name = sreader.nextName(); - - if (mGeoData.getSerializationName().equals(name)) { - mGeoData.deSerializeRepresentation(read(sreader)); - } else { - FilterRepresentation filter = creatFilterFromName(name); - if (filter == null) - return false; - filter.deSerializeRepresentation(read(sreader)); - addFilter(filter); + FilterRepresentation filter = creatFilterFromName(name); + if (filter == null) { + return false; } + filter.deSerializeRepresentation(read(sreader)); + addFilter(filter); } sreader.endObject(); return true; } FilterRepresentation creatFilterFromName(String name) { + if (GeometryMetadata.SERIALIZATION_NAME.equalsIgnoreCase(name)) { + return new GeometryMetadata(); + } FiltersManager filtersManager = FiltersManager.getManager(); return filtersManager.createFilterFromName(name); } diff --git a/src/com/android/gallery3d/filtershow/ui/FilterIconButton.java b/src/com/android/gallery3d/filtershow/ui/FilterIconButton.java index 96126c55c..bc41e0e9c 100644 --- a/src/com/android/gallery3d/filtershow/ui/FilterIconButton.java +++ b/src/com/android/gallery3d/filtershow/ui/FilterIconButton.java @@ -182,11 +182,11 @@ public class FilterIconButton extends IconButton implements View.OnClickListener ImagePreset mPreset = new ImagePreset(); mPreset.addFilter(mFilterRepresentation); - GeometryMetadata geometry = mPreset.mGeoData; + GeometryMetadata geometry = mPreset.getGeometry(); RectF bound = new RectF(0, 0, dst.getWidth(), dst.getHeight()); geometry.setCropBounds(bound); geometry.setPhotoBounds(bound); - + mPreset.setGeometry(geometry); RenderingRequest.post(dst.copy(Bitmap.Config.ARGB_8888, true), mPreset, RenderingRequest.ICON_RENDERING, this); } -- cgit v1.2.3