ImagePreset.java revision 0a32b7afc5286a5c7aa334b9338591d61a49731f
10d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
20d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardpackage com.android.gallery3d.filtershow.presets;
30d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
40d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.graphics.Bitmap;
50d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.util.Log;
60d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
7bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroardimport com.android.gallery3d.filtershow.ImageStateAdapter;
8e9c55b28a4a155c2e1c1f5aec615a0c56e38ade4John Hofordimport com.android.gallery3d.filtershow.cache.ImageLoader;
90d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport com.android.gallery3d.filtershow.filters.ImageFilter;
108537d097f8827caedc8c39564de54d36eae8b16fRuben Brunkimport com.android.gallery3d.filtershow.imageshow.GeometryMetadata;
110d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport com.android.gallery3d.filtershow.imageshow.ImageShow;
120d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
1392e2341248e99c691f38820503984bc5e2f18811nicolasroardimport java.util.Vector;
1492e2341248e99c691f38820503984bc5e2f18811nicolasroard
150d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardpublic class ImagePreset {
160d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
170d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    private static final String LOGTAG = "ImagePreset";
1893dfe7a1df07a64701369b480578410efb740a27nicolasroard
1993dfe7a1df07a64701369b480578410efb740a27nicolasroard    private ImageShow mEndPoint = null;
2093dfe7a1df07a64701369b480578410efb740a27nicolasroard    private ImageFilter mImageBorder = null;
2193dfe7a1df07a64701369b480578410efb740a27nicolasroard    private float mScaleFactor = 1.0f;
2293dfe7a1df07a64701369b480578410efb740a27nicolasroard    private boolean mIsHighQuality = false;
23e9c55b28a4a155c2e1c1f5aec615a0c56e38ade4John Hoford    private ImageLoader mImageLoader = null;
2493dfe7a1df07a64701369b480578410efb740a27nicolasroard
250d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    protected Vector<ImageFilter> mFilters = new Vector<ImageFilter>();
260d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    protected String mName = "Original";
270a32b7afc5286a5c7aa334b9338591d61a49731fRuben Brunk    private String mHistoryName = "Original";
280d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    protected boolean mIsFxPreset = false;
290d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
308537d097f8827caedc8c39564de54d36eae8b16fRuben Brunk    public final GeometryMetadata mGeoData = new GeometryMetadata();
318537d097f8827caedc8c39564de54d36eae8b16fRuben Brunk
3293dfe7a1df07a64701369b480578410efb740a27nicolasroard    enum FullRotate {
3393dfe7a1df07a64701369b480578410efb740a27nicolasroard        ZERO, NINETY, HUNDRED_EIGHTY, TWO_HUNDRED_SEVENTY
348537d097f8827caedc8c39564de54d36eae8b16fRuben Brunk    }
350d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
360d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    public ImagePreset() {
370d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        setup();
380d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
390d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
400a32b7afc5286a5c7aa334b9338591d61a49731fRuben Brunk    public ImagePreset(String historyName) {
410a32b7afc5286a5c7aa334b9338591d61a49731fRuben Brunk        setHistoryName(historyName);
420a32b7afc5286a5c7aa334b9338591d61a49731fRuben Brunk        setup();
430a32b7afc5286a5c7aa334b9338591d61a49731fRuben Brunk    }
440a32b7afc5286a5c7aa334b9338591d61a49731fRuben Brunk
45a19830b4fd9050b48386cd904d99cfd2566cc515John Hoford    public ImagePreset(ImagePreset source, String historyName) {
46a19830b4fd9050b48386cd904d99cfd2566cc515John Hoford        this(source);
4755550694a3f40fbf5dfc95c35a8e253aedab931enicolasroard        if (historyName != null) {
4855550694a3f40fbf5dfc95c35a8e253aedab931enicolasroard            setHistoryName(historyName);
4955550694a3f40fbf5dfc95c35a8e253aedab931enicolasroard        }
50a19830b4fd9050b48386cd904d99cfd2566cc515John Hoford    }
51a19830b4fd9050b48386cd904d99cfd2566cc515John Hoford
520d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    public ImagePreset(ImagePreset source) {
53bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard        try {
5493dfe7a1df07a64701369b480578410efb740a27nicolasroard            if (source.mImageBorder != null) {
5593dfe7a1df07a64701369b480578410efb740a27nicolasroard                mImageBorder = source.mImageBorder.clone();
5693dfe7a1df07a64701369b480578410efb740a27nicolasroard            }
57bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard            for (int i = 0; i < source.mFilters.size(); i++) {
58e9c55b28a4a155c2e1c1f5aec615a0c56e38ade4John Hoford                ImageFilter filter = source.mFilters.elementAt(i).clone();
59e9c55b28a4a155c2e1c1f5aec615a0c56e38ade4John Hoford                filter.setImagePreset(this);
60e9c55b28a4a155c2e1c1f5aec615a0c56e38ade4John Hoford                add(filter);
61bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard            }
62bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard        } catch (java.lang.CloneNotSupportedException e) {
63bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard            Log.v(LOGTAG, "Exception trying to clone: " + e);
640d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        }
650d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        mName = source.name();
660d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        mHistoryName = source.name();
670d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        mIsFxPreset = source.isFx();
68e9c55b28a4a155c2e1c1f5aec615a0c56e38ade4John Hoford        mImageLoader = source.getImageLoader();
690d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
708537d097f8827caedc8c39564de54d36eae8b16fRuben Brunk        mGeoData.set(source.mGeoData);
710d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
720d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
7355550694a3f40fbf5dfc95c35a8e253aedab931enicolasroard    public boolean hasModifications() {
7455550694a3f40fbf5dfc95c35a8e253aedab931enicolasroard        if (mImageBorder != null && !mImageBorder.isNil()) {
7555550694a3f40fbf5dfc95c35a8e253aedab931enicolasroard            return true;
7655550694a3f40fbf5dfc95c35a8e253aedab931enicolasroard        }
7755550694a3f40fbf5dfc95c35a8e253aedab931enicolasroard        if (mGeoData.hasModifications()) {
7855550694a3f40fbf5dfc95c35a8e253aedab931enicolasroard            return true;
7955550694a3f40fbf5dfc95c35a8e253aedab931enicolasroard        }
8055550694a3f40fbf5dfc95c35a8e253aedab931enicolasroard        for (int i = 0; i < mFilters.size(); i++) {
8155550694a3f40fbf5dfc95c35a8e253aedab931enicolasroard            ImageFilter filter = mFilters.elementAt(i);
8255550694a3f40fbf5dfc95c35a8e253aedab931enicolasroard            if (!filter.isNil()) {
8355550694a3f40fbf5dfc95c35a8e253aedab931enicolasroard                return true;
8455550694a3f40fbf5dfc95c35a8e253aedab931enicolasroard            }
8555550694a3f40fbf5dfc95c35a8e253aedab931enicolasroard        }
8655550694a3f40fbf5dfc95c35a8e253aedab931enicolasroard        return false;
8755550694a3f40fbf5dfc95c35a8e253aedab931enicolasroard    }
8855550694a3f40fbf5dfc95c35a8e253aedab931enicolasroard
89014a111f10a7523415ca210bc6fe1e4f00183d31John Reck    public boolean isPanoramaSafe() {
90014a111f10a7523415ca210bc6fe1e4f00183d31John Reck        if (mImageBorder != null && !mImageBorder.isNil()) {
91014a111f10a7523415ca210bc6fe1e4f00183d31John Reck            return false;
92014a111f10a7523415ca210bc6fe1e4f00183d31John Reck        }
93014a111f10a7523415ca210bc6fe1e4f00183d31John Reck        if (mGeoData.hasModifications()) {
94014a111f10a7523415ca210bc6fe1e4f00183d31John Reck            return false;
95014a111f10a7523415ca210bc6fe1e4f00183d31John Reck        }
96014a111f10a7523415ca210bc6fe1e4f00183d31John Reck        for (ImageFilter filter : mFilters) {
97014a111f10a7523415ca210bc6fe1e4f00183d31John Reck            if (filter.getFilterType() == ImageFilter.TYPE_VIGNETTE
98014a111f10a7523415ca210bc6fe1e4f00183d31John Reck                    && !filter.isNil()) {
99014a111f10a7523415ca210bc6fe1e4f00183d31John Reck                return false;
100014a111f10a7523415ca210bc6fe1e4f00183d31John Reck            }
101014a111f10a7523415ca210bc6fe1e4f00183d31John Reck        }
102014a111f10a7523415ca210bc6fe1e4f00183d31John Reck        return true;
103014a111f10a7523415ca210bc6fe1e4f00183d31John Reck    }
104014a111f10a7523415ca210bc6fe1e4f00183d31John Reck
105014a111f10a7523415ca210bc6fe1e4f00183d31John Reck
10693dfe7a1df07a64701369b480578410efb740a27nicolasroard    public void setGeometry(GeometryMetadata m) {
10793dfe7a1df07a64701369b480578410efb740a27nicolasroard        mGeoData.set(m);
10893dfe7a1df07a64701369b480578410efb740a27nicolasroard    }
10993dfe7a1df07a64701369b480578410efb740a27nicolasroard
110a19830b4fd9050b48386cd904d99cfd2566cc515John Hoford    private void setBorder(ImageFilter filter) {
11193dfe7a1df07a64701369b480578410efb740a27nicolasroard        mImageBorder = filter;
11293dfe7a1df07a64701369b480578410efb740a27nicolasroard    }
11393dfe7a1df07a64701369b480578410efb740a27nicolasroard
1140d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    public boolean isFx() {
1150d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        return mIsFxPreset;
1160d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
1170d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
1180d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    public void setIsFx(boolean value) {
1190d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        mIsFxPreset = value;
1200d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
1210d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
1220d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    public void setName(String name) {
1230d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        mName = name;
1240d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        mHistoryName = name;
1250d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
1260d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
127e533f65961ed601ded1803caeab6cef0a778d2f2nicolasroard    public void setHistoryName(String name) {
1280d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        mHistoryName = name;
1290d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
1300d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
131e9c55b28a4a155c2e1c1f5aec615a0c56e38ade4John Hoford    public ImageLoader getImageLoader() {
132e9c55b28a4a155c2e1c1f5aec615a0c56e38ade4John Hoford        return mImageLoader;
133e9c55b28a4a155c2e1c1f5aec615a0c56e38ade4John Hoford    }
134e9c55b28a4a155c2e1c1f5aec615a0c56e38ade4John Hoford
135e9c55b28a4a155c2e1c1f5aec615a0c56e38ade4John Hoford    public void setImageLoader(ImageLoader mImageLoader) {
136e9c55b28a4a155c2e1c1f5aec615a0c56e38ade4John Hoford        this.mImageLoader = mImageLoader;
137e9c55b28a4a155c2e1c1f5aec615a0c56e38ade4John Hoford    }
138e9c55b28a4a155c2e1c1f5aec615a0c56e38ade4John Hoford
1390d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    public boolean same(ImagePreset preset) {
1400d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        if (preset.mFilters.size() != mFilters.size()) {
1410d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            return false;
1420d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        }
1430d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        if (!mName.equalsIgnoreCase(preset.name())) {
1440d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            return false;
1450d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        }
1468537d097f8827caedc8c39564de54d36eae8b16fRuben Brunk
1478537d097f8827caedc8c39564de54d36eae8b16fRuben Brunk        if (!mGeoData.equals(preset.mGeoData)) {
1480d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            return false;
1490d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        }
15093dfe7a1df07a64701369b480578410efb740a27nicolasroard
15193dfe7a1df07a64701369b480578410efb740a27nicolasroard        if (mImageBorder != preset.mImageBorder) {
15293dfe7a1df07a64701369b480578410efb740a27nicolasroard            return false;
15393dfe7a1df07a64701369b480578410efb740a27nicolasroard        }
15493dfe7a1df07a64701369b480578410efb740a27nicolasroard
15593dfe7a1df07a64701369b480578410efb740a27nicolasroard        if (mImageBorder != null && !mImageBorder.same(preset.mImageBorder)) {
15693dfe7a1df07a64701369b480578410efb740a27nicolasroard            return false;
15793dfe7a1df07a64701369b480578410efb740a27nicolasroard        }
15893dfe7a1df07a64701369b480578410efb740a27nicolasroard
1590d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        for (int i = 0; i < preset.mFilters.size(); i++) {
1600d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            ImageFilter a = preset.mFilters.elementAt(i);
1610d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            ImageFilter b = mFilters.elementAt(i);
1620d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            if (!a.same(b)) {
1630d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard                return false;
1640d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            }
1650d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        }
1660d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        return true;
1670d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
1680d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
1690d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    public String name() {
1700d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        return mName;
1710d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
1720d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
1730d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    public String historyName() {
1740d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        return mHistoryName;
1750d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
1760d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
177bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard    public void add(ImageFilter filter) {
178fafb2edbb9928039b887f59685d82593bd79e06aJohn Hoford
17955550694a3f40fbf5dfc95c35a8e253aedab931enicolasroard        if (filter.getFilterType() == ImageFilter.TYPE_BORDER) {
1800a32b7afc5286a5c7aa334b9338591d61a49731fRuben Brunk            setHistoryName(filter.getName());
181a19830b4fd9050b48386cd904d99cfd2566cc515John Hoford            setBorder(filter);
18255550694a3f40fbf5dfc95c35a8e253aedab931enicolasroard        } else if (filter.getFilterType() == ImageFilter.TYPE_FX) {
183a19830b4fd9050b48386cd904d99cfd2566cc515John Hoford            boolean found = false;
184a19830b4fd9050b48386cd904d99cfd2566cc515John Hoford            for (int i = 0; i < mFilters.size(); i++) {
185fafb2edbb9928039b887f59685d82593bd79e06aJohn Hoford                byte type = mFilters.get(i).getFilterType();
186a19830b4fd9050b48386cd904d99cfd2566cc515John Hoford                if (found) {
18755550694a3f40fbf5dfc95c35a8e253aedab931enicolasroard                    if (type != ImageFilter.TYPE_VIGNETTE) {
188fafb2edbb9928039b887f59685d82593bd79e06aJohn Hoford                        mFilters.remove(i);
189fafb2edbb9928039b887f59685d82593bd79e06aJohn Hoford                        continue;
190a19830b4fd9050b48386cd904d99cfd2566cc515John Hoford                    }
191fafb2edbb9928039b887f59685d82593bd79e06aJohn Hoford                }
19255550694a3f40fbf5dfc95c35a8e253aedab931enicolasroard                if (type == ImageFilter.TYPE_FX) {
193fafb2edbb9928039b887f59685d82593bd79e06aJohn Hoford                    mFilters.remove(i);
194fafb2edbb9928039b887f59685d82593bd79e06aJohn Hoford                    mFilters.add(i, filter);
195a19830b4fd9050b48386cd904d99cfd2566cc515John Hoford                    setHistoryName(filter.getName());
196a19830b4fd9050b48386cd904d99cfd2566cc515John Hoford                    found = true;
197a19830b4fd9050b48386cd904d99cfd2566cc515John Hoford                }
198a19830b4fd9050b48386cd904d99cfd2566cc515John Hoford            }
199fafb2edbb9928039b887f59685d82593bd79e06aJohn Hoford            if (!found) {
200fafb2edbb9928039b887f59685d82593bd79e06aJohn Hoford                mFilters.add(filter);
201fafb2edbb9928039b887f59685d82593bd79e06aJohn Hoford                setHistoryName(filter.getName());
202fafb2edbb9928039b887f59685d82593bd79e06aJohn Hoford            }
203a19830b4fd9050b48386cd904d99cfd2566cc515John Hoford        } else {
204a19830b4fd9050b48386cd904d99cfd2566cc515John Hoford            mFilters.add(filter);
205a19830b4fd9050b48386cd904d99cfd2566cc515John Hoford            setHistoryName(filter.getName());
206a19830b4fd9050b48386cd904d99cfd2566cc515John Hoford        }
207e9c55b28a4a155c2e1c1f5aec615a0c56e38ade4John Hoford        filter.setImagePreset(this);
2080d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
2090d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
2100d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    public void remove(String filterName) {
2110d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        ImageFilter filter = getFilter(filterName);
2120d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        if (filter != null) {
2130d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            mFilters.remove(filter);
2140d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        }
2150d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
2160d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
2170d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    public int getCount() {
2180d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        return mFilters.size();
2190d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
2200d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
2210d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    public ImageFilter getFilter(String name) {
2220d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        for (int i = 0; i < mFilters.size(); i++) {
2230d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            ImageFilter filter = mFilters.elementAt(i);
224bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard            if (filter.getName().equalsIgnoreCase(name)) {
2250d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard                return filter;
2260d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            }
2270d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        }
2280d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        return null;
2290d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
2300d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
2310d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    public void setup() {
2320d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        // do nothing here
2330d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
2340d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
2350d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    public void setEndpoint(ImageShow image) {
2360d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        mEndPoint = image;
2370d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
2380d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
2390d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    public Bitmap apply(Bitmap original) {
2400d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        // First we apply any transform -- 90 rotate, flip, straighten, crop
2417bd602506fee36f3ef0a68bfa1ba5dd1e74ca5ddRuben Brunk        Bitmap bitmap = mGeoData.apply(original, mScaleFactor, mIsHighQuality);
2420d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
2430d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        for (int i = 0; i < mFilters.size(); i++) {
2440d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            ImageFilter filter = mFilters.elementAt(i);
24593dfe7a1df07a64701369b480578410efb740a27nicolasroard            bitmap = filter.apply(bitmap, mScaleFactor, mIsHighQuality);
2460d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        }
24793dfe7a1df07a64701369b480578410efb740a27nicolasroard
24808458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard        if (mImageBorder != null) {
24908458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard            bitmap = mImageBorder.apply(bitmap, mScaleFactor, mIsHighQuality);
25008458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard        }
25108458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard
2520d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        if (mEndPoint != null) {
2530d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            mEndPoint.updateFilteredImage(bitmap);
2540d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        }
2550d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        return bitmap;
2560d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
2570d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
258bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard    public void fillImageStateAdapter(ImageStateAdapter imageStateAdapter) {
259bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard        if (imageStateAdapter == null) {
260bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard            return;
261bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard        }
262bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard        imageStateAdapter.clear();
263bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard        imageStateAdapter.addAll(mFilters);
264bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard        imageStateAdapter.notifyDataSetChanged();
265bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard    }
266bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard
26781eb9976f967d9b3faa1749a8ab29d1743cf347dnicolasroard    public float getScaleFactor() {
26881eb9976f967d9b3faa1749a8ab29d1743cf347dnicolasroard        return mScaleFactor;
26981eb9976f967d9b3faa1749a8ab29d1743cf347dnicolasroard    }
27081eb9976f967d9b3faa1749a8ab29d1743cf347dnicolasroard
27181eb9976f967d9b3faa1749a8ab29d1743cf347dnicolasroard    public boolean isHighQuality() {
27281eb9976f967d9b3faa1749a8ab29d1743cf347dnicolasroard        return mIsHighQuality;
27381eb9976f967d9b3faa1749a8ab29d1743cf347dnicolasroard    }
27481eb9976f967d9b3faa1749a8ab29d1743cf347dnicolasroard
27581eb9976f967d9b3faa1749a8ab29d1743cf347dnicolasroard    public void setIsHighQuality(boolean value) {
27681eb9976f967d9b3faa1749a8ab29d1743cf347dnicolasroard        mIsHighQuality = value;
27781eb9976f967d9b3faa1749a8ab29d1743cf347dnicolasroard    }
27881eb9976f967d9b3faa1749a8ab29d1743cf347dnicolasroard
27981eb9976f967d9b3faa1749a8ab29d1743cf347dnicolasroard    public void setScaleFactor(float value) {
28081eb9976f967d9b3faa1749a8ab29d1743cf347dnicolasroard        mScaleFactor = value;
28181eb9976f967d9b3faa1749a8ab29d1743cf347dnicolasroard    }
282bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard}
283