16c319ca1275c8db892c39b48fc54864c949f9171Romain Guy/*
26c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * Copyright (C) 2011 The Android Open Source Project
36c319ca1275c8db892c39b48fc54864c949f9171Romain Guy *
46c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * Licensed under the Apache License, Version 2.0 (the "License");
56c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * you may not use this file except in compliance with the License.
66c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * You may obtain a copy of the License at
76c319ca1275c8db892c39b48fc54864c949f9171Romain Guy *
86c319ca1275c8db892c39b48fc54864c949f9171Romain Guy *      http://www.apache.org/licenses/LICENSE-2.0
96c319ca1275c8db892c39b48fc54864c949f9171Romain Guy *
106c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * Unless required by applicable law or agreed to in writing, software
116c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * distributed under the License is distributed on an "AS IS" BASIS,
126c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * See the License for the specific language governing permissions and
146c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * limitations under the License.
156c319ca1275c8db892c39b48fc54864c949f9171Romain Guy */
166c319ca1275c8db892c39b48fc54864c949f9171Romain Guy
176c319ca1275c8db892c39b48fc54864c949f9171Romain Guy
18aa6c24c21c727a196451332448d4e3b11a80be69Romain Guypackage android.view;
196c319ca1275c8db892c39b48fc54864c949f9171Romain Guy
2077a811610f99e21da7f88dafef60d09f345d0506Romain Guyimport android.graphics.Bitmap;
21d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haaseimport android.graphics.Paint;
2277a811610f99e21da7f88dafef60d09f345d0506Romain Guy
236c319ca1275c8db892c39b48fc54864c949f9171Romain Guy/**
246c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * An OpenGL ES 2.0 implementation of {@link HardwareLayer}.
256c319ca1275c8db892c39b48fc54864c949f9171Romain Guy */
26aa6c24c21c727a196451332448d4e3b11a80be69Romain Guyabstract class GLES20Layer extends HardwareLayer {
27aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy    int mLayer;
28aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy    Finalizer mFinalizer;
296c319ca1275c8db892c39b48fc54864c949f9171Romain Guy
30aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy    GLES20Layer() {
31aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy    }
326c319ca1275c8db892c39b48fc54864c949f9171Romain Guy
33aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy    GLES20Layer(int width, int height, boolean opaque) {
34aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy        super(width, height, opaque);
356c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    }
366c319ca1275c8db892c39b48fc54864c949f9171Romain Guy
37ada830f639591b99c3e40de22b07296c7932a33fRomain Guy    /**
38ada830f639591b99c3e40de22b07296c7932a33fRomain Guy     * Returns the native layer object used to render this layer.
39ada830f639591b99c3e40de22b07296c7932a33fRomain Guy     *
40ada830f639591b99c3e40de22b07296c7932a33fRomain Guy     * @return A pointer to the native layer object, or 0 if the object is NULL
41ada830f639591b99c3e40de22b07296c7932a33fRomain Guy     */
42ada830f639591b99c3e40de22b07296c7932a33fRomain Guy    public int getLayer() {
43ada830f639591b99c3e40de22b07296c7932a33fRomain Guy        return mLayer;
446c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    }
456c319ca1275c8db892c39b48fc54864c949f9171Romain Guy
4602ccac69fd1c0a03c24c5f3ace0ad4bed337b1fdRomain Guy    @Override
47d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase    void setLayerPaint(Paint paint) {
48d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase        if (paint != null) {
49d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase            GLES20Canvas.nSetLayerPaint(mLayer, paint.mNativePaint);
50d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase            GLES20Canvas.nSetLayerColorFilter(mLayer, paint.getColorFilter() != null ?
51d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase                    paint.getColorFilter().nativeColorFilter : 0);
52d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase        }
53d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase    }
54d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase
55d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase    @Override
5677a811610f99e21da7f88dafef60d09f345d0506Romain Guy    boolean copyInto(Bitmap bitmap) {
5777a811610f99e21da7f88dafef60d09f345d0506Romain Guy        return GLES20Canvas.nCopyLayer(mLayer, bitmap.mNativeBitmap);
5802ccac69fd1c0a03c24c5f3ace0ad4bed337b1fdRomain Guy    }
5977a811610f99e21da7f88dafef60d09f345d0506Romain Guy
606c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    @Override
616c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    void destroy() {
62ea83503e8683531fac2534047e50bc1e5979b6ddRomain Guy        if (mFinalizer != null) {
63ea83503e8683531fac2534047e50bc1e5979b6ddRomain Guy            mFinalizer.destroy();
64ea83503e8683531fac2534047e50bc1e5979b6ddRomain Guy            mFinalizer = null;
65ea83503e8683531fac2534047e50bc1e5979b6ddRomain Guy        }
66ada830f639591b99c3e40de22b07296c7932a33fRomain Guy        mLayer = 0;
676c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    }
686c319ca1275c8db892c39b48fc54864c949f9171Romain Guy
69ef09a210dd6ea481158b7028ec2424a7f5769ed2Romain Guy    @Override
70ef09a210dd6ea481158b7028ec2424a7f5769ed2Romain Guy    void clearStorage() {
71ef09a210dd6ea481158b7028ec2424a7f5769ed2Romain Guy        if (mLayer != 0) GLES20Canvas.nClearLayerTexture(mLayer);
72ef09a210dd6ea481158b7028ec2424a7f5769ed2Romain Guy    }
73ef09a210dd6ea481158b7028ec2424a7f5769ed2Romain Guy
74aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy    static class Finalizer {
756c319ca1275c8db892c39b48fc54864c949f9171Romain Guy        private int mLayerId;
766c319ca1275c8db892c39b48fc54864c949f9171Romain Guy
77ada830f639591b99c3e40de22b07296c7932a33fRomain Guy        public Finalizer(int layerId) {
786c319ca1275c8db892c39b48fc54864c949f9171Romain Guy            mLayerId = layerId;
796c319ca1275c8db892c39b48fc54864c949f9171Romain Guy        }
806c319ca1275c8db892c39b48fc54864c949f9171Romain Guy
816c319ca1275c8db892c39b48fc54864c949f9171Romain Guy        @Override
826c319ca1275c8db892c39b48fc54864c949f9171Romain Guy        protected void finalize() throws Throwable {
836c319ca1275c8db892c39b48fc54864c949f9171Romain Guy            try {
84ada830f639591b99c3e40de22b07296c7932a33fRomain Guy                if (mLayerId != 0) {
85ada830f639591b99c3e40de22b07296c7932a33fRomain Guy                    GLES20Canvas.nDestroyLayerDeferred(mLayerId);
866c319ca1275c8db892c39b48fc54864c949f9171Romain Guy                }
876c319ca1275c8db892c39b48fc54864c949f9171Romain Guy            } finally {
886c319ca1275c8db892c39b48fc54864c949f9171Romain Guy                super.finalize();
896c319ca1275c8db892c39b48fc54864c949f9171Romain Guy            }
906c319ca1275c8db892c39b48fc54864c949f9171Romain Guy        }
916c319ca1275c8db892c39b48fc54864c949f9171Romain Guy
926c319ca1275c8db892c39b48fc54864c949f9171Romain Guy        void destroy() {
93ada830f639591b99c3e40de22b07296c7932a33fRomain Guy            GLES20Canvas.nDestroyLayer(mLayerId);
94ada830f639591b99c3e40de22b07296c7932a33fRomain Guy            mLayerId = 0;
956c319ca1275c8db892c39b48fc54864c949f9171Romain Guy        }
966c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    }
976c319ca1275c8db892c39b48fc54864c949f9171Romain Guy}
98