MasterImage.java revision 098159c2e78f506fcb63385526e038088fc34759
1/*
2 * Copyright (C) 2013 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.gallery3d.filtershow.imageshow;
18
19import android.graphics.Bitmap;
20import android.graphics.RectF;
21
22import com.android.gallery3d.app.Log;
23import com.android.gallery3d.filtershow.FilterShowActivity;
24import com.android.gallery3d.filtershow.HistoryAdapter;
25import com.android.gallery3d.filtershow.ImageStateAdapter;
26import com.android.gallery3d.filtershow.cache.*;
27import com.android.gallery3d.filtershow.filters.FilterRepresentation;
28import com.android.gallery3d.filtershow.filters.ImageFilter;
29import com.android.gallery3d.filtershow.presets.ImagePreset;
30
31import java.util.Vector;
32
33public class MasterImage implements RenderingRequestCaller {
34
35    private static final String LOGTAG = "MasterImage";
36
37    private static MasterImage sMasterImage = null;
38
39    private ImageFilter mCurrentFilter = null;
40    private ImagePreset mPreset = null;
41    private ImagePreset mGeometryOnlyPreset = null;
42    private ImagePreset mFiltersOnlyPreset = null;
43
44    private TripleBufferBitmap mFilteredPreview = new TripleBufferBitmap();
45
46    private Bitmap mGeometryOnlyBitmap = null;
47    private Bitmap mFiltersOnlyBitmap = null;
48
49    private ImageLoader mLoader = null;
50    private HistoryAdapter mHistory = null;
51    private ImageStateAdapter mState = null;
52
53    private FilterShowActivity mActivity = null;
54
55    private Vector<ImageShow> mObservers = new Vector<ImageShow>();
56    private FilterRepresentation mCurrentFilterRepresentation;
57
58    private MasterImage() {
59    }
60
61    public static MasterImage getImage() {
62        if (sMasterImage == null) {
63            sMasterImage = new MasterImage();
64        }
65        return sMasterImage;
66    }
67
68    public void addObserver(ImageShow observer) {
69        if (mObservers.contains(observer)) {
70            return;
71        }
72        mObservers.add(observer);
73    }
74
75    public void setActivity(FilterShowActivity activity) {
76        mActivity = activity;
77    }
78
79    public ImageLoader getLoader() {
80        return mLoader;
81    }
82
83    public synchronized ImagePreset getPreset() {
84        return mPreset;
85    }
86
87    public synchronized ImagePreset getGeometryPreset() {
88        return mGeometryOnlyPreset;
89    }
90
91    public synchronized ImagePreset getFiltersOnlyPreset() {
92        return mFiltersOnlyPreset;
93    }
94
95    public synchronized void setPreset(ImagePreset preset, boolean addToHistory) {
96        mPreset = preset;
97        mPreset.setImageLoader(mLoader);
98        setGeometry();
99        mPreset.fillImageStateAdapter(mState);
100        if (addToHistory) {
101            mHistory.addHistoryItem(mPreset);
102        }
103        updatePresets(true);
104    }
105
106    private void setGeometry() {
107        Bitmap image = mLoader.getOriginalBitmapLarge();
108        if (image == null) {
109            return;
110        }
111        float w = image.getWidth();
112        float h = image.getHeight();
113        GeometryMetadata geo = mPreset.mGeoData;
114        RectF pb = geo.getPhotoBounds();
115        if (w == pb.width() && h == pb.height()) {
116            return;
117        }
118        RectF r = new RectF(0, 0, w, h);
119        geo.setPhotoBounds(r);
120        geo.setCropBounds(r);
121    }
122
123    public void onHistoryItemClick(int position) {
124        setPreset(new ImagePreset(mHistory.getItem(position)), false);
125        // We need a copy from the history
126        mHistory.setCurrentPreset(position);
127    }
128
129    public HistoryAdapter getHistory() {
130        return mHistory;
131    }
132
133    public ImageStateAdapter getState() {
134        return mState;
135    }
136
137    public void setHistoryAdapter(HistoryAdapter adapter) {
138        mHistory = adapter;
139    }
140
141    public void setStateAdapter(ImageStateAdapter adapter) {
142        mState = adapter;
143    }
144
145    public void setImageLoader(ImageLoader loader) {
146        mLoader = loader;
147    }
148
149    public ImageLoader getImageLoader() {
150        return mLoader;
151    }
152
153    public void setCurrentFilter(ImageFilter filter) {
154        mCurrentFilter = filter;
155    }
156
157    public ImageFilter getCurrentFilter() {
158        return mCurrentFilter;
159    }
160
161    public synchronized boolean hasModifications() {
162        if (mPreset == null) {
163            return false;
164        }
165        return mPreset.hasModifications();
166    }
167
168    public TripleBufferBitmap getDoubleBuffer() {
169        return mFilteredPreview;
170    }
171
172    public Bitmap getFilteredImage() {
173        return mFilteredPreview.getConsumer();
174    }
175
176    public Bitmap getFiltersOnlyImage() {
177        return mFiltersOnlyBitmap;
178    }
179
180    public Bitmap getGeometryOnlyImage() {
181        return mGeometryOnlyBitmap;
182    }
183
184    public void notifyObservers() {
185        for (ImageShow observer : mObservers) {
186            observer.invalidate();
187        }
188    }
189
190    public void updatePresets(boolean force) {
191        if (force || mGeometryOnlyPreset == null) {
192            ImagePreset newPreset = new ImagePreset(mPreset);
193            newPreset.setDoApplyFilters(false);
194            if (mGeometryOnlyPreset == null
195                    || !newPreset.same(mGeometryOnlyPreset)) {
196                mGeometryOnlyPreset = newPreset;
197                RenderingRequest.post(mLoader.getOriginalBitmapLarge(),
198                        mGeometryOnlyPreset, RenderingRequest.GEOMETRY_RENDERING, this);
199            }
200        }
201        if (force || mFiltersOnlyPreset == null) {
202            ImagePreset newPreset = new ImagePreset(mPreset);
203            newPreset.setDoApplyGeometry(false);
204            if (mFiltersOnlyPreset == null
205                    || !newPreset.same(mFiltersOnlyPreset)) {
206                mFiltersOnlyPreset = newPreset;
207                RenderingRequest.post(mLoader.getOriginalBitmapLarge(),
208                        mFiltersOnlyPreset, RenderingRequest.FILTERS_RENDERING, this);
209            }
210        }
211        invalidatePreview();
212        mActivity.enableSave(hasModifications());
213    }
214
215    public FilterRepresentation getCurrentFilterRepresentation() {
216        return mCurrentFilterRepresentation;
217    }
218
219    public void setCurrentFilterRepresentation(FilterRepresentation currentFilterRepresentation) {
220        mCurrentFilterRepresentation = currentFilterRepresentation;
221    }
222
223    public void invalidateFiltersOnly() {
224        mFiltersOnlyPreset = null;
225        updatePresets(false);
226    }
227
228    public void invalidatePreview() {
229        mFilteredPreview.invalidate();
230        FilteringPipeline.getPipeline().updatePreviewBuffer();
231    }
232
233    @Override
234    public void available(RenderingRequest request) {
235        if (request.getBitmap() == null) {
236            return;
237        }
238        if (request.getType() == RenderingRequest.GEOMETRY_RENDERING) {
239            mGeometryOnlyBitmap = request.getBitmap();
240        }
241        if (request.getType() == RenderingRequest.FILTERS_RENDERING) {
242            mFiltersOnlyBitmap = request.getBitmap();
243        }
244    }
245
246    public static void reset() {
247        sMasterImage = null;
248    }
249}
250