HardwareLayer.java revision 7e52caf6db5feef2b847cfaa3d13690257122c3a
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 Guypackage android.view; 186c319ca1275c8db892c39b48fc54864c949f9171Romain Guy 1902ccac69fd1c0a03c24c5f3ace0ad4bed337b1fdRomain Guyimport android.graphics.Bitmap; 206c319ca1275c8db892c39b48fc54864c949f9171Romain Guyimport android.graphics.Canvas; 21302a9df1d50373c82923bb84ff665dfce584fb22Romain Guyimport android.graphics.Matrix; 222bf68f063b0077ddef6ebfe54f2ae5e063c2c229Romain Guyimport android.graphics.Rect; 236c319ca1275c8db892c39b48fc54864c949f9171Romain Guy 246c319ca1275c8db892c39b48fc54864c949f9171Romain Guy/** 256c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * A hardware layer can be used to render graphics operations into a hardware 266c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * friendly buffer. For instance, with an OpenGL backend, a hardware layer 276c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * would use a Frame Buffer Object (FBO.) The hardware layer can be used as 286c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * a drawing cache when a complex set of graphics operations needs to be 296c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * drawn several times. 306c319ca1275c8db892c39b48fc54864c949f9171Romain Guy */ 316c319ca1275c8db892c39b48fc54864c949f9171Romain Guyabstract class HardwareLayer { 32aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy /** 33aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy * Indicates an unknown dimension (width or height.) 34aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy */ 35aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy static final int DIMENSION_UNDEFINED = -1; 36aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy 376c319ca1275c8db892c39b48fc54864c949f9171Romain Guy int mWidth; 386c319ca1275c8db892c39b48fc54864c949f9171Romain Guy int mHeight; 396c319ca1275c8db892c39b48fc54864c949f9171Romain Guy 4002ccac69fd1c0a03c24c5f3ace0ad4bed337b1fdRomain Guy boolean mOpaque; 416c319ca1275c8db892c39b48fc54864c949f9171Romain Guy 426c319ca1275c8db892c39b48fc54864c949f9171Romain Guy /** 43aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy * Creates a new hardware layer with undefined dimensions. 44aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy */ 45aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy HardwareLayer() { 46aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy this(DIMENSION_UNDEFINED, DIMENSION_UNDEFINED, false); 47aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy } 48aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy 49aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy /** 506c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * Creates a new hardware layer at least as large as the supplied 516c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * dimensions. 526c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * 536c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * @param width The minimum width of the layer 546c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * @param height The minimum height of the layer 556c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * @param isOpaque Whether the layer should be opaque or not 566c319ca1275c8db892c39b48fc54864c949f9171Romain Guy */ 576c319ca1275c8db892c39b48fc54864c949f9171Romain Guy HardwareLayer(int width, int height, boolean isOpaque) { 586c319ca1275c8db892c39b48fc54864c949f9171Romain Guy mWidth = width; 596c319ca1275c8db892c39b48fc54864c949f9171Romain Guy mHeight = height; 606c319ca1275c8db892c39b48fc54864c949f9171Romain Guy mOpaque = isOpaque; 616c319ca1275c8db892c39b48fc54864c949f9171Romain Guy } 626c319ca1275c8db892c39b48fc54864c949f9171Romain Guy 636c319ca1275c8db892c39b48fc54864c949f9171Romain Guy /** 646c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * Returns the minimum width of the layer. 656c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * 666c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * @return The minimum desired width of the hardware layer 676c319ca1275c8db892c39b48fc54864c949f9171Romain Guy */ 686c319ca1275c8db892c39b48fc54864c949f9171Romain Guy int getWidth() { 696c319ca1275c8db892c39b48fc54864c949f9171Romain Guy return mWidth; 706c319ca1275c8db892c39b48fc54864c949f9171Romain Guy } 716c319ca1275c8db892c39b48fc54864c949f9171Romain Guy 726c319ca1275c8db892c39b48fc54864c949f9171Romain Guy /** 736c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * Returns the minimum height of the layer. 746c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * 756c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * @return The minimum desired height of the hardware layer 766c319ca1275c8db892c39b48fc54864c949f9171Romain Guy */ 776c319ca1275c8db892c39b48fc54864c949f9171Romain Guy int getHeight() { 786c319ca1275c8db892c39b48fc54864c949f9171Romain Guy return mHeight; 796c319ca1275c8db892c39b48fc54864c949f9171Romain Guy } 806c319ca1275c8db892c39b48fc54864c949f9171Romain Guy 816c319ca1275c8db892c39b48fc54864c949f9171Romain Guy /** 826c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * Returns whether or not this layer is opaque. 836c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * 846c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * @return True if the layer is opaque, false otherwise 856c319ca1275c8db892c39b48fc54864c949f9171Romain Guy */ 866c319ca1275c8db892c39b48fc54864c949f9171Romain Guy boolean isOpaque() { 876c319ca1275c8db892c39b48fc54864c949f9171Romain Guy return mOpaque; 886c319ca1275c8db892c39b48fc54864c949f9171Romain Guy } 896c319ca1275c8db892c39b48fc54864c949f9171Romain Guy 906c319ca1275c8db892c39b48fc54864c949f9171Romain Guy /** 916c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * Indicates whether this layer can be rendered. 926c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * 936c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * @return True if the layer can be rendered into, false otherwise 946c319ca1275c8db892c39b48fc54864c949f9171Romain Guy */ 956c319ca1275c8db892c39b48fc54864c949f9171Romain Guy abstract boolean isValid(); 966c319ca1275c8db892c39b48fc54864c949f9171Romain Guy 976c319ca1275c8db892c39b48fc54864c949f9171Romain Guy /** 9802ccac69fd1c0a03c24c5f3ace0ad4bed337b1fdRomain Guy * Resize the layer, if necessary, to be at least as large 996c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * as the supplied dimensions. 1006c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * 1016c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * @param width The new desired minimum width for this layer 1026c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * @param height The new desired minimum height for this layer 1036c319ca1275c8db892c39b48fc54864c949f9171Romain Guy */ 1046c319ca1275c8db892c39b48fc54864c949f9171Romain Guy abstract void resize(int width, int height); 1056c319ca1275c8db892c39b48fc54864c949f9171Romain Guy 1066c319ca1275c8db892c39b48fc54864c949f9171Romain Guy /** 1076c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * Returns a hardware canvas that can be used to render onto 1086c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * this layer. 1096c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * 1106c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * @return A hardware canvas, or null if a canvas cannot be created 1116c319ca1275c8db892c39b48fc54864c949f9171Romain Guy */ 1126c319ca1275c8db892c39b48fc54864c949f9171Romain Guy abstract HardwareCanvas getCanvas(); 1136c319ca1275c8db892c39b48fc54864c949f9171Romain Guy 1146c319ca1275c8db892c39b48fc54864c949f9171Romain Guy /** 1156c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * Destroys resources without waiting for a GC. 1166c319ca1275c8db892c39b48fc54864c949f9171Romain Guy */ 1176c319ca1275c8db892c39b48fc54864c949f9171Romain Guy abstract void destroy(); 1186c319ca1275c8db892c39b48fc54864c949f9171Romain Guy 1196c319ca1275c8db892c39b48fc54864c949f9171Romain Guy /** 1209c4b79af221b53f602f946faa9ff317a596a0c39Romain Guy * Flush the render queue associated with this layer. 1219c4b79af221b53f602f946faa9ff317a596a0c39Romain Guy */ 1229c4b79af221b53f602f946faa9ff317a596a0c39Romain Guy abstract void flush(); 1239c4b79af221b53f602f946faa9ff317a596a0c39Romain Guy 1249c4b79af221b53f602f946faa9ff317a596a0c39Romain Guy /** 1256c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * This must be invoked before drawing onto this layer. 1266c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * @param currentCanvas 1276c319ca1275c8db892c39b48fc54864c949f9171Romain Guy */ 1286c319ca1275c8db892c39b48fc54864c949f9171Romain Guy abstract HardwareCanvas start(Canvas currentCanvas); 1296c319ca1275c8db892c39b48fc54864c949f9171Romain Guy 1306c319ca1275c8db892c39b48fc54864c949f9171Romain Guy /** 1316c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * This must be invoked after drawing onto this layer. 1326c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * @param currentCanvas 1336c319ca1275c8db892c39b48fc54864c949f9171Romain Guy */ 1346c319ca1275c8db892c39b48fc54864c949f9171Romain Guy abstract void end(Canvas currentCanvas); 13502ccac69fd1c0a03c24c5f3ace0ad4bed337b1fdRomain Guy 13602ccac69fd1c0a03c24c5f3ace0ad4bed337b1fdRomain Guy /** 13702ccac69fd1c0a03c24c5f3ace0ad4bed337b1fdRomain Guy * Copies this layer into the specified bitmap. 13802ccac69fd1c0a03c24c5f3ace0ad4bed337b1fdRomain Guy * 13902ccac69fd1c0a03c24c5f3ace0ad4bed337b1fdRomain Guy * @param bitmap The bitmap to copy they layer into 14002ccac69fd1c0a03c24c5f3ace0ad4bed337b1fdRomain Guy * 14102ccac69fd1c0a03c24c5f3ace0ad4bed337b1fdRomain Guy * @return True if the copy was successful, false otherwise 14202ccac69fd1c0a03c24c5f3ace0ad4bed337b1fdRomain Guy */ 14302ccac69fd1c0a03c24c5f3ace0ad4bed337b1fdRomain Guy abstract boolean copyInto(Bitmap bitmap); 14402ccac69fd1c0a03c24c5f3ace0ad4bed337b1fdRomain Guy 14502ccac69fd1c0a03c24c5f3ace0ad4bed337b1fdRomain Guy /** 14602ccac69fd1c0a03c24c5f3ace0ad4bed337b1fdRomain Guy * Update the layer's properties. This method should be used 14702ccac69fd1c0a03c24c5f3ace0ad4bed337b1fdRomain Guy * when the underlying storage is modified by an external entity. 14802ccac69fd1c0a03c24c5f3ace0ad4bed337b1fdRomain Guy * To change the underlying storage, use the {@link #resize(int, int)} 14902ccac69fd1c0a03c24c5f3ace0ad4bed337b1fdRomain Guy * method instead. 15002ccac69fd1c0a03c24c5f3ace0ad4bed337b1fdRomain Guy * 15102ccac69fd1c0a03c24c5f3ace0ad4bed337b1fdRomain Guy * @param width The new width of this layer 15202ccac69fd1c0a03c24c5f3ace0ad4bed337b1fdRomain Guy * @param height The new height of this layer 15302ccac69fd1c0a03c24c5f3ace0ad4bed337b1fdRomain Guy * @param isOpaque Whether this layer is opaque 15402ccac69fd1c0a03c24c5f3ace0ad4bed337b1fdRomain Guy */ 15502ccac69fd1c0a03c24c5f3ace0ad4bed337b1fdRomain Guy void update(int width, int height, boolean isOpaque) { 15602ccac69fd1c0a03c24c5f3ace0ad4bed337b1fdRomain Guy mWidth = width; 15702ccac69fd1c0a03c24c5f3ace0ad4bed337b1fdRomain Guy mHeight = height; 15802ccac69fd1c0a03c24c5f3ace0ad4bed337b1fdRomain Guy mOpaque = isOpaque; 15902ccac69fd1c0a03c24c5f3ace0ad4bed337b1fdRomain Guy } 160302a9df1d50373c82923bb84ff665dfce584fb22Romain Guy 161302a9df1d50373c82923bb84ff665dfce584fb22Romain Guy /** 162302a9df1d50373c82923bb84ff665dfce584fb22Romain Guy * Sets an optional transform on this layer. 163302a9df1d50373c82923bb84ff665dfce584fb22Romain Guy * 164302a9df1d50373c82923bb84ff665dfce584fb22Romain Guy * @param matrix The transform to apply to the layer. 165302a9df1d50373c82923bb84ff665dfce584fb22Romain Guy */ 166302a9df1d50373c82923bb84ff665dfce584fb22Romain Guy abstract void setTransform(Matrix matrix); 1672bf68f063b0077ddef6ebfe54f2ae5e063c2c229Romain Guy 1682bf68f063b0077ddef6ebfe54f2ae5e063c2c229Romain Guy /** 1692bf68f063b0077ddef6ebfe54f2ae5e063c2c229Romain Guy * Specifies the display list to use to refresh the layer. 1707e52caf6db5feef2b847cfaa3d13690257122c3aMichael Jurka * 1712bf68f063b0077ddef6ebfe54f2ae5e063c2c229Romain Guy * @param displayList The display list containing the drawing commands to 1722bf68f063b0077ddef6ebfe54f2ae5e063c2c229Romain Guy * execute in this layer 1732bf68f063b0077ddef6ebfe54f2ae5e063c2c229Romain Guy * @param dirtyRect The dirty region of the layer that needs to be redrawn 1742bf68f063b0077ddef6ebfe54f2ae5e063c2c229Romain Guy */ 1752bf68f063b0077ddef6ebfe54f2ae5e063c2c229Romain Guy abstract void redraw(DisplayList displayList, Rect dirtyRect); 1766c319ca1275c8db892c39b48fc54864c949f9171Romain Guy} 177