OSDN Git Service

Make Gallery2 use platform RenderScript
[android-x86/packages-apps-Gallery2.git] / src / com / android / gallery3d / filtershow / pipeline / CachingPipeline.java
index 823da64..2923e3b 100644 (file)
@@ -19,10 +19,16 @@ package com.android.gallery3d.filtershow.pipeline;
 import android.content.Context;
 import android.content.res.Resources;
 import android.graphics.Bitmap;
-import android.support.v8.renderscript.Allocation;
-import android.support.v8.renderscript.RenderScript;
+import android.graphics.Canvas;
+import android.graphics.Matrix;
+import android.graphics.Paint;
+import android.graphics.Rect;
+import android.graphics.RectF;
+import android.renderscript.Allocation;
+import android.renderscript.RenderScript;
 import android.util.Log;
 
+import com.android.gallery3d.filtershow.cache.BitmapCache;
 import com.android.gallery3d.filtershow.cache.ImageLoader;
 import com.android.gallery3d.filtershow.filters.FilterRepresentation;
 import com.android.gallery3d.filtershow.filters.FiltersManager;
@@ -177,6 +183,9 @@ public class CachingPipeline implements PipelineInterface {
     }
 
     private synchronized boolean updateOriginalAllocation(ImagePreset preset) {
+        if (preset == null) {
+            return false;
+        }
         Bitmap originalBitmap = mOriginalBitmap;
 
         if (originalBitmap == null) {
@@ -214,7 +223,7 @@ public class CachingPipeline implements PipelineInterface {
             if (bitmap == null) {
                 return;
             }
-            bitmap = mEnvironment.getBitmapCopy(bitmap);
+            bitmap = mEnvironment.getBitmapCopy(bitmap, BitmapCache.HIGHRES);
             bitmap = preset.applyGeometry(bitmap, mEnvironment);
 
             mEnvironment.setQuality(FilterEnvironment.QUALITY_PREVIEW);
@@ -239,7 +248,7 @@ public class CachingPipeline implements PipelineInterface {
             if (bitmap == null) {
                 return;
             }
-            bitmap = mEnvironment.getBitmapCopy(bitmap);
+            bitmap = mEnvironment.getBitmapCopy(bitmap, BitmapCache.GEOMETRY);
             bitmap = preset.applyGeometry(bitmap, mEnvironment);
             if (!mEnvironment.needsStop()) {
                 request.setBitmap(bitmap);
@@ -261,7 +270,7 @@ public class CachingPipeline implements PipelineInterface {
             if (bitmap == null) {
                 return;
             }
-            bitmap = mEnvironment.getBitmapCopy(bitmap);
+            bitmap = mEnvironment.getBitmapCopy(bitmap, BitmapCache.FILTERS);
             bitmap = preset.apply(bitmap, mEnvironment);
             if (!mEnvironment.needsStop()) {
                 request.setBitmap(bitmap);
@@ -278,7 +287,8 @@ public class CachingPipeline implements PipelineInterface {
             if (getRenderScriptContext() == null) {
                 return;
             }
-            if (((request.getType() != RenderingRequest.PARTIAL_RENDERING)
+            if ((request.getType() != RenderingRequest.PARTIAL_RENDERING
+                  && request.getType() != RenderingRequest.ICON_RENDERING
                     && request.getBitmap() == null)
                     || request.getImagePreset() == null) {
                 return;
@@ -296,7 +306,7 @@ public class CachingPipeline implements PipelineInterface {
             if (request.getType() == RenderingRequest.PARTIAL_RENDERING) {
                 MasterImage master = MasterImage.getImage();
                 bitmap = ImageLoader.getScaleOneImageForPreset(master.getActivity(),
-                        mEnvironment,
+                        mEnvironment.getBimapCache(),
                         master.getUri(), request.getBounds(),
                         request.getDestination());
                 if (bitmap == null) {
@@ -311,7 +321,7 @@ public class CachingPipeline implements PipelineInterface {
                 updateOriginalAllocation(preset);
             }
 
-            if (DEBUG) {
+            if (DEBUG && bitmap != null) {
                 Log.v(LOGTAG, "after update, req bitmap (" + bitmap.getWidth() + "x" + bitmap.getHeight()
                         + " ? resizeOriginal (" + mResizedOriginalBitmap.getWidth() + "x"
                         + mResizedOriginalBitmap.getHeight());
@@ -336,6 +346,29 @@ public class CachingPipeline implements PipelineInterface {
                     mEnvironment.setQuality(FilterEnvironment.QUALITY_PREVIEW);
                 }
 
+                if (request.getType() == RenderingRequest.ICON_RENDERING) {
+                    Rect iconBounds = request.getIconBounds();
+                    Bitmap source = MasterImage.getImage().getThumbnailBitmap();
+                    if (iconBounds.width() > source.getWidth() * 2) {
+                        source = MasterImage.getImage().getLargeThumbnailBitmap();
+                    }
+                    if (iconBounds != null) {
+                        bitmap = mEnvironment.getBitmap(iconBounds.width(),
+                                iconBounds.height(), BitmapCache.ICON);
+                        Canvas canvas = new Canvas(bitmap);
+                        Matrix m = new Matrix();
+                        float minSize = Math.min(source.getWidth(), source.getHeight());
+                        float maxSize = Math.max(iconBounds.width(), iconBounds.height());
+                        float scale = maxSize / minSize;
+                        m.setScale(scale, scale);
+                        float dx = (iconBounds.width() - (source.getWidth() * scale))/2.0f;
+                        float dy = (iconBounds.height() - (source.getHeight() * scale))/2.0f;
+                        m.postTranslate(dx, dy);
+                        canvas.drawBitmap(source, m, new Paint(Paint.FILTER_BITMAP_FLAG));
+                    } else {
+                        bitmap = mEnvironment.getBitmapCopy(source, BitmapCache.ICON);
+                    }
+                }
                 Bitmap bmp = preset.apply(bitmap, mEnvironment);
                 if (!mEnvironment.needsStop()) {
                     request.setBitmap(bmp);
@@ -391,57 +424,6 @@ public class CachingPipeline implements PipelineInterface {
         mEnvironment.cache(result);
     }
 
-    public synchronized void computeOld(SharedBuffer buffer, ImagePreset preset, int type) {
-        synchronized (CachingPipeline.class) {
-            if (getRenderScriptContext() == null) {
-                return;
-            }
-            if (DEBUG) {
-                Log.v(LOGTAG, "compute preset " + preset);
-                preset.showFilters();
-            }
-
-            String thread = Thread.currentThread().getName();
-            long time = System.currentTimeMillis();
-            setupEnvironment(preset, false);
-            mFiltersManager.freeFilterResources(preset);
-
-            Bitmap resizedOriginalBitmap = mResizedOriginalBitmap;
-            if (updateOriginalAllocation(preset) || buffer.getProducer() == null) {
-                resizedOriginalBitmap = mResizedOriginalBitmap;
-                buffer.setProducer(resizedOriginalBitmap);
-                mEnvironment.cache(buffer.getProducer());
-            }
-
-            Bitmap bitmap = buffer.getProducer().getBitmap();
-            long time2 = System.currentTimeMillis();
-
-            if (bitmap == null || (bitmap.getWidth() != resizedOriginalBitmap.getWidth())
-                    || (bitmap.getHeight() != resizedOriginalBitmap.getHeight())) {
-                mEnvironment.cache(buffer.getProducer());
-                buffer.setProducer(resizedOriginalBitmap);
-                bitmap = buffer.getProducer().getBitmap();
-            }
-            mOriginalAllocation.copyTo(bitmap);
-
-            Bitmap tmpbitmap = preset.apply(bitmap, mEnvironment);
-            if (tmpbitmap != bitmap) {
-                mEnvironment.cache(buffer.getProducer());
-                buffer.setProducer(tmpbitmap);
-            }
-
-            mFiltersManager.freeFilterResources(preset);
-
-            time = System.currentTimeMillis() - time;
-            time2 = System.currentTimeMillis() - time2;
-            if (DEBUG) {
-                Log.v(LOGTAG, "Applying type " + type + " filters to bitmap "
-                        + bitmap + " (" + bitmap.getWidth() + " x " + bitmap.getHeight()
-                        + ") took " + time + " ms, " + time2 + " ms for the filter, on thread " + thread);
-            }
-        }
-    }
-
     public boolean needsRepaint() {
         SharedBuffer buffer = MasterImage.getImage().getPreviewBuffer();
         return buffer.checkRepaintNeeded();