1*90c8c64dSAndroid Build Coastguard Worker /*
2*90c8c64dSAndroid Build Coastguard Worker  * Copyright (C) 2014 The Android Open Source Project
3*90c8c64dSAndroid Build Coastguard Worker  *
4*90c8c64dSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*90c8c64dSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*90c8c64dSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*90c8c64dSAndroid Build Coastguard Worker  *
8*90c8c64dSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*90c8c64dSAndroid Build Coastguard Worker  *
10*90c8c64dSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*90c8c64dSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*90c8c64dSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*90c8c64dSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*90c8c64dSAndroid Build Coastguard Worker  * limitations under the License.
15*90c8c64dSAndroid Build Coastguard Worker  */
16*90c8c64dSAndroid Build Coastguard Worker 
17*90c8c64dSAndroid Build Coastguard Worker package com.example.android.mediaeffects;
18*90c8c64dSAndroid Build Coastguard Worker 
19*90c8c64dSAndroid Build Coastguard Worker import android.graphics.Bitmap;
20*90c8c64dSAndroid Build Coastguard Worker import android.graphics.BitmapFactory;
21*90c8c64dSAndroid Build Coastguard Worker import android.graphics.Color;
22*90c8c64dSAndroid Build Coastguard Worker import android.media.effect.Effect;
23*90c8c64dSAndroid Build Coastguard Worker import android.media.effect.EffectContext;
24*90c8c64dSAndroid Build Coastguard Worker import android.media.effect.EffectFactory;
25*90c8c64dSAndroid Build Coastguard Worker import android.opengl.GLES20;
26*90c8c64dSAndroid Build Coastguard Worker import android.opengl.GLSurfaceView;
27*90c8c64dSAndroid Build Coastguard Worker import android.opengl.GLUtils;
28*90c8c64dSAndroid Build Coastguard Worker import android.os.Bundle;
29*90c8c64dSAndroid Build Coastguard Worker import android.support.annotation.Nullable;
30*90c8c64dSAndroid Build Coastguard Worker import android.support.v4.app.Fragment;
31*90c8c64dSAndroid Build Coastguard Worker import android.view.LayoutInflater;
32*90c8c64dSAndroid Build Coastguard Worker import android.view.Menu;
33*90c8c64dSAndroid Build Coastguard Worker import android.view.MenuInflater;
34*90c8c64dSAndroid Build Coastguard Worker import android.view.MenuItem;
35*90c8c64dSAndroid Build Coastguard Worker import android.view.View;
36*90c8c64dSAndroid Build Coastguard Worker import android.view.ViewGroup;
37*90c8c64dSAndroid Build Coastguard Worker 
38*90c8c64dSAndroid Build Coastguard Worker import javax.microedition.khronos.egl.EGLConfig;
39*90c8c64dSAndroid Build Coastguard Worker import javax.microedition.khronos.opengles.GL10;
40*90c8c64dSAndroid Build Coastguard Worker 
41*90c8c64dSAndroid Build Coastguard Worker public class MediaEffectsFragment extends Fragment implements GLSurfaceView.Renderer {
42*90c8c64dSAndroid Build Coastguard Worker 
43*90c8c64dSAndroid Build Coastguard Worker     private static final String STATE_CURRENT_EFFECT = "current_effect";
44*90c8c64dSAndroid Build Coastguard Worker 
45*90c8c64dSAndroid Build Coastguard Worker     private GLSurfaceView mEffectView;
46*90c8c64dSAndroid Build Coastguard Worker     private int[] mTextures = new int[2];
47*90c8c64dSAndroid Build Coastguard Worker     private EffectContext mEffectContext;
48*90c8c64dSAndroid Build Coastguard Worker     private Effect mEffect;
49*90c8c64dSAndroid Build Coastguard Worker     private TextureRenderer mTexRenderer = new TextureRenderer();
50*90c8c64dSAndroid Build Coastguard Worker     private int mImageWidth;
51*90c8c64dSAndroid Build Coastguard Worker     private int mImageHeight;
52*90c8c64dSAndroid Build Coastguard Worker     private boolean mInitialized = false;
53*90c8c64dSAndroid Build Coastguard Worker     private int mCurrentEffect;
54*90c8c64dSAndroid Build Coastguard Worker 
55*90c8c64dSAndroid Build Coastguard Worker     @Override
onCreate(Bundle savedInstanceState)56*90c8c64dSAndroid Build Coastguard Worker     public void onCreate(Bundle savedInstanceState) {
57*90c8c64dSAndroid Build Coastguard Worker         super.onCreate(savedInstanceState);
58*90c8c64dSAndroid Build Coastguard Worker         setHasOptionsMenu(true);
59*90c8c64dSAndroid Build Coastguard Worker     }
60*90c8c64dSAndroid Build Coastguard Worker 
61*90c8c64dSAndroid Build Coastguard Worker     @Override
onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState)62*90c8c64dSAndroid Build Coastguard Worker     public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
63*90c8c64dSAndroid Build Coastguard Worker                              @Nullable Bundle savedInstanceState) {
64*90c8c64dSAndroid Build Coastguard Worker         return inflater.inflate(R.layout.fragment_media_effects, container, false);
65*90c8c64dSAndroid Build Coastguard Worker     }
66*90c8c64dSAndroid Build Coastguard Worker 
67*90c8c64dSAndroid Build Coastguard Worker     @Override
onViewCreated(View view, @Nullable Bundle savedInstanceState)68*90c8c64dSAndroid Build Coastguard Worker     public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
69*90c8c64dSAndroid Build Coastguard Worker         mEffectView = (GLSurfaceView) view.findViewById(R.id.effectsview);
70*90c8c64dSAndroid Build Coastguard Worker         mEffectView.setEGLContextClientVersion(2);
71*90c8c64dSAndroid Build Coastguard Worker         mEffectView.setRenderer(this);
72*90c8c64dSAndroid Build Coastguard Worker         mEffectView.setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
73*90c8c64dSAndroid Build Coastguard Worker         if (null != savedInstanceState && savedInstanceState.containsKey(STATE_CURRENT_EFFECT)) {
74*90c8c64dSAndroid Build Coastguard Worker             setCurrentEffect(savedInstanceState.getInt(STATE_CURRENT_EFFECT));
75*90c8c64dSAndroid Build Coastguard Worker         } else {
76*90c8c64dSAndroid Build Coastguard Worker             setCurrentEffect(R.id.none);
77*90c8c64dSAndroid Build Coastguard Worker         }
78*90c8c64dSAndroid Build Coastguard Worker     }
79*90c8c64dSAndroid Build Coastguard Worker 
80*90c8c64dSAndroid Build Coastguard Worker     @Override
onCreateOptionsMenu(Menu menu, MenuInflater inflater)81*90c8c64dSAndroid Build Coastguard Worker     public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
82*90c8c64dSAndroid Build Coastguard Worker         inflater.inflate(R.menu.media_effects, menu);
83*90c8c64dSAndroid Build Coastguard Worker     }
84*90c8c64dSAndroid Build Coastguard Worker 
85*90c8c64dSAndroid Build Coastguard Worker     @Override
onOptionsItemSelected(MenuItem item)86*90c8c64dSAndroid Build Coastguard Worker     public boolean onOptionsItemSelected(MenuItem item) {
87*90c8c64dSAndroid Build Coastguard Worker         setCurrentEffect(item.getItemId());
88*90c8c64dSAndroid Build Coastguard Worker         mEffectView.requestRender();
89*90c8c64dSAndroid Build Coastguard Worker         return true;
90*90c8c64dSAndroid Build Coastguard Worker     }
91*90c8c64dSAndroid Build Coastguard Worker 
92*90c8c64dSAndroid Build Coastguard Worker     @Override
onSaveInstanceState(Bundle outState)93*90c8c64dSAndroid Build Coastguard Worker     public void onSaveInstanceState(Bundle outState) {
94*90c8c64dSAndroid Build Coastguard Worker         outState.putInt(STATE_CURRENT_EFFECT, mCurrentEffect);
95*90c8c64dSAndroid Build Coastguard Worker     }
96*90c8c64dSAndroid Build Coastguard Worker 
97*90c8c64dSAndroid Build Coastguard Worker     @Override
onSurfaceCreated(GL10 gl, EGLConfig eglConfig)98*90c8c64dSAndroid Build Coastguard Worker     public void onSurfaceCreated(GL10 gl, EGLConfig eglConfig) {
99*90c8c64dSAndroid Build Coastguard Worker         // Nothing to do here
100*90c8c64dSAndroid Build Coastguard Worker     }
101*90c8c64dSAndroid Build Coastguard Worker 
102*90c8c64dSAndroid Build Coastguard Worker     @Override
onSurfaceChanged(GL10 gl, int width, int height)103*90c8c64dSAndroid Build Coastguard Worker     public void onSurfaceChanged(GL10 gl, int width, int height) {
104*90c8c64dSAndroid Build Coastguard Worker         if (mTexRenderer != null) {
105*90c8c64dSAndroid Build Coastguard Worker             mTexRenderer.updateViewSize(width, height);
106*90c8c64dSAndroid Build Coastguard Worker         }
107*90c8c64dSAndroid Build Coastguard Worker     }
108*90c8c64dSAndroid Build Coastguard Worker 
109*90c8c64dSAndroid Build Coastguard Worker     @Override
onDrawFrame(GL10 gl)110*90c8c64dSAndroid Build Coastguard Worker     public void onDrawFrame(GL10 gl) {
111*90c8c64dSAndroid Build Coastguard Worker         if (!mInitialized) {
112*90c8c64dSAndroid Build Coastguard Worker             //Only need to do this once
113*90c8c64dSAndroid Build Coastguard Worker             mEffectContext = EffectContext.createWithCurrentGlContext();
114*90c8c64dSAndroid Build Coastguard Worker             mTexRenderer.init();
115*90c8c64dSAndroid Build Coastguard Worker             loadTextures();
116*90c8c64dSAndroid Build Coastguard Worker             mInitialized = true;
117*90c8c64dSAndroid Build Coastguard Worker         }
118*90c8c64dSAndroid Build Coastguard Worker         if (mCurrentEffect != R.id.none) {
119*90c8c64dSAndroid Build Coastguard Worker             //if an effect is chosen initialize it and apply it to the texture
120*90c8c64dSAndroid Build Coastguard Worker             initEffect();
121*90c8c64dSAndroid Build Coastguard Worker             applyEffect();
122*90c8c64dSAndroid Build Coastguard Worker         }
123*90c8c64dSAndroid Build Coastguard Worker         renderResult();
124*90c8c64dSAndroid Build Coastguard Worker     }
125*90c8c64dSAndroid Build Coastguard Worker 
setCurrentEffect(int effect)126*90c8c64dSAndroid Build Coastguard Worker     private void setCurrentEffect(int effect) {
127*90c8c64dSAndroid Build Coastguard Worker         mCurrentEffect = effect;
128*90c8c64dSAndroid Build Coastguard Worker     }
129*90c8c64dSAndroid Build Coastguard Worker 
loadTextures()130*90c8c64dSAndroid Build Coastguard Worker     private void loadTextures() {
131*90c8c64dSAndroid Build Coastguard Worker         // Generate textures
132*90c8c64dSAndroid Build Coastguard Worker         GLES20.glGenTextures(2, mTextures, 0);
133*90c8c64dSAndroid Build Coastguard Worker 
134*90c8c64dSAndroid Build Coastguard Worker         // Load input bitmap
135*90c8c64dSAndroid Build Coastguard Worker         Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.puppy);
136*90c8c64dSAndroid Build Coastguard Worker         mImageWidth = bitmap.getWidth();
137*90c8c64dSAndroid Build Coastguard Worker         mImageHeight = bitmap.getHeight();
138*90c8c64dSAndroid Build Coastguard Worker         mTexRenderer.updateTextureSize(mImageWidth, mImageHeight);
139*90c8c64dSAndroid Build Coastguard Worker 
140*90c8c64dSAndroid Build Coastguard Worker         // Upload to texture
141*90c8c64dSAndroid Build Coastguard Worker         GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTextures[0]);
142*90c8c64dSAndroid Build Coastguard Worker         GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmap, 0);
143*90c8c64dSAndroid Build Coastguard Worker 
144*90c8c64dSAndroid Build Coastguard Worker         // Set texture parameters
145*90c8c64dSAndroid Build Coastguard Worker         GLToolbox.initTexParams();
146*90c8c64dSAndroid Build Coastguard Worker     }
147*90c8c64dSAndroid Build Coastguard Worker 
initEffect()148*90c8c64dSAndroid Build Coastguard Worker     private void initEffect() {
149*90c8c64dSAndroid Build Coastguard Worker         EffectFactory effectFactory = mEffectContext.getFactory();
150*90c8c64dSAndroid Build Coastguard Worker         if (mEffect != null) {
151*90c8c64dSAndroid Build Coastguard Worker             mEffect.release();
152*90c8c64dSAndroid Build Coastguard Worker         }
153*90c8c64dSAndroid Build Coastguard Worker         // Initialize the correct effect based on the selected menu/action item
154*90c8c64dSAndroid Build Coastguard Worker         switch (mCurrentEffect) {
155*90c8c64dSAndroid Build Coastguard Worker 
156*90c8c64dSAndroid Build Coastguard Worker             case R.id.none:
157*90c8c64dSAndroid Build Coastguard Worker                 break;
158*90c8c64dSAndroid Build Coastguard Worker 
159*90c8c64dSAndroid Build Coastguard Worker             case R.id.autofix:
160*90c8c64dSAndroid Build Coastguard Worker                 mEffect = effectFactory.createEffect(EffectFactory.EFFECT_AUTOFIX);
161*90c8c64dSAndroid Build Coastguard Worker                 mEffect.setParameter("scale", 0.5f);
162*90c8c64dSAndroid Build Coastguard Worker                 break;
163*90c8c64dSAndroid Build Coastguard Worker 
164*90c8c64dSAndroid Build Coastguard Worker             case R.id.bw:
165*90c8c64dSAndroid Build Coastguard Worker                 mEffect = effectFactory.createEffect(EffectFactory.EFFECT_BLACKWHITE);
166*90c8c64dSAndroid Build Coastguard Worker                 mEffect.setParameter("black", .1f);
167*90c8c64dSAndroid Build Coastguard Worker                 mEffect.setParameter("white", .7f);
168*90c8c64dSAndroid Build Coastguard Worker                 break;
169*90c8c64dSAndroid Build Coastguard Worker 
170*90c8c64dSAndroid Build Coastguard Worker             case R.id.brightness:
171*90c8c64dSAndroid Build Coastguard Worker                 mEffect = effectFactory.createEffect(EffectFactory.EFFECT_BRIGHTNESS);
172*90c8c64dSAndroid Build Coastguard Worker                 mEffect.setParameter("brightness", 2.0f);
173*90c8c64dSAndroid Build Coastguard Worker                 break;
174*90c8c64dSAndroid Build Coastguard Worker 
175*90c8c64dSAndroid Build Coastguard Worker             case R.id.contrast:
176*90c8c64dSAndroid Build Coastguard Worker                 mEffect = effectFactory.createEffect(EffectFactory.EFFECT_CONTRAST);
177*90c8c64dSAndroid Build Coastguard Worker                 mEffect.setParameter("contrast", 1.4f);
178*90c8c64dSAndroid Build Coastguard Worker                 break;
179*90c8c64dSAndroid Build Coastguard Worker 
180*90c8c64dSAndroid Build Coastguard Worker             case R.id.crossprocess:
181*90c8c64dSAndroid Build Coastguard Worker                 mEffect = effectFactory.createEffect(EffectFactory.EFFECT_CROSSPROCESS);
182*90c8c64dSAndroid Build Coastguard Worker                 break;
183*90c8c64dSAndroid Build Coastguard Worker 
184*90c8c64dSAndroid Build Coastguard Worker             case R.id.documentary:
185*90c8c64dSAndroid Build Coastguard Worker                 mEffect = effectFactory.createEffect(EffectFactory.EFFECT_DOCUMENTARY);
186*90c8c64dSAndroid Build Coastguard Worker                 break;
187*90c8c64dSAndroid Build Coastguard Worker 
188*90c8c64dSAndroid Build Coastguard Worker             case R.id.duotone:
189*90c8c64dSAndroid Build Coastguard Worker                 mEffect = effectFactory.createEffect(EffectFactory.EFFECT_DUOTONE);
190*90c8c64dSAndroid Build Coastguard Worker                 mEffect.setParameter("first_color", Color.YELLOW);
191*90c8c64dSAndroid Build Coastguard Worker                 mEffect.setParameter("second_color", Color.DKGRAY);
192*90c8c64dSAndroid Build Coastguard Worker                 break;
193*90c8c64dSAndroid Build Coastguard Worker 
194*90c8c64dSAndroid Build Coastguard Worker             case R.id.filllight:
195*90c8c64dSAndroid Build Coastguard Worker                 mEffect = effectFactory.createEffect(EffectFactory.EFFECT_FILLLIGHT);
196*90c8c64dSAndroid Build Coastguard Worker                 mEffect.setParameter("strength", .8f);
197*90c8c64dSAndroid Build Coastguard Worker                 break;
198*90c8c64dSAndroid Build Coastguard Worker 
199*90c8c64dSAndroid Build Coastguard Worker             case R.id.fisheye:
200*90c8c64dSAndroid Build Coastguard Worker                 mEffect = effectFactory.createEffect(EffectFactory.EFFECT_FISHEYE);
201*90c8c64dSAndroid Build Coastguard Worker                 mEffect.setParameter("scale", .5f);
202*90c8c64dSAndroid Build Coastguard Worker                 break;
203*90c8c64dSAndroid Build Coastguard Worker 
204*90c8c64dSAndroid Build Coastguard Worker             case R.id.flipvert:
205*90c8c64dSAndroid Build Coastguard Worker                 mEffect = effectFactory.createEffect(EffectFactory.EFFECT_FLIP);
206*90c8c64dSAndroid Build Coastguard Worker                 mEffect.setParameter("vertical", true);
207*90c8c64dSAndroid Build Coastguard Worker                 break;
208*90c8c64dSAndroid Build Coastguard Worker 
209*90c8c64dSAndroid Build Coastguard Worker             case R.id.fliphor:
210*90c8c64dSAndroid Build Coastguard Worker                 mEffect = effectFactory.createEffect(EffectFactory.EFFECT_FLIP);
211*90c8c64dSAndroid Build Coastguard Worker                 mEffect.setParameter("horizontal", true);
212*90c8c64dSAndroid Build Coastguard Worker                 break;
213*90c8c64dSAndroid Build Coastguard Worker 
214*90c8c64dSAndroid Build Coastguard Worker             case R.id.grain:
215*90c8c64dSAndroid Build Coastguard Worker                 mEffect = effectFactory.createEffect(EffectFactory.EFFECT_GRAIN);
216*90c8c64dSAndroid Build Coastguard Worker                 mEffect.setParameter("strength", 1.0f);
217*90c8c64dSAndroid Build Coastguard Worker                 break;
218*90c8c64dSAndroid Build Coastguard Worker 
219*90c8c64dSAndroid Build Coastguard Worker             case R.id.grayscale:
220*90c8c64dSAndroid Build Coastguard Worker                 mEffect = effectFactory.createEffect(EffectFactory.EFFECT_GRAYSCALE);
221*90c8c64dSAndroid Build Coastguard Worker                 break;
222*90c8c64dSAndroid Build Coastguard Worker 
223*90c8c64dSAndroid Build Coastguard Worker             case R.id.lomoish:
224*90c8c64dSAndroid Build Coastguard Worker                 mEffect = effectFactory.createEffect(EffectFactory.EFFECT_LOMOISH);
225*90c8c64dSAndroid Build Coastguard Worker                 break;
226*90c8c64dSAndroid Build Coastguard Worker 
227*90c8c64dSAndroid Build Coastguard Worker             case R.id.negative:
228*90c8c64dSAndroid Build Coastguard Worker                 mEffect = effectFactory.createEffect(EffectFactory.EFFECT_NEGATIVE);
229*90c8c64dSAndroid Build Coastguard Worker                 break;
230*90c8c64dSAndroid Build Coastguard Worker 
231*90c8c64dSAndroid Build Coastguard Worker             case R.id.posterize:
232*90c8c64dSAndroid Build Coastguard Worker                 mEffect = effectFactory.createEffect(EffectFactory.EFFECT_POSTERIZE);
233*90c8c64dSAndroid Build Coastguard Worker                 break;
234*90c8c64dSAndroid Build Coastguard Worker 
235*90c8c64dSAndroid Build Coastguard Worker             case R.id.rotate:
236*90c8c64dSAndroid Build Coastguard Worker                 mEffect = effectFactory.createEffect(EffectFactory.EFFECT_ROTATE);
237*90c8c64dSAndroid Build Coastguard Worker                 mEffect.setParameter("angle", 180);
238*90c8c64dSAndroid Build Coastguard Worker                 break;
239*90c8c64dSAndroid Build Coastguard Worker 
240*90c8c64dSAndroid Build Coastguard Worker             case R.id.saturate:
241*90c8c64dSAndroid Build Coastguard Worker                 mEffect = effectFactory.createEffect(EffectFactory.EFFECT_SATURATE);
242*90c8c64dSAndroid Build Coastguard Worker                 mEffect.setParameter("scale", .5f);
243*90c8c64dSAndroid Build Coastguard Worker                 break;
244*90c8c64dSAndroid Build Coastguard Worker 
245*90c8c64dSAndroid Build Coastguard Worker             case R.id.sepia:
246*90c8c64dSAndroid Build Coastguard Worker                 mEffect = effectFactory.createEffect(EffectFactory.EFFECT_SEPIA);
247*90c8c64dSAndroid Build Coastguard Worker                 break;
248*90c8c64dSAndroid Build Coastguard Worker 
249*90c8c64dSAndroid Build Coastguard Worker             case R.id.sharpen:
250*90c8c64dSAndroid Build Coastguard Worker                 mEffect = effectFactory.createEffect(EffectFactory.EFFECT_SHARPEN);
251*90c8c64dSAndroid Build Coastguard Worker                 break;
252*90c8c64dSAndroid Build Coastguard Worker 
253*90c8c64dSAndroid Build Coastguard Worker             case R.id.temperature:
254*90c8c64dSAndroid Build Coastguard Worker                 mEffect = effectFactory.createEffect(EffectFactory.EFFECT_TEMPERATURE);
255*90c8c64dSAndroid Build Coastguard Worker                 mEffect.setParameter("scale", .9f);
256*90c8c64dSAndroid Build Coastguard Worker                 break;
257*90c8c64dSAndroid Build Coastguard Worker 
258*90c8c64dSAndroid Build Coastguard Worker             case R.id.tint:
259*90c8c64dSAndroid Build Coastguard Worker                 mEffect = effectFactory.createEffect(EffectFactory.EFFECT_TINT);
260*90c8c64dSAndroid Build Coastguard Worker                 mEffect.setParameter("tint", Color.MAGENTA);
261*90c8c64dSAndroid Build Coastguard Worker                 break;
262*90c8c64dSAndroid Build Coastguard Worker 
263*90c8c64dSAndroid Build Coastguard Worker             case R.id.vignette:
264*90c8c64dSAndroid Build Coastguard Worker                 mEffect = effectFactory.createEffect(EffectFactory.EFFECT_VIGNETTE);
265*90c8c64dSAndroid Build Coastguard Worker                 mEffect.setParameter("scale", .5f);
266*90c8c64dSAndroid Build Coastguard Worker                 break;
267*90c8c64dSAndroid Build Coastguard Worker 
268*90c8c64dSAndroid Build Coastguard Worker             default:
269*90c8c64dSAndroid Build Coastguard Worker                 break;
270*90c8c64dSAndroid Build Coastguard Worker         }
271*90c8c64dSAndroid Build Coastguard Worker     }
272*90c8c64dSAndroid Build Coastguard Worker 
applyEffect()273*90c8c64dSAndroid Build Coastguard Worker     private void applyEffect() {
274*90c8c64dSAndroid Build Coastguard Worker         mEffect.apply(mTextures[0], mImageWidth, mImageHeight, mTextures[1]);
275*90c8c64dSAndroid Build Coastguard Worker     }
276*90c8c64dSAndroid Build Coastguard Worker 
renderResult()277*90c8c64dSAndroid Build Coastguard Worker     private void renderResult() {
278*90c8c64dSAndroid Build Coastguard Worker         if (mCurrentEffect != R.id.none) {
279*90c8c64dSAndroid Build Coastguard Worker             // if no effect is chosen, just render the original bitmap
280*90c8c64dSAndroid Build Coastguard Worker             mTexRenderer.renderTexture(mTextures[1]);
281*90c8c64dSAndroid Build Coastguard Worker         } else {
282*90c8c64dSAndroid Build Coastguard Worker             // render the result of applyEffect()
283*90c8c64dSAndroid Build Coastguard Worker             mTexRenderer.renderTexture(mTextures[0]);
284*90c8c64dSAndroid Build Coastguard Worker         }
285*90c8c64dSAndroid Build Coastguard Worker     }
286*90c8c64dSAndroid Build Coastguard Worker 
287*90c8c64dSAndroid Build Coastguard Worker }
288