1 package com.android.rs.refocus; 2 3 import com.android.rs.refocus.d1new.RefocusFilterd1new; 4 import com.android.rs.refocus.f32.RefocusFilterF32; 5 6 import android.graphics.Bitmap; 7 import android.support.v8.renderscript.RenderScript; 8 import android.util.Log; 9 10 11 /** 12 * An wrapper class that calls the refocus filtering function in 13 * {@code RefocusFilter} class. The class also contains several default 14 * parameters that are used in calling the refocus filtering function. 15 * 16 * Example usage: 17 * 18 * {@code DepthOfFieldOptions options;} 19 * {@code RenderScriptTask renderScriptTask;} 20 * {@code Bitmap result = renderScriptTask.applyRefocusFilter(options);} 21 * 22 * @author zhl@google.com (Li Zhang) 23 */ 24 public class RenderScriptTask { 25 enum script{f32, d1new}; 26 /** 27 * A flag to choose the version of RenderScript. 28 */ 29 private script mScript = script.d1new; 30 31 /** 32 * An enum for the different types of Render Script tasks. (generated by zhl) 33 */ 34 public enum Purpose { 35 VIEWER, SERVICE 36 } 37 38 //private static final Log.Tag TAG = new Log.Tag("RenderScriptTask"); 39 private static final String TAG = "RenderScriptTask"; 40 /** 41 * Number of blending layers in which the quantized depth levels are grouped. 42 */ 43 private static final int NUM_BLENDING_LAYERS = 8; 44 45 /** 46 * An object that records the blur disk radius for each quantized inverse 47 * depth level and how all the depth levels are grouped into blending layers. 48 */ 49 public BlurStack blurStack; 50 51 /** 52 * An image in which each pixel has red, green, blue, and quantized inverse 53 * depth level. The quantized inverse depth levels range from 1 to 54 * {@code BlurStack.MAX_DEPTH}. 0 is reserved for padding pixels. 55 * 56 * <b> The pixels with larger depth values are closer to the camera. 57 */ 58 private Bitmap rgbdImage; 59 60 /** 61 * The Render Script context that is required to construct the filter. 62 */ 63 private RenderScript renderScript; 64 65 /** 66 * A constructor of render script context. 67 * 68 * @param renderScript RenderScript context. 69 */ RenderScriptTask(RenderScript renderScript, script sChoice)70 public RenderScriptTask(RenderScript renderScript, script sChoice) { 71 this.renderScript = renderScript; 72 this.mScript = sChoice; 73 } 74 75 /** 76 * A function that computes a refocused image from an instance of 77 * {@code DepthOfFieldOptions}. 78 * 79 * @param options an object contains color image, depth map, focal depth, and 80 * the amount of desired blur ({@code blurInfinity}) 81 * @return the refocus filtering result 82 */ applyRefocusFilter(DepthOfFieldOptions options)83 public Bitmap applyRefocusFilter(DepthOfFieldOptions options) { 84 long startTime = System.currentTimeMillis(); 85 86 // Generates {@code rgbdImage} and {@code blurStack}. 87 prepareRefocusFilter(options); 88 Bitmap outputImage = null; 89 // Check which version of RenderScript code is used. 90 switch (mScript) { 91 case f32: 92 RefocusFilterF32 rfFilterF32 = new RefocusFilterF32(renderScript); 93 outputImage = 94 rfFilterF32.compute(rgbdImage, blurStack); 95 break; 96 case d1new: 97 RefocusFilterd1new rfFilterd1new = new RefocusFilterd1new(renderScript); 98 outputImage = 99 rfFilterd1new.compute(rgbdImage, blurStack); 100 break; 101 } 102 103 long endTime = System.currentTimeMillis(); 104 float duration = (endTime - startTime); 105 Log.d(TAG, "applyRefocusFilter is finished in " + (duration / 1000.0f) 106 + " seconds"); 107 108 return outputImage; 109 } 110 111 /** 112 * A function that computes {@code rgbdImage} and {@code blurStack} from an 113 * instance of {@code DepthOfFieldOptions}. 114 * 115 * @param options an object contains color image, depth map, focal depth, and 116 * the amount of desired blur ({@code blurInfinity}). 117 */ prepareRefocusFilter(DepthOfFieldOptions options)118 private void prepareRefocusFilter(DepthOfFieldOptions options) { 119 blurStack = BlurStack.createFromDepthTransform( 120 options.rgbz.getDepthTransform(), options.focalDepth, 121 options.depthOfField, options.blurInfinity, NUM_BLENDING_LAYERS); 122 123 rgbdImage = options.rgbz.getBitmap(); 124 } 125 } 126