Slide 1

Slide 1 text

RenderScript + Blur Wasabeef

Slide 2

Slide 2 text

About Me @wasabeef_jp CyberAgent, Inc.

Slide 3

Slide 3 text

RenderScript?

Slide 4

Slide 4 text

RenderScript? ɾAPI Level 11 (Support Library v8) ɾUsing C99 lang (RenderScript Kernel) ɾUsing Java API ɾImage Processing ɾBlur … etc

Slide 5

Slide 5 text

RenderScript Kernel? blur.rs LLVM RS CC blur.bc ScriptC_blur .java ScriptField_point .java

Slide 6

Slide 6 text

RenderScript Intrinsics ɾScriptIntrinsicConvolve3x3 ɾScriptIntrinsicConvolve5x5 ɾScriptIntrinsicBlur ɾScriptIntrinsicYuvToRGB ɾScriptIntrinsicColorMatrix ɾScriptIntrinsicBlend ɾScriptIntrinsicLUT ɾScriptIntrinsic3DLUT

Slide 7

Slide 7 text

RenderScript Settings

Slide 8

Slide 8 text

Gradle android { compileSdkVersion 23 buildToolsVersion “23.0.1” defaultConfig { minSdkVersion 23 targetSdkVersion 23 renderscriptTargetApi 23 renderscriptSupportModeEnabled true } }

Slide 9

Slide 9 text

Gradle android { compileSdkVersion 23 buildToolsVersion “23.0.1” defaultConfig { minSdkVersion 23 targetSdkVersion 23 renderscriptTargetApi 23 renderscriptSupportModeEnabled true } }

Slide 10

Slide 10 text

Blur?

Slide 11

Slide 11 text

Blur

Slide 12

Slide 12 text

Algorithms ɾRS Gaussian Fast (ScriptIntrinsicBlur) ɾRS Box, Gaussian 5x5 (ScriptIntrinsicConvolve5x5) ɾStack Blur ɾGaussian Fast Blur ɾBox Blur

Slide 13

Slide 13 text

Gaussian Blur (Java) public static void blur(Bitmap bmp, int radius) {
 int w = bmp.getWidth();
 int h = bmp.getHeight();
 int[] pix = new int[w * h];
 bmp.getPixels(pix, 0, w, 0, 0, w, h);
 
 for (int r = radius; r >= 1; r /= 2) {
 for (int i = r; i < h - r; i++) {
 for (int j = r; j < w - r; j++) {
 int tl = pix[(i - r) * w + j - r];
 int tr = pix[(i - r) * w + j + r];
 int tc = pix[(i - r) * w + j];
 int bl = pix[(i + r) * w + j - r];
 int br = pix[(i + r) * w + j + r];
 int bc = pix[(i + r) * w + j];
 int cl = pix[i * w + j - r];
 int cr = pix[i * w + j + r];
 
 pix[(i * w) + j] = 0xFF000000 |
 (((tl & 0xFF) + (tr & 0xFF) + (tc & 0xFF) + (bl & 0xFF) + (br & 0xFF) + (bc & 0xFF)
 + (cl & 0xFF) + (cr & 0xFF)) >> 3) & 0xFF |
 (((tl & 0xFF00) + (tr & 0xFF00) + (tc & 0xFF00) + (bl & 0xFF00) + (br & 0xFF00) + (bc
 & 0xFF00) + (cl & 0xFF00) + (cr & 0xFF00)) >> 3) & 0xFF00 |
 (((tl & 0xFF0000) + (tr & 0xFF0000) + (tc & 0xFF0000) + (bl & 0xFF0000) + (br
 & 0xFF0000) + (bc & 0xFF0000) + (cl & 0xFF0000) + (cr & 0xFF0000)) >> 3)
 & 0xFF0000;
 }
 }
 }
 bmp.setPixels(pix, 0, w, 0, 0, w, h);
 }

Slide 14

Slide 14 text

RS Gaussian Blur (Java) public static void blur(Bitmap src, int radius) { RenderScript rs = RenderScript.create(context);
 Allocation input = Allocation.createFromBitmap(rs, src); Allocation output = Allocation.createTyped(rs, input.getType()); ScriptIntrinsicBlur script = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs)); script.setRadius(radius); script.setInput(input); script.forEach(output); output.copyTo(src);
 rs.destroy(); }

Slide 15

Slide 15 text

RenderScript public static void blur(Bitmap src, int radius) { RenderScript rs = RenderScript.create(context);
 Allocation input = Allocation.createFromBitmap(rs, src); Allocation output = Allocation.createTyped(rs, input.getType()); ScriptIntrinsicBlur script = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs)); script.setRadius(radius); script.setInput(input); script.forEach(output); output.copyTo(src);
 rs.destroy(); }

Slide 16

Slide 16 text

Allocation public static void blur(Bitmap src, int radius) { RenderScript rs = RenderScript.create(context);
 Allocation input = Allocation.createFromBitmap(rs, src); Allocation output = Allocation.createTyped(rs, input.getType()); ScriptIntrinsicBlur script = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs)); script.setRadius(radius); script.setInput(input); script.forEach(output); output.copyTo(src);
 rs.destroy(); }

Slide 17

Slide 17 text

ScriptIntrinsicBlur public static void blur(Bitmap src, int radius) { RenderScript rs = RenderScript.create(context);
 Allocation input = Allocation.createFromBitmap(rs, src); Allocation output = Allocation.createTyped(rs, input.getType()); ScriptIntrinsicBlur script = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs)); script.setRadius(radius); script.setInput(input); script.forEach(output); output.copyTo(src);
 rs.destroy(); }

Slide 18

Slide 18 text

RenderScript Intrinsics ɾScriptIntrinsicConvolve3x3 ɾScriptIntrinsicConvolve5x5 ɾScriptIntrinsicBlur ɾScriptIntrinsicYuvToRGB ɾScriptIntrinsicColorMatrix ɾScriptIntrinsicBlend ɾScriptIntrinsicLUT ɾScriptIntrinsic3DLUT

Slide 19

Slide 19 text

Element ɾRoughly equivalent to a C type ɾfloat ɾfloat4 ɾunsigned 32-bit int ɾsigned 8-bit int

Slide 20

Slide 20 text

ScriptIntrinsicBlur::setRadius public static void blur(Bitmap src, int radius) { RenderScript rs = RenderScript.create(context);
 Allocation input = Allocation.createFromBitmap(rs, src); Allocation output = Allocation.createTyped(rs, input.getType()); ScriptIntrinsicBlur script = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs)); script.setRadius(radius); script.setInput(input); script.forEach(output); output.copyTo(src);
 rs.destroy(); }

Slide 21

Slide 21 text

ScriptIntrinsicBlur::setInput public static void blur(Bitmap src, int radius) { RenderScript rs = RenderScript.create(context);
 Allocation input = Allocation.createFromBitmap(rs, src); Allocation output = Allocation.createTyped(rs, input.getType()); ScriptIntrinsicBlur script = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs)); script.setRadius(radius); script.setInput(input); script.forEach(output); output.copyTo(src);
 rs.destroy(); }

Slide 22

Slide 22 text

ScriptIntrinsicBlur::forEach public static void blur(Bitmap src, int radius) { RenderScript rs = RenderScript.create(context);
 Allocation input = Allocation.createFromBitmap(rs, src); Allocation output = Allocation.createTyped(rs, input.getType()); ScriptIntrinsicBlur script = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs)); script.setRadius(radius); script.setInput(input); script.forEach(output); output.copyTo(src);
 rs.destroy(); }

Slide 23

Slide 23 text

Allocation::copyTo public static void blur(Bitmap src, int radius) { RenderScript rs = RenderScript.create(context);
 Allocation input = Allocation.createFromBitmap(rs, src); Allocation output = Allocation.createTyped(rs, input.getType()); ScriptIntrinsicBlur script = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs)); script.setRadius(radius); script.setInput(input); script.forEach(output); output.copyTo(src);
 rs.destroy(); }

Slide 24

Slide 24 text

RenderScript::destroy public static void blur(Bitmap src, int radius) { RenderScript rs = RenderScript.create(context);
 Allocation input = Allocation.createFromBitmap(rs, src); Allocation output = Allocation.createTyped(rs, input.getType()); ScriptIntrinsicBlur script = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs)); script.setRadius(radius); script.setInput(input); script.forEach(output); output.copyTo(src);
 rs.destroy(); }

Slide 25

Slide 25 text

RS Gaussian Blur public static void blur(Bitmap src, int radius) { RenderScript rs = RenderScript.create(context);
 Allocation input = Allocation.createFromBitmap(rs, src); Allocation output = Allocation.createTyped(rs, input.getType()); ScriptIntrinsicBlur script = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs)); script.setRadius(radius); script.setInput(input); script.forEach(output); output.copyTo(src);
 rs.destroy(); }

Slide 26

Slide 26 text

github.com/wasabeef Blurry Glide Transformations Picasso Transformations Fresco Processors

Slide 27

Slide 27 text

Thanks.