HardwareLayer.java revision 12f5e3433226f0a2886a98b0b8da8d5e947c5cde
18d5a16ca0b3d19fdde3d0d453dd16a9c46395345Chris Lattner/* 22b37d7cf28b1382420b5e4007042feeb66d21ac8Misha Brukman * Copyright (C) 2011 The Android Open Source Project 3b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell * 4b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell * Licensed under the Apache License, Version 2.0 (the "License"); 54ee451de366474b9c228b4e5fa573795a715216dChris Lattner * you may not use this file except in compliance with the License. 64ee451de366474b9c228b4e5fa573795a715216dChris Lattner * You may obtain a copy of the License at 72b37d7cf28b1382420b5e4007042feeb66d21ac8Misha Brukman * 8b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell * http://www.apache.org/licenses/LICENSE-2.0 941fbf305ee3e2c3b8610459e8c09b60e61f4d34dChris Lattner * 1041fbf305ee3e2c3b8610459e8c09b60e61f4d34dChris Lattner * Unless required by applicable law or agreed to in writing, software 1136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines * distributed under the License is distributed on an "AS IS" BASIS, 120b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth * See the License for the specific language governing permissions and 140b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth * limitations under the License. 15265c026fee512f8206050c0b3f956fe072b05b34David Greene */ 1645cfe545ec8177262dabc70580ce05feaa1c3880Chris Lattner 17b81c021f14107b12d1275c84fbce170db06437a5Chris Lattnerpackage android.view; 18d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 1936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesimport android.graphics.Bitmap; 2036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesimport android.graphics.Matrix; 2136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesimport android.graphics.Paint; 2236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesimport android.graphics.SurfaceTexture; 2336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 24dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesimport com.android.internal.util.VirtualRefBasePtr; 25dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 2636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/** 2736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines * A hardware layer can be used to render graphics operations into a hardware 2836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines * friendly buffer. For instance, with an OpenGL backend a hardware layer 2936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines * would use a Frame Buffer Object (FBO.) The hardware layer can be used as 3036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines * a drawing cache when a complex set of graphics operations needs to be 31dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines * drawn several times. 3236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines * 3336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines * @hide 3436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines */ 3536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesfinal class HardwareLayer { 3636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines private HardwareRenderer mRenderer; 3736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines private VirtualRefBasePtr mFinalizer; 3836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 3936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines private HardwareLayer(HardwareRenderer renderer, long deferredUpdater) { 4036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (renderer == null || deferredUpdater == 0) { 4136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines throw new IllegalArgumentException("Either hardware renderer: " + renderer 4236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines + " or deferredUpdater: " + deferredUpdater + " is invalid"); 4336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 4436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines mRenderer = renderer; 4536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines mFinalizer = new VirtualRefBasePtr(deferredUpdater); 4636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 4736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 4836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /** 4936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines * Update the paint used when drawing this layer. 50c143c7573bfd0d55cf283cc2676dbd852f939c87Rafael Espindola * 5103839956e2b99348812f4c45fb57649804c77c2dChris Lattner * @param paint The paint used when the layer is drawn into the destination canvas. 52c143c7573bfd0d55cf283cc2676dbd852f939c87Rafael Espindola * @see View#setLayerPaint(android.graphics.Paint) 53c143c7573bfd0d55cf283cc2676dbd852f939c87Rafael Espindola */ 5403839956e2b99348812f4c45fb57649804c77c2dChris Lattner public void setLayerPaint(Paint paint) { 55c143c7573bfd0d55cf283cc2676dbd852f939c87Rafael Espindola nSetLayerPaint(mFinalizer.get(), paint.mNativePaint); 56c143c7573bfd0d55cf283cc2676dbd852f939c87Rafael Espindola mRenderer.pushLayerUpdate(this); 57c143c7573bfd0d55cf283cc2676dbd852f939c87Rafael Espindola } 582b37d7cf28b1382420b5e4007042feeb66d21ac8Misha Brukman 59c143c7573bfd0d55cf283cc2676dbd852f939c87Rafael Espindola /** 60c143c7573bfd0d55cf283cc2676dbd852f939c87Rafael Espindola * Indicates whether this layer can be rendered. 61c143c7573bfd0d55cf283cc2676dbd852f939c87Rafael Espindola * 62c143c7573bfd0d55cf283cc2676dbd852f939c87Rafael Espindola * @return True if the layer can be rendered into, false otherwise 63c143c7573bfd0d55cf283cc2676dbd852f939c87Rafael Espindola */ 64c143c7573bfd0d55cf283cc2676dbd852f939c87Rafael Espindola public boolean isValid() { 6545cfe545ec8177262dabc70580ce05feaa1c3880Chris Lattner return mFinalizer != null && mFinalizer.get() != 0; 6603839956e2b99348812f4c45fb57649804c77c2dChris Lattner } 6703839956e2b99348812f4c45fb57649804c77c2dChris Lattner 68c143c7573bfd0d55cf283cc2676dbd852f939c87Rafael Espindola /** 69c143c7573bfd0d55cf283cc2676dbd852f939c87Rafael Espindola * Destroys resources without waiting for a GC. 70c143c7573bfd0d55cf283cc2676dbd852f939c87Rafael Espindola */ 71c143c7573bfd0d55cf283cc2676dbd852f939c87Rafael Espindola public void destroy() { 72c143c7573bfd0d55cf283cc2676dbd852f939c87Rafael Espindola if (!isValid()) { 73c143c7573bfd0d55cf283cc2676dbd852f939c87Rafael Espindola // Already destroyed 74c143c7573bfd0d55cf283cc2676dbd852f939c87Rafael Espindola return; 75c143c7573bfd0d55cf283cc2676dbd852f939c87Rafael Espindola } 76c143c7573bfd0d55cf283cc2676dbd852f939c87Rafael Espindola mRenderer.onLayerDestroyed(this); 77c143c7573bfd0d55cf283cc2676dbd852f939c87Rafael Espindola mRenderer = null; 78c143c7573bfd0d55cf283cc2676dbd852f939c87Rafael Espindola mFinalizer.release(); 79c143c7573bfd0d55cf283cc2676dbd852f939c87Rafael Espindola mFinalizer = null; 80c143c7573bfd0d55cf283cc2676dbd852f939c87Rafael Espindola } 81c143c7573bfd0d55cf283cc2676dbd852f939c87Rafael Espindola 82c143c7573bfd0d55cf283cc2676dbd852f939c87Rafael Espindola public long getDeferredLayerUpdater() { 83c143c7573bfd0d55cf283cc2676dbd852f939c87Rafael Espindola return mFinalizer.get(); 84c143c7573bfd0d55cf283cc2676dbd852f939c87Rafael Espindola } 85c143c7573bfd0d55cf283cc2676dbd852f939c87Rafael Espindola 86c143c7573bfd0d55cf283cc2676dbd852f939c87Rafael Espindola /** 87c143c7573bfd0d55cf283cc2676dbd852f939c87Rafael Espindola * Copies this layer into the specified bitmap. 88c143c7573bfd0d55cf283cc2676dbd852f939c87Rafael Espindola * 8903839956e2b99348812f4c45fb57649804c77c2dChris Lattner * @param bitmap The bitmap to copy they layer into 9003839956e2b99348812f4c45fb57649804c77c2dChris Lattner * 91c143c7573bfd0d55cf283cc2676dbd852f939c87Rafael Espindola * @return True if the copy was successful, false otherwise 9203839956e2b99348812f4c45fb57649804c77c2dChris Lattner */ 9336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines public boolean copyInto(Bitmap bitmap) { 94c143c7573bfd0d55cf283cc2676dbd852f939c87Rafael Espindola return mRenderer.copyLayerInto(this, bitmap); 95c143c7573bfd0d55cf283cc2676dbd852f939c87Rafael Espindola } 96c143c7573bfd0d55cf283cc2676dbd852f939c87Rafael Espindola 97c143c7573bfd0d55cf283cc2676dbd852f939c87Rafael Espindola /** 98c143c7573bfd0d55cf283cc2676dbd852f939c87Rafael Espindola * Update the layer's properties. Note that after calling this isValid() may 99c143c7573bfd0d55cf283cc2676dbd852f939c87Rafael Espindola * return false if the requested width/height cannot be satisfied 100c143c7573bfd0d55cf283cc2676dbd852f939c87Rafael Espindola * 10116500158223d4147ae97513bf698d5f321b15889Chris Lattner * @param width The new width of this layer 102af8a42445c99d2d733caf1f9ef3e3b53827613d5Chris Lattner * @param height The new height of this layer 103af8a42445c99d2d733caf1f9ef3e3b53827613d5Chris Lattner * @param isOpaque Whether this layer is opaque 10436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines * 105286c4dc355b8be6806081b23c3097485821c7642Manman Ren * @return true if the layer's properties will change, false if they already 10636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines * match the desired values. 107cc77eece74c8db09acc2af425e7e6c88a5bb30d1Manman Ren */ 108af8a42445c99d2d733caf1f9ef3e3b53827613d5Chris Lattner public boolean prepare(int width, int height, boolean isOpaque) { 109d99d4d7b70b45d25e7dc91c6e7edb9206509ed39Chris Lattner return nPrepare(mFinalizer.get(), width, height, isOpaque); 110d99d4d7b70b45d25e7dc91c6e7edb9206509ed39Chris Lattner } 111d99d4d7b70b45d25e7dc91c6e7edb9206509ed39Chris Lattner 112d99d4d7b70b45d25e7dc91c6e7edb9206509ed39Chris Lattner /** 11325e9cad236c5ebb0f96f2c213c294616a1d04155Chris Lattner * Sets an optional transform on this layer. 11425e9cad236c5ebb0f96f2c213c294616a1d04155Chris Lattner * 115d99d4d7b70b45d25e7dc91c6e7edb9206509ed39Chris Lattner * @param matrix The transform to apply to the layer. 1162adb8306e2256a4d1bef8f21ebb6dba55a108a88Chris Lattner */ 117d99d4d7b70b45d25e7dc91c6e7edb9206509ed39Chris Lattner public void setTransform(Matrix matrix) { 1185714c974006d4fe28ddd66d15e9b158493df00b6Chris Lattner nSetTransform(mFinalizer.get(), matrix.native_instance); 119d99d4d7b70b45d25e7dc91c6e7edb9206509ed39Chris Lattner mRenderer.pushLayerUpdate(this); 1205714c974006d4fe28ddd66d15e9b158493df00b6Chris Lattner } 12125e9cad236c5ebb0f96f2c213c294616a1d04155Chris Lattner 12236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /** 1235714c974006d4fe28ddd66d15e9b158493df00b6Chris Lattner * Indicates that this layer has lost its texture. 12425e9cad236c5ebb0f96f2c213c294616a1d04155Chris Lattner */ 12525e9cad236c5ebb0f96f2c213c294616a1d04155Chris Lattner public void detachSurfaceTexture() { 1269ad1cb59deda265441c1614fee5ec7f7dea7625dNick Lewycky mRenderer.detachSurfaceTexture(mFinalizer.get()); 1279ad1cb59deda265441c1614fee5ec7f7dea7625dNick Lewycky } 1289ad1cb59deda265441c1614fee5ec7f7dea7625dNick Lewycky 1299ad1cb59deda265441c1614fee5ec7f7dea7625dNick Lewycky public long getLayerHandle() { 1309ad1cb59deda265441c1614fee5ec7f7dea7625dNick Lewycky return mFinalizer.get(); 1319ad1cb59deda265441c1614fee5ec7f7dea7625dNick Lewycky } 1329ad1cb59deda265441c1614fee5ec7f7dea7625dNick Lewycky 1339ad1cb59deda265441c1614fee5ec7f7dea7625dNick Lewycky public void setSurfaceTexture(SurfaceTexture surface) { 1349ad1cb59deda265441c1614fee5ec7f7dea7625dNick Lewycky nSetSurfaceTexture(mFinalizer.get(), surface, false); 1359ad1cb59deda265441c1614fee5ec7f7dea7625dNick Lewycky mRenderer.pushLayerUpdate(this); 1369ad1cb59deda265441c1614fee5ec7f7dea7625dNick Lewycky } 1379ad1cb59deda265441c1614fee5ec7f7dea7625dNick Lewycky 1389ad1cb59deda265441c1614fee5ec7f7dea7625dNick Lewycky public void updateSurfaceTexture() { 1399ad1cb59deda265441c1614fee5ec7f7dea7625dNick Lewycky nUpdateSurfaceTexture(mFinalizer.get()); 1409ad1cb59deda265441c1614fee5ec7f7dea7625dNick Lewycky mRenderer.pushLayerUpdate(this); 141c54b1c1f8b7cf7419b2843d54e9da6c8c15e0dd0Chris Lattner } 142c54b1c1f8b7cf7419b2843d54e9da6c8c15e0dd0Chris Lattner 143c54b1c1f8b7cf7419b2843d54e9da6c8c15e0dd0Chris Lattner static HardwareLayer adoptTextureLayer(HardwareRenderer renderer, long layer) { 144c54b1c1f8b7cf7419b2843d54e9da6c8c15e0dd0Chris Lattner return new HardwareLayer(renderer, layer); 145c54b1c1f8b7cf7419b2843d54e9da6c8c15e0dd0Chris Lattner } 14636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 14736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines private static native boolean nPrepare(long layerUpdater, int width, int height, boolean isOpaque); 14836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines private static native void nSetLayerPaint(long layerUpdater, long paint); 14936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines private static native void nSetTransform(long layerUpdater, long matrix); 150c54b1c1f8b7cf7419b2843d54e9da6c8c15e0dd0Chris Lattner private static native void nSetSurfaceTexture(long layerUpdater, 151c54b1c1f8b7cf7419b2843d54e9da6c8c15e0dd0Chris Lattner SurfaceTexture surface, boolean isAlreadyAttached); 152c54b1c1f8b7cf7419b2843d54e9da6c8c15e0dd0Chris Lattner private static native void nUpdateSurfaceTexture(long layerUpdater); 15336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines private static native void nUpdateRenderLayer(long layerUpdater, long displayList, 15436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines int left, int top, int right, int bottom); 15536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 15636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines private static native int nGetTexName(long layerUpdater); 15745cfe545ec8177262dabc70580ce05feaa1c3880Chris Lattner} 15803839956e2b99348812f4c45fb57649804c77c2dChris Lattner