OSDN Git Service

tiny planet fix
authorJohn Hoford <hoford@google.com>
Fri, 19 Apr 2013 01:43:29 +0000 (18:43 -0700)
committerJohn Hoford <hoford@google.com>
Fri, 19 Apr 2013 22:26:53 +0000 (15:26 -0700)
bug:8323524
Change-Id: I39283face7079574dbe25e797323a84141930f9a

12 files changed:
jni/filters/tinyplanet.cc
src/com/android/gallery3d/filtershow/EditorPlaceHolder.java
src/com/android/gallery3d/filtershow/FilterShowActivity.java
src/com/android/gallery3d/filtershow/cache/CachingPipeline.java
src/com/android/gallery3d/filtershow/cache/TripleBufferBitmap.java
src/com/android/gallery3d/filtershow/editors/Editor.java
src/com/android/gallery3d/filtershow/editors/EditorTinyPlanet.java
src/com/android/gallery3d/filtershow/editors/ParametricEditor.java
src/com/android/gallery3d/filtershow/filters/FilterTinyPlanetRepresentation.java
src/com/android/gallery3d/filtershow/filters/ImageFilterTinyPlanet.java
src/com/android/gallery3d/filtershow/imageshow/ImageTinyPlanet.java
src/com/android/gallery3d/filtershow/presets/FilterEnvironment.java

index a40470d..beac086 100644 (file)
@@ -80,6 +80,7 @@ inline void InterpolatePixel(const ImageRGBA &image, float x, float y,
              ax * ay * p2[4] + axn * ay * p2[0] + 0.5f);
   p++;
   p2++;
+  dest[3] = 0xFF;
 }
 
 // Wrap circular coordinates around the globe
index 735803c..38424ec 100644 (file)
@@ -1,6 +1,7 @@
 package com.android.gallery3d.filtershow;
 
 import android.view.View;
+import android.view.ViewParent;
 import android.widget.FrameLayout;
 
 import com.android.gallery3d.filtershow.cache.ImageLoader;
@@ -49,7 +50,14 @@ public class EditorPlaceHolder {
             editor.setImageLoader(mImageLoader);
             mContainer.setVisibility(View.VISIBLE);
             mContainer.removeAllViews();
-            mContainer.addView(editor.getTopLevelView());
+            View eview = editor.getTopLevelView();
+            ViewParent parent = eview.getParent();
+
+            if (parent != null && parent instanceof FrameLayout) {
+                ((FrameLayout) parent).removeAllViews();
+            }
+
+            mContainer.addView(eview);
             hideOldViews();
             editor.setVisibility(View.VISIBLE);
             return editor;
index fb89849..20061ee 100644 (file)
@@ -482,7 +482,8 @@ public class FilterShowActivity extends FragmentActivity implements OnItemClickL
             if (mAction == CROP_ACTION) {
                 mPanelController.showComponent(findViewById(EditorCrop.ID));
             } else if (mAction == TINY_PLANET_ACTION) {
-                mPanelController.showComponent(findViewById(EditorTinyPlanet.ID));
+                FilterIconButton button = (FilterIconButton) findViewById(EditorTinyPlanet.ID);
+                button.onClick(button);
             }
             super.onPostExecute(result);
         }
index 8cb8f8f..566d161 100644 (file)
@@ -22,9 +22,9 @@ import android.graphics.Bitmap;
 import android.support.v8.renderscript.Allocation;
 import android.support.v8.renderscript.RenderScript;
 import android.util.Log;
+
 import com.android.gallery3d.filtershow.filters.FiltersManager;
 import com.android.gallery3d.filtershow.filters.ImageFilterGeometry;
-import com.android.gallery3d.filtershow.filters.ImageFilterRS;
 import com.android.gallery3d.filtershow.imageshow.GeometryMetadata;
 import com.android.gallery3d.filtershow.imageshow.MasterImage;
 import com.android.gallery3d.filtershow.presets.FilterEnvironment;
@@ -357,19 +357,25 @@ public class CachingPipeline {
             Bitmap resizedOriginalBitmap = mResizedOriginalBitmap;
             if (updateOriginalAllocation(preset)) {
                 resizedOriginalBitmap = mResizedOriginalBitmap;
-                buffer.updateBitmaps(resizedOriginalBitmap);
+                mEnvironment.cache(buffer.getProducer());
+                buffer.updateProducerBitmap(resizedOriginalBitmap);
             }
             Bitmap bitmap = buffer.getProducer();
             long time2 = System.currentTimeMillis();
 
             if (bitmap == null || (bitmap.getWidth() != resizedOriginalBitmap.getWidth())
                     || (bitmap.getHeight() != resizedOriginalBitmap.getHeight())) {
-                buffer.updateBitmaps(resizedOriginalBitmap);
+                mEnvironment.cache(buffer.getProducer());
+                buffer.updateProducerBitmap(resizedOriginalBitmap);
                 bitmap = buffer.getProducer();
             }
             mOriginalAllocation.copyTo(bitmap);
 
-            bitmap = preset.apply(bitmap, mEnvironment);
+            Bitmap tmpbitmap = preset.apply(bitmap, mEnvironment);
+            if (tmpbitmap != bitmap) {
+                mEnvironment.cache(buffer.getProducer());
+                buffer.setProducer(tmpbitmap);
+            }
 
             mFiltersManager.freeFilterResources(preset);
 
index d91d64d..ba7b769 100644 (file)
@@ -44,6 +44,14 @@ public class TripleBufferBitmap {
         mIntermediate = mBitmaps[2];
     }
 
+    public synchronized void updateProducerBitmap(Bitmap bitmap) {
+        mProducer = bitmap.copy(mBitmapConfig, true);
+    }
+
+    public synchronized void setProducer(Bitmap producer) {
+        mProducer = producer;
+    }
+
     public synchronized Bitmap getProducer() {
         return mProducer;
     }
index 036745d..1e239e6 100644 (file)
@@ -214,6 +214,7 @@ public class Editor implements OnSeekBarChangeListener, SwapButton.SwapButtonLis
     public void commitLocalRepresentation() {
         ImagePreset preset = MasterImage.getImage().getPreset();
         preset.updateFilterRepresentation(getLocalRepresentation());
+        mPanelController.onNewValue(-1);
     }
 
     /**
index 4b005c4..9376fbe 100644 (file)
@@ -49,4 +49,10 @@ public class EditorTinyPlanet extends BasicEditor {
             mImageTinyPlanet.setRepresentation(drawRep);
         }
     }
+
+    public void updateUI() {
+        if (mControl != null) {
+            mControl.updateUI();
+        }
+    }
 }
index 9c275d4..e49f6cd 100644 (file)
@@ -198,6 +198,7 @@ public class ParametricEditor extends Editor {
     public void commitLocalRepresentation() {
         super.commitLocalRepresentation();
         FilterRepresentation rep = getLocalRepresentation();
+        mPanelController.onNewValue(-1);
     }
 
     @Override
index 7b69ce9..ac5e046 100644 (file)
@@ -31,6 +31,7 @@ public class FilterTinyPlanetRepresentation extends FilterBasicRepresentation {
         setTextId(R.string.tinyplanet);
         setButtonId(R.id.tinyplanetButton);
         setEditorId(EditorTinyPlanet.ID);
+        setMinimum(1);
     }
 
     @Override
@@ -42,6 +43,14 @@ public class FilterTinyPlanetRepresentation extends FilterBasicRepresentation {
         return representation;
     }
 
+    @Override
+    public void useParametersFrom(FilterRepresentation a) {
+        FilterTinyPlanetRepresentation representation = (FilterTinyPlanetRepresentation) a;
+        super.useParametersFrom(a);
+        mAngle = representation.mAngle;
+        setZoom(representation.getZoom());
+    }
+
     public void setAngle(float angle) {
         mAngle = angle;
     }
index 9874dea..37d5739 100644 (file)
@@ -65,30 +65,34 @@ public class ImageFilterTinyPlanet extends SimpleImageFilter {
         return new FilterTinyPlanetRepresentation();
     }
 
+
     native protected void nativeApplyFilter(
             Bitmap bitmapIn, int width, int height, Bitmap bitmapOut, int outSize, float scale,
             float angle);
 
+
     @Override
     public Bitmap apply(Bitmap bitmapIn, float scaleFactor, int quality) {
         int w = bitmapIn.getWidth();
         int h = bitmapIn.getHeight();
         int outputSize = (int) (w / 2f);
         ImagePreset preset = getImagePreset();
-
+        Bitmap mBitmapOut = null;
         if (preset != null) {
             XMPMeta xmp = preset.getImageLoader().getXmpObject();
             // Do nothing, just use bitmapIn as is if we don't have XMP.
             if(xmp != null) {
-              bitmapIn = applyXmp(bitmapIn, xmp, w);
+                bitmapIn = applyXmp(bitmapIn, xmp, w);
+            }
+        }
+        if (mBitmapOut != null) {
+            if (outputSize != mBitmapOut.getHeight()) {
+                mBitmapOut = null;
             }
         }
-
-        Bitmap mBitmapOut = null;
         while (mBitmapOut == null) {
             try {
-                mBitmapOut = Bitmap.createBitmap(
-                        outputSize, outputSize, Bitmap.Config.ARGB_8888);
+                mBitmapOut = getEnvironment().getBitmap(outputSize, outputSize);
             } catch (java.lang.OutOfMemoryError e) {
                 System.gc();
                 outputSize /= 2;
@@ -98,32 +102,6 @@ public class ImageFilterTinyPlanet extends SimpleImageFilter {
         nativeApplyFilter(bitmapIn, bitmapIn.getWidth(), bitmapIn.getHeight(), mBitmapOut,
                 outputSize, mParameters.getZoom() / 100f, mParameters.getAngle());
 
-        if (true) {
-            // TODO(hoford): FIXME and remove this section
-            String text = "Tiny Planet Not Working";
-            int w2 = bitmapIn.getWidth() / 2;
-            int h2 = bitmapIn.getHeight() / 2;
-            Canvas c = new Canvas(bitmapIn);
-            Paint p = new Paint();
-            Rect src = new Rect(0, 0, mBitmapOut.getWidth(), mBitmapOut.getHeight());
-            Rect dst = new Rect(0, 0, bitmapIn.getWidth(), bitmapIn.getHeight());
-            c.drawBitmap(mBitmapOut, 0, 0, p);
-            float size = Math.min(w2, h2) / 4f;
-            p.setTextSize(size);
-            p.setColor(0xFF000000);
-            p.setStyle(Paint.Style.STROKE);
-            p.setStrokeWidth(20);
-            Rect bounds = new Rect();
-            p.getTextBounds(text, 0, text.length(), bounds);
-            int tw = bounds.width() / 2;
-            c.drawText(text, w2 - tw, h2, p);
-
-            p.setColor(0xFFFF0000);
-            p.setStyle(Paint.Style.FILL);
-            p.setStrokeWidth(0);
-
-            c.drawText(text, w2 - tw, h2, p);
-        }
         return mBitmapOut;
     }
 
@@ -150,8 +128,8 @@ public class ImageFilterTinyPlanet extends SimpleImageFilter {
             while (paddedBitmap == null) {
                 try {
                     paddedBitmap = Bitmap.createBitmap(
-                    (int) (fullPanoWidth * scale), (int) (fullPanoHeight * scale),
-                    Bitmap.Config.ARGB_8888);
+                            (int) (fullPanoWidth * scale), (int) (fullPanoHeight * scale),
+                            Bitmap.Config.ARGB_8888);
                 } catch (java.lang.OutOfMemoryError e) {
                     System.gc();
                     scale /= 2;
index a49636f..25a0a90 100644 (file)
 package com.android.gallery3d.filtershow.imageshow;
 
 import android.content.Context;
+import android.graphics.Bitmap;
 import android.graphics.Canvas;
+import android.graphics.RectF;
 import android.util.AttributeSet;
 import android.view.MotionEvent;
+import android.view.ScaleGestureDetector;
+import android.view.ScaleGestureDetector.OnScaleGestureListener;
 
 import com.android.gallery3d.filtershow.editors.BasicEditor;
+import com.android.gallery3d.filtershow.editors.EditorTinyPlanet;
 import com.android.gallery3d.filtershow.filters.FilterTinyPlanetRepresentation;
 
 public class ImageTinyPlanet extends ImageShow {
+    private static final String LOGTAG = "ImageTinyPlanet";
 
     private float mTouchCenterX = 0;
     private float mTouchCenterY = 0;
@@ -34,14 +40,48 @@ public class ImageTinyPlanet extends ImageShow {
     private float mCenterY = 0;
     private float mStartAngle = 0;
     private FilterTinyPlanetRepresentation mTinyPlanetRep;
-    private BasicEditor mEditorTinyPlanet;
+    private EditorTinyPlanet mEditorTinyPlanet;
+    private ScaleGestureDetector mScaleGestureDetector = null;
+    boolean mInScale = false;
+    RectF mDestRect = new RectF();
+
+    OnScaleGestureListener mScaleGestureListener = new OnScaleGestureListener() {
+        private float mScale = 100;
+        @Override
+        public void onScaleEnd(ScaleGestureDetector detector) {
+            mInScale = false;
+        }
+
+        @Override
+        public boolean onScaleBegin(ScaleGestureDetector detector) {
+            mInScale = true;
+            mScale = mTinyPlanetRep.getValue();
+            return true;
+        }
+
+        @Override
+        public boolean onScale(ScaleGestureDetector detector) {
+            int value = mTinyPlanetRep.getValue();
+            mScale *= detector.getScaleFactor();
+            value = (int) (mScale);
+            value = Math.min(mTinyPlanetRep.getMaximum(), value);
+            value = Math.max(mTinyPlanetRep.getMinimum(), value);
+            mTinyPlanetRep.setValue(value);
+            invalidate();
+            mEditorTinyPlanet.commitLocalRepresentation();
+            mEditorTinyPlanet.updateUI();
+            return true;
+        }
+    };
 
     public ImageTinyPlanet(Context context) {
         super(context);
+        mScaleGestureDetector = new ScaleGestureDetector(context, mScaleGestureListener);
     }
 
     public ImageTinyPlanet(Context context, AttributeSet attrs) {
         super(context, attrs);
+        mScaleGestureDetector = new ScaleGestureDetector(context,mScaleGestureListener );
     }
 
     protected static float angleFor(float dx, float dy) {
@@ -70,18 +110,21 @@ public class ImageTinyPlanet extends ImageShow {
         mCurrentY = y;
         mCenterX = getWidth() / 2;
         mCenterY = getHeight() / 2;
+        mScaleGestureDetector.onTouchEvent(event);
+        if (mInScale) {
+            return true;
+        }
         switch (event.getActionMasked()) {
             case (MotionEvent.ACTION_DOWN):
                 mTouchCenterX = x;
                 mTouchCenterY = y;
                 mStartAngle = mTinyPlanetRep.getAngle();
                 break;
-            case (MotionEvent.ACTION_UP):
+
             case (MotionEvent.ACTION_MOVE):
                 mTinyPlanetRep.setAngle(mStartAngle + getCurrentTouchAngle());
                 break;
         }
-        resetImageCaches(this);
         invalidate();
         mEditorTinyPlanet.commitLocalRepresentation();
         return true;
@@ -92,12 +135,40 @@ public class ImageTinyPlanet extends ImageShow {
     }
 
     public void setEditor(BasicEditor editorTinyPlanet) {
-        mEditorTinyPlanet = editorTinyPlanet;
+        mEditorTinyPlanet = (EditorTinyPlanet) editorTinyPlanet;
     }
 
     @Override
     public void onDraw(Canvas canvas) {
-        super.onDraw(canvas);
+        Bitmap bitmap = MasterImage.getImage().getHighresImage();
+        if (bitmap == null) {
+            bitmap = MasterImage.getImage().getFilteredImage();
+        }
+
+        if (bitmap != null) {
+            display(canvas, bitmap);
+        }
     }
 
+    private void display(Canvas canvas, Bitmap bitmap) {
+        float sw = canvas.getWidth();
+        float sh = canvas.getHeight();
+        float iw = bitmap.getWidth();
+        float ih = bitmap.getHeight();
+        float nsw = sw;
+        float nsh = sh;
+
+        if (sw * ih > sh * iw) {
+            nsw = sh * iw / ih;
+        } else {
+            nsh = sw * ih / iw;
+        }
+
+        mDestRect.left = (sw - nsw) / 2;
+        mDestRect.top = (sh - nsh) / 2;
+        mDestRect.right = sw - mDestRect.left;
+        mDestRect.bottom = sh - mDestRect.top;
+
+        canvas.drawBitmap(bitmap, null, mDestRect, mPaint);
+    }
 }
index 7b0e019..3c53227 100644 (file)
@@ -18,17 +18,51 @@ package com.android.gallery3d.filtershow.presets;
 
 import android.graphics.Bitmap;
 import android.support.v8.renderscript.Allocation;
+import android.util.Log;
+
 import com.android.gallery3d.filtershow.cache.CachingPipeline;
 import com.android.gallery3d.filtershow.filters.FilterRepresentation;
 import com.android.gallery3d.filtershow.filters.FiltersManager;
 import com.android.gallery3d.filtershow.filters.ImageFilter;
 
+import java.lang.ref.WeakReference;
+import java.util.HashMap;
+
 public class FilterEnvironment {
+    private static final String LOGTAG = "FilterEnvironment";
     private ImagePreset mImagePreset;
     private float mScaleFactor;
     private int mQuality;
     private FiltersManager mFiltersManager;
     private CachingPipeline mCachingPipeline;
+    private HashMap<Long, WeakReference<Bitmap>>
+            bitmapCach = new HashMap<Long, WeakReference<Bitmap>>();
+
+    public void cache(Bitmap bitmap) {
+        if (bitmap == null) {
+            return;
+        }
+        Long key = calcKey(bitmap.getWidth(), bitmap.getHeight());
+        bitmapCach.put(key, new WeakReference<Bitmap>(bitmap));
+    }
+
+    public Bitmap getBitmap(int w, int h) {
+        Long key = calcKey(w, h);
+        WeakReference<Bitmap> ref = bitmapCach.remove(key);
+        Bitmap bitmap = null;
+        if (ref != null) {
+            bitmap = ref.get();
+        }
+        if (bitmap == null) {
+            bitmap = Bitmap.createBitmap(
+                    w, h, Bitmap.Config.ARGB_8888);
+        }
+        return bitmap;
+    }
+
+    private Long calcKey(long w, long h) {
+        return (w << 32) | (h << 32);
+    }
 
     public void setImagePreset(ImagePreset imagePreset) {
         mImagePreset = imagePreset;