1aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy/*
2aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy * Copyright (C) 2011 The Android Open Source Project
3aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy *
4aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy * Licensed under the Apache License, Version 2.0 (the "License");
5aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy * you may not use this file except in compliance with the License.
6aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy * You may obtain a copy of the License at
7aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy *
8aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy *      http://www.apache.org/licenses/LICENSE-2.0
9aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy *
10aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy * Unless required by applicable law or agreed to in writing, software
11aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy * distributed under the License is distributed on an "AS IS" BASIS,
12aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy * See the License for the specific language governing permissions and
14aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy * limitations under the License.
15aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy */
16aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy
17aa6c24c21c727a196451332448d4e3b11a80be69Romain Guypackage android.view;
18aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy
19c89b14bba0f6cc2c91629080617f7ed215f697f3Romain Guyimport android.graphics.Canvas;
20302a9df1d50373c82923bb84ff665dfce584fb22Romain Guyimport android.graphics.Matrix;
212bf68f063b0077ddef6ebfe54f2ae5e063c2c229Romain Guyimport android.graphics.Rect;
22aa6c24c21c727a196451332448d4e3b11a80be69Romain Guyimport android.graphics.SurfaceTexture;
23aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy
24aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy/**
25aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy * An OpenGL ES 2.0 implementation of {@link HardwareLayer}. This
26aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy * implementation can be used as a texture. Rendering into this
27aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy * layer is not controlled by a {@link HardwareCanvas}.
28aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy */
29aa6c24c21c727a196451332448d4e3b11a80be69Romain Guyclass GLES20TextureLayer extends GLES20Layer {
30aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy    private int mTexture;
31aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy    private SurfaceTexture mSurface;
32aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy
33a9489274d67b540804aafb587a226f7c2ae4464dRomain Guy    GLES20TextureLayer(boolean isOpaque) {
34aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy        int[] layerInfo = new int[2];
35a9489274d67b540804aafb587a226f7c2ae4464dRomain Guy        mLayer = GLES20Canvas.nCreateTextureLayer(isOpaque, layerInfo);
36aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy
37aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy        if (mLayer != 0) {
38aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy            mTexture = layerInfo[0];
39aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy            mFinalizer = new Finalizer(mLayer);
40aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy        } else {
41aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy            mFinalizer = null;
42ef09a210dd6ea481158b7028ec2424a7f5769ed2Romain Guy        }
43aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy    }
44aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy
45aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy    @Override
46aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy    boolean isValid() {
47aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy        return mLayer != 0 && mTexture != 0;
48aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy    }
49aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy
50aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy    @Override
51603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase    boolean resize(int width, int height) {
52603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase        return isValid();
53aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy    }
54aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy
55aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy    @Override
56aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy    HardwareCanvas getCanvas() {
57aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy        return null;
58aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy    }
59aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy
60aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy    @Override
61c89b14bba0f6cc2c91629080617f7ed215f697f3Romain Guy    HardwareCanvas start(Canvas currentCanvas) {
62aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy        return null;
63aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy    }
64aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy
65aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy    @Override
66c89b14bba0f6cc2c91629080617f7ed215f697f3Romain Guy    void end(Canvas currentCanvas) {
67aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy    }
68aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy
69aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy    SurfaceTexture getSurfaceTexture() {
70aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy        if (mSurface == null) {
715c5050d9026f7e0ba52bec094f681e048cdd5d9aGrace Kloba            mSurface = new SurfaceTexture(mTexture, false);
72aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy        }
73aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy        return mSurface;
74aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy    }
75aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy
762af3524beb75150d347accc925022daa53b4a789Jamie Gennis    void setSurfaceTexture(SurfaceTexture surfaceTexture) {
772af3524beb75150d347accc925022daa53b4a789Jamie Gennis        if (mSurface != null) {
782af3524beb75150d347accc925022daa53b4a789Jamie Gennis            mSurface.release();
792af3524beb75150d347accc925022daa53b4a789Jamie Gennis        }
802af3524beb75150d347accc925022daa53b4a789Jamie Gennis        mSurface = surfaceTexture;
812af3524beb75150d347accc925022daa53b4a789Jamie Gennis        mSurface.attachToGLContext(mTexture);
822af3524beb75150d347accc925022daa53b4a789Jamie Gennis    }
832af3524beb75150d347accc925022daa53b4a789Jamie Gennis
8402ccac69fd1c0a03c24c5f3ace0ad4bed337b1fdRomain Guy    @Override
85a9489274d67b540804aafb587a226f7c2ae4464dRomain Guy    void update(int width, int height, boolean isOpaque) {
8602ccac69fd1c0a03c24c5f3ace0ad4bed337b1fdRomain Guy        super.update(width, height, isOpaque);
87a9489274d67b540804aafb587a226f7c2ae4464dRomain Guy        GLES20Canvas.nUpdateTextureLayer(mLayer, width, height, isOpaque, mSurface);
88aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy    }
89302a9df1d50373c82923bb84ff665dfce584fb22Romain Guy
90302a9df1d50373c82923bb84ff665dfce584fb22Romain Guy    @Override
91846a533945576e5cb1a66529ca3a52d71749f04fRomain Guy    void setOpaque(boolean isOpaque) {
92846a533945576e5cb1a66529ca3a52d71749f04fRomain Guy        throw new UnsupportedOperationException("Use update(int, int, boolean) instead");
93846a533945576e5cb1a66529ca3a52d71749f04fRomain Guy    }
94846a533945576e5cb1a66529ca3a52d71749f04fRomain Guy
95846a533945576e5cb1a66529ca3a52d71749f04fRomain Guy    @Override
96302a9df1d50373c82923bb84ff665dfce584fb22Romain Guy    void setTransform(Matrix matrix) {
97302a9df1d50373c82923bb84ff665dfce584fb22Romain Guy        GLES20Canvas.nSetTextureLayerTransform(mLayer, matrix.native_instance);
98302a9df1d50373c82923bb84ff665dfce584fb22Romain Guy    }
992bf68f063b0077ddef6ebfe54f2ae5e063c2c229Romain Guy
1002bf68f063b0077ddef6ebfe54f2ae5e063c2c229Romain Guy    @Override
10111cb642756093a4af901b1525375b1eb2b5c3e2bRomain Guy    void redrawLater(DisplayList displayList, Rect dirtyRect) {
1022bf68f063b0077ddef6ebfe54f2ae5e063c2c229Romain Guy    }
103aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy}
104