14cead8034aab0e20e402baee87cbe9129db00192Stephen Hinespackage com.android.rs.refocus.d1new;
2de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang
34cead8034aab0e20e402baee87cbe9129db00192Stephen Hinesimport com.android.rs.refocus.BlurStack;
44cead8034aab0e20e402baee87cbe9129db00192Stephen Hinesimport com.android.rs.refocus.KernelDataForRenderScript;
54cead8034aab0e20e402baee87cbe9129db00192Stephen Hinesimport com.android.rs.refocus.LayerInfo;
64cead8034aab0e20e402baee87cbe9129db00192Stephen Hinesimport com.android.rs.refocus.MediaStoreSaver;
74cead8034aab0e20e402baee87cbe9129db00192Stephen Hinesimport com.android.rs.refocus.R;
84cead8034aab0e20e402baee87cbe9129db00192Stephen Hinesimport com.android.rs.refocus.RefocusFilter;
94cead8034aab0e20e402baee87cbe9129db00192Stephen Hinesimport com.android.rs.refocus.renderscript.ScriptC_layered_filter_fast_d1new;
10de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang
11de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wangimport android.graphics.Bitmap;
12de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wangimport android.support.v8.renderscript.Allocation;
13de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wangimport android.support.v8.renderscript.RenderScript;
14de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wangimport android.support.v8.renderscript.Script;
15de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wangimport android.util.Log;
16de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang/**
17de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang
18de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang/**
19de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang * An accelerated implementation of RefocusFilter using float32 as pixel
20de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang * representation. The corresponding RenderScript class is
21de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang * ScriptC_layered_filter_Fast. Integral image is used for the speedup.
22de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang *
23de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang * Example Usage:
24de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang *
25de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang * {@code RenderScript renderScript = RenderScript.create(context);}
26de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang * {@code RefocusFilterd1new rfFilter = new RefocusFilterd1new(renderScript);}
27de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang * {@code ProgressCallback progress;}
28de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang * {@code Bitmap result = rfFilter.compute(rgbdImage, blurStack, progress);}
29de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang *
30de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang * @author zhl@google.com (Li Zhang)
31de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang */
32de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wangpublic class RefocusFilterd1new extends
33de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    RefocusFilter<ScriptC_layered_filter_fast_d1new> {
34de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang  private static final String myTAG = "RefocusFilterd1new";
35de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang  private static final boolean ENABLE_FAST_FILTER = true;
36de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang  private static final float MIN_DISC_RADIUS_FOR_FAST_FILTER = 3;
37de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang  boolean useFastFilterForCurrentLayer = false;
38de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang  ImageBuffersForRenderScriptd1new buffers;
39de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang
40de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang  public RefocusFilterd1new(RenderScript rs) {
41de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    super(rs);
42de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang  }
43de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang
44de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang  @Override
45de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang  protected void initializeScriptAndBuffers(Bitmap inputImage,
46de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang      LayerInfo focalLayer) {
47de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    scriptC = new ScriptC_layered_filter_fast_d1new(renderScript);
48de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang
49de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    // Allocates, binds, and initializes buffers that interface between Java
50de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    // and Render Script.
51de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    // + 1 is for the boundary case of using integral image.
52de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    KernelDataForRenderScript.setUseNewRS(true);
53de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    int margin = KernelDataForRenderScript.getMaxKernelRadius() + 1;
54de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    buffers = new ImageBuffersForRenderScriptd1new(inputImage, margin,
55de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang        renderScript, scriptC);
56de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    buffers.initializeRenderScript(focalLayer, scriptC);
57de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang
58de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang  }
59de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang
60de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang  @Override
61de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang  protected Bitmap extractResultImage() {
62de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    // Extracts the result from .rs file to {@code buffers.outputImage} in Java.
63de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    long startnow;
64de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    long endnow;
65de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    startnow = System.nanoTime();
66de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    scriptC.forEach_PackOutputImage(buffers.outAllocation);
67de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    endnow = System.nanoTime();
68de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    Log.d(myTAG, "PackOutputImage: "+(endnow - startnow)+ " ns" );
69de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang
70de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    buffers.outAllocation.copyTo(buffers.outputImage);
71de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    return buffers.outputImage;
72de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang  }
73de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang
74de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang  /*
75de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang   * Utility Method to extract intermediatory result
76de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang   */
77de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang  private  void extractSharpImage(String name) {
78de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang
79de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    Bitmap mBitmap = Bitmap.createBitmap(buffers.inputImage.getWidth(),
80de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang            buffers.inputImage.getHeight(), Bitmap.Config.ARGB_8888);
81de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    Allocation mAllocation = Allocation.createFromBitmap(renderScript, mBitmap);
82de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    scriptC.forEach_PackSharpImage(mAllocation);
83de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang
84de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    mAllocation.copyTo(mBitmap);
85de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    MediaStoreSaver.savePNG(mBitmap, "sharpd1new", name, renderScript.getApplicationContext());
86de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang  }
87de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang  /*
88de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang   * Utility Method to extract intermediatory result
89de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang   */
90de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang  private  void extractFuzzyImage(String name) {
91de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang
92de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    Bitmap mBitmap = Bitmap.createBitmap(buffers.inputImage.getWidth(),
93de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang            buffers.inputImage.getHeight(), Bitmap.Config.ARGB_8888);
94de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    Allocation mAllocation = Allocation.createFromBitmap(renderScript, mBitmap);
95de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    scriptC.forEach_PackFuzzyImage(mAllocation);
96de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang
97de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    mAllocation.copyTo(mBitmap);
98de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    MediaStoreSaver.savePNG(mBitmap, "fuzzyd1new", name, renderScript.getApplicationContext());
99de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang  }
100de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang
101de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang  @Override
102de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang  protected void setTargetLayer(LayerInfo layerInfo) {
103de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    scriptC.invoke_SetTargetLayer(layerInfo.frontDepth, layerInfo.backDepth);
104de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang  }
105de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang
106de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang  @Override
107de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang  protected void setBlendInfo(int dilationRadius) {
108de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    scriptC.invoke_SetBlendInfo(dilationRadius);
109de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang  }
110de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang
111de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang  @Override
112de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang  protected void setKernelData(int targetLayer, BlurStack blurStack) {
113de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    KernelDataForRenderScriptd1new kernelData =
114de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang        new KernelDataForRenderScriptd1new(targetLayer, blurStack, renderScript);
115de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang
116de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    if (ENABLE_FAST_FILTER
117de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang        && kernelData.minDiskRadius > MIN_DISC_RADIUS_FOR_FAST_FILTER) {
118de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang      useFastFilterForCurrentLayer = true;
119de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    } else {
120de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang      useFastFilterForCurrentLayer = false;
121de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    }
122de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    scriptC.set_g_kernel_stack(kernelData.stackAllocation);
123de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    scriptC.set_galloc_kernel_info(kernelData.infoAllocation);
124de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang  }
125de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang
126de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang  @Override
127de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang  protected void computeLayerMatteBehindFocalDepth() {
128de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    // Marks active pixels (pixels that are on this target layer);
129de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    // Marks adjacent pixels that are close enough to active pixels;
130de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    long startnow;
131de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    long endnow;
132de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang
133de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    startnow = System.nanoTime();
134de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    //scriptC.forEach_MarkLayerMask(buffers.inAllocation);
135de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    // Pass sharp meta allocation directly into the kernel
136de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    scriptC.forEach_MarkLayerMaskPassInput(buffers.sharpActualDepthAllocation, buffers.sharpDilatedDepthAllocation);
137de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    endnow = System.nanoTime();
138de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    Log.d(myTAG, "MarkLayerMask: "+(endnow - startnow)+ " ns" );
139de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang
140de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    startnow = System.nanoTime();
141de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    //scriptC.forEach_ComputeLayerMatteBehindFocalDepth(buffers.inAllocation);
142de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    // Pass g_sharp_meta into kernel and get updated g_sharp_meta
143de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    scriptC.forEach_ComputeLayerMatteBehindFocalDepthPassInput(buffers.sharpDilatedDepthAllocation, buffers.sharpDilatedDepthAllocation);
144de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    endnow = System.nanoTime();
145de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    Log.d(myTAG, "ComputeLayerMatteBehindFocalDepth: "+(endnow - startnow)+ " ns" );
146de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang  }
147de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang
148de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang  @Override
149de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang  protected void filterLayerBehindFocalDepth() {
150de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    // Filters the target layer and saves the result to {@code g_accum_map} in
151de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    // .rs file.
152de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    long startnow;
153de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    long endnow;
154de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang
155de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    if (useFastFilterForCurrentLayer) {
156de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang      scriptC.invoke_SetUseIntegralImage(1);
157de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang      Script.LaunchOptions launchOptions = new Script.LaunchOptions();
158de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang      launchOptions.setX(0, 1);
159de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang      launchOptions.setY(0, buffers.inputImage.getHeight());
160de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang
161de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang      startnow = System.nanoTime();
162de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang      scriptC.forEach_ComputeIntegralImageForLayerBehindFocalDepth(
163de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang          buffers.inAllocation, launchOptions);
164de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang      endnow = System.nanoTime();
165de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang      Log.d(myTAG, "ComputeIntegralImageForLayerBehindFocalDepth: "+(endnow - startnow)+ " ns" );
166de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    } else {
167de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang      scriptC.invoke_SetUseIntegralImage(0);
168de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    }
169de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang
170de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    startnow = System.nanoTime();
171de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    //scriptC.forEach_FilterLayerBehindFocalDepth(buffers.inAllocation);
172de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    // Pass g_fuzzy_RGBA into kernel and get g_fuzzy_RGBA as output
173de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    scriptC.forEach_FilterLayerBehindFocalDepthPassInput(buffers.fuzzyRGBAAllocation, buffers.fuzzyRGBAAllocation);
174de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    endnow = System.nanoTime();
175de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    Log.d(myTAG, "FilterLayerBehindFocalDepth: "+(endnow - startnow)+ " ns" );
176de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    //extractFuzzyImage("fuzzy_behind");
177de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    //extractSharpImage("sharp_behind");
178de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang  }
179de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang
180de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang  @Override
181de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang  protected void updateSharpImageUsingFuzzyImage() {
182de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    long startnow;
183de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    long endnow;
184de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang
185de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    startnow = System.nanoTime();
186de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang
187de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    //scriptC.forEach_UpdateSharpImageUsingFuzzyImage(buffers.inAllocation);
188de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    // Pass input and output version of UpdateSharpImageUsingFuzzyImage
189de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang		scriptC.forEach_UpdateSharpUsingFuzzyPassInput(buffers.sharpDilatedDepthAllocation, buffers.sharpDilatedDepthAllocation);
190de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang
191de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang		endnow = System.nanoTime();
192de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang		Log.d(myTAG, "updateSharpImageUsingFuzzyImage: "+(endnow - startnow)+ " ns" );
193de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    //extractSharpImage("sharp_update");
194de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang  }
195de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang
196de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang
197de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang  @Override
198de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang  protected void computeLayerMatteInFrontOfFocalDepth() {
199de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    // Marks active pixels (pixels that are on this target layer);
200de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    // Marks adjacent pixels that are close enough to active pixels;
201de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    long startnow;
202de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    long endnow;
203de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang
204de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    startnow = System.nanoTime();
205de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    //scriptC.forEach_MarkLayerMask(buffers.inAllocation);
206de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    // Pass sharp meta allocation directly into the kernel
207de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    scriptC.forEach_MarkLayerMaskPassInput(buffers.sharpActualDepthAllocation, buffers.sharpDilatedDepthAllocation);
208de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    endnow = System.nanoTime();
209de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    Log.d(myTAG, "MarkLayerMask: "+(endnow - startnow)+ " ns" );
210de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang
211de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    startnow = System.nanoTime();
212de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    //scriptC.forEach_ComputeLayerMatteInFrontOfFocalDepth(buffers.inAllocation);
213de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    // Pass g_sharp_meta and g_fuzzy_RGBA directly into the kernel
214de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    scriptC.forEach_ComputeLayerMatteInFrontOfFocalDepthPassInput(buffers.sharpDilatedDepthAllocation, buffers.sharpDilatedDepthAllocation);
215de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    endnow = System.nanoTime();
216de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    Log.d(myTAG, "ComputeLayerMatteInFrontOfFocalDepth: "+(endnow - startnow)+ " ns" );
217de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang  }
218de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang
219de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang  @Override
220de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang  protected void filterLayerInFrontOfFocalDepth() {
221de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    // Filters the target layer and accumulates the result to {@code
222de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    // g_accum_map} in .rs file.
223de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    long startnow;
224de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    long endnow;
225de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    if (useFastFilterForCurrentLayer) {
226de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang      scriptC.invoke_SetUseIntegralImage(1);
227de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang      Script.LaunchOptions launchOptions = new Script.LaunchOptions();
228de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang      launchOptions.setX(0, 1);
229de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang      launchOptions.setY(0, buffers.inputImage.getHeight());
230de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang
231de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang      startnow = System.nanoTime();
232de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang      scriptC.forEach_ComputeIntegralImageForLayerInFrontOfFocalDepth(
233de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang          buffers.inAllocation, launchOptions);
234de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang      endnow = System.nanoTime();
235de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang      Log.d(myTAG, "ComputeIntegralImageForLayerInFrontOfFocalDepth: "+(endnow - startnow)+ " ns" );
236de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    } else {
237de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang      scriptC.invoke_SetUseIntegralImage(0);
238de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    }
239de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    startnow = System.nanoTime();
240de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    //scriptC.forEach_FilterLayerInFrontOfFocalDepth(buffers.inAllocation);
241de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    // Pass g_sharp_dilated_depth into kernel and get g_fuzzy_RGBA as output
242de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    scriptC.forEach_FilterLayerInFrontOfFocalDepthPassInput(buffers.sharpDilatedDepthAllocation, buffers.sharpDilatedDepthAllocation);
243de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    endnow = System.nanoTime();
244de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    Log.d(myTAG, "FilterLayerInFrontOfFocalDepth: "+(endnow - startnow)+ " ns" );
245de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang
246de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    //extractFuzzyImage("fuzzy_front");
247de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    //extractSharpImage("sharp_front");
248de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang  }
249de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang
250de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang  @Override
251de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang  protected void finalizeFuzzyImageUsingSharpImage() {
252de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    // Blends {@code g_accum_map} and {@code g_focus_map} in .rs file.
253de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    // Saves the result in {@code g_accum_map}.
254de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    long startnow;
255de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    long endnow;
256de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    startnow = System.nanoTime();
257de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    scriptC.forEach_FinalizeFuzzyImageUsingSharpImage(buffers.inAllocation);
258de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    //scriptC.forEach_FinalizeFuzzyImageUsingSharpImagePassInput(buffers.sharpActualDepthAllocation, buffers.fuzzyRGBAAllocation);
259de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    endnow = System.nanoTime();
260de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    Log.d(myTAG, "finalizeFuzzyImageUsingSharpImage: "+(endnow - startnow)+ " ns" );
261de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang  }
262de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang}
263