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; 39a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase DisplayList mDisplayList; 406c319ca1275c8db892c39b48fc54864c949f9171Romain Guy 4102ccac69fd1c0a03c24c5f3ace0ad4bed337b1fdRomain Guy boolean mOpaque; 426c319ca1275c8db892c39b48fc54864c949f9171Romain Guy 436c319ca1275c8db892c39b48fc54864c949f9171Romain Guy /** 44aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy * Creates a new hardware layer with undefined dimensions. 45aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy */ 46aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy HardwareLayer() { 47aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy this(DIMENSION_UNDEFINED, DIMENSION_UNDEFINED, false); 48aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy } 49aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy 50aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy /** 516c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * Creates a new hardware layer at least as large as the supplied 526c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * dimensions. 536c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * 546c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * @param width The minimum width of the layer 556c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * @param height The minimum height of the layer 566c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * @param isOpaque Whether the layer should be opaque or not 576c319ca1275c8db892c39b48fc54864c949f9171Romain Guy */ 586c319ca1275c8db892c39b48fc54864c949f9171Romain Guy HardwareLayer(int width, int height, boolean isOpaque) { 596c319ca1275c8db892c39b48fc54864c949f9171Romain Guy mWidth = width; 606c319ca1275c8db892c39b48fc54864c949f9171Romain Guy mHeight = height; 616c319ca1275c8db892c39b48fc54864c949f9171Romain Guy mOpaque = isOpaque; 626c319ca1275c8db892c39b48fc54864c949f9171Romain Guy } 636c319ca1275c8db892c39b48fc54864c949f9171Romain Guy 646c319ca1275c8db892c39b48fc54864c949f9171Romain Guy /** 656c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * Returns the minimum width of the layer. 666c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * 676c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * @return The minimum desired width of the hardware layer 686c319ca1275c8db892c39b48fc54864c949f9171Romain Guy */ 696c319ca1275c8db892c39b48fc54864c949f9171Romain Guy int getWidth() { 706c319ca1275c8db892c39b48fc54864c949f9171Romain Guy return mWidth; 716c319ca1275c8db892c39b48fc54864c949f9171Romain Guy } 726c319ca1275c8db892c39b48fc54864c949f9171Romain Guy 736c319ca1275c8db892c39b48fc54864c949f9171Romain Guy /** 746c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * Returns the minimum height of the layer. 756c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * 766c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * @return The minimum desired height of the hardware layer 776c319ca1275c8db892c39b48fc54864c949f9171Romain Guy */ 786c319ca1275c8db892c39b48fc54864c949f9171Romain Guy int getHeight() { 796c319ca1275c8db892c39b48fc54864c949f9171Romain Guy return mHeight; 806c319ca1275c8db892c39b48fc54864c949f9171Romain Guy } 816c319ca1275c8db892c39b48fc54864c949f9171Romain Guy 826c319ca1275c8db892c39b48fc54864c949f9171Romain Guy /** 83a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase * Returns the DisplayList for the layer. 84a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase * 85a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase * @return The DisplayList of the hardware layer 86a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase */ 87a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase DisplayList getDisplayList() { 88a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase return mDisplayList; 89a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 90a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 91a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase /** 92a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase * Sets the DisplayList for the layer. 93a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase * 94a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase * @param displayList The new DisplayList for this layer 95a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase */ 96a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase void setDisplayList(DisplayList displayList) { 97a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mDisplayList = displayList; 98a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 99a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 100a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase /** 1016c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * Returns whether or not this layer is opaque. 1026c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * 1036c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * @return True if the layer is opaque, false otherwise 1046c319ca1275c8db892c39b48fc54864c949f9171Romain Guy */ 1056c319ca1275c8db892c39b48fc54864c949f9171Romain Guy boolean isOpaque() { 1066c319ca1275c8db892c39b48fc54864c949f9171Romain Guy return mOpaque; 1076c319ca1275c8db892c39b48fc54864c949f9171Romain Guy } 1086c319ca1275c8db892c39b48fc54864c949f9171Romain Guy 1096c319ca1275c8db892c39b48fc54864c949f9171Romain Guy /** 1106c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * Indicates whether this layer can be rendered. 1116c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * 1126c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * @return True if the layer can be rendered into, false otherwise 1136c319ca1275c8db892c39b48fc54864c949f9171Romain Guy */ 1146c319ca1275c8db892c39b48fc54864c949f9171Romain Guy abstract boolean isValid(); 1156c319ca1275c8db892c39b48fc54864c949f9171Romain Guy 1166c319ca1275c8db892c39b48fc54864c949f9171Romain Guy /** 11702ccac69fd1c0a03c24c5f3ace0ad4bed337b1fdRomain Guy * Resize the layer, if necessary, to be at least as large 1186c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * as the supplied dimensions. 1196c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * 1206c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * @param width The new desired minimum width for this layer 1216c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * @param height The new desired minimum height for this layer 1226c319ca1275c8db892c39b48fc54864c949f9171Romain Guy */ 1236c319ca1275c8db892c39b48fc54864c949f9171Romain Guy abstract void resize(int width, int height); 1246c319ca1275c8db892c39b48fc54864c949f9171Romain Guy 1256c319ca1275c8db892c39b48fc54864c949f9171Romain Guy /** 1266c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * Returns a hardware canvas that can be used to render onto 1276c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * this layer. 1286c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * 1296c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * @return A hardware canvas, or null if a canvas cannot be created 1306c319ca1275c8db892c39b48fc54864c949f9171Romain Guy */ 1316c319ca1275c8db892c39b48fc54864c949f9171Romain Guy abstract HardwareCanvas getCanvas(); 1326c319ca1275c8db892c39b48fc54864c949f9171Romain Guy 1336c319ca1275c8db892c39b48fc54864c949f9171Romain Guy /** 1346c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * Destroys resources without waiting for a GC. 1356c319ca1275c8db892c39b48fc54864c949f9171Romain Guy */ 1366c319ca1275c8db892c39b48fc54864c949f9171Romain Guy abstract void destroy(); 1376c319ca1275c8db892c39b48fc54864c949f9171Romain Guy 1386c319ca1275c8db892c39b48fc54864c949f9171Romain Guy /** 1399c4b79af221b53f602f946faa9ff317a596a0c39Romain Guy * Flush the render queue associated with this layer. 1409c4b79af221b53f602f946faa9ff317a596a0c39Romain Guy */ 1419c4b79af221b53f602f946faa9ff317a596a0c39Romain Guy abstract void flush(); 1429c4b79af221b53f602f946faa9ff317a596a0c39Romain Guy 1439c4b79af221b53f602f946faa9ff317a596a0c39Romain Guy /** 1446c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * This must be invoked before drawing onto this layer. 1456c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * @param currentCanvas 1466c319ca1275c8db892c39b48fc54864c949f9171Romain Guy */ 1476c319ca1275c8db892c39b48fc54864c949f9171Romain Guy abstract HardwareCanvas start(Canvas currentCanvas); 1486c319ca1275c8db892c39b48fc54864c949f9171Romain Guy 1496c319ca1275c8db892c39b48fc54864c949f9171Romain Guy /** 1506c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * This must be invoked after drawing onto this layer. 1516c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * @param currentCanvas 1526c319ca1275c8db892c39b48fc54864c949f9171Romain Guy */ 1536c319ca1275c8db892c39b48fc54864c949f9171Romain Guy abstract void end(Canvas currentCanvas); 15402ccac69fd1c0a03c24c5f3ace0ad4bed337b1fdRomain Guy 15502ccac69fd1c0a03c24c5f3ace0ad4bed337b1fdRomain Guy /** 15602ccac69fd1c0a03c24c5f3ace0ad4bed337b1fdRomain Guy * Copies this layer into the specified bitmap. 15702ccac69fd1c0a03c24c5f3ace0ad4bed337b1fdRomain Guy * 15802ccac69fd1c0a03c24c5f3ace0ad4bed337b1fdRomain Guy * @param bitmap The bitmap to copy they layer into 15902ccac69fd1c0a03c24c5f3ace0ad4bed337b1fdRomain Guy * 16002ccac69fd1c0a03c24c5f3ace0ad4bed337b1fdRomain Guy * @return True if the copy was successful, false otherwise 16102ccac69fd1c0a03c24c5f3ace0ad4bed337b1fdRomain Guy */ 16202ccac69fd1c0a03c24c5f3ace0ad4bed337b1fdRomain Guy abstract boolean copyInto(Bitmap bitmap); 16302ccac69fd1c0a03c24c5f3ace0ad4bed337b1fdRomain Guy 16402ccac69fd1c0a03c24c5f3ace0ad4bed337b1fdRomain Guy /** 16502ccac69fd1c0a03c24c5f3ace0ad4bed337b1fdRomain Guy * Update the layer's properties. This method should be used 16602ccac69fd1c0a03c24c5f3ace0ad4bed337b1fdRomain Guy * when the underlying storage is modified by an external entity. 16702ccac69fd1c0a03c24c5f3ace0ad4bed337b1fdRomain Guy * To change the underlying storage, use the {@link #resize(int, int)} 16802ccac69fd1c0a03c24c5f3ace0ad4bed337b1fdRomain Guy * method instead. 16902ccac69fd1c0a03c24c5f3ace0ad4bed337b1fdRomain Guy * 17002ccac69fd1c0a03c24c5f3ace0ad4bed337b1fdRomain Guy * @param width The new width of this layer 17102ccac69fd1c0a03c24c5f3ace0ad4bed337b1fdRomain Guy * @param height The new height of this layer 17202ccac69fd1c0a03c24c5f3ace0ad4bed337b1fdRomain Guy * @param isOpaque Whether this layer is opaque 17302ccac69fd1c0a03c24c5f3ace0ad4bed337b1fdRomain Guy */ 17402ccac69fd1c0a03c24c5f3ace0ad4bed337b1fdRomain Guy void update(int width, int height, boolean isOpaque) { 17502ccac69fd1c0a03c24c5f3ace0ad4bed337b1fdRomain Guy mWidth = width; 17602ccac69fd1c0a03c24c5f3ace0ad4bed337b1fdRomain Guy mHeight = height; 17702ccac69fd1c0a03c24c5f3ace0ad4bed337b1fdRomain Guy mOpaque = isOpaque; 17802ccac69fd1c0a03c24c5f3ace0ad4bed337b1fdRomain Guy } 179302a9df1d50373c82923bb84ff665dfce584fb22Romain Guy 180302a9df1d50373c82923bb84ff665dfce584fb22Romain Guy /** 181302a9df1d50373c82923bb84ff665dfce584fb22Romain Guy * Sets an optional transform on this layer. 182302a9df1d50373c82923bb84ff665dfce584fb22Romain Guy * 183302a9df1d50373c82923bb84ff665dfce584fb22Romain Guy * @param matrix The transform to apply to the layer. 184302a9df1d50373c82923bb84ff665dfce584fb22Romain Guy */ 185302a9df1d50373c82923bb84ff665dfce584fb22Romain Guy abstract void setTransform(Matrix matrix); 1862bf68f063b0077ddef6ebfe54f2ae5e063c2c229Romain Guy 1872bf68f063b0077ddef6ebfe54f2ae5e063c2c229Romain Guy /** 1882bf68f063b0077ddef6ebfe54f2ae5e063c2c229Romain Guy * Specifies the display list to use to refresh the layer. 1897e52caf6db5feef2b847cfaa3d13690257122c3aMichael Jurka * 1902bf68f063b0077ddef6ebfe54f2ae5e063c2c229Romain Guy * @param displayList The display list containing the drawing commands to 1912bf68f063b0077ddef6ebfe54f2ae5e063c2c229Romain Guy * execute in this layer 1922bf68f063b0077ddef6ebfe54f2ae5e063c2c229Romain Guy * @param dirtyRect The dirty region of the layer that needs to be redrawn 1932bf68f063b0077ddef6ebfe54f2ae5e063c2c229Romain Guy */ 1942bf68f063b0077ddef6ebfe54f2ae5e063c2c229Romain Guy abstract void redraw(DisplayList displayList, Rect dirtyRect); 1956c319ca1275c8db892c39b48fc54864c949f9171Romain Guy} 196