RawTexture.java revision 8ac2e8630f33f4d5f65731dc56efa9bfb3570cd7
18ac2e8630f33f4d5f65731dc56efa9bfb3570cd7Owen Lin/* 28ac2e8630f33f4d5f65731dc56efa9bfb3570cd7Owen Lin * Copyright (C) 2010 The Android Open Source Project 38ac2e8630f33f4d5f65731dc56efa9bfb3570cd7Owen Lin * 48ac2e8630f33f4d5f65731dc56efa9bfb3570cd7Owen Lin * Licensed under the Apache License, Version 2.0 (the "License"); 58ac2e8630f33f4d5f65731dc56efa9bfb3570cd7Owen Lin * you may not use this file except in compliance with the License. 68ac2e8630f33f4d5f65731dc56efa9bfb3570cd7Owen Lin * You may obtain a copy of the License at 78ac2e8630f33f4d5f65731dc56efa9bfb3570cd7Owen Lin * 88ac2e8630f33f4d5f65731dc56efa9bfb3570cd7Owen Lin * http://www.apache.org/licenses/LICENSE-2.0 98ac2e8630f33f4d5f65731dc56efa9bfb3570cd7Owen Lin * 108ac2e8630f33f4d5f65731dc56efa9bfb3570cd7Owen Lin * Unless required by applicable law or agreed to in writing, software 118ac2e8630f33f4d5f65731dc56efa9bfb3570cd7Owen Lin * distributed under the License is distributed on an "AS IS" BASIS, 128ac2e8630f33f4d5f65731dc56efa9bfb3570cd7Owen Lin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 138ac2e8630f33f4d5f65731dc56efa9bfb3570cd7Owen Lin * See the License for the specific language governing permissions and 148ac2e8630f33f4d5f65731dc56efa9bfb3570cd7Owen Lin * limitations under the License. 158ac2e8630f33f4d5f65731dc56efa9bfb3570cd7Owen Lin */ 168ac2e8630f33f4d5f65731dc56efa9bfb3570cd7Owen Lin 178ac2e8630f33f4d5f65731dc56efa9bfb3570cd7Owen Linpackage com.android.gallery3d.ui; 188ac2e8630f33f4d5f65731dc56efa9bfb3570cd7Owen Lin 198ac2e8630f33f4d5f65731dc56efa9bfb3570cd7Owen Linimport javax.microedition.khronos.opengles.GL11; 208ac2e8630f33f4d5f65731dc56efa9bfb3570cd7Owen Linimport javax.microedition.khronos.opengles.GL11Ext; 218ac2e8630f33f4d5f65731dc56efa9bfb3570cd7Owen Lin 228ac2e8630f33f4d5f65731dc56efa9bfb3570cd7Owen Linpublic class RawTexture extends BasicTexture { 238ac2e8630f33f4d5f65731dc56efa9bfb3570cd7Owen Lin private static final String TAG = "RawTexture"; 248ac2e8630f33f4d5f65731dc56efa9bfb3570cd7Owen Lin 258ac2e8630f33f4d5f65731dc56efa9bfb3570cd7Owen Lin private final static int[] sTextureId = new int[1]; 268ac2e8630f33f4d5f65731dc56efa9bfb3570cd7Owen Lin private final static float[] sCropRect = new float[4]; 278ac2e8630f33f4d5f65731dc56efa9bfb3570cd7Owen Lin 288ac2e8630f33f4d5f65731dc56efa9bfb3570cd7Owen Lin private final boolean mOpaque; 298ac2e8630f33f4d5f65731dc56efa9bfb3570cd7Owen Lin 308ac2e8630f33f4d5f65731dc56efa9bfb3570cd7Owen Lin public RawTexture(int width, int height, boolean opaque) { 318ac2e8630f33f4d5f65731dc56efa9bfb3570cd7Owen Lin mOpaque = opaque; 328ac2e8630f33f4d5f65731dc56efa9bfb3570cd7Owen Lin setSize(width, height); 338ac2e8630f33f4d5f65731dc56efa9bfb3570cd7Owen Lin } 348ac2e8630f33f4d5f65731dc56efa9bfb3570cd7Owen Lin 358ac2e8630f33f4d5f65731dc56efa9bfb3570cd7Owen Lin @Override 368ac2e8630f33f4d5f65731dc56efa9bfb3570cd7Owen Lin public boolean isOpaque() { 378ac2e8630f33f4d5f65731dc56efa9bfb3570cd7Owen Lin return mOpaque; 388ac2e8630f33f4d5f65731dc56efa9bfb3570cd7Owen Lin } 398ac2e8630f33f4d5f65731dc56efa9bfb3570cd7Owen Lin 408ac2e8630f33f4d5f65731dc56efa9bfb3570cd7Owen Lin protected void prepare(GLCanvas canvas) { 418ac2e8630f33f4d5f65731dc56efa9bfb3570cd7Owen Lin GL11 gl = canvas.getGLInstance(); 428ac2e8630f33f4d5f65731dc56efa9bfb3570cd7Owen Lin 438ac2e8630f33f4d5f65731dc56efa9bfb3570cd7Owen Lin // Define a vertically flipped crop rectangle for 448ac2e8630f33f4d5f65731dc56efa9bfb3570cd7Owen Lin // OES_draw_texture. 458ac2e8630f33f4d5f65731dc56efa9bfb3570cd7Owen Lin // The four values in sCropRect are: left, bottom, width, and 468ac2e8630f33f4d5f65731dc56efa9bfb3570cd7Owen Lin // height. Negative value of width or height means flip. 478ac2e8630f33f4d5f65731dc56efa9bfb3570cd7Owen Lin sCropRect[0] = 0; 488ac2e8630f33f4d5f65731dc56efa9bfb3570cd7Owen Lin sCropRect[1] = mHeight; 498ac2e8630f33f4d5f65731dc56efa9bfb3570cd7Owen Lin sCropRect[2] = mWidth; 508ac2e8630f33f4d5f65731dc56efa9bfb3570cd7Owen Lin sCropRect[3] = -mHeight; 518ac2e8630f33f4d5f65731dc56efa9bfb3570cd7Owen Lin 528ac2e8630f33f4d5f65731dc56efa9bfb3570cd7Owen Lin // Upload the bitmap to a new texture. 538ac2e8630f33f4d5f65731dc56efa9bfb3570cd7Owen Lin GLId.glGenTextures(1, sTextureId, 0); 548ac2e8630f33f4d5f65731dc56efa9bfb3570cd7Owen Lin gl.glBindTexture(GL11.GL_TEXTURE_2D, sTextureId[0]); 558ac2e8630f33f4d5f65731dc56efa9bfb3570cd7Owen Lin gl.glTexParameterfv(GL11.GL_TEXTURE_2D, 568ac2e8630f33f4d5f65731dc56efa9bfb3570cd7Owen Lin GL11Ext.GL_TEXTURE_CROP_RECT_OES, sCropRect, 0); 578ac2e8630f33f4d5f65731dc56efa9bfb3570cd7Owen Lin gl.glTexParameteri(GL11.GL_TEXTURE_2D, 588ac2e8630f33f4d5f65731dc56efa9bfb3570cd7Owen Lin GL11.GL_TEXTURE_WRAP_S, GL11.GL_CLAMP_TO_EDGE); 598ac2e8630f33f4d5f65731dc56efa9bfb3570cd7Owen Lin gl.glTexParameteri(GL11.GL_TEXTURE_2D, 608ac2e8630f33f4d5f65731dc56efa9bfb3570cd7Owen Lin GL11.GL_TEXTURE_WRAP_T, GL11.GL_CLAMP_TO_EDGE); 618ac2e8630f33f4d5f65731dc56efa9bfb3570cd7Owen Lin gl.glTexParameterf(GL11.GL_TEXTURE_2D, 628ac2e8630f33f4d5f65731dc56efa9bfb3570cd7Owen Lin GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR); 638ac2e8630f33f4d5f65731dc56efa9bfb3570cd7Owen Lin gl.glTexParameterf(GL11.GL_TEXTURE_2D, 648ac2e8630f33f4d5f65731dc56efa9bfb3570cd7Owen Lin GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR); 658ac2e8630f33f4d5f65731dc56efa9bfb3570cd7Owen Lin 668ac2e8630f33f4d5f65731dc56efa9bfb3570cd7Owen Lin gl.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA, 678ac2e8630f33f4d5f65731dc56efa9bfb3570cd7Owen Lin getTextureWidth(), getTextureHeight(), 688ac2e8630f33f4d5f65731dc56efa9bfb3570cd7Owen Lin 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, null); 698ac2e8630f33f4d5f65731dc56efa9bfb3570cd7Owen Lin 708ac2e8630f33f4d5f65731dc56efa9bfb3570cd7Owen Lin mId = sTextureId[0]; 718ac2e8630f33f4d5f65731dc56efa9bfb3570cd7Owen Lin mState = UploadedTexture.STATE_LOADED; 728ac2e8630f33f4d5f65731dc56efa9bfb3570cd7Owen Lin setAssociatedCanvas(canvas); 738ac2e8630f33f4d5f65731dc56efa9bfb3570cd7Owen Lin } 748ac2e8630f33f4d5f65731dc56efa9bfb3570cd7Owen Lin 758ac2e8630f33f4d5f65731dc56efa9bfb3570cd7Owen Lin @Override 768ac2e8630f33f4d5f65731dc56efa9bfb3570cd7Owen Lin protected boolean onBind(GLCanvas canvas) { 778ac2e8630f33f4d5f65731dc56efa9bfb3570cd7Owen Lin if (isLoaded(canvas)) return true; 788ac2e8630f33f4d5f65731dc56efa9bfb3570cd7Owen Lin Log.w(TAG, "lost the content due to context change"); 798ac2e8630f33f4d5f65731dc56efa9bfb3570cd7Owen Lin return false; 808ac2e8630f33f4d5f65731dc56efa9bfb3570cd7Owen Lin } 818ac2e8630f33f4d5f65731dc56efa9bfb3570cd7Owen Lin 828ac2e8630f33f4d5f65731dc56efa9bfb3570cd7Owen Lin @Override 838ac2e8630f33f4d5f65731dc56efa9bfb3570cd7Owen Lin public void yield() { 848ac2e8630f33f4d5f65731dc56efa9bfb3570cd7Owen Lin // we cannot free the texture because we have no backup. 858ac2e8630f33f4d5f65731dc56efa9bfb3570cd7Owen Lin } 868ac2e8630f33f4d5f65731dc56efa9bfb3570cd7Owen Lin 878ac2e8630f33f4d5f65731dc56efa9bfb3570cd7Owen Lin @Override 888ac2e8630f33f4d5f65731dc56efa9bfb3570cd7Owen Lin protected int getTarget() { 898ac2e8630f33f4d5f65731dc56efa9bfb3570cd7Owen Lin return GL11.GL_TEXTURE_2D; 908ac2e8630f33f4d5f65731dc56efa9bfb3570cd7Owen Lin } 918ac2e8630f33f4d5f65731dc56efa9bfb3570cd7Owen Lin} 92