filter.cpp revision cba73d3210c18f0fbcac2e9b5b95a717d4a6d977
1#include <stdlib.h> 2#include <stdio.h> 3 4#include <EGL/egl.h> 5#include <GLES/gl.h> 6#include <GLES/glext.h> 7 8#include <ui/FramebufferNativeWindow.h> 9#include <ui/EGLUtils.h> 10 11using namespace android; 12 13int main(int argc, char** argv) 14{ 15 if (argc!=2 && argc!=3) { 16 printf("usage: %s <0-6> [pbuffer]\n", argv[0]); 17 return 0; 18 } 19 20 const int test = atoi(argv[1]); 21 int usePbuffer = argc==3 && !strcmp(argv[2], "pbuffer"); 22 EGLint s_configAttribs[] = { 23 EGL_SURFACE_TYPE, EGL_PBUFFER_BIT|EGL_WINDOW_BIT, 24 EGL_RED_SIZE, 5, 25 EGL_GREEN_SIZE, 6, 26 EGL_BLUE_SIZE, 5, 27 EGL_NONE 28 }; 29 30 EGLint numConfigs = -1; 31 EGLint majorVersion; 32 EGLint minorVersion; 33 EGLConfig config; 34 EGLContext context; 35 EGLSurface surface; 36 EGLint w, h; 37 38 EGLDisplay dpy; 39 40 EGLNativeWindowType window = 0; 41 if (!usePbuffer) { 42 window = android_createDisplaySurface(); 43 } 44 45 dpy = eglGetDisplay(EGL_DEFAULT_DISPLAY); 46 eglInitialize(dpy, &majorVersion, &minorVersion); 47 if (!usePbuffer) { 48 EGLUtils::selectConfigForNativeWindow( 49 dpy, s_configAttribs, window, &config); 50 surface = eglCreateWindowSurface(dpy, config, window, NULL); 51 } else { 52 printf("using pbuffer\n"); 53 eglChooseConfig(dpy, s_configAttribs, &config, 1, &numConfigs); 54 EGLint attribs[] = { EGL_WIDTH, 320, EGL_HEIGHT, 480, EGL_NONE }; 55 surface = eglCreatePbufferSurface(dpy, config, attribs); 56 if (surface == EGL_NO_SURFACE) { 57 printf("eglCreatePbufferSurface error %x\n", eglGetError()); 58 } 59 } 60 context = eglCreateContext(dpy, config, NULL, NULL); 61 eglMakeCurrent(dpy, surface, surface, context); 62 eglQuerySurface(dpy, surface, EGL_WIDTH, &w); 63 eglQuerySurface(dpy, surface, EGL_HEIGHT, &h); 64 GLint dim = w<h ? w : h; 65 66 glViewport(0, 0, w, h); 67 glMatrixMode(GL_PROJECTION); 68 glLoadIdentity(); 69 glOrthof(0, w, h, 0, 0, 1); 70 71 glClearColor(0,0,0,0); 72 glClear(GL_COLOR_BUFFER_BIT); 73 74 GLint crop[4] = { 0, 4, 4, -4 }; 75 glBindTexture(GL_TEXTURE_2D, 0); 76 glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES, crop); 77 glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 78 glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 79 glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 80 glEnable(GL_TEXTURE_2D); 81 glColor4f(1,1,1,1); 82 83 // packing is always 4 84 uint8_t t8[] = { 85 0x00, 0x55, 0x00, 0x55, 86 0xAA, 0xFF, 0xAA, 0xFF, 87 0x00, 0x55, 0x00, 0x55, 88 0xAA, 0xFF, 0xAA, 0xFF }; 89 90 uint16_t t16[] = { 91 0x0000, 0x5555, 0x0000, 0x5555, 92 0xAAAA, 0xFFFF, 0xAAAA, 0xFFFF, 93 0x0000, 0x5555, 0x0000, 0x5555, 94 0xAAAA, 0xFFFF, 0xAAAA, 0xFFFF }; 95 96 uint16_t t5551[] = { 97 0x0000, 0xFFFF, 0x0000, 0xFFFF, 98 0xFFFF, 0x0000, 0xFFFF, 0x0000, 99 0x0000, 0xFFFF, 0x0000, 0xFFFF, 100 0xFFFF, 0x0000, 0xFFFF, 0x0000 }; 101 102 uint32_t t32[] = { 103 0xFF000000, 0xFF0000FF, 0xFF00FF00, 0xFFFF0000, 104 0xFF00FF00, 0xFFFF0000, 0xFF000000, 0xFF0000FF, 105 0xFF00FFFF, 0xFF00FF00, 0x00FF00FF, 0xFFFFFF00, 106 0xFF000000, 0xFFFF00FF, 0xFF00FFFF, 0xFFFFFFFF 107 }; 108 109 switch(test) 110 { 111 case 1: 112 glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, 113 4, 4, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, t8); 114 break; 115 case 2: 116 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 117 4, 4, 0, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, t16); 118 break; 119 case 3: 120 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 121 4, 4, 0, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, t16); 122 break; 123 case 4: 124 glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE_ALPHA, 125 4, 4, 0, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, t16); 126 break; 127 case 5: 128 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 129 4, 4, 0, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1, t5551); 130 break; 131 case 6: 132 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 133 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, t32); 134 break; 135 } 136 137 //glDrawTexiOES(0, 0, 0, dim, dim); 138 139 const GLfloat vertices[4][2] = { 140 { 0, 0 }, 141 { 0, dim }, 142 { dim, dim }, 143 { dim, 0 } 144 }; 145 146 const GLfloat texCoords[4][2] = { 147 { 0, 0 }, 148 { 0, 1 }, 149 { 1, 1 }, 150 { 1, 0 } 151 }; 152 153 if (!usePbuffer) { 154 eglSwapBuffers(dpy, surface); 155 } 156 157 glMatrixMode(GL_MODELVIEW); 158 //glEnable(GL_SCISSOR_TEST); 159 //glScissor(0,dim,dim,h-dim); 160 161 for (int y=0 ; y<dim ; y++) { 162 glLoadIdentity(); 163 glTranslatef(0, -y, 0); 164 165 glClear(GL_COLOR_BUFFER_BIT); 166 glEnableClientState(GL_VERTEX_ARRAY); 167 glEnableClientState(GL_TEXTURE_COORD_ARRAY); 168 glVertexPointer(2, GL_FLOAT, 0, vertices); 169 glTexCoordPointer(2, GL_FLOAT, 0, texCoords); 170 glDrawArrays(GL_TRIANGLE_FAN, 0, 4); 171 172 173 if (!usePbuffer) { 174 eglSwapBuffers(dpy, surface); 175 } else { 176 glFinish(); 177 } 178 } 179 180 181 eglTerminate(dpy); 182 return 0; 183} 184