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