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