Surface.java revision c14bacf1fb511472138eeb5dc84a9423fc003214
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.view;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshimaimport android.content.res.CompatibilityInfo.Translator;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.*;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcelable;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcel;
23b85c933d850286874005f97a9764c9b22e49a597Kevin Hesterimport android.os.SystemProperties;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
27334031cd07c3bd09d23fce0ebaf946fc6ecfee26Glenn Kasten * Handle onto a raw buffer that is being managed by the screen compositor.
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class Surface implements Parcelable {
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String LOG_TAG = "Surface";
31f5e32f33eddc6e22edee1df486b38294ddc76cc3Mathias Agopian    private static final boolean DEBUG_RELEASE = false;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /* orientations for setOrientation() */
34b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    public static final int ROTATION_0       = 0;
35b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    public static final int ROTATION_90      = 1;
36b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    public static final int ROTATION_180     = 2;
37b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    public static final int ROTATION_270     = 3;
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
39b85c933d850286874005f97a9764c9b22e49a597Kevin Hester    private static final boolean headless = "1".equals(
40b85c933d850286874005f97a9764c9b22e49a597Kevin Hester        SystemProperties.get("ro.config.headless", "0"));
41b85c933d850286874005f97a9764c9b22e49a597Kevin Hester
42b85c933d850286874005f97a9764c9b22e49a597Kevin Hester    private static void checkHeadless() {
43b85c933d850286874005f97a9764c9b22e49a597Kevin Hester        if(headless) {
44b85c933d850286874005f97a9764c9b22e49a597Kevin Hester            throw new UnsupportedOperationException("Device is headless");
45b85c933d850286874005f97a9764c9b22e49a597Kevin Hester        }
46b85c933d850286874005f97a9764c9b22e49a597Kevin Hester    }
47b85c933d850286874005f97a9764c9b22e49a597Kevin Hester
48b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /**
490db3aef9f81b056c57b2331dd2750958c9341fdfJamie Gennis     * Create Surface from a {@link SurfaceTexture}.
50df0c84f90894c677c50bdc967a0598f516ac86d7Jamie Gennis     *
510db3aef9f81b056c57b2331dd2750958c9341fdfJamie Gennis     * Images drawn to the Surface will be made available to the {@link
520db3aef9f81b056c57b2331dd2750958c9341fdfJamie Gennis     * SurfaceTexture}, which can attach them an OpenGL ES texture via {@link
530db3aef9f81b056c57b2331dd2750958c9341fdfJamie Gennis     * SurfaceTexture#updateTexImage}.
540db3aef9f81b056c57b2331dd2750958c9341fdfJamie Gennis     *
550db3aef9f81b056c57b2331dd2750958c9341fdfJamie Gennis     * @param surfaceTexture The {@link SurfaceTexture} that is updated by this
560db3aef9f81b056c57b2331dd2750958c9341fdfJamie Gennis     * Surface.
57df0c84f90894c677c50bdc967a0598f516ac86d7Jamie Gennis     */
58df0c84f90894c677c50bdc967a0598f516ac86d7Jamie Gennis    public Surface(SurfaceTexture surfaceTexture) {
59b85c933d850286874005f97a9764c9b22e49a597Kevin Hester        checkHeadless();
60b85c933d850286874005f97a9764c9b22e49a597Kevin Hester
61df0c84f90894c677c50bdc967a0598f516ac86d7Jamie Gennis        if (DEBUG_RELEASE) {
62df0c84f90894c677c50bdc967a0598f516ac86d7Jamie Gennis            mCreationStack = new Exception();
63df0c84f90894c677c50bdc967a0598f516ac86d7Jamie Gennis        }
64df0c84f90894c677c50bdc967a0598f516ac86d7Jamie Gennis        mCanvas = new CompatibleCanvas();
65df0c84f90894c677c50bdc967a0598f516ac86d7Jamie Gennis        initFromSurfaceTexture(surfaceTexture);
66df0c84f90894c677c50bdc967a0598f516ac86d7Jamie Gennis    }
67df0c84f90894c677c50bdc967a0598f516ac86d7Jamie Gennis
68df0c84f90894c677c50bdc967a0598f516ac86d7Jamie Gennis    /**
69b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * Does this object hold a valid surface?  Returns true if it holds
70b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * a physical surface, so lockCanvas() will succeed.  Otherwise
71b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * returns false.
72b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     */
73b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    public native   boolean isValid();
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
75b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /** Release the local reference to the server-side surface.
76b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * Always call release() when you're done with a Surface. This will
77b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * make the surface invalid.
78317a6280cc109e873646e4652be1582d870eedfdMathias Agopian     */
79b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    public native void release();
80b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian
81b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /** draw into a surface */
82b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    public Canvas lockCanvas(Rect dirty) throws OutOfResourcesException, IllegalArgumentException {
83b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian        /*
84b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian         * the dirty rectangle may be expanded to the surface's size, if for
85b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian         * instance it has been resized or if the bits were lost, since the last
86b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian         * call.
87b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian         */
88b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian        return lockCanvasNative(dirty);
89b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    }
90b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian
91b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /** unlock the surface and asks a page flip */
92b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    public native   void unlockCanvasAndPost(Canvas canvas);
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
94b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /**
95b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * unlock the surface. the screen won't be updated until
96b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * post() or postAll() is called
97317a6280cc109e873646e4652be1582d870eedfdMathias Agopian     */
98b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    public native   void unlockCanvas(Canvas canvas);
99b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian
100b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    @Override
101b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    public String toString() {
102b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian        return "Surface(name=" + mName + ", identity=" + getIdentity() + ")";
103b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    }
104b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian
105b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    public int describeContents() {
106b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian        return 0;
107b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    }
108b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian
109b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    public native   void readFromParcel(Parcel source);
110b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    public native   void writeToParcel(Parcel dest, int flags);
111b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian
112b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /**
113b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * Exception thrown when a surface couldn't be created or resized
114b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     */
115b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    public static class OutOfResourcesException extends Exception {
116b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian        public OutOfResourcesException() {
117b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian        }
118b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian        public OutOfResourcesException(String name) {
119b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian            super(name);
120b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian        }
121b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    }
122b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian
123b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /*
124b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * -----------------------------------------------------------------------
125b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * No user serviceable parts beyond this point
126b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * -----------------------------------------------------------------------
127b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     */
128b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian
129b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /* flags used in constructor (keep in sync with ISurfaceComposer.h) */
130b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian
131b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /** Surface is created hidden @hide */
132b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    public static final int HIDDEN              = 0x00000004;
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** The surface contains secure content, special measures will
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * be taken to disallow the surface's content to be copied from
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * another process. In particular, screenshots and VNC servers will
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * be disabled, but other measures can take place, for instance the
138b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * surface might not be hardware accelerated.
139b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * @hide*/
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int SECURE              = 0x00000080;
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Creates a surface where color components are interpreted as
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  "non pre-multiplied" by their alpha channel. Of course this flag is
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  meaningless for surfaces without an alpha channel. By default
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  surfaces are pre-multiplied, which means that each color component is
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  already multiplied by its alpha value. In this case the blending
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  equation used is:
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *    DEST = SRC + DEST * (1-SRC_ALPHA)
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  By contrast, non pre-multiplied surfaces use the following equation:
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *    DEST = SRC * SRC_ALPHA * DEST * (1-SRC_ALPHA)
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  pre-multiplied surfaces must always be used if transparent pixels are
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  composited on top of each-other into the surface. A pre-multiplied
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  surface can never lower the value of the alpha component of a given
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  pixel.
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  In some rare situations, a non pre-multiplied surface is preferable.
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
162b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     *  @hide
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int NON_PREMULTIPLIED   = 0x00000100;
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
167d10cd5765a2b706fc174f16b951d6b0a5d3740d3Romain Guy     * Indicates that the surface must be considered opaque, even if its
168d10cd5765a2b706fc174f16b951d6b0a5d3740d3Romain Guy     * pixel format is set to translucent. This can be useful if an
169d10cd5765a2b706fc174f16b951d6b0a5d3740d3Romain Guy     * application needs full RGBA 8888 support for instance but will
170d10cd5765a2b706fc174f16b951d6b0a5d3740d3Romain Guy     * still draw every pixel opaque.
171d10cd5765a2b706fc174f16b951d6b0a5d3740d3Romain Guy     *
172d10cd5765a2b706fc174f16b951d6b0a5d3740d3Romain Guy     * @hide
173d10cd5765a2b706fc174f16b951d6b0a5d3740d3Romain Guy     */
174d10cd5765a2b706fc174f16b951d6b0a5d3740d3Romain Guy    public static final int OPAQUE              = 0x00000400;
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
176d6f5bde96b2fe82bc7e5d4e64266d585108c4648Glenn Kasten    /**
177d6f5bde96b2fe82bc7e5d4e64266d585108c4648Glenn Kasten     * Application requires a hardware-protected path to an
178d6f5bde96b2fe82bc7e5d4e64266d585108c4648Glenn Kasten     * external display sink. If a hardware-protected path is not available,
179d6f5bde96b2fe82bc7e5d4e64266d585108c4648Glenn Kasten     * then this surface will not be displayed on the external sink.
180d6f5bde96b2fe82bc7e5d4e64266d585108c4648Glenn Kasten     *
181d6f5bde96b2fe82bc7e5d4e64266d585108c4648Glenn Kasten     * @hide
182d6f5bde96b2fe82bc7e5d4e64266d585108c4648Glenn Kasten     */
183d6f5bde96b2fe82bc7e5d4e64266d585108c4648Glenn Kasten    public static final int PROTECTED_APP       = 0x00000800;
184d6f5bde96b2fe82bc7e5d4e64266d585108c4648Glenn Kasten
185d6f5bde96b2fe82bc7e5d4e64266d585108c4648Glenn Kasten    // 0x1000 is reserved for an independent DRM protected flag in framework
186d6f5bde96b2fe82bc7e5d4e64266d585108c4648Glenn Kasten
187b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /** Creates a normal surface. This is the default. @hide */
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int FX_SURFACE_NORMAL   = 0x00000000;
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Creates a Blur surface. Everything behind this surface is blurred
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * by some amount. The quality and refresh speed of the blur effect
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is not settable or guaranteed.
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * It is an error to lock a Blur surface, since it doesn't have
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * a backing store.
195b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * @hide
19667403e096e6f59b7cd18a90d0d3f5c3d17c31407Mathias Agopian     * @deprecated
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
19867403e096e6f59b7cd18a90d0d3f5c3d17c31407Mathias Agopian    @Deprecated
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int FX_SURFACE_BLUR     = 0x00010000;
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Creates a Dim surface. Everything behind this surface is dimmed
202334031cd07c3bd09d23fce0ebaf946fc6ecfee26Glenn Kasten     * by the amount specified in {@link #setAlpha}.
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * It is an error to lock a Dim surface, since it doesn't have
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * a backing store.
205b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * @hide
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int FX_SURFACE_DIM     = 0x00020000;
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2090ab84ef507f23505a72798fbe25cf4bb2c507ea3Mathias Agopian    /** @hide */
2100ab84ef507f23505a72798fbe25cf4bb2c507ea3Mathias Agopian    public static final int FX_SURFACE_SCREENSHOT   = 0x00030000;
2110ab84ef507f23505a72798fbe25cf4bb2c507ea3Mathias Agopian
212b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /** Mask used for FX values above @hide */
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int FX_SURFACE_MASK     = 0x000F0000;
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /* flags used with setFlags() (keep in sync with ISurfaceComposer.h) */
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
217b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /** Hide the surface. Equivalent to calling hide(). @hide */
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int SURFACE_HIDDEN    = 0x01;
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
220b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /** Freeze the surface. Equivalent to calling freeze(). @hide */
221c87c4a3e3b3c3949ae3c6f8fd245b71691d5ca3bMathias Agopian    public static final int SURFACE_FROZEN     = 0x02;
222c87c4a3e3b3c3949ae3c6f8fd245b71691d5ca3bMathias Agopian
223b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /** Enable dithering when compositing this surface @hide */
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int SURFACE_DITHER    = 0x04;
225eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian
2260de171b0d490a5928d54d2fb67c912d140aac643Ted Bonkenburg    // The mSurfaceControl will only be present for Surfaces used by the window
2270de171b0d490a5928d54d2fb67c912d140aac643Ted Bonkenburg    // server or system processes. When this class is parceled we defer to the
228b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    // mSurfaceControl to do the parceling. Otherwise we parcel the
229b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    // mNativeSurface.
23017f638b39f2e8b610ecfa1290e5bc42ab7700c98Mathias Agopian    private int mSurfaceControl;
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mSaveCount;
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Canvas mCanvas;
2338b138323d54e36fd66b22a634494648e20c53373Mathias Agopian    private int mNativeSurface;
2342a83f001fdb189f945e82e81e717ba204824b112Romain Guy    private int mSurfaceGenerationId;
2358138cb49e47f9a9905a316a217757710185c66aaMarco Nelissen    private String mName;
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2375be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn    // The Translator for density compatibility mode.  This is used for scaling
2385be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn    // the canvas to perform the appropriate density transformation.
2395be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn    private Translator mCompatibilityTranslator;
240240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima
241240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima    // A matrix to scale the matrix set by application. This is set to null for
242240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima    // non compatibility mode.
243240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima    private Matrix mCompatibleMatrix;
24438ed7d7701514ee7127d0430e952930854608c4fMitsuru Oshima
245f5e32f33eddc6e22edee1df486b38294ddc76cc3Mathias Agopian    private Exception mCreationStack;
246f5e32f33eddc6e22edee1df486b38294ddc76cc3Mathias Agopian
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * We use a class initializer to allow the native code to cache some
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * field offsets.
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    native private static void nativeClassInit();
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static { nativeClassInit(); }
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
255b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /** create a surface @hide */
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Surface(SurfaceSession s,
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int pid, int display, int w, int h, int format, int flags)
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throws OutOfResourcesException {
259b85c933d850286874005f97a9764c9b22e49a597Kevin Hester        checkHeadless();
260b85c933d850286874005f97a9764c9b22e49a597Kevin Hester
261f5e32f33eddc6e22edee1df486b38294ddc76cc3Mathias Agopian        if (DEBUG_RELEASE) {
262f5e32f33eddc6e22edee1df486b38294ddc76cc3Mathias Agopian            mCreationStack = new Exception();
263f5e32f33eddc6e22edee1df486b38294ddc76cc3Mathias Agopian        }
2640586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn        mCanvas = new CompatibleCanvas();
2655d26c1e38dabb3ad8b4b6e1000375f3b1a6b7693Mathias Agopian        init(s,pid,null,display,w,h,format,flags);
2665d26c1e38dabb3ad8b4b6e1000375f3b1a6b7693Mathias Agopian    }
2675d26c1e38dabb3ad8b4b6e1000375f3b1a6b7693Mathias Agopian
268b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /** create a surface with a name @hide */
2695d26c1e38dabb3ad8b4b6e1000375f3b1a6b7693Mathias Agopian    public Surface(SurfaceSession s,
2705d26c1e38dabb3ad8b4b6e1000375f3b1a6b7693Mathias Agopian            int pid, String name, int display, int w, int h, int format, int flags)
2715d26c1e38dabb3ad8b4b6e1000375f3b1a6b7693Mathias Agopian        throws OutOfResourcesException {
272b85c933d850286874005f97a9764c9b22e49a597Kevin Hester        checkHeadless();
273b85c933d850286874005f97a9764c9b22e49a597Kevin Hester
274f5e32f33eddc6e22edee1df486b38294ddc76cc3Mathias Agopian        if (DEBUG_RELEASE) {
275f5e32f33eddc6e22edee1df486b38294ddc76cc3Mathias Agopian            mCreationStack = new Exception();
276f5e32f33eddc6e22edee1df486b38294ddc76cc3Mathias Agopian        }
2775d26c1e38dabb3ad8b4b6e1000375f3b1a6b7693Mathias Agopian        mCanvas = new CompatibleCanvas();
2785d26c1e38dabb3ad8b4b6e1000375f3b1a6b7693Mathias Agopian        init(s,pid,name,display,w,h,format,flags);
2798138cb49e47f9a9905a316a217757710185c66aaMarco Nelissen        mName = name;
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Create an empty surface, which will later be filled in by
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * readFromParcel().
285b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * @hide
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Surface() {
288b85c933d850286874005f97a9764c9b22e49a597Kevin Hester        checkHeadless();
289b85c933d850286874005f97a9764c9b22e49a597Kevin Hester
290f5e32f33eddc6e22edee1df486b38294ddc76cc3Mathias Agopian        if (DEBUG_RELEASE) {
291f5e32f33eddc6e22edee1df486b38294ddc76cc3Mathias Agopian            mCreationStack = new Exception();
292f5e32f33eddc6e22edee1df486b38294ddc76cc3Mathias Agopian        }
293240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima        mCanvas = new CompatibleCanvas();
294240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima    }
295240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima
296b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    private Surface(Parcel source) throws OutOfResourcesException {
297b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian        init(source);
298b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    }
299b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian
300240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima    /**
301b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * Copy another surface to this one.  This surface now holds a reference
302b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * to the same data as the original surface, and is -not- the owner.
30361566cc1932468720a831ad5cbc68ee080d613c9Dianne Hackborn     * This is for use by the window manager when returning a window surface
30461566cc1932468720a831ad5cbc68ee080d613c9Dianne Hackborn     * back from a client, converting it from the representation being managed
30561566cc1932468720a831ad5cbc68ee080d613c9Dianne Hackborn     * by the window manager to the representation the client uses to draw
30661566cc1932468720a831ad5cbc68ee080d613c9Dianne Hackborn     * in to it.
307b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * @hide
308b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     */
309b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    public native void copyFrom(Surface o);
31061566cc1932468720a831ad5cbc68ee080d613c9Dianne Hackborn
31161566cc1932468720a831ad5cbc68ee080d613c9Dianne Hackborn    /**
31261566cc1932468720a831ad5cbc68ee080d613c9Dianne Hackborn     * Transfer the native state from 'o' to this surface, releasing it
31361566cc1932468720a831ad5cbc68ee080d613c9Dianne Hackborn     * from 'o'.  This is for use in the client side for drawing into a
31461566cc1932468720a831ad5cbc68ee080d613c9Dianne Hackborn     * surface; not guaranteed to work on the window manager side.
31561566cc1932468720a831ad5cbc68ee080d613c9Dianne Hackborn     * This is for use by the client to move the underlying surface from
31661566cc1932468720a831ad5cbc68ee080d613c9Dianne Hackborn     * one Surface object to another, in particular in SurfaceFlinger.
31761566cc1932468720a831ad5cbc68ee080d613c9Dianne Hackborn     * @hide.
31861566cc1932468720a831ad5cbc68ee080d613c9Dianne Hackborn     */
31961566cc1932468720a831ad5cbc68ee080d613c9Dianne Hackborn    public native void transferFrom(Surface o);
32061566cc1932468720a831ad5cbc68ee080d613c9Dianne Hackborn
321b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /** @hide */
322b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    public int getGenerationId() {
323b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian        return mSurfaceGenerationId;
324b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    }
325b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian
326c14bacf1fb511472138eeb5dc84a9423fc003214Mathias Agopian
327c14bacf1fb511472138eeb5dc84a9423fc003214Mathias Agopian    /**
328c14bacf1fb511472138eeb5dc84a9423fc003214Mathias Agopian     * Whether the consumer of this Surface is running behind the producer;
329c14bacf1fb511472138eeb5dc84a9423fc003214Mathias Agopian     * that is, isConsumerRunningBehind() returns true if the consumer is more
330c14bacf1fb511472138eeb5dc84a9423fc003214Mathias Agopian     * than one buffer ahead of the producer.
331c14bacf1fb511472138eeb5dc84a9423fc003214Mathias Agopian     * @hide
332c14bacf1fb511472138eeb5dc84a9423fc003214Mathias Agopian     */
333c14bacf1fb511472138eeb5dc84a9423fc003214Mathias Agopian    public native boolean isConsumerRunningBehind();
334c14bacf1fb511472138eeb5dc84a9423fc003214Mathias Agopian
335b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /**
336b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * A Canvas class that can handle the compatibility mode. This does two
337b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * things differently.
338240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima     * <ul>
339b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * <li>Returns the width and height of the target metrics, rather than
340b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * native. For example, the canvas returns 320x480 even if an app is running
341b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * in WVGA high density.
342b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * <li>Scales the matrix in setMatrix by the application scale, except if
343b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * the matrix looks like obtained from getMatrix. This is a hack to handle
344b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * the case that an application uses getMatrix to keep the original matrix,
345b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * set matrix of its own, then set the original matrix back. There is no
346b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * perfect solution that works for all cases, and there are a lot of cases
347b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * that this model does not work, but we hope this works for many apps.
348240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima     * </ul>
349240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima     */
350240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima    private class CompatibleCanvas extends Canvas {
351240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima        // A temp matrix to remember what an application obtained via {@link getMatrix}
352240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima        private Matrix mOrigMatrix = null;
353240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima
354240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima        @Override
355240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima        public int getWidth() {
3565be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn            int w = super.getWidth();
3575be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn            if (mCompatibilityTranslator != null) {
3585be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn                w = (int)(w * mCompatibilityTranslator.applicationInvertedScale + .5f);
3595be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn            }
3605be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn            return w;
361240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima        }
362240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima
363240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima        @Override
364240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima        public int getHeight() {
3655be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn            int h = super.getHeight();
3665be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn            if (mCompatibilityTranslator != null) {
3675be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn                h = (int)(h * mCompatibilityTranslator.applicationInvertedScale + .5f);
3685be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn            }
3695be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn            return h;
370240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima        }
371240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima
372240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima        @Override
373240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima        public void setMatrix(Matrix matrix) {
374240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima            if (mCompatibleMatrix == null || mOrigMatrix == null || mOrigMatrix.equals(matrix)) {
375240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima                // don't scale the matrix if it's not compatibility mode, or
376240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima                // the matrix was obtained from getMatrix.
377240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima                super.setMatrix(matrix);
378240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima            } else {
379240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima                Matrix m = new Matrix(mCompatibleMatrix);
380240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima                m.preConcat(matrix);
381240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima                super.setMatrix(m);
38238ed7d7701514ee7127d0430e952930854608c4fMitsuru Oshima            }
383240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima        }
384240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima
385240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima        @Override
386240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima        public void getMatrix(Matrix m) {
387240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima            super.getMatrix(m);
388240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima            if (mOrigMatrix == null) {
389240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima                mOrigMatrix = new Matrix();
39038ed7d7701514ee7127d0430e952930854608c4fMitsuru Oshima            }
391240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima            mOrigMatrix.set(m);
392240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima        }
393d10cd5765a2b706fc174f16b951d6b0a5d3740d3Romain Guy    }
39438ed7d7701514ee7127d0430e952930854608c4fMitsuru Oshima
39538ed7d7701514ee7127d0430e952930854608c4fMitsuru Oshima    /**
396b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * Sets the translator used to scale canvas's width/height in compatibility
397b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * mode.
39838ed7d7701514ee7127d0430e952930854608c4fMitsuru Oshima     */
3995be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn    void setCompatibilityTranslator(Translator translator) {
400240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima        if (translator != null) {
401240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima            float appScale = translator.applicationScale;
402240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima            mCompatibleMatrix = new Matrix();
403240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima            mCompatibleMatrix.setScale(appScale, appScale);
404240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima        }
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4070586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn    /** Free all server-side state associated with this surface and
408b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * release this object's reference. @hide */
4090586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn    public native void destroy();
4100586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn
411b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    private native Canvas lockCanvasNative(Rect dirty);
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
413b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /*
414b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * set display parameters & screenshots
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Freezes the specified display, No updating of the screen will occur
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * until unfreezeDisplay() is called. Everything else works as usual though,
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * in particular transactions.
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param display
422b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * @hide
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static native   void freezeDisplay(int display);
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * resume updating the specified display.
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param display
429b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * @hide
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static native   void unfreezeDisplay(int display);
4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * set the orientation of the given display.
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param display
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param orientation
43701a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown     * @param flags Currently unused, set to 0.
438b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * @hide
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
440eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian    public static native   void setOrientation(int display, int orientation, int flags);
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
443eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian     * set the orientation of the given display.
444eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian     * @param display
445eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian     * @param orientation
446b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * @hide
447eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian     */
448eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian    public static void setOrientation(int display, int orientation) {
449eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian        setOrientation(display, orientation, 0);
450eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian    }
451eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian
452eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian    /**
453d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn     * Like {@link #screenshot(int, int, int, int)} but includes all
454d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn     * Surfaces in the screenshot.
455d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn     *
456d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn     * @hide
457d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn     */
458d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn    public static native Bitmap screenshot(int width, int height);
459d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn
460d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn    /**
461a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn     * Copy the current screen contents into a bitmap and return it.
462a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn     *
463a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn     * @param width The desired width of the returned bitmap; the raw
464a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn     * screen will be scaled down to this size.
465a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn     * @param height The desired height of the returned bitmap; the raw
466a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn     * screen will be scaled down to this size.
467d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn     * @param minLayer The lowest (bottom-most Z order) surface layer to
468d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn     * include in the screenshot.
469d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn     * @param maxLayer The highest (top-most Z order) surface layer to
470d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn     * include in the screenshot.
471a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn     * @return Returns a Bitmap containing the screen contents.
472a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn     *
473a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn     * @hide
474a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn     */
475d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn    public static native Bitmap screenshot(int width, int height, int minLayer, int maxLayer);
476a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn
477b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian
478b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /*
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * set surface parameters.
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * needs to be inside open/closeTransaction block
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
482b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian
483b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /** start a transaction @hide */
484b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    public static native   void openTransaction();
485b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /** end a transaction @hide */
486b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    public static native   void closeTransaction();
487b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /** @hide */
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native   void setLayer(int zorder);
489b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /** @hide */
49034cb9f2a960c4173bdafb4b8a2444c1bca4c5f0dMathias Agopian    public void setPosition(int x, int y) { setPosition((float)x, (float)y); }
49134cb9f2a960c4173bdafb4b8a2444c1bca4c5f0dMathias Agopian    /** @hide */
49234cb9f2a960c4173bdafb4b8a2444c1bca4c5f0dMathias Agopian    public native   void setPosition(float x, float y);
493b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /** @hide */
4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native   void setSize(int w, int h);
495b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /** @hide */
4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native   void hide();
497b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /** @hide */
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native   void show();
499b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /** @hide */
5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native   void setTransparentRegionHint(Region region);
501b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /** @hide */
5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native   void setAlpha(float alpha);
503b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /** @hide */
504b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    public native   void setMatrix(float dsdx, float dtdx, float dsdy, float dtdy);
505b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /** @hide */
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native   void freeze();
507b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /** @hide */
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native   void unfreeze();
509b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /** @hide */
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native   void setFreezeTint(int tint);
511b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /** @hide */
5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native   void setFlags(int flags, int mask);
5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
515b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian
5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final Parcelable.Creator<Surface> CREATOR
5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            = new Parcelable.Creator<Surface>()
5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Surface createFromParcel(Parcel source) {
5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return new Surface(source);
5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (Exception e) {
5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.e(LOG_TAG, "Exception creating surface from parcel", e);
5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Surface[] newArray(int size) {
5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return new Surface[size];
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void finalize() throws Throwable {
535d10cd5765a2b706fc174f16b951d6b0a5d3740d3Romain Guy        try {
536d10cd5765a2b706fc174f16b951d6b0a5d3740d3Romain Guy            super.finalize();
537d10cd5765a2b706fc174f16b951d6b0a5d3740d3Romain Guy        } finally {
538d10cd5765a2b706fc174f16b951d6b0a5d3740d3Romain Guy            if (mNativeSurface != 0 || mSurfaceControl != 0) {
539d10cd5765a2b706fc174f16b951d6b0a5d3740d3Romain Guy                if (DEBUG_RELEASE) {
540d10cd5765a2b706fc174f16b951d6b0a5d3740d3Romain Guy                    Log.w(LOG_TAG, "Surface.finalize() has work. You should have called release() ("
541d10cd5765a2b706fc174f16b951d6b0a5d3740d3Romain Guy                            + mNativeSurface + ", " + mSurfaceControl + ")", mCreationStack);
542d10cd5765a2b706fc174f16b951d6b0a5d3740d3Romain Guy                } else {
543d10cd5765a2b706fc174f16b951d6b0a5d3740d3Romain Guy                    Log.w(LOG_TAG, "Surface.finalize() has work. You should have called release() ("
544d10cd5765a2b706fc174f16b951d6b0a5d3740d3Romain Guy                            + mNativeSurface + ", " + mSurfaceControl + ")");
545d10cd5765a2b706fc174f16b951d6b0a5d3740d3Romain Guy                }
546f5e32f33eddc6e22edee1df486b38294ddc76cc3Mathias Agopian            }
547d10cd5765a2b706fc174f16b951d6b0a5d3740d3Romain Guy            release();
548f5e32f33eddc6e22edee1df486b38294ddc76cc3Mathias Agopian        }
5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private native void init(SurfaceSession s,
5525d26c1e38dabb3ad8b4b6e1000375f3b1a6b7693Mathias Agopian            int pid, String name, int display, int w, int h, int format, int flags)
5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws OutOfResourcesException;
5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private native void init(Parcel source);
5568138cb49e47f9a9905a316a217757710185c66aaMarco Nelissen
5570de171b0d490a5928d54d2fb67c912d140aac643Ted Bonkenburg    private native void initFromSurfaceTexture(SurfaceTexture surfaceTexture);
5580de171b0d490a5928d54d2fb67c912d140aac643Ted Bonkenburg
5598138cb49e47f9a9905a316a217757710185c66aaMarco Nelissen    private native int getIdentity();
5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
561