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