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