OSDN Git Service

Fix segfaults in RS filters
authornicolasroard <nicolasroard@google.com>
Wed, 3 Apr 2013 05:22:37 +0000 (22:22 -0700)
committernicolasroard <nicolasroard@google.com>
Wed, 3 Apr 2013 05:22:37 +0000 (22:22 -0700)
We did not recreate the filters in all
cases when the input size change.

bug:8530112
Change-Id: I4cb47498532618271b90e56c01ec63ad991db787

src/com/android/gallery3d/filtershow/filters/ImageFilterRS.java

index 2aeaed8..a0523c1 100644 (file)
@@ -16,7 +16,6 @@
 
 package com.android.gallery3d.filtershow.filters;
 
-import android.app.Activity;
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
 import android.support.v8.renderscript.*;
@@ -28,6 +27,8 @@ import com.android.gallery3d.filtershow.cache.CachingPipeline;
 public abstract class ImageFilterRS extends ImageFilter {
     private static final String LOGTAG = "ImageFilterRS";
     private boolean DEBUG = false;
+    private int mLastInputWidth = 0;
+    private int mLastInputHeight = 0;
 
     private volatile boolean mResourcesLoaded = false;
 
@@ -65,11 +66,19 @@ public abstract class ImageFilterRS extends ImageFilter {
                 Log.v(LOGTAG, "apply filter " + getName() + " in pipeline " + pipeline.getName());
             }
             Resources rsc = pipeline.getResources();
+            boolean sizeChanged = false;
+            if (getInPixelsAllocation() != null
+                    && ((getInPixelsAllocation().getType().getX() != mLastInputWidth)
+                    || (getInPixelsAllocation().getType().getY() != mLastInputHeight))) {
+                sizeChanged = true;
+            }
             if (pipeline.prepareRenderscriptAllocations(bitmap)
-                    || !isResourcesLoaded()) {
+                    || !isResourcesLoaded() || sizeChanged) {
                 freeResources();
                 createFilter(rsc, scaleFactor, quality);
                 setResourcesLoaded(true);
+                mLastInputWidth = getInPixelsAllocation().getType().getX();
+                mLastInputHeight = getInPixelsAllocation().getType().getY();
             }
             bindScriptValues();
             runFilter();