1a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard/* 2a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard * Copyright (C) 2012 The Android Open Source Project 3a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard * 4a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard * Licensed under the Apache License, Version 2.0 (the "License"); 5a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard * you may not use this file except in compliance with the License. 6a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard * You may obtain a copy of the License at 7a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard * 8a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard * http://www.apache.org/licenses/LICENSE-2.0 9a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard * 10a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard * Unless required by applicable law or agreed to in writing, software 11a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard * distributed under the License is distributed on an "AS IS" BASIS, 12a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard * See the License for the specific language governing permissions and 14a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard * limitations under the License. 15a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard */ 160d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 17ce9ceff5776a9b0479c30cbeb2a9388b44df1865nicolasroardpackage com.android.gallery3d.filtershow.pipeline; 180d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 190d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.graphics.Bitmap; 20e5498da0262fc836738aad63ea30286d8afa643cnicolasroardimport android.graphics.Rect; 2193ef658bf44d7ecd79894a9a225a400c2741058fnicolasroardimport android.support.v8.renderscript.Allocation; 22afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hofordimport android.util.JsonReader; 23afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hofordimport android.util.JsonWriter; 240d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.util.Log; 250d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 26d2e9ea0ce1949e192e80ce806e702606694440acztenghuiimport com.android.gallery3d.R; 279f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroardimport com.android.gallery3d.filtershow.cache.BitmapCache; 28e9c55b28a4a155c2e1c1f5aec615a0c56e38ade4John Hofordimport com.android.gallery3d.filtershow.cache.ImageLoader; 29b75da4c91e16bbd83cd839207224c0645a6ecefdnicolasroardimport com.android.gallery3d.filtershow.filters.BaseFiltersManager; 3076a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunkimport com.android.gallery3d.filtershow.filters.FilterCropRepresentation; 31d2e9ea0ce1949e192e80ce806e702606694440acztenghuiimport com.android.gallery3d.filtershow.filters.FilterFxRepresentation; 32d2e9ea0ce1949e192e80ce806e702606694440acztenghuiimport com.android.gallery3d.filtershow.filters.FilterImageBorderRepresentation; 3376a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunkimport com.android.gallery3d.filtershow.filters.FilterMirrorRepresentation; 3471f04cbaedbb89e313e0b86b531640db2d3f6016nicolasroardimport com.android.gallery3d.filtershow.filters.FilterRepresentation; 3576a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunkimport com.android.gallery3d.filtershow.filters.FilterRotateRepresentation; 3676a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunkimport com.android.gallery3d.filtershow.filters.FilterStraightenRepresentation; 37fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroardimport com.android.gallery3d.filtershow.filters.FilterUserPresetRepresentation; 38d2e9ea0ce1949e192e80ce806e702606694440acztenghuiimport com.android.gallery3d.filtershow.filters.FiltersManager; 390d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport com.android.gallery3d.filtershow.filters.ImageFilter; 40b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunkimport com.android.gallery3d.filtershow.imageshow.GeometryMathUtils; 41cf0b2aad3bc5d80c51316ae10e1cf2c3476259aanicolasroardimport com.android.gallery3d.filtershow.imageshow.MasterImage; 42f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroardimport com.android.gallery3d.filtershow.state.State; 43fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroardimport com.android.gallery3d.filtershow.state.StateAdapter; 440d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 45afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hofordimport java.io.IOException; 46afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hofordimport java.io.StringReader; 47afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hofordimport java.io.StringWriter; 48b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunkimport java.util.ArrayList; 49b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunkimport java.util.Collection; 5092e2341248e99c691f38820503984bc5e2f18811nicolasroardimport java.util.Vector; 5192e2341248e99c691f38820503984bc5e2f18811nicolasroard 520d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardpublic class ImagePreset { 530d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 540d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard private static final String LOGTAG = "ImagePreset"; 558a0072e519157b976d7d1fd34ca2aa1c849a983bJohn Hoford public static final String JASON_SAVED = "Saved"; 5693dfe7a1df07a64701369b480578410efb740a27nicolasroard 5771f04cbaedbb89e313e0b86b531640db2d3f6016nicolasroard private Vector<FilterRepresentation> mFilters = new Vector<FilterRepresentation>(); 5871f04cbaedbb89e313e0b86b531640db2d3f6016nicolasroard 59e8c2b314d8f3c5d79227fae97a0ec1ca68a1e611Nicolas Roard private boolean mDoApplyGeometry = true; 60e8c2b314d8f3c5d79227fae97a0ec1ca68a1e611Nicolas Roard private boolean mDoApplyFilters = true; 61e8c2b314d8f3c5d79227fae97a0ec1ca68a1e611Nicolas Roard 62e5498da0262fc836738aad63ea30286d8afa643cnicolasroard private boolean mPartialRendering = false; 63e5498da0262fc836738aad63ea30286d8afa643cnicolasroard private Rect mPartialRenderingBounds; 6424d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard private static final boolean DEBUG = false; 658537d097f8827caedc8c39564de54d36eae8b16fRuben Brunk 660d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard public ImagePreset() { 670d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 680d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 690d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard public ImagePreset(ImagePreset source) { 703f0034140c165b86fbaf5c0369f39431548308e9John Hoford for (int i = 0; i < source.mFilters.size(); i++) { 713f0034140c165b86fbaf5c0369f39431548308e9John Hoford FilterRepresentation sourceRepresentation = source.mFilters.elementAt(i); 72b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk mFilters.add(sourceRepresentation.copy()); 730d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 740d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 750d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 768e33c2b402983070eb0cc9ace16ecfa4b9728447nicolasroard public Vector<FilterRepresentation> getFilters() { 778e33c2b402983070eb0cc9ace16ecfa4b9728447nicolasroard return mFilters; 788e33c2b402983070eb0cc9ace16ecfa4b9728447nicolasroard } 798e33c2b402983070eb0cc9ace16ecfa4b9728447nicolasroard 80cf0b2aad3bc5d80c51316ae10e1cf2c3476259aanicolasroard public FilterRepresentation getFilterRepresentation(int position) { 81cf0b2aad3bc5d80c51316ae10e1cf2c3476259aanicolasroard FilterRepresentation representation = null; 823f0034140c165b86fbaf5c0369f39431548308e9John Hoford 833f0034140c165b86fbaf5c0369f39431548308e9John Hoford representation = mFilters.elementAt(position).copy(); 843f0034140c165b86fbaf5c0369f39431548308e9John Hoford 85cf0b2aad3bc5d80c51316ae10e1cf2c3476259aanicolasroard return representation; 86cf0b2aad3bc5d80c51316ae10e1cf2c3476259aanicolasroard } 87cf0b2aad3bc5d80c51316ae10e1cf2c3476259aanicolasroard 88b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk private static boolean sameSerializationName(String a, String b) { 89b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk if (a != null && b != null) { 90b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk return a.equals(b); 91b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk } else { 92b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk return a == null && b == null; 93b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk } 94b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk } 95b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk 96b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk public static boolean sameSerializationName(FilterRepresentation a, FilterRepresentation b) { 97b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk if (a == null || b == null) { 98b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk return false; 99b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk } 100b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk return sameSerializationName(a.getSerializationName(), b.getSerializationName()); 101b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk } 102b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk 103cf0b2aad3bc5d80c51316ae10e1cf2c3476259aanicolasroard public int getPositionForRepresentation(FilterRepresentation representation) { 104cf0b2aad3bc5d80c51316ae10e1cf2c3476259aanicolasroard for (int i = 0; i < mFilters.size(); i++) { 105b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk if (sameSerializationName(mFilters.elementAt(i), representation)) { 106cf0b2aad3bc5d80c51316ae10e1cf2c3476259aanicolasroard return i; 107cf0b2aad3bc5d80c51316ae10e1cf2c3476259aanicolasroard } 108cf0b2aad3bc5d80c51316ae10e1cf2c3476259aanicolasroard } 109cf0b2aad3bc5d80c51316ae10e1cf2c3476259aanicolasroard return -1; 110cf0b2aad3bc5d80c51316ae10e1cf2c3476259aanicolasroard } 111cf0b2aad3bc5d80c51316ae10e1cf2c3476259aanicolasroard 112bb92950836df40142f34834259af476d01bfc751nicolasroard private FilterRepresentation getFilterRepresentationForType(int type) { 113bb92950836df40142f34834259af476d01bfc751nicolasroard for (int i = 0; i < mFilters.size(); i++) { 114bb92950836df40142f34834259af476d01bfc751nicolasroard if (mFilters.elementAt(i).getFilterType() == type) { 115bb92950836df40142f34834259af476d01bfc751nicolasroard return mFilters.elementAt(i); 116bb92950836df40142f34834259af476d01bfc751nicolasroard } 117bb92950836df40142f34834259af476d01bfc751nicolasroard } 118bb92950836df40142f34834259af476d01bfc751nicolasroard return null; 119bb92950836df40142f34834259af476d01bfc751nicolasroard } 120bb92950836df40142f34834259af476d01bfc751nicolasroard 121acc00f8fed8960b079448db8f05c3fbac8642ca4nicolasroard public int getPositionForType(int type) { 122acc00f8fed8960b079448db8f05c3fbac8642ca4nicolasroard for (int i = 0; i < mFilters.size(); i++) { 123acc00f8fed8960b079448db8f05c3fbac8642ca4nicolasroard if (mFilters.elementAt(i).getFilterType() == type) { 124acc00f8fed8960b079448db8f05c3fbac8642ca4nicolasroard return i; 125acc00f8fed8960b079448db8f05c3fbac8642ca4nicolasroard } 126acc00f8fed8960b079448db8f05c3fbac8642ca4nicolasroard } 127acc00f8fed8960b079448db8f05c3fbac8642ca4nicolasroard return -1; 128acc00f8fed8960b079448db8f05c3fbac8642ca4nicolasroard } 129acc00f8fed8960b079448db8f05c3fbac8642ca4nicolasroard 130b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk public FilterRepresentation getFilterRepresentationCopyFrom( 131b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk FilterRepresentation filterRepresentation) { 132cf0b2aad3bc5d80c51316ae10e1cf2c3476259aanicolasroard // TODO: add concept of position in the filters (to allow multiple instances) 133cf0b2aad3bc5d80c51316ae10e1cf2c3476259aanicolasroard if (filterRepresentation == null) { 134cf0b2aad3bc5d80c51316ae10e1cf2c3476259aanicolasroard return null; 135cf0b2aad3bc5d80c51316ae10e1cf2c3476259aanicolasroard } 136bb92950836df40142f34834259af476d01bfc751nicolasroard int position = getPositionForRepresentation(filterRepresentation); 137bb92950836df40142f34834259af476d01bfc751nicolasroard if (position == -1) { 138bb92950836df40142f34834259af476d01bfc751nicolasroard return null; 139d88683e307eb058e71c083bb795bd31945ed1292Ruben Brunk } 140bb92950836df40142f34834259af476d01bfc751nicolasroard FilterRepresentation representation = mFilters.elementAt(position); 141d88683e307eb058e71c083bb795bd31945ed1292Ruben Brunk if (representation != null) { 1423f0034140c165b86fbaf5c0369f39431548308e9John Hoford representation = representation.copy(); 143cf0b2aad3bc5d80c51316ae10e1cf2c3476259aanicolasroard } 144cf0b2aad3bc5d80c51316ae10e1cf2c3476259aanicolasroard return representation; 145cf0b2aad3bc5d80c51316ae10e1cf2c3476259aanicolasroard } 146cf0b2aad3bc5d80c51316ae10e1cf2c3476259aanicolasroard 147b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk public void updateFilterRepresentations(Collection<FilterRepresentation> reps) { 148b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk for (FilterRepresentation r : reps) { 149b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk updateOrAddFilterRepresentation(r); 1503a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard } 151b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk } 152b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk 153b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk public void updateOrAddFilterRepresentation(FilterRepresentation rep) { 154b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk int pos = getPositionForRepresentation(rep); 155b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk if (pos != -1) { 156b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk mFilters.elementAt(pos).useParametersFrom(rep); 1577f7755f76210a500e6ce63bfa880f23303556294nicolasroard } else { 158b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk addFilter(rep.copy()); 159cf0b2aad3bc5d80c51316ae10e1cf2c3476259aanicolasroard } 160cf0b2aad3bc5d80c51316ae10e1cf2c3476259aanicolasroard } 161cf0b2aad3bc5d80c51316ae10e1cf2c3476259aanicolasroard 162e8c2b314d8f3c5d79227fae97a0ec1ca68a1e611Nicolas Roard public void setDoApplyGeometry(boolean value) { 163e8c2b314d8f3c5d79227fae97a0ec1ca68a1e611Nicolas Roard mDoApplyGeometry = value; 164e8c2b314d8f3c5d79227fae97a0ec1ca68a1e611Nicolas Roard } 165e8c2b314d8f3c5d79227fae97a0ec1ca68a1e611Nicolas Roard 166e8c2b314d8f3c5d79227fae97a0ec1ca68a1e611Nicolas Roard public void setDoApplyFilters(boolean value) { 167e8c2b314d8f3c5d79227fae97a0ec1ca68a1e611Nicolas Roard mDoApplyFilters = value; 168e8c2b314d8f3c5d79227fae97a0ec1ca68a1e611Nicolas Roard } 169e8c2b314d8f3c5d79227fae97a0ec1ca68a1e611Nicolas Roard 170e8c2b314d8f3c5d79227fae97a0ec1ca68a1e611Nicolas Roard public boolean getDoApplyFilters() { 171e8c2b314d8f3c5d79227fae97a0ec1ca68a1e611Nicolas Roard return mDoApplyFilters; 172e8c2b314d8f3c5d79227fae97a0ec1ca68a1e611Nicolas Roard } 173e8c2b314d8f3c5d79227fae97a0ec1ca68a1e611Nicolas Roard 174545eca119e7b2dc783f8d89a0de4330b5444ed79ztenghui public boolean hasModifications() { 175545eca119e7b2dc783f8d89a0de4330b5444ed79ztenghui for (int i = 0; i < mFilters.size(); i++) { 176545eca119e7b2dc783f8d89a0de4330b5444ed79ztenghui FilterRepresentation filter = mFilters.elementAt(i); 177b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk if (!filter.isNil()) { 178545eca119e7b2dc783f8d89a0de4330b5444ed79ztenghui return true; 179545eca119e7b2dc783f8d89a0de4330b5444ed79ztenghui } 180545eca119e7b2dc783f8d89a0de4330b5444ed79ztenghui } 181545eca119e7b2dc783f8d89a0de4330b5444ed79ztenghui return false; 182545eca119e7b2dc783f8d89a0de4330b5444ed79ztenghui } 183545eca119e7b2dc783f8d89a0de4330b5444ed79ztenghui 184863b61f2ddd387473f588e2a9184eabb5a930096John Hoford public boolean contains(byte type) { 185863b61f2ddd387473f588e2a9184eabb5a930096John Hoford for (FilterRepresentation representation : mFilters) { 186863b61f2ddd387473f588e2a9184eabb5a930096John Hoford if (representation.getFilterType() == type 187863b61f2ddd387473f588e2a9184eabb5a930096John Hoford && !representation.isNil()) { 188863b61f2ddd387473f588e2a9184eabb5a930096John Hoford return true; 189863b61f2ddd387473f588e2a9184eabb5a930096John Hoford } 190863b61f2ddd387473f588e2a9184eabb5a930096John Hoford } 191863b61f2ddd387473f588e2a9184eabb5a930096John Hoford return false; 192863b61f2ddd387473f588e2a9184eabb5a930096John Hoford } 193863b61f2ddd387473f588e2a9184eabb5a930096John Hoford 194014a111f10a7523415ca210bc6fe1e4f00183d31John Reck public boolean isPanoramaSafe() { 19571f04cbaedbb89e313e0b86b531640db2d3f6016nicolasroard for (FilterRepresentation representation : mFilters) { 196b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk if (representation.getFilterType() == FilterRepresentation.TYPE_GEOMETRY 197b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk && !representation.isNil()) { 198b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk return false; 199e5f4b784ddfaf359fe460998d0edc25755df8bdcnicolasroard } 200bb92950836df40142f34834259af476d01bfc751nicolasroard if (representation.getFilterType() == FilterRepresentation.TYPE_BORDER 201bb92950836df40142f34834259af476d01bfc751nicolasroard && !representation.isNil()) { 202bb92950836df40142f34834259af476d01bfc751nicolasroard return false; 203bb92950836df40142f34834259af476d01bfc751nicolasroard } 2043cb106ddd7ad0f8494ac9c7a33660831c1694295Ruben Brunk if (representation.getFilterType() == FilterRepresentation.TYPE_VIGNETTE 205afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford && !representation.isNil()) { 206014a111f10a7523415ca210bc6fe1e4f00183d31John Reck return false; 207014a111f10a7523415ca210bc6fe1e4f00183d31John Reck } 2083cb106ddd7ad0f8494ac9c7a33660831c1694295Ruben Brunk if (representation.getFilterType() == FilterRepresentation.TYPE_TINYPLANET 209afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford && !representation.isNil()) { 21017540e58b8454e820a6273365cee94742d9b9900John Hoford return false; 21117540e58b8454e820a6273365cee94742d9b9900John Hoford } 212014a111f10a7523415ca210bc6fe1e4f00183d31John Reck } 213014a111f10a7523415ca210bc6fe1e4f00183d31John Reck return true; 214014a111f10a7523415ca210bc6fe1e4f00183d31John Reck } 215014a111f10a7523415ca210bc6fe1e4f00183d31John Reck 2160d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard public boolean same(ImagePreset preset) { 21757eedfd99676913f575b1f76e3a874026d1ddf7cnicolasroard if (preset == null) { 21857eedfd99676913f575b1f76e3a874026d1ddf7cnicolasroard return false; 21957eedfd99676913f575b1f76e3a874026d1ddf7cnicolasroard } 22057eedfd99676913f575b1f76e3a874026d1ddf7cnicolasroard 2210d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard if (preset.mFilters.size() != mFilters.size()) { 2220d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard return false; 2230d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 22457eedfd99676913f575b1f76e3a874026d1ddf7cnicolasroard 225e8c2b314d8f3c5d79227fae97a0ec1ca68a1e611Nicolas Roard if (mDoApplyGeometry != preset.mDoApplyGeometry) { 226fb90fd60f155f6fef0334a0739be55a2717c17f5nicolasroard return false; 227fb90fd60f155f6fef0334a0739be55a2717c17f5nicolasroard } 228fb90fd60f155f6fef0334a0739be55a2717c17f5nicolasroard 229e8c2b314d8f3c5d79227fae97a0ec1ca68a1e611Nicolas Roard if (mDoApplyFilters != preset.mDoApplyFilters) { 230e8c2b314d8f3c5d79227fae97a0ec1ca68a1e611Nicolas Roard if (mFilters.size() > 0 || preset.mFilters.size() > 0) { 2310d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard return false; 2320d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 2330d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 234fb90fd60f155f6fef0334a0739be55a2717c17f5nicolasroard 235e8c2b314d8f3c5d79227fae97a0ec1ca68a1e611Nicolas Roard if (mDoApplyFilters && preset.mDoApplyFilters) { 236e8c2b314d8f3c5d79227fae97a0ec1ca68a1e611Nicolas Roard for (int i = 0; i < preset.mFilters.size(); i++) { 237e8c2b314d8f3c5d79227fae97a0ec1ca68a1e611Nicolas Roard FilterRepresentation a = preset.mFilters.elementAt(i); 238e8c2b314d8f3c5d79227fae97a0ec1ca68a1e611Nicolas Roard FilterRepresentation b = mFilters.elementAt(i); 239b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk 240e8c2b314d8f3c5d79227fae97a0ec1ca68a1e611Nicolas Roard if (!a.same(b)) { 241e8c2b314d8f3c5d79227fae97a0ec1ca68a1e611Nicolas Roard return false; 242e8c2b314d8f3c5d79227fae97a0ec1ca68a1e611Nicolas Roard } 243e8c2b314d8f3c5d79227fae97a0ec1ca68a1e611Nicolas Roard } 244e8c2b314d8f3c5d79227fae97a0ec1ca68a1e611Nicolas Roard } 245e8c2b314d8f3c5d79227fae97a0ec1ca68a1e611Nicolas Roard 24671f04cbaedbb89e313e0b86b531640db2d3f6016nicolasroard return true; 24757eedfd99676913f575b1f76e3a874026d1ddf7cnicolasroard } 24857eedfd99676913f575b1f76e3a874026d1ddf7cnicolasroard 2499f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard public boolean equals(ImagePreset preset) { 2509f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard if (preset == null) { 2519f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard return false; 2529f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard } 2539f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard 2549f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard if (preset.mFilters.size() != mFilters.size()) { 2559f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard return false; 2569f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard } 2579f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard 2589f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard if (mDoApplyGeometry != preset.mDoApplyGeometry) { 2599f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard return false; 2609f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard } 2619f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard 2629f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard if (mDoApplyFilters != preset.mDoApplyFilters) { 2639f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard if (mFilters.size() > 0 || preset.mFilters.size() > 0) { 2649f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard return false; 2659f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard } 2669f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard } 2679f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard 2689f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard for (int i = 0; i < preset.mFilters.size(); i++) { 2699f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard FilterRepresentation a = preset.mFilters.elementAt(i); 2709f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard FilterRepresentation b = mFilters.elementAt(i); 2717fa373b0c3143c2c55a0d72487607d5a05c72e1dnicolasroard boolean isGeometry = false; 2727fa373b0c3143c2c55a0d72487607d5a05c72e1dnicolasroard if (a instanceof FilterRotateRepresentation 2737fa373b0c3143c2c55a0d72487607d5a05c72e1dnicolasroard || a instanceof FilterMirrorRepresentation 2747fa373b0c3143c2c55a0d72487607d5a05c72e1dnicolasroard || a instanceof FilterCropRepresentation 2757fa373b0c3143c2c55a0d72487607d5a05c72e1dnicolasroard || a instanceof FilterStraightenRepresentation) { 2767fa373b0c3143c2c55a0d72487607d5a05c72e1dnicolasroard isGeometry = true; 2777fa373b0c3143c2c55a0d72487607d5a05c72e1dnicolasroard } 2787fa373b0c3143c2c55a0d72487607d5a05c72e1dnicolasroard boolean evaluate = true; 2797fa373b0c3143c2c55a0d72487607d5a05c72e1dnicolasroard if (!isGeometry && mDoApplyGeometry && !mDoApplyFilters) { 2807fa373b0c3143c2c55a0d72487607d5a05c72e1dnicolasroard evaluate = false; 2817fa373b0c3143c2c55a0d72487607d5a05c72e1dnicolasroard } else if (isGeometry && !mDoApplyGeometry && mDoApplyFilters) { 2827fa373b0c3143c2c55a0d72487607d5a05c72e1dnicolasroard evaluate = false; 2837fa373b0c3143c2c55a0d72487607d5a05c72e1dnicolasroard } 2847fa373b0c3143c2c55a0d72487607d5a05c72e1dnicolasroard if (evaluate && !a.equals(b)) { 2859f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard return false; 2869f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard } 2879f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard } 2889f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard 2899f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard return true; 2909f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard } 2919f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard 29257eedfd99676913f575b1f76e3a874026d1ddf7cnicolasroard public int similarUpTo(ImagePreset preset) { 29357eedfd99676913f575b1f76e3a874026d1ddf7cnicolasroard for (int i = 0; i < preset.mFilters.size(); i++) { 29471f04cbaedbb89e313e0b86b531640db2d3f6016nicolasroard FilterRepresentation a = preset.mFilters.elementAt(i); 29557eedfd99676913f575b1f76e3a874026d1ddf7cnicolasroard if (i < mFilters.size()) { 29671f04cbaedbb89e313e0b86b531640db2d3f6016nicolasroard FilterRepresentation b = mFilters.elementAt(i); 29757eedfd99676913f575b1f76e3a874026d1ddf7cnicolasroard if (!a.same(b)) { 29857eedfd99676913f575b1f76e3a874026d1ddf7cnicolasroard return i; 29957eedfd99676913f575b1f76e3a874026d1ddf7cnicolasroard } 30071f04cbaedbb89e313e0b86b531640db2d3f6016nicolasroard if (!a.equals(b)) { 30157eedfd99676913f575b1f76e3a874026d1ddf7cnicolasroard return i; 30257eedfd99676913f575b1f76e3a874026d1ddf7cnicolasroard } 30357eedfd99676913f575b1f76e3a874026d1ddf7cnicolasroard } else { 30457eedfd99676913f575b1f76e3a874026d1ddf7cnicolasroard return i; 30557eedfd99676913f575b1f76e3a874026d1ddf7cnicolasroard } 30657eedfd99676913f575b1f76e3a874026d1ddf7cnicolasroard } 30757eedfd99676913f575b1f76e3a874026d1ddf7cnicolasroard return preset.mFilters.size(); 30857eedfd99676913f575b1f76e3a874026d1ddf7cnicolasroard } 30957eedfd99676913f575b1f76e3a874026d1ddf7cnicolasroard 31071f04cbaedbb89e313e0b86b531640db2d3f6016nicolasroard public void showFilters() { 31171f04cbaedbb89e313e0b86b531640db2d3f6016nicolasroard Log.v(LOGTAG, "\\\\\\ showFilters -- " + mFilters.size() + " filters"); 31271f04cbaedbb89e313e0b86b531640db2d3f6016nicolasroard int n = 0; 31371f04cbaedbb89e313e0b86b531640db2d3f6016nicolasroard for (FilterRepresentation representation : mFilters) { 31471f04cbaedbb89e313e0b86b531640db2d3f6016nicolasroard Log.v(LOGTAG, " filter " + n + " : " + representation.toString()); 31571f04cbaedbb89e313e0b86b531640db2d3f6016nicolasroard n++; 31671f04cbaedbb89e313e0b86b531640db2d3f6016nicolasroard } 31771f04cbaedbb89e313e0b86b531640db2d3f6016nicolasroard Log.v(LOGTAG, "/// showFilters -- " + mFilters.size() + " filters"); 31871f04cbaedbb89e313e0b86b531640db2d3f6016nicolasroard } 319fafb2edbb9928039b887f59685d82593bd79e06aJohn Hoford 3203a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard public FilterRepresentation getLastRepresentation() { 3213a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard if (mFilters.size() > 0) { 3223a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard return mFilters.lastElement(); 3233a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard } 3243a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard return null; 3253a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard } 3263a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard 3273a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard public void removeFilter(FilterRepresentation filterRepresentation) { 3283cb106ddd7ad0f8494ac9c7a33660831c1694295Ruben Brunk if (filterRepresentation.getFilterType() == FilterRepresentation.TYPE_BORDER) { 329b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk for (int i = 0; i < mFilters.size(); i++) { 330bb92950836df40142f34834259af476d01bfc751nicolasroard if (mFilters.elementAt(i).getFilterType() 331b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk == filterRepresentation.getFilterType()) { 332bb92950836df40142f34834259af476d01bfc751nicolasroard mFilters.remove(i); 333bb92950836df40142f34834259af476d01bfc751nicolasroard break; 334bb92950836df40142f34834259af476d01bfc751nicolasroard } 335bb92950836df40142f34834259af476d01bfc751nicolasroard } 336bb92950836df40142f34834259af476d01bfc751nicolasroard } else { 337bb92950836df40142f34834259af476d01bfc751nicolasroard for (int i = 0; i < mFilters.size(); i++) { 338b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk if (sameSerializationName(mFilters.elementAt(i), filterRepresentation)) { 339bb92950836df40142f34834259af476d01bfc751nicolasroard mFilters.remove(i); 340bb92950836df40142f34834259af476d01bfc751nicolasroard break; 341bb92950836df40142f34834259af476d01bfc751nicolasroard } 3423a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard } 3433a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard } 3443a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard } 3453a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard 346b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk // If the filter is an "None" effect or border, then just don't add this filter. 34771f04cbaedbb89e313e0b86b531640db2d3f6016nicolasroard public void addFilter(FilterRepresentation representation) { 348fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard if (representation instanceof FilterUserPresetRepresentation) { 349fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard ImagePreset preset = ((FilterUserPresetRepresentation) representation).getImagePreset(); 3506aea6b7f4014968fc414554c1530b16437364c80nicolasroard if (preset.nbFilters() == 1 3516aea6b7f4014968fc414554c1530b16437364c80nicolasroard && preset.contains(FilterRepresentation.TYPE_FX)) { 3526aea6b7f4014968fc414554c1530b16437364c80nicolasroard FilterRepresentation rep = preset.getFilterRepresentationForType( 3536aea6b7f4014968fc414554c1530b16437364c80nicolasroard FilterRepresentation.TYPE_FX); 3543bc6e6f3b5ac0bb989c5e2f1580bdb40ead5dc25nicolasroard addFilter(rep); 3556aea6b7f4014968fc414554c1530b16437364c80nicolasroard } else { 3566aea6b7f4014968fc414554c1530b16437364c80nicolasroard // user preset replaces everything 3576aea6b7f4014968fc414554c1530b16437364c80nicolasroard mFilters.clear(); 3586aea6b7f4014968fc414554c1530b16437364c80nicolasroard for (int i = 0; i < preset.nbFilters(); i++) { 3596aea6b7f4014968fc414554c1530b16437364c80nicolasroard addFilter(preset.getFilterRepresentation(i)); 3606aea6b7f4014968fc414554c1530b16437364c80nicolasroard } 361fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard } 362b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk } else if (representation.getFilterType() == FilterRepresentation.TYPE_GEOMETRY) { 363b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk // Add geometry filter, removing duplicates and do-nothing operations. 364b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk for (int i = 0; i < mFilters.size(); i++) { 365b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk if (sameSerializationName(representation, mFilters.elementAt(i))) { 366b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk mFilters.remove(i); 367b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk } 368b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk } 369430e46b06f8e7ee1ca3e7ecdcef3e0a978637c03nicolasroard int index = 0; 370430e46b06f8e7ee1ca3e7ecdcef3e0a978637c03nicolasroard for (; index < mFilters.size(); index++) { 371430e46b06f8e7ee1ca3e7ecdcef3e0a978637c03nicolasroard FilterRepresentation rep = mFilters.elementAt(index); 372430e46b06f8e7ee1ca3e7ecdcef3e0a978637c03nicolasroard if (rep.getFilterType() != FilterRepresentation.TYPE_GEOMETRY) { 373430e46b06f8e7ee1ca3e7ecdcef3e0a978637c03nicolasroard break; 374430e46b06f8e7ee1ca3e7ecdcef3e0a978637c03nicolasroard } 375430e46b06f8e7ee1ca3e7ecdcef3e0a978637c03nicolasroard } 376b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk if (!representation.isNil()) { 377430e46b06f8e7ee1ca3e7ecdcef3e0a978637c03nicolasroard mFilters.insertElementAt(representation, index); 378b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk } 379b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk } else if (representation.getFilterType() == FilterRepresentation.TYPE_BORDER) { 380bb92950836df40142f34834259af476d01bfc751nicolasroard removeFilter(representation); 381d2e9ea0ce1949e192e80ce806e702606694440acztenghui if (!isNoneBorderFilter(representation)) { 382d2e9ea0ce1949e192e80ce806e702606694440acztenghui mFilters.add(representation); 383d2e9ea0ce1949e192e80ce806e702606694440acztenghui } 3843cb106ddd7ad0f8494ac9c7a33660831c1694295Ruben Brunk } else if (representation.getFilterType() == FilterRepresentation.TYPE_FX) { 3853bc6e6f3b5ac0bb989c5e2f1580bdb40ead5dc25nicolasroard boolean replaced = false; 386a19830b4fd9050b48386cd904d99cfd2566cc515John Hoford for (int i = 0; i < mFilters.size(); i++) { 387fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard FilterRepresentation current = mFilters.elementAt(i); 3883bc6e6f3b5ac0bb989c5e2f1580bdb40ead5dc25nicolasroard if (current.getFilterType() == FilterRepresentation.TYPE_FX) { 3893bc6e6f3b5ac0bb989c5e2f1580bdb40ead5dc25nicolasroard mFilters.remove(i); 3903bc6e6f3b5ac0bb989c5e2f1580bdb40ead5dc25nicolasroard replaced = true; 3914c107f27eee1c6778c32b3f01f3c628cbcaf0b26John Hoford if (!isNoneFxFilter(representation)) { 3923bc6e6f3b5ac0bb989c5e2f1580bdb40ead5dc25nicolasroard mFilters.add(i, representation); 393d2e9ea0ce1949e192e80ce806e702606694440acztenghui } 3943bc6e6f3b5ac0bb989c5e2f1580bdb40ead5dc25nicolasroard break; 395a19830b4fd9050b48386cd904d99cfd2566cc515John Hoford } 396a19830b4fd9050b48386cd904d99cfd2566cc515John Hoford } 3975a1d760b60040a8a47d876a9accd27f0bc7be455nicolasroard if (!replaced && !isNoneFxFilter(representation)) { 3983bc6e6f3b5ac0bb989c5e2f1580bdb40ead5dc25nicolasroard mFilters.add(0, representation); 399fafb2edbb9928039b887f59685d82593bd79e06aJohn Hoford } 400a19830b4fd9050b48386cd904d99cfd2566cc515John Hoford } else { 40171f04cbaedbb89e313e0b86b531640db2d3f6016nicolasroard mFilters.add(representation); 402a19830b4fd9050b48386cd904d99cfd2566cc515John Hoford } 4036aea6b7f4014968fc414554c1530b16437364c80nicolasroard // Enforces Filter type ordering for borders 4046aea6b7f4014968fc414554c1530b16437364c80nicolasroard FilterRepresentation border = null; 4056aea6b7f4014968fc414554c1530b16437364c80nicolasroard for (int i = 0; i < mFilters.size();) { 4066aea6b7f4014968fc414554c1530b16437364c80nicolasroard FilterRepresentation rep = mFilters.elementAt(i); 4076aea6b7f4014968fc414554c1530b16437364c80nicolasroard if (rep.getFilterType() == FilterRepresentation.TYPE_BORDER) { 4086aea6b7f4014968fc414554c1530b16437364c80nicolasroard border = rep; 4096aea6b7f4014968fc414554c1530b16437364c80nicolasroard mFilters.remove(i); 4106aea6b7f4014968fc414554c1530b16437364c80nicolasroard continue; 4116aea6b7f4014968fc414554c1530b16437364c80nicolasroard } 4126aea6b7f4014968fc414554c1530b16437364c80nicolasroard i++; 4136aea6b7f4014968fc414554c1530b16437364c80nicolasroard } 4146aea6b7f4014968fc414554c1530b16437364c80nicolasroard if (border != null) { 4156aea6b7f4014968fc414554c1530b16437364c80nicolasroard mFilters.add(border); 4166aea6b7f4014968fc414554c1530b16437364c80nicolasroard } 4170d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 4180d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 419d2e9ea0ce1949e192e80ce806e702606694440acztenghui private boolean isNoneBorderFilter(FilterRepresentation representation) { 420d2e9ea0ce1949e192e80ce806e702606694440acztenghui return representation instanceof FilterImageBorderRepresentation && 421d2e9ea0ce1949e192e80ce806e702606694440acztenghui ((FilterImageBorderRepresentation) representation).getDrawableResource() == 0; 422d2e9ea0ce1949e192e80ce806e702606694440acztenghui } 423d2e9ea0ce1949e192e80ce806e702606694440acztenghui 424d2e9ea0ce1949e192e80ce806e702606694440acztenghui private boolean isNoneFxFilter(FilterRepresentation representation) { 425d2e9ea0ce1949e192e80ce806e702606694440acztenghui return representation instanceof FilterFxRepresentation && 426b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk ((FilterFxRepresentation) representation).getNameResource() == R.string.none; 427d2e9ea0ce1949e192e80ce806e702606694440acztenghui } 428d2e9ea0ce1949e192e80ce806e702606694440acztenghui 42971f04cbaedbb89e313e0b86b531640db2d3f6016nicolasroard public FilterRepresentation getRepresentation(FilterRepresentation filterRepresentation) { 4300d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard for (int i = 0; i < mFilters.size(); i++) { 43171f04cbaedbb89e313e0b86b531640db2d3f6016nicolasroard FilterRepresentation representation = mFilters.elementAt(i); 432b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk if (sameSerializationName(representation, filterRepresentation)) { 43371f04cbaedbb89e313e0b86b531640db2d3f6016nicolasroard return representation; 4340d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 4350d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 4360d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard return null; 4370d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 4380d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 439b75da4c91e16bbd83cd839207224c0645a6ecefdnicolasroard public Bitmap apply(Bitmap original, FilterEnvironment environment) { 44031529940021b9a18611b1a3fb4a0317ab8c89618nicolasroard Bitmap bitmap = original; 441b75da4c91e16bbd83cd839207224c0645a6ecefdnicolasroard bitmap = applyFilters(bitmap, -1, -1, environment); 442b75da4c91e16bbd83cd839207224c0645a6ecefdnicolasroard return applyBorder(bitmap, environment); 44357eedfd99676913f575b1f76e3a874026d1ddf7cnicolasroard } 44457eedfd99676913f575b1f76e3a874026d1ddf7cnicolasroard 445b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk public Collection<FilterRepresentation> getGeometryFilters() { 446b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk ArrayList<FilterRepresentation> geometry = new ArrayList<FilterRepresentation>(); 447b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk for (FilterRepresentation r : mFilters) { 448b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk if (r.getFilterType() == FilterRepresentation.TYPE_GEOMETRY) { 449b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk geometry.add(r); 450b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk } 451b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk } 452b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk return geometry; 453b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk } 454b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk 455b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk public FilterRepresentation getFilterWithSerializationName(String serializationName) { 456b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk for (FilterRepresentation r : mFilters) { 457b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk if (r != null) { 458b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk if (sameSerializationName(r.getSerializationName(), serializationName)) { 459b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk return r.copy(); 460b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk } 461b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk } 462b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk } 463b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk return null; 464b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk } 465b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk 46655d6abe58c3a7574a5d76c68ec5c21848848e399nicolasroard public Rect finalGeometryRect(int width, int height) { 46755d6abe58c3a7574a5d76c68ec5c21848848e399nicolasroard return GeometryMathUtils.finalGeometryRect(width, height, getGeometryFilters()); 46855d6abe58c3a7574a5d76c68ec5c21848848e399nicolasroard } 46955d6abe58c3a7574a5d76c68ec5c21848848e399nicolasroard 470b75da4c91e16bbd83cd839207224c0645a6ecefdnicolasroard public Bitmap applyGeometry(Bitmap bitmap, FilterEnvironment environment) { 47157eedfd99676913f575b1f76e3a874026d1ddf7cnicolasroard // Apply any transform -- 90 rotate, flip, straighten, crop 47257eedfd99676913f575b1f76e3a874026d1ddf7cnicolasroard // Returns a new bitmap. 473e8c2b314d8f3c5d79227fae97a0ec1ca68a1e611Nicolas Roard if (mDoApplyGeometry) { 474ec1e009a7faea0478e361bc2d48d856ab48a0209nicolasroard Bitmap bmp = GeometryMathUtils.applyGeometryRepresentations( 475ec1e009a7faea0478e361bc2d48d856ab48a0209nicolasroard getGeometryFilters(), bitmap); 476ec1e009a7faea0478e361bc2d48d856ab48a0209nicolasroard if (bmp != bitmap) { 477ec1e009a7faea0478e361bc2d48d856ab48a0209nicolasroard environment.cache(bitmap); 478ec1e009a7faea0478e361bc2d48d856ab48a0209nicolasroard } 479ec1e009a7faea0478e361bc2d48d856ab48a0209nicolasroard return bmp; 480e8c2b314d8f3c5d79227fae97a0ec1ca68a1e611Nicolas Roard } 481d61a2f9fcaad0309132b6b9b666c3dc6df62fed7John Hoford return bitmap; 48257eedfd99676913f575b1f76e3a874026d1ddf7cnicolasroard } 4830d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 484b75da4c91e16bbd83cd839207224c0645a6ecefdnicolasroard public Bitmap applyBorder(Bitmap bitmap, FilterEnvironment environment) { 485bb92950836df40142f34834259af476d01bfc751nicolasroard // get the border from the list of filters. 486bb92950836df40142f34834259af476d01bfc751nicolasroard FilterRepresentation border = getFilterRepresentationForType( 487bb92950836df40142f34834259af476d01bfc751nicolasroard FilterRepresentation.TYPE_BORDER); 488bb92950836df40142f34834259af476d01bfc751nicolasroard if (border != null && mDoApplyGeometry) { 489bb92950836df40142f34834259af476d01bfc751nicolasroard bitmap = environment.applyRepresentation(border, bitmap); 49036e567afff815bc821c2859ebdeec86b1fca1ef6nicolasroard if (environment.getQuality() == FilterEnvironment.QUALITY_FINAL) { 4911401b2fec43ebc349a3102153bb1b3597f358838Bobby Georgescu } 49231529940021b9a18611b1a3fb4a0317ab8c89618nicolasroard } 49357eedfd99676913f575b1f76e3a874026d1ddf7cnicolasroard return bitmap; 49457eedfd99676913f575b1f76e3a874026d1ddf7cnicolasroard } 49557eedfd99676913f575b1f76e3a874026d1ddf7cnicolasroard 4962aa37f270a077c8a409190f891aa838a8c1653c3nicolasroard public int nbFilters() { 4972aa37f270a077c8a409190f891aa838a8c1653c3nicolasroard return mFilters.size(); 4982aa37f270a077c8a409190f891aa838a8c1653c3nicolasroard } 4992aa37f270a077c8a409190f891aa838a8c1653c3nicolasroard 500b75da4c91e16bbd83cd839207224c0645a6ecefdnicolasroard public Bitmap applyFilters(Bitmap bitmap, int from, int to, FilterEnvironment environment) { 501e8c2b314d8f3c5d79227fae97a0ec1ca68a1e611Nicolas Roard if (mDoApplyFilters) { 502e8c2b314d8f3c5d79227fae97a0ec1ca68a1e611Nicolas Roard if (from < 0) { 503e8c2b314d8f3c5d79227fae97a0ec1ca68a1e611Nicolas Roard from = 0; 504e8c2b314d8f3c5d79227fae97a0ec1ca68a1e611Nicolas Roard } 505e8c2b314d8f3c5d79227fae97a0ec1ca68a1e611Nicolas Roard if (to == -1) { 506e8c2b314d8f3c5d79227fae97a0ec1ca68a1e611Nicolas Roard to = mFilters.size(); 507e8c2b314d8f3c5d79227fae97a0ec1ca68a1e611Nicolas Roard } 508e8c2b314d8f3c5d79227fae97a0ec1ca68a1e611Nicolas Roard for (int i = from; i < to; i++) { 5097f7755f76210a500e6ce63bfa880f23303556294nicolasroard FilterRepresentation representation = mFilters.elementAt(i); 510b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk if (representation.getFilterType() == FilterRepresentation.TYPE_GEOMETRY) { 511e5f4b784ddfaf359fe460998d0edc25755df8bdcnicolasroard // skip the geometry as it's already applied. 512e5f4b784ddfaf359fe460998d0edc25755df8bdcnicolasroard continue; 513e5f4b784ddfaf359fe460998d0edc25755df8bdcnicolasroard } 514bb92950836df40142f34834259af476d01bfc751nicolasroard if (representation.getFilterType() == FilterRepresentation.TYPE_BORDER) { 515b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk // for now, let's skip the border as it will be applied in 516b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk // applyBorder() 517bb92950836df40142f34834259af476d01bfc751nicolasroard // TODO: might be worth getting rid of applyBorder. 518bb92950836df40142f34834259af476d01bfc751nicolasroard continue; 519bb92950836df40142f34834259af476d01bfc751nicolasroard } 5209f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard Bitmap tmp = bitmap; 521b75da4c91e16bbd83cd839207224c0645a6ecefdnicolasroard bitmap = environment.applyRepresentation(representation, bitmap); 5229f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard if (tmp != bitmap) { 5239f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard environment.cache(tmp); 5249f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard } 52517218987cfa32cff5dc719cfb88d0e3ce3677f00John Hoford if (environment.needsStop()) { 52617218987cfa32cff5dc719cfb88d0e3ce3677f00John Hoford return bitmap; 52717218987cfa32cff5dc719cfb88d0e3ce3677f00John Hoford } 52831529940021b9a18611b1a3fb4a0317ab8c89618nicolasroard } 5290d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 53093dfe7a1df07a64701369b480578410efb740a27nicolasroard 5310d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard return bitmap; 5320d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 5330d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 5342aa37f270a077c8a409190f891aa838a8c1653c3nicolasroard public void applyBorder(Allocation in, Allocation out, 535b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk boolean copyOut, FilterEnvironment environment) { 536bb92950836df40142f34834259af476d01bfc751nicolasroard FilterRepresentation border = getFilterRepresentationForType( 537bb92950836df40142f34834259af476d01bfc751nicolasroard FilterRepresentation.TYPE_BORDER); 538bb92950836df40142f34834259af476d01bfc751nicolasroard if (border != null && mDoApplyGeometry) { 5394b6ea5bce9b68eea16eb8a0980501f671e7fbf44nicolasroard // TODO: should keep the bitmap around 5402aa37f270a077c8a409190f891aa838a8c1653c3nicolasroard Allocation bitmapIn = in; 5412aa37f270a077c8a409190f891aa838a8c1653c3nicolasroard if (copyOut) { 5422aa37f270a077c8a409190f891aa838a8c1653c3nicolasroard bitmapIn = Allocation.createTyped( 5432aa37f270a077c8a409190f891aa838a8c1653c3nicolasroard CachingPipeline.getRenderScriptContext(), in.getType()); 5442aa37f270a077c8a409190f891aa838a8c1653c3nicolasroard bitmapIn.copyFrom(out); 5452aa37f270a077c8a409190f891aa838a8c1653c3nicolasroard } 546bb92950836df40142f34834259af476d01bfc751nicolasroard environment.applyRepresentation(border, bitmapIn, out); 5474b6ea5bce9b68eea16eb8a0980501f671e7fbf44nicolasroard } 5484b6ea5bce9b68eea16eb8a0980501f671e7fbf44nicolasroard } 5494b6ea5bce9b68eea16eb8a0980501f671e7fbf44nicolasroard 5502aa37f270a077c8a409190f891aa838a8c1653c3nicolasroard public void applyFilters(int from, int to, Allocation in, Allocation out, 551b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk FilterEnvironment environment) { 55293ef658bf44d7ecd79894a9a225a400c2741058fnicolasroard if (mDoApplyFilters) { 55393ef658bf44d7ecd79894a9a225a400c2741058fnicolasroard if (from < 0) { 55493ef658bf44d7ecd79894a9a225a400c2741058fnicolasroard from = 0; 55593ef658bf44d7ecd79894a9a225a400c2741058fnicolasroard } 55693ef658bf44d7ecd79894a9a225a400c2741058fnicolasroard if (to == -1) { 55793ef658bf44d7ecd79894a9a225a400c2741058fnicolasroard to = mFilters.size(); 55893ef658bf44d7ecd79894a9a225a400c2741058fnicolasroard } 55993ef658bf44d7ecd79894a9a225a400c2741058fnicolasroard for (int i = from; i < to; i++) { 5607f7755f76210a500e6ce63bfa880f23303556294nicolasroard FilterRepresentation representation = mFilters.elementAt(i); 561b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk if (representation.getFilterType() == FilterRepresentation.TYPE_GEOMETRY 562b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk || representation.getFilterType() == FilterRepresentation.TYPE_BORDER) { 563bb92950836df40142f34834259af476d01bfc751nicolasroard continue; 564bb92950836df40142f34834259af476d01bfc751nicolasroard } 56593ef658bf44d7ecd79894a9a225a400c2741058fnicolasroard if (i > from) { 56693ef658bf44d7ecd79894a9a225a400c2741058fnicolasroard in.copyFrom(out); 56793ef658bf44d7ecd79894a9a225a400c2741058fnicolasroard } 56893ef658bf44d7ecd79894a9a225a400c2741058fnicolasroard environment.applyRepresentation(representation, in, out); 56993ef658bf44d7ecd79894a9a225a400c2741058fnicolasroard } 57093ef658bf44d7ecd79894a9a225a400c2741058fnicolasroard } 57193ef658bf44d7ecd79894a9a225a400c2741058fnicolasroard } 57293ef658bf44d7ecd79894a9a225a400c2741058fnicolasroard 573e5498da0262fc836738aad63ea30286d8afa643cnicolasroard public boolean canDoPartialRendering() { 5740c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk if (MasterImage.getImage().getZoomOrientation() != ImageLoader.ORI_NORMAL) { 575db4cedf1feb3899840963b2648dc3e2b4d0a1d6fnicolasroard return false; 576db4cedf1feb3899840963b2648dc3e2b4d0a1d6fnicolasroard } 577e5498da0262fc836738aad63ea30286d8afa643cnicolasroard for (int i = 0; i < mFilters.size(); i++) { 5787f7755f76210a500e6ce63bfa880f23303556294nicolasroard FilterRepresentation representation = mFilters.elementAt(i); 579e5498da0262fc836738aad63ea30286d8afa643cnicolasroard if (!representation.supportsPartialRendering()) { 580e5498da0262fc836738aad63ea30286d8afa643cnicolasroard return false; 581e5498da0262fc836738aad63ea30286d8afa643cnicolasroard } 582e5498da0262fc836738aad63ea30286d8afa643cnicolasroard } 583e5498da0262fc836738aad63ea30286d8afa643cnicolasroard return true; 584e5498da0262fc836738aad63ea30286d8afa643cnicolasroard } 585e5498da0262fc836738aad63ea30286d8afa643cnicolasroard 586fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard public void fillImageStateAdapter(StateAdapter imageStateAdapter) { 587bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard if (imageStateAdapter == null) { 588bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard return; 589bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard } 59000259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard Vector<State> states = new Vector<State>(); 59100259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard for (FilterRepresentation filter : mFilters) { 592fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard if (filter instanceof FilterUserPresetRepresentation) { 593fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard // do not show the user preset itself in the state panel 594fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard continue; 595fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard } 59600259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard State state = new State(filter.getName()); 59700259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard state.setFilterRepresentation(filter); 59800259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard states.add(state); 599f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard } 60000259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard imageStateAdapter.fill(states); 601bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard } 602bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard 603e5498da0262fc836738aad63ea30286d8afa643cnicolasroard public void setPartialRendering(boolean partialRendering, Rect bounds) { 604e5498da0262fc836738aad63ea30286d8afa643cnicolasroard mPartialRendering = partialRendering; 605e5498da0262fc836738aad63ea30286d8afa643cnicolasroard mPartialRenderingBounds = bounds; 606e5498da0262fc836738aad63ea30286d8afa643cnicolasroard } 607e5498da0262fc836738aad63ea30286d8afa643cnicolasroard 608e5498da0262fc836738aad63ea30286d8afa643cnicolasroard public boolean isPartialRendering() { 609e5498da0262fc836738aad63ea30286d8afa643cnicolasroard return mPartialRendering; 610e5498da0262fc836738aad63ea30286d8afa643cnicolasroard } 611e5498da0262fc836738aad63ea30286d8afa643cnicolasroard 612e5498da0262fc836738aad63ea30286d8afa643cnicolasroard public Rect getPartialRenderingBounds() { 613e5498da0262fc836738aad63ea30286d8afa643cnicolasroard return mPartialRenderingBounds; 614e5498da0262fc836738aad63ea30286d8afa643cnicolasroard } 6153a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard 616b75da4c91e16bbd83cd839207224c0645a6ecefdnicolasroard public Vector<ImageFilter> getUsedFilters(BaseFiltersManager filtersManager) { 6177706e506dc74fa634a69b9ce8c7e5e2c457f01fcnicolasroard Vector<ImageFilter> usedFilters = new Vector<ImageFilter>(); 6187706e506dc74fa634a69b9ce8c7e5e2c457f01fcnicolasroard for (int i = 0; i < mFilters.size(); i++) { 6197706e506dc74fa634a69b9ce8c7e5e2c457f01fcnicolasroard FilterRepresentation representation = mFilters.elementAt(i); 6207706e506dc74fa634a69b9ce8c7e5e2c457f01fcnicolasroard ImageFilter filter = filtersManager.getFilterForRepresentation(representation); 6217706e506dc74fa634a69b9ce8c7e5e2c457f01fcnicolasroard usedFilters.add(filter); 6227706e506dc74fa634a69b9ce8c7e5e2c457f01fcnicolasroard } 6237706e506dc74fa634a69b9ce8c7e5e2c457f01fcnicolasroard return usedFilters; 6247706e506dc74fa634a69b9ce8c7e5e2c457f01fcnicolasroard } 6257706e506dc74fa634a69b9ce8c7e5e2c457f01fcnicolasroard 626afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford public String getJsonString(String name) { 627afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford StringWriter swriter = new StringWriter(); 628afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford try { 629afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford JsonWriter writer = new JsonWriter(swriter); 630afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford writeJson(writer, name); 631afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford writer.close(); 6325762138f8c561cb377d52f3379b89977fc2fbc14John Hoford } catch (IOException e) { 6335762138f8c561cb377d52f3379b89977fc2fbc14John Hoford return null; 634afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford } 635afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford return swriter.toString(); 636afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford } 637afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford 638afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford public void writeJson(JsonWriter writer, String name) { 639b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk int numFilters = mFilters.size(); 640afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford try { 641afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford writer.beginObject(); 642afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford for (int i = 0; i < numFilters; i++) { 643afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford FilterRepresentation filter = mFilters.get(i); 644fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard if (filter instanceof FilterUserPresetRepresentation) { 645fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard continue; 646fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard } 647afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford String sname = filter.getSerializationName(); 6485762138f8c561cb377d52f3379b89977fc2fbc14John Hoford if (DEBUG) { 6495762138f8c561cb377d52f3379b89977fc2fbc14John Hoford Log.v(LOGTAG, "Serialization: " + sname); 6505762138f8c561cb377d52f3379b89977fc2fbc14John Hoford if (sname == null) { 65124d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard Log.v(LOGTAG, "Serialization name null for filter: " + filter); 652afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford } 653afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford } 6545762138f8c561cb377d52f3379b89977fc2fbc14John Hoford writer.name(sname); 6555762138f8c561cb377d52f3379b89977fc2fbc14John Hoford filter.serializeRepresentation(writer); 656afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford } 657afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford writer.endObject(); 658afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford 659afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford } catch (IOException e) { 660bc8e077e77cf6f0dda8efd8318b8a8e7eda16f61John Hoford Log.e(LOGTAG,"Error encoding JASON",e); 661afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford } 662afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford } 663afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford 6645762138f8c561cb377d52f3379b89977fc2fbc14John Hoford /** 6655762138f8c561cb377d52f3379b89977fc2fbc14John Hoford * populates preset from JSON string 666b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk * 6675762138f8c561cb377d52f3379b89977fc2fbc14John Hoford * @param filterString a JSON string 6685762138f8c561cb377d52f3379b89977fc2fbc14John Hoford * @return true on success if false ImagePreset is undefined 6695762138f8c561cb377d52f3379b89977fc2fbc14John Hoford */ 670afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford public boolean readJsonFromString(String filterString) { 6715762138f8c561cb377d52f3379b89977fc2fbc14John Hoford if (DEBUG) { 672b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk Log.v(LOGTAG, "reading preset: \"" + filterString + "\""); 6735762138f8c561cb377d52f3379b89977fc2fbc14John Hoford } 674afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford StringReader sreader = new StringReader(filterString); 675afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford try { 676afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford JsonReader reader = new JsonReader(sreader); 677afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford boolean ok = readJson(reader); 678afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford if (!ok) { 6795762138f8c561cb377d52f3379b89977fc2fbc14John Hoford reader.close(); 680afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford return false; 681afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford } 682afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford reader.close(); 683afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford } catch (Exception e) { 684b17765a3e9ead269493d7a851a21af3622931c40John Hoford Log.e(LOGTAG, "\""+filterString+"\""); 685b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk Log.e(LOGTAG, "parsing the filter parameters:", e); 6865762138f8c561cb377d52f3379b89977fc2fbc14John Hoford return false; 687afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford } 688afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford return true; 689afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford } 690afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford 6915762138f8c561cb377d52f3379b89977fc2fbc14John Hoford /** 6925762138f8c561cb377d52f3379b89977fc2fbc14John Hoford * populates preset from JSON stream 693b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk * 6945762138f8c561cb377d52f3379b89977fc2fbc14John Hoford * @param sreader a JSON string 6955762138f8c561cb377d52f3379b89977fc2fbc14John Hoford * @return true on success if false ImagePreset is undefined 6965762138f8c561cb377d52f3379b89977fc2fbc14John Hoford */ 697afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford public boolean readJson(JsonReader sreader) throws IOException { 698afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford sreader.beginObject(); 699afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford 700afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford while (sreader.hasNext()) { 701afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford String name = sreader.nextName(); 702e5f4b784ddfaf359fe460998d0edc25755df8bdcnicolasroard FilterRepresentation filter = creatFilterFromName(name); 703e5f4b784ddfaf359fe460998d0edc25755df8bdcnicolasroard if (filter == null) { 704b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk Log.w(LOGTAG, "UNKNOWN FILTER! " + name); 705e5f4b784ddfaf359fe460998d0edc25755df8bdcnicolasroard return false; 706afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford } 707312efd6469dd0a26e26d8838af4f5db6b40efe2fJohn Hoford filter.deSerializeRepresentation(sreader); 708e5f4b784ddfaf359fe460998d0edc25755df8bdcnicolasroard addFilter(filter); 709afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford } 710afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford sreader.endObject(); 711afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford return true; 712afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford } 713afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford 714afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford FilterRepresentation creatFilterFromName(String name) { 715b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk if (FilterRotateRepresentation.SERIALIZATION_NAME.equals(name)) { 71676a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk return new FilterRotateRepresentation(); 71776a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk } else if (FilterMirrorRepresentation.SERIALIZATION_NAME.equals(name)) { 71876a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk return new FilterMirrorRepresentation(); 71976a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk } else if (FilterStraightenRepresentation.SERIALIZATION_NAME.equals(name)) { 72076a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk return new FilterStraightenRepresentation(); 72176a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk } else if (FilterCropRepresentation.SERIALIZATION_NAME.equals(name)) { 72276a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk return new FilterCropRepresentation(); 723e5f4b784ddfaf359fe460998d0edc25755df8bdcnicolasroard } 724afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford FiltersManager filtersManager = FiltersManager.getManager(); 725afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford return filtersManager.createFilterFromName(name); 726afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford } 7277f7755f76210a500e6ce63bfa880f23303556294nicolasroard 7287f7755f76210a500e6ce63bfa880f23303556294nicolasroard public void updateWith(ImagePreset preset) { 7297f7755f76210a500e6ce63bfa880f23303556294nicolasroard if (preset.mFilters.size() != mFilters.size()) { 7307f7755f76210a500e6ce63bfa880f23303556294nicolasroard Log.e(LOGTAG, "Updating a preset with an incompatible one"); 7317f7755f76210a500e6ce63bfa880f23303556294nicolasroard return; 7327f7755f76210a500e6ce63bfa880f23303556294nicolasroard } 7337f7755f76210a500e6ce63bfa880f23303556294nicolasroard for (int i = 0; i < mFilters.size(); i++) { 7347f7755f76210a500e6ce63bfa880f23303556294nicolasroard FilterRepresentation destRepresentation = mFilters.elementAt(i); 7357f7755f76210a500e6ce63bfa880f23303556294nicolasroard FilterRepresentation sourceRepresentation = preset.mFilters.elementAt(i); 7367f7755f76210a500e6ce63bfa880f23303556294nicolasroard destRepresentation.useParametersFrom(sourceRepresentation); 7377f7755f76210a500e6ce63bfa880f23303556294nicolasroard } 7387f7755f76210a500e6ce63bfa880f23303556294nicolasroard } 739bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard} 740