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