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