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