Home | History | Annotate | Download | only in view
      1 /*
      2  * Copyright (C) 2011 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package android.view;
     18 
     19 import android.graphics.Canvas;
     20 import android.graphics.Matrix;
     21 import android.graphics.Rect;
     22 import android.graphics.SurfaceTexture;
     23 
     24 /**
     25  * An OpenGL ES 2.0 implementation of {@link HardwareLayer}. This
     26  * implementation can be used as a texture. Rendering into this
     27  * layer is not controlled by a {@link HardwareCanvas}.
     28  */
     29 class GLES20TextureLayer extends GLES20Layer {
     30     private int mTexture;
     31     private SurfaceTexture mSurface;
     32 
     33     GLES20TextureLayer(boolean isOpaque) {
     34         int[] layerInfo = new int[2];
     35         mLayer = GLES20Canvas.nCreateTextureLayer(isOpaque, layerInfo);
     36 
     37         if (mLayer != 0) {
     38             mTexture = layerInfo[0];
     39             mFinalizer = new Finalizer(mLayer);
     40         } else {
     41             mFinalizer = null;
     42         }
     43     }
     44 
     45     @Override
     46     boolean isValid() {
     47         return mLayer != 0 && mTexture != 0;
     48     }
     49 
     50     @Override
     51     boolean resize(int width, int height) {
     52         return isValid();
     53     }
     54 
     55     @Override
     56     HardwareCanvas getCanvas() {
     57         return null;
     58     }
     59 
     60     @Override
     61     HardwareCanvas start(Canvas currentCanvas) {
     62         return null;
     63     }
     64 
     65     @Override
     66     HardwareCanvas start(Canvas currentCanvas, Rect dirty) {
     67         return null;
     68     }
     69 
     70     @Override
     71     void end(Canvas currentCanvas) {
     72     }
     73 
     74     SurfaceTexture getSurfaceTexture() {
     75         if (mSurface == null) {
     76             mSurface = new SurfaceTexture(mTexture);
     77         }
     78         return mSurface;
     79     }
     80 
     81     void setSurfaceTexture(SurfaceTexture surfaceTexture) {
     82         if (mSurface != null) {
     83             mSurface.release();
     84         }
     85         mSurface = surfaceTexture;
     86         mSurface.attachToGLContext(mTexture);
     87     }
     88 
     89     @Override
     90     void update(int width, int height, boolean isOpaque) {
     91         super.update(width, height, isOpaque);
     92         GLES20Canvas.nUpdateTextureLayer(mLayer, width, height, isOpaque, mSurface);
     93     }
     94 
     95     @Override
     96     void setOpaque(boolean isOpaque) {
     97         throw new UnsupportedOperationException("Use update(int, int, boolean) instead");
     98     }
     99 
    100     @Override
    101     void setTransform(Matrix matrix) {
    102         GLES20Canvas.nSetTextureLayerTransform(mLayer, matrix.native_instance);
    103     }
    104 
    105     @Override
    106     void redrawLater(DisplayList displayList, Rect dirtyRect) {
    107     }
    108 }
    109