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();
68fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni    logTiming(myTAG, "PackOutputImage", endnow - startnow);
69de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang
70fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni    startnow = System.nanoTime();
71de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    buffers.outAllocation.copyTo(buffers.outputImage);
72fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni    endnow = System.nanoTime();
73fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni    logTiming(myTAG, "CopyOutputImage", endnow - startnow);
74fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni
75de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    return buffers.outputImage;
76de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang  }
77de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang
78de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang  /*
79de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang   * Utility Method to extract intermediatory result
80de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang   */
81de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang  private  void extractSharpImage(String name) {
82de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang
83de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    Bitmap mBitmap = Bitmap.createBitmap(buffers.inputImage.getWidth(),
84de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang            buffers.inputImage.getHeight(), Bitmap.Config.ARGB_8888);
85de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    Allocation mAllocation = Allocation.createFromBitmap(renderScript, mBitmap);
86de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    scriptC.forEach_PackSharpImage(mAllocation);
87de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang
88de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    mAllocation.copyTo(mBitmap);
89de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    MediaStoreSaver.savePNG(mBitmap, "sharpd1new", name, renderScript.getApplicationContext());
90de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang  }
91de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang  /*
92de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang   * Utility Method to extract intermediatory result
93de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang   */
94de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang  private  void extractFuzzyImage(String name) {
95de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang
96de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    Bitmap mBitmap = Bitmap.createBitmap(buffers.inputImage.getWidth(),
97de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang            buffers.inputImage.getHeight(), Bitmap.Config.ARGB_8888);
98de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    Allocation mAllocation = Allocation.createFromBitmap(renderScript, mBitmap);
99de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    scriptC.forEach_PackFuzzyImage(mAllocation);
100de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang
101de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    mAllocation.copyTo(mBitmap);
102de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    MediaStoreSaver.savePNG(mBitmap, "fuzzyd1new", name, renderScript.getApplicationContext());
103de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang  }
104de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang
105de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang  @Override
106de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang  protected void setTargetLayer(LayerInfo layerInfo) {
107de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    scriptC.invoke_SetTargetLayer(layerInfo.frontDepth, layerInfo.backDepth);
108de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang  }
109de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang
110de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang  @Override
111de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang  protected void setBlendInfo(int dilationRadius) {
112de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    scriptC.invoke_SetBlendInfo(dilationRadius);
113de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang  }
114de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang
115de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang  @Override
116de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang  protected void setKernelData(int targetLayer, BlurStack blurStack) {
117de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    KernelDataForRenderScriptd1new kernelData =
118de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang        new KernelDataForRenderScriptd1new(targetLayer, blurStack, renderScript);
119de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang
120de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    if (ENABLE_FAST_FILTER
121de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang        && kernelData.minDiskRadius > MIN_DISC_RADIUS_FOR_FAST_FILTER) {
122de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang      useFastFilterForCurrentLayer = true;
123de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    } else {
124de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang      useFastFilterForCurrentLayer = false;
125de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    }
126de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    scriptC.set_g_kernel_stack(kernelData.stackAllocation);
127de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    scriptC.set_galloc_kernel_info(kernelData.infoAllocation);
128de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang  }
129de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang
130de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang  @Override
131de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang  protected void computeLayerMatteBehindFocalDepth() {
132de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    // Marks active pixels (pixels that are on this target layer);
133de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    // Marks adjacent pixels that are close enough to active pixels;
134de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    long startnow;
135de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    long endnow;
136de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang
137de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    startnow = System.nanoTime();
138de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    //scriptC.forEach_MarkLayerMask(buffers.inAllocation);
139de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    // Pass sharp meta allocation directly into the kernel
140fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni    scriptC.forEach_MarkLayerMaskPassInput(buffers.sharpActualDepthAllocation);
141de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    endnow = System.nanoTime();
142fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni    logTiming(myTAG, "MarkLayerMask", endnow - startnow);
143de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang
144de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    startnow = System.nanoTime();
145de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    //scriptC.forEach_ComputeLayerMatteBehindFocalDepth(buffers.inAllocation);
146de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    // Pass g_sharp_meta into kernel and get updated g_sharp_meta
147de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    scriptC.forEach_ComputeLayerMatteBehindFocalDepthPassInput(buffers.sharpDilatedDepthAllocation, buffers.sharpDilatedDepthAllocation);
148de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    endnow = System.nanoTime();
149fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni    logTiming(myTAG, "ComputeLayerMatteBehindFocalDepth", endnow - startnow);
150de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang  }
151de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang
152de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang  @Override
153de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang  protected void filterLayerBehindFocalDepth() {
154de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    // Filters the target layer and saves the result to {@code g_accum_map} in
155de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    // .rs file.
156de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    long startnow;
157de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    long endnow;
158de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang
159de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    if (useFastFilterForCurrentLayer) {
160de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang      scriptC.invoke_SetUseIntegralImage(1);
161de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang      Script.LaunchOptions launchOptions = new Script.LaunchOptions();
162de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang      launchOptions.setX(0, 1);
163de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang      launchOptions.setY(0, buffers.inputImage.getHeight());
164de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang
165de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang      startnow = System.nanoTime();
166de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang      scriptC.forEach_ComputeIntegralImageForLayerBehindFocalDepth(
167de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang          buffers.inAllocation, launchOptions);
168de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang      endnow = System.nanoTime();
169fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni      logTiming(myTAG, "ComputeIntegralImageForLayerBehindFocalDepth", endnow - startnow);
170de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    } else {
171de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang      scriptC.invoke_SetUseIntegralImage(0);
172de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    }
173de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang
174de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    startnow = System.nanoTime();
175de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    //scriptC.forEach_FilterLayerBehindFocalDepth(buffers.inAllocation);
176de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    // Pass g_fuzzy_RGBA into kernel and get g_fuzzy_RGBA as output
177de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    scriptC.forEach_FilterLayerBehindFocalDepthPassInput(buffers.fuzzyRGBAAllocation, buffers.fuzzyRGBAAllocation);
178de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    endnow = System.nanoTime();
179fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni    logTiming(myTAG, "FilterLayerBehindFocalDepth", endnow - startnow);
180fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni
181de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    //extractFuzzyImage("fuzzy_behind");
182de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    //extractSharpImage("sharp_behind");
183de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang  }
184de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang
185de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang  @Override
186de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang  protected void updateSharpImageUsingFuzzyImage() {
187de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    long startnow;
188de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    long endnow;
189de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang
190de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    startnow = System.nanoTime();
191de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang
192de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    //scriptC.forEach_UpdateSharpImageUsingFuzzyImage(buffers.inAllocation);
193de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    // Pass input and output version of UpdateSharpImageUsingFuzzyImage
194fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni    scriptC.forEach_UpdateSharpUsingFuzzyPassInput(buffers.sharpDilatedDepthAllocation, buffers.sharpDilatedDepthAllocation);
195fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni    endnow = System.nanoTime();
196fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni    logTiming(myTAG, "UpdateSharpImageUsingFuzzyImage", endnow - startnow);
197de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang
198de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    //extractSharpImage("sharp_update");
199de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang  }
200de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang
201de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang
202de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang  @Override
203de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang  protected void computeLayerMatteInFrontOfFocalDepth() {
204de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    // Marks active pixels (pixels that are on this target layer);
205de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    // Marks adjacent pixels that are close enough to active pixels;
206de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    long startnow;
207de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    long endnow;
208de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang
209de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    startnow = System.nanoTime();
210de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    //scriptC.forEach_MarkLayerMask(buffers.inAllocation);
211de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    // Pass sharp meta allocation directly into the kernel
212fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni    scriptC.forEach_MarkLayerMaskPassInput(buffers.sharpActualDepthAllocation);
213de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    endnow = System.nanoTime();
214fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni    logTiming(myTAG, "MarkLayerMask", endnow - startnow);
215de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang
216de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    startnow = System.nanoTime();
217de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    //scriptC.forEach_ComputeLayerMatteInFrontOfFocalDepth(buffers.inAllocation);
218de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    // Pass g_sharp_meta and g_fuzzy_RGBA directly into the kernel
219de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    scriptC.forEach_ComputeLayerMatteInFrontOfFocalDepthPassInput(buffers.sharpDilatedDepthAllocation, buffers.sharpDilatedDepthAllocation);
220de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    endnow = System.nanoTime();
221fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni    logTiming(myTAG, "ComputeLayerMatteInFrontOfFocalDepth", endnow - startnow);
222de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang  }
223de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang
224de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang  @Override
225de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang  protected void filterLayerInFrontOfFocalDepth() {
226de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    // Filters the target layer and accumulates the result to {@code
227de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    // g_accum_map} in .rs file.
228de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    long startnow;
229de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    long endnow;
230de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    if (useFastFilterForCurrentLayer) {
231de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang      scriptC.invoke_SetUseIntegralImage(1);
232de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang      Script.LaunchOptions launchOptions = new Script.LaunchOptions();
233de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang      launchOptions.setX(0, 1);
234de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang      launchOptions.setY(0, buffers.inputImage.getHeight());
235de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang
236de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang      startnow = System.nanoTime();
237de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang      scriptC.forEach_ComputeIntegralImageForLayerInFrontOfFocalDepth(
238de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang          buffers.inAllocation, launchOptions);
239de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang      endnow = System.nanoTime();
240fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni      logTiming(myTAG, "ComputeIntegralImageForLayerInFrontOfFocalDepth", endnow - startnow);
241de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    } else {
242de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang      scriptC.invoke_SetUseIntegralImage(0);
243de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    }
244de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    startnow = System.nanoTime();
245de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    //scriptC.forEach_FilterLayerInFrontOfFocalDepth(buffers.inAllocation);
246de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    // Pass g_sharp_dilated_depth into kernel and get g_fuzzy_RGBA as output
247de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    scriptC.forEach_FilterLayerInFrontOfFocalDepthPassInput(buffers.sharpDilatedDepthAllocation, buffers.sharpDilatedDepthAllocation);
248de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    endnow = System.nanoTime();
249fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni    logTiming(myTAG, "FilterLayerInFrontOfFocalDepth", endnow - startnow);
250de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang
251de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    //extractFuzzyImage("fuzzy_front");
252de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    //extractSharpImage("sharp_front");
253de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang  }
254de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang
255de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang  @Override
256de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang  protected void finalizeFuzzyImageUsingSharpImage() {
257de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    // Blends {@code g_accum_map} and {@code g_focus_map} in .rs file.
258de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    // Saves the result in {@code g_accum_map}.
259de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    long startnow;
260de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    long endnow;
261de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    startnow = System.nanoTime();
262de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    scriptC.forEach_FinalizeFuzzyImageUsingSharpImage(buffers.inAllocation);
263de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    //scriptC.forEach_FinalizeFuzzyImageUsingSharpImagePassInput(buffers.sharpActualDepthAllocation, buffers.fuzzyRGBAAllocation);
264de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    endnow = System.nanoTime();
265fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni    logTiming(myTAG, "FinalizeFuzzyImageUsingSharpImage", endnow - startnow);
266de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang  }
267de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang}
268