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