FullscreenBlur.java revision 6f31c36a3dbe5e61644ec39c4fcad0284d50e4f1
1006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk/* 2006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk * Copyright (C) 2011 The Android Open Source Project 3006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk * 4006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk * Licensed under the Apache License, Version 2.0 (the "License"); 5006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk * you may not use this file except in compliance with the License. 6006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk * You may obtain a copy of the License at 7006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk * 8006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk * http://www.apache.org/licenses/LICENSE-2.0 9006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk * 10006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk * Unless required by applicable law or agreed to in writing, software 11006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk * distributed under the License is distributed on an "AS IS" BASIS, 12006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk * See the License for the specific language governing permissions and 14006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk * limitations under the License. 15006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk */ 16006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk 17006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk 18d4cb9c587c23e3c24d928b0ac1a4de5679846f93Alex Sakhartchoukpackage com.android.testapp; 19006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk 20be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchoukimport java.util.ArrayList; 21be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk 22d4cb9c587c23e3c24d928b0ac1a4de5679846f93Alex Sakhartchoukimport com.android.scenegraph.*; 23be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk 24006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchoukimport android.content.res.Resources; 25006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchoukimport android.graphics.Bitmap; 26006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchoukimport android.graphics.BitmapFactory; 27006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchoukimport android.os.AsyncTask; 28006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchoukimport android.renderscript.*; 29006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchoukimport android.renderscript.Allocation.MipmapControl; 30006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchoukimport android.renderscript.Element.Builder; 31006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchoukimport android.renderscript.Font.Style; 32006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchoukimport android.renderscript.Program.TextureType; 33006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchoukimport android.renderscript.ProgramStore.DepthFunc; 34006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchoukimport android.util.Log; 35006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk 36b6e9dad7823fd5458f381530c09bd71fcfcef98fAlex Sakhartchoukclass FullscreenBlur { 37006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk 38006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk static Allocation sRenderTargetBlur0Color; 39006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk static Allocation sRenderTargetBlur0Depth; 40006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk static Allocation sRenderTargetBlur1Color; 41006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk static Allocation sRenderTargetBlur1Depth; 42006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk static Allocation sRenderTargetBlur2Color; 43006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk static Allocation sRenderTargetBlur2Depth; 44006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk 455121da171e0215f3bcd5d1fb0b147e7ed3c295a9Alex Sakhartchouk static FragmentShader mPF_BlurH; 465121da171e0215f3bcd5d1fb0b147e7ed3c295a9Alex Sakhartchouk static FragmentShader mPF_BlurV; 475121da171e0215f3bcd5d1fb0b147e7ed3c295a9Alex Sakhartchouk static FragmentShader mPF_SelectColor; 485121da171e0215f3bcd5d1fb0b147e7ed3c295a9Alex Sakhartchouk static FragmentShader mPF_Texture; 495121da171e0215f3bcd5d1fb0b147e7ed3c295a9Alex Sakhartchouk static VertexShader mPV_Paint; 505121da171e0215f3bcd5d1fb0b147e7ed3c295a9Alex Sakhartchouk static VertexShader mPV_Blur; 51006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk 52006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk // This is only used when full screen blur is enabled 53006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk // Basically, it's the offscreen render targets 54006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk static void createRenderTargets(RenderScriptGL rs, int w, int h) { 55006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk Type.Builder b = new Type.Builder(rs, Element.RGBA_8888(rs)); 565121da171e0215f3bcd5d1fb0b147e7ed3c295a9Alex Sakhartchouk Type renderType = b.setX(w/8).setY(h/8).create(); 57ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk int usage = Allocation.USAGE_GRAPHICS_TEXTURE | Allocation.USAGE_GRAPHICS_RENDER_TARGET; 58ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk sRenderTargetBlur0Color = Allocation.createTyped(rs, renderType, usage); 59ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk sRenderTargetBlur1Color = Allocation.createTyped(rs, renderType, usage); 60ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk sRenderTargetBlur2Color = Allocation.createTyped(rs, renderType, usage); 61ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk 62ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk b = new Type.Builder(rs, Element.createPixel(rs, Element.DataType.UNSIGNED_16, 63ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk Element.DataKind.PIXEL_DEPTH)); 645121da171e0215f3bcd5d1fb0b147e7ed3c295a9Alex Sakhartchouk renderType = b.setX(w/8).setY(h/8).create(); 65ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk usage = Allocation.USAGE_GRAPHICS_RENDER_TARGET; 66ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk sRenderTargetBlur0Depth = Allocation.createTyped(rs, renderType, usage); 67ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk sRenderTargetBlur1Depth = Allocation.createTyped(rs, renderType, usage); 68ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk sRenderTargetBlur2Depth = Allocation.createTyped(rs, renderType, usage); 69006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk } 70006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk 71ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk static void addOffsets(Renderable quad, float advance) { 72ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk quad.appendSourceParams(new Float4Param("blurOffset0", - advance * 2.5f)); 73ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk quad.appendSourceParams(new Float4Param("blurOffset1", - advance * 0.5f)); 74ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk quad.appendSourceParams(new Float4Param("blurOffset2", advance * 1.5f)); 75ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk quad.appendSourceParams(new Float4Param("blurOffset3", advance * 3.5f)); 76ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk } 77006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk 786f31c36a3dbe5e61644ec39c4fcad0284d50e4f1Alex Sakhartchouk static RenderPass addPass(Scene scene, Camera cam, Allocation color, Allocation depth) { 79ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk RenderPass pass = new RenderPass(); 80ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk pass.setColorTarget(color); 81ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk pass.setDepthTarget(depth); 82ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk pass.setShouldClearColor(false); 83ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk pass.setShouldClearDepth(false); 846f31c36a3dbe5e61644ec39c4fcad0284d50e4f1Alex Sakhartchouk pass.setCamera(cam); 85ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk scene.appendRenderPass(pass); 86ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk return pass; 87ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk } 88006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk 896f31c36a3dbe5e61644ec39c4fcad0284d50e4f1Alex Sakhartchouk static void addBlurPasses(Scene scene, RenderScriptGL rs, Camera cam) { 90ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk SceneManager sceneManager = SceneManager.getInstance(); 91ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk ArrayList<RenderableBase> allDraw = scene.getRenderables(); 92ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk int numDraw = allDraw.size(); 93006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk 94ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk ProgramRaster cullNone = ProgramRaster.CULL_NONE(rs); 95ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk ProgramStore blendAdd = SceneManager.BLEND_ADD_DEPTH_NONE(rs); 96ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk ProgramStore blendNone = ProgramStore.BLEND_NONE_DEPTH_NONE(rs); 97006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk 98ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk RenderState drawTex = new RenderState(mPV_Blur, mPF_Texture, blendAdd, cullNone); 99ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk RenderState selectCol = new RenderState(mPV_Blur, mPF_SelectColor, blendNone, cullNone); 100ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk RenderState hBlur = new RenderState(mPV_Blur, mPF_BlurH, blendNone, cullNone); 101ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk RenderState vBlur = new RenderState(mPV_Blur, mPF_BlurV, blendNone, cullNone); 102006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk 103ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk // Renders the scene off screen 1046f31c36a3dbe5e61644ec39c4fcad0284d50e4f1Alex Sakhartchouk RenderPass blurSourcePass = addPass(scene, cam, 105ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk sRenderTargetBlur0Color, 106ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk sRenderTargetBlur0Depth); 107006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk blurSourcePass.setClearColor(new Float4(1.0f, 1.0f, 1.0f, 1.0f)); 108006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk blurSourcePass.setShouldClearColor(true); 109006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk blurSourcePass.setClearDepth(1.0f); 110006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk blurSourcePass.setShouldClearDepth(true); 111006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk for (int i = 0; i < numDraw; i ++) { 112684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk blurSourcePass.appendRenderable((Renderable)allDraw.get(i)); 113006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk } 114ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk 115ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk // Pass for selecting bright colors 1166f31c36a3dbe5e61644ec39c4fcad0284d50e4f1Alex Sakhartchouk RenderPass selectColorPass = addPass(scene, cam, 117ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk sRenderTargetBlur2Color, 118ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk sRenderTargetBlur2Depth); 119f92189d2aea9856c11c26ebe392cd53dd969c0b8Alex Sakhartchouk Renderable quad = sceneManager.getRenderableQuad("ScreenAlignedQuadS", selectCol); 1206f31c36a3dbe5e61644ec39c4fcad0284d50e4f1Alex Sakhartchouk quad.appendSourceParams(new TextureParam("color", new Texture2D(sRenderTargetBlur0Color))); 121684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk selectColorPass.appendRenderable(quad); 122be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk 123ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk // Horizontal blur 1246f31c36a3dbe5e61644ec39c4fcad0284d50e4f1Alex Sakhartchouk RenderPass horizontalBlurPass = addPass(scene, cam, 125ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk sRenderTargetBlur1Color, 126ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk sRenderTargetBlur1Depth); 127ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk quad = sceneManager.getRenderableQuad("ScreenAlignedQuadH", hBlur); 1286f31c36a3dbe5e61644ec39c4fcad0284d50e4f1Alex Sakhartchouk quad.appendSourceParams(new TextureParam("color", new Texture2D(sRenderTargetBlur2Color))); 129ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk addOffsets(quad, 1.0f / (float)sRenderTargetBlur0Color.getType().getX()); 130684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk horizontalBlurPass.appendRenderable(quad); 131be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk 132ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk // Vertical Blur 1336f31c36a3dbe5e61644ec39c4fcad0284d50e4f1Alex Sakhartchouk RenderPass verticalBlurPass = addPass(scene, cam, 134ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk sRenderTargetBlur2Color, 135ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk sRenderTargetBlur2Depth); 136ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk quad = sceneManager.getRenderableQuad("ScreenAlignedQuadV", vBlur); 1376f31c36a3dbe5e61644ec39c4fcad0284d50e4f1Alex Sakhartchouk quad.appendSourceParams(new TextureParam("color", new Texture2D(sRenderTargetBlur1Color))); 138ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk addOffsets(quad, 1.0f / (float)sRenderTargetBlur0Color.getType().getY()); 139684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk verticalBlurPass.appendRenderable(quad); 140006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk } 141006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk 142ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk // Additively renders the blurred colors on top of the scene 1436f31c36a3dbe5e61644ec39c4fcad0284d50e4f1Alex Sakhartchouk static void addCompositePass(Scene scene, RenderScriptGL rs, Camera cam) { 144ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk SceneManager sceneManager = SceneManager.getInstance(); 145006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk RenderState drawTex = new RenderState(mPV_Blur, mPF_Texture, 146ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk SceneManager.BLEND_ADD_DEPTH_NONE(rs), 147ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk ProgramRaster.CULL_NONE(rs)); 148ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk 1496f31c36a3dbe5e61644ec39c4fcad0284d50e4f1Alex Sakhartchouk RenderPass compositePass = addPass(scene, cam, null, null); 1506f31c36a3dbe5e61644ec39c4fcad0284d50e4f1Alex Sakhartchouk Renderable quad = sceneManager.getRenderableQuad("ScreenAlignedQuadComposite", drawTex); 1516f31c36a3dbe5e61644ec39c4fcad0284d50e4f1Alex Sakhartchouk quad.appendSourceParams(new TextureParam("color", new Texture2D(sRenderTargetBlur2Color))); 152684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk compositePass.appendRenderable(quad); 153006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk } 154006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk 1555121da171e0215f3bcd5d1fb0b147e7ed3c295a9Alex Sakhartchouk static private FragmentShader getShader(Resources res, RenderScriptGL rs, 1565121da171e0215f3bcd5d1fb0b147e7ed3c295a9Alex Sakhartchouk int resID, Type constants) { 1575121da171e0215f3bcd5d1fb0b147e7ed3c295a9Alex Sakhartchouk FragmentShader.Builder fb = new FragmentShader.Builder(rs); 1585121da171e0215f3bcd5d1fb0b147e7ed3c295a9Alex Sakhartchouk fb.setShader(res, resID); 1595121da171e0215f3bcd5d1fb0b147e7ed3c295a9Alex Sakhartchouk fb.addTexture(TextureType.TEXTURE_2D, "color"); 1605121da171e0215f3bcd5d1fb0b147e7ed3c295a9Alex Sakhartchouk if (constants != null) { 1615121da171e0215f3bcd5d1fb0b147e7ed3c295a9Alex Sakhartchouk fb.setObjectConst(constants); 1625121da171e0215f3bcd5d1fb0b147e7ed3c295a9Alex Sakhartchouk } 1635121da171e0215f3bcd5d1fb0b147e7ed3c295a9Alex Sakhartchouk FragmentShader prog = fb.create(); 164d4cb9c587c23e3c24d928b0ac1a4de5679846f93Alex Sakhartchouk prog.getProgram().bindSampler(Sampler.CLAMP_LINEAR(rs), 0); 1655121da171e0215f3bcd5d1fb0b147e7ed3c295a9Alex Sakhartchouk return prog; 1665121da171e0215f3bcd5d1fb0b147e7ed3c295a9Alex Sakhartchouk } 1675121da171e0215f3bcd5d1fb0b147e7ed3c295a9Alex Sakhartchouk 1685121da171e0215f3bcd5d1fb0b147e7ed3c295a9Alex Sakhartchouk static void initShaders(Resources res, RenderScriptGL rs) { 1694bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchouk ScriptField_BlurOffsets blurConst = new ScriptField_BlurOffsets(rs, 1); 1705121da171e0215f3bcd5d1fb0b147e7ed3c295a9Alex Sakhartchouk VertexShader.Builder vb = new VertexShader.Builder(rs); 1714bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchouk vb.addInput(ScriptField_VertexShaderInputs.createElement(rs)); 172006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk vb.setShader(res, R.raw.blur_vertex); 173006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk mPV_Blur = vb.create(); 174006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk 1755121da171e0215f3bcd5d1fb0b147e7ed3c295a9Alex Sakhartchouk mPF_Texture = getShader(res, rs, R.raw.texture, null); 176d4cb9c587c23e3c24d928b0ac1a4de5679846f93Alex Sakhartchouk mPF_Texture.getProgram().bindSampler(Sampler.WRAP_LINEAR_MIP_LINEAR(rs), 0); 1775121da171e0215f3bcd5d1fb0b147e7ed3c295a9Alex Sakhartchouk mPF_BlurH = getShader(res, rs, R.raw.blur_h, blurConst.getAllocation().getType()); 1785121da171e0215f3bcd5d1fb0b147e7ed3c295a9Alex Sakhartchouk mPF_BlurV = getShader(res, rs, R.raw.blur_v, blurConst.getAllocation().getType()); 1795121da171e0215f3bcd5d1fb0b147e7ed3c295a9Alex Sakhartchouk mPF_SelectColor = getShader(res, rs, R.raw.select_color, null); 180006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk } 181006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk 182006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk} 183006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk 184006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk 185006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk 186006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk 187006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk 188