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