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