From affcdfd7d8fbefe6d46cf6750ec0d99ef6c9f5d2 Mon Sep 17 00:00:00 2001 From: Robert Ly Date: Tue, 3 Apr 2012 14:00:22 -0700 Subject: [PATCH] adding media effects sample to sdk Change-Id: I8fc55e1ac5409c0262bfda930e6db3d34ce6ae08 --- build/sdk.atree | 1 + samples/HelloEffects/Android.mk | 12 + samples/HelloEffects/AndroidManifest.xml | 32 ++ samples/HelloEffects/_index.html | 23 ++ .../res/drawable-hdpi/ic_launcher.png | Bin 0 -> 2678 bytes .../res/drawable-ldpi/ic_launcher.png | Bin 0 -> 1415 bytes .../res/drawable-mdpi/ic_launcher.png | Bin 0 -> 1814 bytes .../res/drawable-xhdpi/ic_launcher.png | Bin 0 -> 3567 bytes samples/HelloEffects/res/drawable/puppy.jpg | Bin 0 -> 73836 bytes samples/HelloEffects/res/layout/main.xml | 26 ++ .../HelloEffects/res/menu/options_menu.xml | 112 +++++++ samples/HelloEffects/res/values/strings.xml | 42 +++ .../example/android/mediafx/GLToolbox.java | 90 ++++++ .../example/android/mediafx/HelloEffects.java | 296 ++++++++++++++++++ .../android/mediafx/TextureRenderer.java | 163 ++++++++++ 15 files changed, 797 insertions(+) create mode 100644 samples/HelloEffects/Android.mk create mode 100644 samples/HelloEffects/AndroidManifest.xml create mode 100644 samples/HelloEffects/_index.html create mode 100644 samples/HelloEffects/res/drawable-hdpi/ic_launcher.png create mode 100644 samples/HelloEffects/res/drawable-ldpi/ic_launcher.png create mode 100644 samples/HelloEffects/res/drawable-mdpi/ic_launcher.png create mode 100644 samples/HelloEffects/res/drawable-xhdpi/ic_launcher.png create mode 100644 samples/HelloEffects/res/drawable/puppy.jpg create mode 100644 samples/HelloEffects/res/layout/main.xml create mode 100644 samples/HelloEffects/res/menu/options_menu.xml create mode 100644 samples/HelloEffects/res/values/strings.xml create mode 100644 samples/HelloEffects/src/com/example/android/mediafx/GLToolbox.java create mode 100644 samples/HelloEffects/src/com/example/android/mediafx/HelloEffects.java create mode 100644 samples/HelloEffects/src/com/example/android/mediafx/TextureRenderer.java diff --git a/build/sdk.atree b/build/sdk.atree index b00aa6499..da744a5cd 100644 --- a/build/sdk.atree +++ b/build/sdk.atree @@ -167,6 +167,7 @@ development/samples/BluetoothHDP samples/${PLATFORM_NAME}/Bluetoot development/samples/ContactManager samples/${PLATFORM_NAME}/ContactManager development/samples/CrossCompatibility samples/${PLATFORM_NAME}/CrossCompatibility development/samples/CubeLiveWallpaper samples/${PLATFORM_NAME}/CubeLiveWallpaper +development/samples/HelloEffects samples/${PLATFORM_NAME}/HelloEffects development/samples/Home samples/${PLATFORM_NAME}/Home development/samples/HoneycombGallery samples/${PLATFORM_NAME}/HoneycombGallery development/samples/JetBoy samples/${PLATFORM_NAME}/JetBoy diff --git a/samples/HelloEffects/Android.mk b/samples/HelloEffects/Android.mk new file mode 100644 index 000000000..1d9a50a54 --- /dev/null +++ b/samples/HelloEffects/Android.mk @@ -0,0 +1,12 @@ +LOCAL_PATH:= $(call my-dir) +include $(CLEAR_VARS) + +LOCAL_MODULE_TAGS := samples + +LOCAL_SRC_FILES := $(call all-subdir-java-files) + +LOCAL_SDK_VERSION := current + +LOCAL_PACKAGE_NAME := HelloEffects + +include $(BUILD_PACKAGE) diff --git a/samples/HelloEffects/AndroidManifest.xml b/samples/HelloEffects/AndroidManifest.xml new file mode 100644 index 000000000..d3c5f64e0 --- /dev/null +++ b/samples/HelloEffects/AndroidManifest.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + diff --git a/samples/HelloEffects/_index.html b/samples/HelloEffects/_index.html new file mode 100644 index 000000000..adf1fa849 --- /dev/null +++ b/samples/HelloEffects/_index.html @@ -0,0 +1,23 @@ + + +

This sample shows how to use the Media +Effects APIs that were introduced in Android 4.0. These APIs let you apply +effects to image frames represented as OpenGL ES 2.0 textures. Image frames can +be images loaded from disk, frames from the device's camera, or other video +streams.

+ + diff --git a/samples/HelloEffects/res/drawable-hdpi/ic_launcher.png b/samples/HelloEffects/res/drawable-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..76278e36b4d2bbe261fd3bb23c37bd65deb070c6 GIT binary patch literal 2678 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 literal 0 HcmV?d00001 diff --git a/samples/HelloEffects/res/drawable-mdpi/ic_launcher.png b/samples/HelloEffects/res/drawable-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..162d976a7bee710d7b046dc061ff725d45da8880 GIT binary patch literal 1814 zcmV+x2kH2UP)5e7^QT2qD>^!-I0GZHY{D%kFn|S2 z0}aAD{%GBaX%4@s2|K97<}6?Wo8h{*79M{yvFbJ(?-+gfJ^>4uz-E*W(R9S+N^tZ_ zic{;vUS=>dy}sY^eT~}oy9^4#!%bS9u{;2YiL*(Jq1HZqu|GSeypxTSM?b5T4f=Yu ztsmy87RCaq_Pt%9;a|9{wYR%dw1Ek1U<{QD~Z`$}j@ZqSbI<9r?Ws_g6!T1qeKES)d^(J!lD zlvq{CY^5DX3dUA;D-`qs0OU|A$=1KMwqPHH;+kLiyxAK%*(FBKsxGOqwCB|6=&Bym z0>Eyw&ZD$-gMsbtnb>k8v_6u3g28)2V&tq6bI_GQKi2r7 z?B)l66Ii`RU;oJ#V||H{vr5cCS0Wv(@=>+l^Z-(LmAW0!*T?cS%qK8{70ikN_LkkG z^TtVBz{}ekZThn8it)zm^zG0C;NgL#8RU_~2v$`92~<$hN)_gnQOKHWT6^lrIOk?} zwlcZ`MzE@uP&|EBTq(UIObP%SJGYAVcMiMis@BK)_As`<2v$`R+i1gA#Z-EUkv$Oc z0I-`Zb1Us27z7o?+mGK;wt0D5`b8aEU;`sqRb@1mR&HKPhpKs!_#z&_TAih{`f7js zTo+^As=daA9`Qv_nZTS4j9^v0$gH$DV;=21=B4tkhz5|_D3UYyLL#eAd#|@?eQmt1 zvIjOWf>pJZz{Y3_ZQ4~qr7etVdLt5mm5*ShYU!YarZnhp)YRJwUqBpiq&{E*8yLZ= zb278h+v`81@6IwhcPkgXo!+1|C_eH zS-_tCiDsp!_wnK6ktU@sw$)JvI`=kceI`2O(FYqCbq_RRN+!`e>+@;%Z;bxvR8*u< z6EJ`UOke|Jn1ekI%y(1n_BuLH#pqA>=m!7>uz(3{VGi|uvk*_uXJyis-92=~#i+_N zdhi##Okw~Fn8eG=@G~RI(+qlT%{uygUqD)WLGOkU6ZnL0Fn|S21Ng8-@+XTJF0<*~ zkN42FL&DHV&IEkHCw%AR6-g|DY2e>Sxy0fB9e?Yc;G-a>66?{-#D;D7fG_xjZ!id! zLI3c;TEm~j6nZPSi1G^q^uu{ZWgSd?Zivj1@eAAV0blS5--2PtKRU+929jyniVgJ9 zHaG1oVRW=nY-{B=_OJvtU<)>38$RGmjQqsm{NM=kVFR{c6Sm<)togV|{9;lk_H-@_D0BIHv?~8HZTgxYE{@@hDz>@Ut79~g zgu%0edptuM`k*g#pbHzY1)H!fe8i9$e=6lNhH0I}C5^Ik@@VBIJH5ZPmp1PbRReF# z;tCFEXY{jE2=4I=ZRmr((19*&z?QH%QTAc(|6+MB5-;yd7Etnnr|FfPd|q}-X=R>^ zR&TjZtMeJH`9uir@eFO~gTBxaBc3GN8aLv9>}97md3&2AR}K8Aet=5`mnE`f$j?&c zK1s5UZ8X3`CAw8UCE4T=O_0AFB+B>ka$Bt2HzEo8FK#YaU~|9lr2qf`07*qoM6N<$ Ef{q%2cK`qY literal 0 HcmV?d00001 diff --git a/samples/HelloEffects/res/drawable-xhdpi/ic_launcher.png b/samples/HelloEffects/res/drawable-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..131d3a0c7e21b803b378f892d682669ddfa0da51 GIT binary patch literal 3567 zcmV3)=6~9L^s}tihs;4AmS(Yc7u6#Bwx4|^NpwT=oztQ~Y zS!>hyBE}&28=r~q_%*l|_uyXCfx3J+6@ZUEUOqY@+p;*(Tz@F>Op9ggS;j^bGB)H4 zW3l;+-JZu-WG-W2X2yEuFy?2Hg1_+@zQZ-R7Wd#@)PcHCC+bEUK8Lh{KJv)9xUpH5 ze=iNo;qObvjxt?M zf1to>IPmQ`0=h!y;Xf3O^Vl)s)@3Pu#$;KNhZVH64B(G>kb%M9D9{x;$8p_9WYi?X z7LV%nL%%ySY(!3d&fWP|*4HdkMe;C#&d?n;z!uo#2~UInLnq3n#F?AwV)DCofOY3U z4O?K-u+;M}8+mN-k2`VUgZuJYL>%=uc|QDBfi18Jw!ucjIbra7@AZ1{RQ1NYxPo|W z$>f~^+h8MXh0TV5-+#gCkRj={`|rxLvQRIE-zuTP304N1VSAUtAGBaW&^>82dk1la zg1Z6yR)MXsS=i1QbQS-A!KsxS2j;ePEBI}l0NcR;EINI_jXhHO{vfVEXg7r4HXMNg zSajyV?0@IJ+$jUi&0am=Ix;X1;w)nJnP2G)C-@EAa`54p%=)^hTp#>a0gITdhB~n6 z(8*fV%q5}GsnuDx0ZgLPYE59&VT0~1-xaSPz+;{_%y2tm#tb%K)DeTS zU;iyX{QP!PQ*)Rv?zbyo14dxw-ca$IQlK?*=kd{u66)=+>Xoo_qTAFP~4uIeoVpX$#9cP-DLyLytJbawHreE*HW_jYy-sB7n!P3!rK_I0ZSQ}w# zZnttHH~=!KRIMI_6IBOns8y?Ta;ZW_1cscYVCp~#rmu3!?5%bh#Q~6w7X5kU!#&nqHeN>Z_$-DVQpUpEr^pqr>Ozrk+M}09GT*6+#BWN_ejQdMXs^!8QGJ)l*Wi z6igMvP#~@Sa&hqK2D=rjH~_tFUmas#yC673t77Pr=hOzxlv>xGB$Qv3IJkQTmYk_- z7z(0I#}9|)w7Bd5jE}uLaRRqqF?K&~1K>o(v1CK76Y~kMjOYN!Pm5*l zuUEEMuFog7T~-UHj}<$olVHi23bs1qKmaXEnMy}0bt^Th10Ww%tEZ9AD$b}stZ`8< zFa=wk&6=LH`is?c;*v)@06$5}ZB&~`)hL9Xyhd54OAB;qbxg1YV>_iceYAg1@6(MQ z?EpyPS=qj;1$B%sa$O(6H09f`1!FrUgg*HpGbp>+Ee=2|eyLn8oH--6<+*0`(u=M; zVEIM&bO^zevlWc(lrY+wR?;)O#VrnSwLI!#&%+Nbcna=x$!c)l6D*i=wt}&}4KUiC zc`49j^$G_-M)H|-lhyIIagWL@TzL!tQ_fZ}wo@W#S9ZP1?w6-H05abRU16WQcgbj% zsa`O)>wulv%rD#ORSxKpqqe-1!-7pAlwm9Dbwp!fifQ&{g$XWD4P&lO=ET&UeJboeunOy4nQ}|4& zoAd$Ge;+E-b3i{@x7+0DOA(N0#r0i!x#P(EX|3L66EM!8YaM{(u!Qj2^Oms5IyC76P(&SG3odVcn=X@?`_@xT=pjGrrID7rR1jUupZ>~7`1^}=GQ?S)pjt-#c=om`*wvJ9-_BaRNyr@c9 zQg!paZ&#_^JFUVA-M|t|!B%HO#!pNXR&M-J9HsCe2i#M@Se-)X!Rn~3SLfgqTe`x^ z>6I4slN$dMuw1n%U7LjI9!&|Qc^|CP8wZT!0Iaioe^qUT)86FnA^u&XLRxh6ssk?+ zY>oe53bsneQl5K#GHpp^_GZLJa=^?BYT;vn!V2dc#kz3xT}eMM1WPbgI+h|24@J}J zZB=x%%J2@rt0?OgdhN-2wG~b*8y{78ni{O~Wq-Olf+1Lfsp7#bKd~e+|HIE|Prh8m zGpGXqG_~H1urxu8zoIanq}4O~zncR)Fa%35b>M__Fim>tY5Mqk*51015geep(V`qK z+Q?MJjA~J(&iW4+f~5n8bFYV?6(1Lh8Jvy5xT_tYy485(s&j8@RGm|_yLAa>UDYGMD*wY2OwS4Ya4@8+yRvpOBA?ul`G6Ieft_ORZ|^CH zqUnp*)2Bxn;e4YHvV8#~umUr%bHnQjf+#ZbetLUDnaF7sHtf5tfDIUd6_~l$``bPR z5%lb|skCO7RV*y|LXqvz12$j;R&wvxZLcuH8g>jNt=umr7TDiZIK0(u1T0c5a?%Ax zV5PI}@Awb5v6Xg5>~LDNwuH8y_GLvkW<5JH87*8}Dj3OaN4LK_E@qE$!^E_lWio)9M%JuAmRMGdfVByLIW+0^7j=EMA_sN?UU1 z(V?%c)Hao4Y5I~Kv~D*acq*96SyJzV-z;qhgXxQR3MP_GhyRZOe{E;yUYfc52(8~I zNB{2R1OcDh4BNo~EF_c8dwZ@}Uo=TcEIlR$BV+{F2lb|T z0&IazunjiCR@f{jTY=QYB~Vl30ebCkdw4n~b7D+PykW)+8(<4;f^D!7wi*O}+i=uZ z3`SFu-lsR#HPRG6qwpxN(~)0$n3cISHD z)6m-Mp*w7VEwD+ZnxSOm|D>el!qIf=fOwkr<{^43*-HO8EGI0OvKx79fNszcxQ#*EV)4nZBL3w5Gyw1KwJ zCfbG$&;>d{H>qO~dC9-CZO;*rS}%Ku9{=t0^y;F$G-FvEPxTnR{~4oy9b{t90kE*a zjoyk)AcPC_UZjU@Ll^$WXZQ}+;9A^+dr=4KLY=4^ZJ;f*iMFAG)FslJ!MEp#zFKy1 zAD2<|O|dW18vDRqct764R~8)M4)zV5;My?xD4ik1+I7j>xEhWq^XMz@EPbSn!coh zUSE2i_uxt{$W)}@Z+wRDa1E}-J-Al_kJsuPthEuLwHfFwG2Wfd2+}4yky;Op)q3kt zEnHv$Y&4fgxFl%ui1yhC?V6$5J+WFHky@QWKIo1)BtSdX7p$d&VOq!t*LrcJCK1|a peYI;sw0nAKb@+h$imw>5{1>=RRi9&IiDCc%002ovPDHLkV1oF?=!5_O literal 0 HcmV?d00001 diff --git a/samples/HelloEffects/res/drawable/puppy.jpg b/samples/HelloEffects/res/drawable/puppy.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ef79be200403ca7f4ae90bc68dfa42a507593239 GIT binary patch literal 73836 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 literal 0 HcmV?d00001 diff --git a/samples/HelloEffects/res/layout/main.xml b/samples/HelloEffects/res/layout/main.xml new file mode 100644 index 000000000..94c23e26e --- /dev/null +++ b/samples/HelloEffects/res/layout/main.xml @@ -0,0 +1,26 @@ + + + + + + diff --git a/samples/HelloEffects/res/menu/options_menu.xml b/samples/HelloEffects/res/menu/options_menu.xml new file mode 100644 index 000000000..531a8dca3 --- /dev/null +++ b/samples/HelloEffects/res/menu/options_menu.xml @@ -0,0 +1,112 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/samples/HelloEffects/res/values/strings.xml b/samples/HelloEffects/res/values/strings.xml new file mode 100644 index 000000000..66203d76c --- /dev/null +++ b/samples/HelloEffects/res/values/strings.xml @@ -0,0 +1,42 @@ + + + + HelloEffects + None + Autofix + Min/Max Color Intensity + Brightness + Contrast + Cross Process + Documentary + Duo Tone + Fill Light + Fish Eye + Flip Vertical + Flip Horizontal + Grain + Grayscale + Lomoish + Negative + Posterize + Rotate + Saturate + Sepia + Sharpen + Temperature + Tint + Vignette + diff --git a/samples/HelloEffects/src/com/example/android/mediafx/GLToolbox.java b/samples/HelloEffects/src/com/example/android/mediafx/GLToolbox.java new file mode 100644 index 000000000..0062fa189 --- /dev/null +++ b/samples/HelloEffects/src/com/example/android/mediafx/GLToolbox.java @@ -0,0 +1,90 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.example.android.mediafx; + +import android.opengl.GLES20; + +public class GLToolbox { + + public static int loadShader(int shaderType, String source) { + int shader = GLES20.glCreateShader(shaderType); + if (shader != 0) { + GLES20.glShaderSource(shader, source); + GLES20.glCompileShader(shader); + int[] compiled = new int[1]; + GLES20.glGetShaderiv(shader, GLES20.GL_COMPILE_STATUS, compiled, 0); + if (compiled[0] == 0) { + String info = GLES20.glGetShaderInfoLog(shader); + GLES20.glDeleteShader(shader); + shader = 0; + throw new RuntimeException("Could not compile shader " + + shaderType + ":" + info); + } + } + return shader; + } + + public static int createProgram(String vertexSource, + String fragmentSource) { + int vertexShader = loadShader(GLES20.GL_VERTEX_SHADER, vertexSource); + if (vertexShader == 0) { + return 0; + } + int pixelShader = loadShader(GLES20.GL_FRAGMENT_SHADER, fragmentSource); + if (pixelShader == 0) { + return 0; + } + + int program = GLES20.glCreateProgram(); + if (program != 0) { + GLES20.glAttachShader(program, vertexShader); + checkGlError("glAttachShader"); + GLES20.glAttachShader(program, pixelShader); + checkGlError("glAttachShader"); + GLES20.glLinkProgram(program); + int[] linkStatus = new int[1]; + GLES20.glGetProgramiv(program, GLES20.GL_LINK_STATUS, linkStatus, + 0); + if (linkStatus[0] != GLES20.GL_TRUE) { + String info = GLES20.glGetProgramInfoLog(program); + GLES20.glDeleteProgram(program); + program = 0; + throw new RuntimeException("Could not link program: " + info); + } + } + return program; + } + + public static void checkGlError(String op) { + int error; + while ((error = GLES20.glGetError()) != GLES20.GL_NO_ERROR) { + throw new RuntimeException(op + ": glError " + error); + } + } + + public static void initTexParams() { + GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, + GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR); + GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, + GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR); + GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, + GLES20.GL_CLAMP_TO_EDGE); + GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, + GLES20.GL_CLAMP_TO_EDGE); + } + +} diff --git a/samples/HelloEffects/src/com/example/android/mediafx/HelloEffects.java b/samples/HelloEffects/src/com/example/android/mediafx/HelloEffects.java new file mode 100644 index 000000000..cfecce052 --- /dev/null +++ b/samples/HelloEffects/src/com/example/android/mediafx/HelloEffects.java @@ -0,0 +1,296 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.example.android.mediafx; + +import android.app.Activity; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Color; +import android.os.Bundle; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; + +import android.media.effect.Effect; +import android.media.effect.EffectContext; +import android.media.effect.EffectFactory; + +import android.opengl.GLES20; +import android.opengl.GLSurfaceView; +import android.opengl.GLUtils; + +import javax.microedition.khronos.egl.EGLConfig; +import javax.microedition.khronos.opengles.GL10; + +public class HelloEffects extends Activity implements GLSurfaceView.Renderer { + + private GLSurfaceView mEffectView; + private int[] mTextures = new int[2]; + private EffectContext mEffectContext; + private Effect mEffect; + private TextureRenderer mTexRenderer = new TextureRenderer(); + private int mImageWidth; + private int mImageHeight; + private boolean mInitialized = false; + int mCurrentEffect; + + public void setCurrentEffect(int effect) { + mCurrentEffect = effect; + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.main); + /** + * Initialize the renderer and tell it to only render when + * explicity requested with the RENDERMODE_WHEN_DIRTY option + */ + mEffectView = (GLSurfaceView) findViewById(R.id.effectsview); + mEffectView.setEGLContextClientVersion(2); + mEffectView.setRenderer(this); + mEffectView.setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY); + mCurrentEffect = R.id.none; + } + + private void loadTextures() { + // Generate textures + GLES20.glGenTextures(2, mTextures, 0); + + // Load input bitmap + Bitmap bitmap = BitmapFactory.decodeResource(getResources(), + R.drawable.puppy); + mImageWidth = bitmap.getWidth(); + mImageHeight = bitmap.getHeight(); + mTexRenderer.updateTextureSize(mImageWidth, mImageHeight); + + // Upload to texture + GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTextures[0]); + GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmap, 0); + + // Set texture parameters + GLToolbox.initTexParams(); + } + + private void initEffect() { + EffectFactory effectFactory = mEffectContext.getFactory(); + if (mEffect != null) { + mEffect.release(); + } + /** + * Initialize the correct effect based on the selected menu/action item + */ + switch (mCurrentEffect) { + + case R.id.none: + break; + + case R.id.autofix: + mEffect = effectFactory.createEffect( + EffectFactory.EFFECT_AUTOFIX); + mEffect.setParameter("scale", 0.5f); + break; + + case R.id.bw: + mEffect = effectFactory.createEffect( + EffectFactory.EFFECT_BLACKWHITE); + mEffect.setParameter("black", .1f); + mEffect.setParameter("white", .7f); + break; + + case R.id.brightness: + mEffect = effectFactory.createEffect( + EffectFactory.EFFECT_BRIGHTNESS); + mEffect.setParameter("brightness", 2.0f); + break; + + case R.id.contrast: + mEffect = effectFactory.createEffect( + EffectFactory.EFFECT_CONTRAST); + mEffect.setParameter("contrast", 1.4f); + break; + + case R.id.crossprocess: + mEffect = effectFactory.createEffect( + EffectFactory.EFFECT_CROSSPROCESS); + break; + + case R.id.documentary: + mEffect = effectFactory.createEffect( + EffectFactory.EFFECT_DOCUMENTARY); + break; + + case R.id.duotone: + mEffect = effectFactory.createEffect( + EffectFactory.EFFECT_DUOTONE); + mEffect.setParameter("first_color", Color.YELLOW); + mEffect.setParameter("second_color", Color.DKGRAY); + break; + + case R.id.filllight: + mEffect = effectFactory.createEffect( + EffectFactory.EFFECT_FILLLIGHT); + mEffect.setParameter("strength", .8f); + break; + + case R.id.fisheye: + mEffect = effectFactory.createEffect( + EffectFactory.EFFECT_FISHEYE); + mEffect.setParameter("scale", .5f); + break; + + case R.id.flipvert: + mEffect = effectFactory.createEffect( + EffectFactory.EFFECT_FLIP); + mEffect.setParameter("vertical", true); + break; + + case R.id.fliphor: + mEffect = effectFactory.createEffect( + EffectFactory.EFFECT_FLIP); + mEffect.setParameter("horizontal", true); + break; + + case R.id.grain: + mEffect = effectFactory.createEffect( + EffectFactory.EFFECT_GRAIN); + mEffect.setParameter("strength", 1.0f); + break; + + case R.id.grayscale: + mEffect = effectFactory.createEffect( + EffectFactory.EFFECT_GRAYSCALE); + break; + + case R.id.lomoish: + mEffect = effectFactory.createEffect( + EffectFactory.EFFECT_LOMOISH); + break; + + case R.id.negative: + mEffect = effectFactory.createEffect( + EffectFactory.EFFECT_NEGATIVE); + break; + + case R.id.posterize: + mEffect = effectFactory.createEffect( + EffectFactory.EFFECT_POSTERIZE); + break; + + case R.id.rotate: + mEffect = effectFactory.createEffect( + EffectFactory.EFFECT_ROTATE); + mEffect.setParameter("angle", 180); + break; + + case R.id.saturate: + mEffect = effectFactory.createEffect( + EffectFactory.EFFECT_SATURATE); + mEffect.setParameter("scale", .5f); + break; + + case R.id.sepia: + mEffect = effectFactory.createEffect( + EffectFactory.EFFECT_SEPIA); + break; + + case R.id.sharpen: + mEffect = effectFactory.createEffect( + EffectFactory.EFFECT_SHARPEN); + break; + + case R.id.temperature: + mEffect = effectFactory.createEffect( + EffectFactory.EFFECT_TEMPERATURE); + mEffect.setParameter("scale", .9f); + break; + + case R.id.tint: + mEffect = effectFactory.createEffect( + EffectFactory.EFFECT_TINT); + mEffect.setParameter("tint", Color.MAGENTA); + break; + + case R.id.vignette: + mEffect = effectFactory.createEffect( + EffectFactory.EFFECT_VIGNETTE); + mEffect.setParameter("scale", .5f); + break; + + default: + break; + + } + } + + private void applyEffect() { + mEffect.apply(mTextures[0], mImageWidth, mImageHeight, mTextures[1]); + } + + private void renderResult() { + if (mCurrentEffect != R.id.none) { + // if no effect is chosen, just render the original bitmap + mTexRenderer.renderTexture(mTextures[1]); + } + else { + // render the result of applyEffect() + mTexRenderer.renderTexture(mTextures[0]); + } + } + + @Override + public void onDrawFrame(GL10 gl) { + if (!mInitialized) { + //Only need to do this once + mEffectContext = EffectContext.createWithCurrentGlContext(); + mTexRenderer.init(); + loadTextures(); + mInitialized = true; + } + if (mCurrentEffect != R.id.none) { + //if an effect is chosen initialize it and apply it to the texture + initEffect(); + applyEffect(); + } + renderResult(); + } + + @Override + public void onSurfaceChanged(GL10 gl, int width, int height) { + if (mTexRenderer != null) { + mTexRenderer.updateViewSize(width, height); + } + } + + @Override + public void onSurfaceCreated(GL10 gl, EGLConfig config) { + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + MenuInflater inflater = getMenuInflater(); + inflater.inflate(R.menu.options_menu, menu); + return true; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + setCurrentEffect(item.getItemId()); + mEffectView.requestRender(); + return true; + } +} diff --git a/samples/HelloEffects/src/com/example/android/mediafx/TextureRenderer.java b/samples/HelloEffects/src/com/example/android/mediafx/TextureRenderer.java new file mode 100644 index 000000000..9ef47bcda --- /dev/null +++ b/samples/HelloEffects/src/com/example/android/mediafx/TextureRenderer.java @@ -0,0 +1,163 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.example.android.mediafx; + +import android.opengl.GLES20; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.FloatBuffer; + +public class TextureRenderer { + + private int mProgram; + private int mTexSamplerHandle; + private int mTexCoordHandle; + private int mPosCoordHandle; + + private FloatBuffer mTexVertices; + private FloatBuffer mPosVertices; + + private int mViewWidth; + private int mViewHeight; + + private int mTexWidth; + private int mTexHeight; + + private static final String VERTEX_SHADER = + "attribute vec4 a_position;\n" + + "attribute vec2 a_texcoord;\n" + + "varying vec2 v_texcoord;\n" + + "void main() {\n" + + " gl_Position = a_position;\n" + + " v_texcoord = a_texcoord;\n" + + "}\n"; + + private static final String FRAGMENT_SHADER = + "precision mediump float;\n" + + "uniform sampler2D tex_sampler;\n" + + "varying vec2 v_texcoord;\n" + + "void main() {\n" + + " gl_FragColor = texture2D(tex_sampler, v_texcoord);\n" + + "}\n"; + + private static final float[] TEX_VERTICES = { + 0.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f + }; + + private static final float[] POS_VERTICES = { + -1.0f, -1.0f, 1.0f, -1.0f, -1.0f, 1.0f, 1.0f, 1.0f + }; + + private static final int FLOAT_SIZE_BYTES = 4; + + public void init() { + // Create program + mProgram = GLToolbox.createProgram(VERTEX_SHADER, FRAGMENT_SHADER); + + // Bind attributes and uniforms + mTexSamplerHandle = GLES20.glGetUniformLocation(mProgram, + "tex_sampler"); + mTexCoordHandle = GLES20.glGetAttribLocation(mProgram, "a_texcoord"); + mPosCoordHandle = GLES20.glGetAttribLocation(mProgram, "a_position"); + + // Setup coordinate buffers + mTexVertices = ByteBuffer.allocateDirect( + TEX_VERTICES.length * FLOAT_SIZE_BYTES) + .order(ByteOrder.nativeOrder()).asFloatBuffer(); + mTexVertices.put(TEX_VERTICES).position(0); + mPosVertices = ByteBuffer.allocateDirect( + POS_VERTICES.length * FLOAT_SIZE_BYTES) + .order(ByteOrder.nativeOrder()).asFloatBuffer(); + mPosVertices.put(POS_VERTICES).position(0); + } + + public void tearDown() { + GLES20.glDeleteProgram(mProgram); + } + + public void updateTextureSize(int texWidth, int texHeight) { + mTexWidth = texWidth; + mTexHeight = texHeight; + computeOutputVertices(); + } + + public void updateViewSize(int viewWidth, int viewHeight) { + mViewWidth = viewWidth; + mViewHeight = viewHeight; + computeOutputVertices(); + } + + public void renderTexture(int texId) { + // Bind default FBO + GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, 0); + + // Use our shader program + GLES20.glUseProgram(mProgram); + GLToolbox.checkGlError("glUseProgram"); + + // Set viewport + GLES20.glViewport(0, 0, mViewWidth, mViewHeight); + GLToolbox.checkGlError("glViewport"); + + // Disable blending + GLES20.glDisable(GLES20.GL_BLEND); + + // Set the vertex attributes + GLES20.glVertexAttribPointer(mTexCoordHandle, 2, GLES20.GL_FLOAT, false, + 0, mTexVertices); + GLES20.glEnableVertexAttribArray(mTexCoordHandle); + GLES20.glVertexAttribPointer(mPosCoordHandle, 2, GLES20.GL_FLOAT, false, + 0, mPosVertices); + GLES20.glEnableVertexAttribArray(mPosCoordHandle); + GLToolbox.checkGlError("vertex attribute setup"); + + // Set the input texture + GLES20.glActiveTexture(GLES20.GL_TEXTURE0); + GLToolbox.checkGlError("glActiveTexture"); + GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, texId); + GLToolbox.checkGlError("glBindTexture"); + GLES20.glUniform1i(mTexSamplerHandle, 0); + + // Draw + GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f); + GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT); + GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4); + } + + private void computeOutputVertices() { + if (mPosVertices != null) { + float imgAspectRatio = mTexWidth / (float)mTexHeight; + float viewAspectRatio = mViewWidth / (float)mViewHeight; + float relativeAspectRatio = viewAspectRatio / imgAspectRatio; + float x0, y0, x1, y1; + if (relativeAspectRatio > 1.0f) { + x0 = -1.0f / relativeAspectRatio; + y0 = -1.0f; + x1 = 1.0f / relativeAspectRatio; + y1 = 1.0f; + } else { + x0 = -1.0f; + y0 = -relativeAspectRatio; + x1 = 1.0f; + y1 = relativeAspectRatio; + } + float[] coords = new float[] { x0, y0, x1, y0, x0, y1, x1, y1 }; + mPosVertices.put(coords).position(0); + } + } +}