Surface.java revision 0db3aef9f81b056c57b2331dd2750958c9341fdf
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;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
26334031cd07c3bd09d23fce0ebaf946fc6ecfee26Glenn Kasten * Handle onto a raw buffer that is being managed by the screen compositor.
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class Surface implements Parcelable {
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String LOG_TAG = "Surface";
30f5e32f33eddc6e22edee1df486b38294ddc76cc3Mathias Agopian    private static final boolean DEBUG_RELEASE = false;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /* orientations for setOrientation() */
33b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    public static final int ROTATION_0       = 0;
34b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    public static final int ROTATION_90      = 1;
35b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    public static final int ROTATION_180     = 2;
36b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    public static final int ROTATION_270     = 3;
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /**
390db3aef9f81b056c57b2331dd2750958c9341fdfJamie Gennis     * Create Surface from a {@link SurfaceTexture}.
40df0c84f90894c677c50bdc967a0598f516ac86d7Jamie Gennis     *
410db3aef9f81b056c57b2331dd2750958c9341fdfJamie Gennis     * Images drawn to the Surface will be made available to the {@link
420db3aef9f81b056c57b2331dd2750958c9341fdfJamie Gennis     * SurfaceTexture}, which can attach them an OpenGL ES texture via {@link
430db3aef9f81b056c57b2331dd2750958c9341fdfJamie Gennis     * SurfaceTexture#updateTexImage}.
440db3aef9f81b056c57b2331dd2750958c9341fdfJamie Gennis     *
450db3aef9f81b056c57b2331dd2750958c9341fdfJamie Gennis     * @param surfaceTexture The {@link SurfaceTexture} that is updated by this
460db3aef9f81b056c57b2331dd2750958c9341fdfJamie Gennis     * Surface.
47df0c84f90894c677c50bdc967a0598f516ac86d7Jamie Gennis     */
48df0c84f90894c677c50bdc967a0598f516ac86d7Jamie Gennis    public Surface(SurfaceTexture surfaceTexture) {
49df0c84f90894c677c50bdc967a0598f516ac86d7Jamie Gennis        if (DEBUG_RELEASE) {
50df0c84f90894c677c50bdc967a0598f516ac86d7Jamie Gennis            mCreationStack = new Exception();
51df0c84f90894c677c50bdc967a0598f516ac86d7Jamie Gennis        }
52df0c84f90894c677c50bdc967a0598f516ac86d7Jamie Gennis        mCanvas = new CompatibleCanvas();
53df0c84f90894c677c50bdc967a0598f516ac86d7Jamie Gennis        initFromSurfaceTexture(surfaceTexture);
54df0c84f90894c677c50bdc967a0598f516ac86d7Jamie Gennis    }
55df0c84f90894c677c50bdc967a0598f516ac86d7Jamie Gennis
56df0c84f90894c677c50bdc967a0598f516ac86d7Jamie Gennis    /**
57b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * Does this object hold a valid surface?  Returns true if it holds
58b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * a physical surface, so lockCanvas() will succeed.  Otherwise
59b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * returns false.
60b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     */
61b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    public native   boolean isValid();
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
63b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /** Release the local reference to the server-side surface.
64b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * Always call release() when you're done with a Surface. This will
65b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * make the surface invalid.
66317a6280cc109e873646e4652be1582d870eedfdMathias Agopian     */
67b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    public native void release();
68b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian
69b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /** draw into a surface */
70b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    public Canvas lockCanvas(Rect dirty) throws OutOfResourcesException, IllegalArgumentException {
71b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian        /*
72b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian         * the dirty rectangle may be expanded to the surface's size, if for
73b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian         * instance it has been resized or if the bits were lost, since the last
74b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian         * call.
75b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian         */
76b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian        return lockCanvasNative(dirty);
77b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    }
78b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian
79b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /** unlock the surface and asks a page flip */
80b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    public native   void unlockCanvasAndPost(Canvas canvas);
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
82b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /**
83b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * unlock the surface. the screen won't be updated until
84b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * post() or postAll() is called
85317a6280cc109e873646e4652be1582d870eedfdMathias Agopian     */
86b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    public native   void unlockCanvas(Canvas canvas);
87b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian
88b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    @Override
89b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    public String toString() {
90b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian        return "Surface(name=" + mName + ", identity=" + getIdentity() + ")";
91b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    }
92b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian
93b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    public int describeContents() {
94b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian        return 0;
95b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    }
96b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian
97b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    public native   void readFromParcel(Parcel source);
98b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    public native   void writeToParcel(Parcel dest, int flags);
99b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian
100b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /**
101b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * Exception thrown when a surface couldn't be created or resized
102b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     */
103b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    public static class OutOfResourcesException extends Exception {
104b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian        public OutOfResourcesException() {
105b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian        }
106b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian        public OutOfResourcesException(String name) {
107b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian            super(name);
108b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian        }
109b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    }
110b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian
111b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /*
112b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * -----------------------------------------------------------------------
113b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * No user serviceable parts beyond this point
114b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * -----------------------------------------------------------------------
115b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     */
116b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian
117b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /* flags used in constructor (keep in sync with ISurfaceComposer.h) */
118b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian
119b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /** Surface is created hidden @hide */
120b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    public static final int HIDDEN              = 0x00000004;
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** The surface contains secure content, special measures will
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * be taken to disallow the surface's content to be copied from
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * another process. In particular, screenshots and VNC servers will
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * be disabled, but other measures can take place, for instance the
126b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * surface might not be hardware accelerated.
127b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * @hide*/
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int SECURE              = 0x00000080;
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Creates a surface where color components are interpreted as
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  "non pre-multiplied" by their alpha channel. Of course this flag is
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  meaningless for surfaces without an alpha channel. By default
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  surfaces are pre-multiplied, which means that each color component is
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  already multiplied by its alpha value. In this case the blending
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  equation used is:
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *    DEST = SRC + DEST * (1-SRC_ALPHA)
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  By contrast, non pre-multiplied surfaces use the following equation:
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *    DEST = SRC * SRC_ALPHA * DEST * (1-SRC_ALPHA)
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  pre-multiplied surfaces must always be used if transparent pixels are
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  composited on top of each-other into the surface. A pre-multiplied
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  surface can never lower the value of the alpha component of a given
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  pixel.
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  In some rare situations, a non pre-multiplied surface is preferable.
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
150b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     *  @hide
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int NON_PREMULTIPLIED   = 0x00000100;
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
155d10cd5765a2b706fc174f16b951d6b0a5d3740d3Romain Guy     * Indicates that the surface must be considered opaque, even if its
156d10cd5765a2b706fc174f16b951d6b0a5d3740d3Romain Guy     * pixel format is set to translucent. This can be useful if an
157d10cd5765a2b706fc174f16b951d6b0a5d3740d3Romain Guy     * application needs full RGBA 8888 support for instance but will
158d10cd5765a2b706fc174f16b951d6b0a5d3740d3Romain Guy     * still draw every pixel opaque.
159d10cd5765a2b706fc174f16b951d6b0a5d3740d3Romain Guy     *
160d10cd5765a2b706fc174f16b951d6b0a5d3740d3Romain Guy     * @hide
161d10cd5765a2b706fc174f16b951d6b0a5d3740d3Romain Guy     */
162d10cd5765a2b706fc174f16b951d6b0a5d3740d3Romain Guy    public static final int OPAQUE              = 0x00000400;
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
164d6f5bde96b2fe82bc7e5d4e64266d585108c4648Glenn Kasten    /**
165d6f5bde96b2fe82bc7e5d4e64266d585108c4648Glenn Kasten     * Application requires a hardware-protected path to an
166d6f5bde96b2fe82bc7e5d4e64266d585108c4648Glenn Kasten     * external display sink. If a hardware-protected path is not available,
167d6f5bde96b2fe82bc7e5d4e64266d585108c4648Glenn Kasten     * then this surface will not be displayed on the external sink.
168d6f5bde96b2fe82bc7e5d4e64266d585108c4648Glenn Kasten     *
169d6f5bde96b2fe82bc7e5d4e64266d585108c4648Glenn Kasten     * @hide
170d6f5bde96b2fe82bc7e5d4e64266d585108c4648Glenn Kasten     */
171d6f5bde96b2fe82bc7e5d4e64266d585108c4648Glenn Kasten    public static final int PROTECTED_APP       = 0x00000800;
172d6f5bde96b2fe82bc7e5d4e64266d585108c4648Glenn Kasten
173d6f5bde96b2fe82bc7e5d4e64266d585108c4648Glenn Kasten    // 0x1000 is reserved for an independent DRM protected flag in framework
174d6f5bde96b2fe82bc7e5d4e64266d585108c4648Glenn Kasten
175b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /** Creates a normal surface. This is the default. @hide */
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int FX_SURFACE_NORMAL   = 0x00000000;
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Creates a Blur surface. Everything behind this surface is blurred
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * by some amount. The quality and refresh speed of the blur effect
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is not settable or guaranteed.
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * It is an error to lock a Blur surface, since it doesn't have
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * a backing store.
183b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * @hide
18467403e096e6f59b7cd18a90d0d3f5c3d17c31407Mathias Agopian     * @deprecated
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
18667403e096e6f59b7cd18a90d0d3f5c3d17c31407Mathias Agopian    @Deprecated
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int FX_SURFACE_BLUR     = 0x00010000;
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Creates a Dim surface. Everything behind this surface is dimmed
190334031cd07c3bd09d23fce0ebaf946fc6ecfee26Glenn Kasten     * by the amount specified in {@link #setAlpha}.
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * It is an error to lock a Dim surface, since it doesn't have
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * a backing store.
193b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * @hide
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int FX_SURFACE_DIM     = 0x00020000;
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
197b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /** Mask used for FX values above @hide */
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int FX_SURFACE_MASK     = 0x000F0000;
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /* flags used with setFlags() (keep in sync with ISurfaceComposer.h) */
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
202b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /** Hide the surface. Equivalent to calling hide(). @hide */
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int SURFACE_HIDDEN    = 0x01;
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
205b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /** Freeze the surface. Equivalent to calling freeze(). @hide */
206c87c4a3e3b3c3949ae3c6f8fd245b71691d5ca3bMathias Agopian    public static final int SURFACE_FROZEN     = 0x02;
207c87c4a3e3b3c3949ae3c6f8fd245b71691d5ca3bMathias Agopian
208b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /** Enable dithering when compositing this surface @hide */
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int SURFACE_DITHER    = 0x04;
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
211b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /** Disable the orientation animation @hide */
212eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian    public static final int FLAGS_ORIENTATION_ANIMATION_DISABLE = 0x000000001;
213eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian
2140de171b0d490a5928d54d2fb67c912d140aac643Ted Bonkenburg    // The mSurfaceControl will only be present for Surfaces used by the window
2150de171b0d490a5928d54d2fb67c912d140aac643Ted Bonkenburg    // server or system processes. When this class is parceled we defer to the
216b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    // mSurfaceControl to do the parceling. Otherwise we parcel the
217b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    // mNativeSurface.
21817f638b39f2e8b610ecfa1290e5bc42ab7700c98Mathias Agopian    private int mSurfaceControl;
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mSaveCount;
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Canvas mCanvas;
2218b138323d54e36fd66b22a634494648e20c53373Mathias Agopian    private int mNativeSurface;
2222a83f001fdb189f945e82e81e717ba204824b112Romain Guy    private int mSurfaceGenerationId;
2238138cb49e47f9a9905a316a217757710185c66aaMarco Nelissen    private String mName;
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2255be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn    // The Translator for density compatibility mode.  This is used for scaling
2265be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn    // the canvas to perform the appropriate density transformation.
2275be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn    private Translator mCompatibilityTranslator;
228240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima
229240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima    // A matrix to scale the matrix set by application. This is set to null for
230240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima    // non compatibility mode.
231240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima    private Matrix mCompatibleMatrix;
23238ed7d7701514ee7127d0430e952930854608c4fMitsuru Oshima
233f5e32f33eddc6e22edee1df486b38294ddc76cc3Mathias Agopian    private Exception mCreationStack;
234f5e32f33eddc6e22edee1df486b38294ddc76cc3Mathias Agopian
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * We use a class initializer to allow the native code to cache some
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * field offsets.
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    native private static void nativeClassInit();
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static { nativeClassInit(); }
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
243b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /** create a surface @hide */
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Surface(SurfaceSession s,
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int pid, int display, int w, int h, int format, int flags)
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throws OutOfResourcesException {
247f5e32f33eddc6e22edee1df486b38294ddc76cc3Mathias Agopian        if (DEBUG_RELEASE) {
248f5e32f33eddc6e22edee1df486b38294ddc76cc3Mathias Agopian            mCreationStack = new Exception();
249f5e32f33eddc6e22edee1df486b38294ddc76cc3Mathias Agopian        }
2500586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn        mCanvas = new CompatibleCanvas();
2515d26c1e38dabb3ad8b4b6e1000375f3b1a6b7693Mathias Agopian        init(s,pid,null,display,w,h,format,flags);
2525d26c1e38dabb3ad8b4b6e1000375f3b1a6b7693Mathias Agopian    }
2535d26c1e38dabb3ad8b4b6e1000375f3b1a6b7693Mathias Agopian
254b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /** create a surface with a name @hide */
2555d26c1e38dabb3ad8b4b6e1000375f3b1a6b7693Mathias Agopian    public Surface(SurfaceSession s,
2565d26c1e38dabb3ad8b4b6e1000375f3b1a6b7693Mathias Agopian            int pid, String name, int display, int w, int h, int format, int flags)
2575d26c1e38dabb3ad8b4b6e1000375f3b1a6b7693Mathias Agopian        throws OutOfResourcesException {
258f5e32f33eddc6e22edee1df486b38294ddc76cc3Mathias Agopian        if (DEBUG_RELEASE) {
259f5e32f33eddc6e22edee1df486b38294ddc76cc3Mathias Agopian            mCreationStack = new Exception();
260f5e32f33eddc6e22edee1df486b38294ddc76cc3Mathias Agopian        }
2615d26c1e38dabb3ad8b4b6e1000375f3b1a6b7693Mathias Agopian        mCanvas = new CompatibleCanvas();
2625d26c1e38dabb3ad8b4b6e1000375f3b1a6b7693Mathias Agopian        init(s,pid,name,display,w,h,format,flags);
2638138cb49e47f9a9905a316a217757710185c66aaMarco Nelissen        mName = name;
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Create an empty surface, which will later be filled in by
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * readFromParcel().
269b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * @hide
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Surface() {
272f5e32f33eddc6e22edee1df486b38294ddc76cc3Mathias Agopian        if (DEBUG_RELEASE) {
273f5e32f33eddc6e22edee1df486b38294ddc76cc3Mathias Agopian            mCreationStack = new Exception();
274f5e32f33eddc6e22edee1df486b38294ddc76cc3Mathias Agopian        }
275240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima        mCanvas = new CompatibleCanvas();
276240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima    }
277240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima
278b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    private Surface(Parcel source) throws OutOfResourcesException {
279b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian        init(source);
280b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    }
281b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian
282240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima    /**
283b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * Copy another surface to this one.  This surface now holds a reference
284b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * to the same data as the original surface, and is -not- the owner.
285b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * @hide
286b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     */
287b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    public native void copyFrom(Surface o);
288b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian
289b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /** @hide */
290b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    public int getGenerationId() {
291b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian        return mSurfaceGenerationId;
292b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    }
293b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian
294b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /**
295b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * A Canvas class that can handle the compatibility mode. This does two
296b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * things differently.
297240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima     * <ul>
298b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * <li>Returns the width and height of the target metrics, rather than
299b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * native. For example, the canvas returns 320x480 even if an app is running
300b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * in WVGA high density.
301b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * <li>Scales the matrix in setMatrix by the application scale, except if
302b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * the matrix looks like obtained from getMatrix. This is a hack to handle
303b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * the case that an application uses getMatrix to keep the original matrix,
304b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * set matrix of its own, then set the original matrix back. There is no
305b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * perfect solution that works for all cases, and there are a lot of cases
306b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * that this model does not work, but we hope this works for many apps.
307240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima     * </ul>
308240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima     */
309240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima    private class CompatibleCanvas extends Canvas {
310240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima        // A temp matrix to remember what an application obtained via {@link getMatrix}
311240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima        private Matrix mOrigMatrix = null;
312240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima
313240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima        @Override
314240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima        public int getWidth() {
3155be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn            int w = super.getWidth();
3165be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn            if (mCompatibilityTranslator != null) {
3175be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn                w = (int)(w * mCompatibilityTranslator.applicationInvertedScale + .5f);
3185be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn            }
3195be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn            return w;
320240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima        }
321240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima
322240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima        @Override
323240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima        public int getHeight() {
3245be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn            int h = super.getHeight();
3255be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn            if (mCompatibilityTranslator != null) {
3265be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn                h = (int)(h * mCompatibilityTranslator.applicationInvertedScale + .5f);
3275be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn            }
3285be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn            return h;
329240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima        }
330240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima
331240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima        @Override
332240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima        public void setMatrix(Matrix matrix) {
333240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima            if (mCompatibleMatrix == null || mOrigMatrix == null || mOrigMatrix.equals(matrix)) {
334240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima                // don't scale the matrix if it's not compatibility mode, or
335240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima                // the matrix was obtained from getMatrix.
336240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima                super.setMatrix(matrix);
337240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima            } else {
338240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima                Matrix m = new Matrix(mCompatibleMatrix);
339240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima                m.preConcat(matrix);
340240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima                super.setMatrix(m);
34138ed7d7701514ee7127d0430e952930854608c4fMitsuru Oshima            }
342240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima        }
343240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima
344240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima        @Override
345240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima        public void getMatrix(Matrix m) {
346240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima            super.getMatrix(m);
347240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima            if (mOrigMatrix == null) {
348240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima                mOrigMatrix = new Matrix();
34938ed7d7701514ee7127d0430e952930854608c4fMitsuru Oshima            }
350240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima            mOrigMatrix.set(m);
351240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima        }
352d10cd5765a2b706fc174f16b951d6b0a5d3740d3Romain Guy    }
35338ed7d7701514ee7127d0430e952930854608c4fMitsuru Oshima
35438ed7d7701514ee7127d0430e952930854608c4fMitsuru Oshima    /**
355b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * Sets the translator used to scale canvas's width/height in compatibility
356b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * mode.
35738ed7d7701514ee7127d0430e952930854608c4fMitsuru Oshima     */
3585be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn    void setCompatibilityTranslator(Translator translator) {
359240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima        if (translator != null) {
360240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima            float appScale = translator.applicationScale;
361240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima            mCompatibleMatrix = new Matrix();
362240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima            mCompatibleMatrix.setScale(appScale, appScale);
363240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima        }
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3660586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn    /** Free all server-side state associated with this surface and
367b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * release this object's reference. @hide */
3680586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn    public native void destroy();
3690586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn
370b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    private native Canvas lockCanvasNative(Rect dirty);
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
372b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /*
373b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * set display parameters & screenshots
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Freezes the specified display, No updating of the screen will occur
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * until unfreezeDisplay() is called. Everything else works as usual though,
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * in particular transactions.
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param display
381b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * @hide
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static native   void freezeDisplay(int display);
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * resume updating the specified display.
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param display
388b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * @hide
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static native   void unfreezeDisplay(int display);
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * set the orientation of the given display.
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param display
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param orientation
396eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian     * @param flags
397b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * @hide
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
399eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian    public static native   void setOrientation(int display, int orientation, int flags);
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
402eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian     * set the orientation of the given display.
403eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian     * @param display
404eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian     * @param orientation
405b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * @hide
406eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian     */
407eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian    public static void setOrientation(int display, int orientation) {
408eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian        setOrientation(display, orientation, 0);
409eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian    }
410eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian
411eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian    /**
412d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn     * Like {@link #screenshot(int, int, int, int)} but includes all
413d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn     * Surfaces in the screenshot.
414d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn     *
415d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn     * @hide
416d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn     */
417d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn    public static native Bitmap screenshot(int width, int height);
418d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn
419d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn    /**
420a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn     * Copy the current screen contents into a bitmap and return it.
421a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn     *
422a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn     * @param width The desired width of the returned bitmap; the raw
423a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn     * screen will be scaled down to this size.
424a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn     * @param height The desired height of the returned bitmap; the raw
425a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn     * screen will be scaled down to this size.
426d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn     * @param minLayer The lowest (bottom-most Z order) surface layer to
427d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn     * include in the screenshot.
428d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn     * @param maxLayer The highest (top-most Z order) surface layer to
429d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn     * include in the screenshot.
430a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn     * @return Returns a Bitmap containing the screen contents.
431a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn     *
432a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn     * @hide
433a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn     */
434d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn    public static native Bitmap screenshot(int width, int height, int minLayer, int maxLayer);
435a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn
436b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian
437b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /*
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * set surface parameters.
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * needs to be inside open/closeTransaction block
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
441b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian
442b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /** start a transaction @hide */
443b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    public static native   void openTransaction();
444b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /** end a transaction @hide */
445b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    public static native   void closeTransaction();
446b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /** @hide */
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native   void setLayer(int zorder);
448b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /** @hide */
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native   void setPosition(int x, int y);
450b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /** @hide */
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native   void setSize(int w, int h);
452b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /** @hide */
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native   void hide();
454b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /** @hide */
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native   void show();
456b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /** @hide */
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native   void setTransparentRegionHint(Region region);
458b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /** @hide */
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native   void setAlpha(float alpha);
460b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /** @hide */
461b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    public native   void setMatrix(float dsdx, float dtdx, float dsdy, float dtdy);
462b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /** @hide */
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native   void freeze();
464b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /** @hide */
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native   void unfreeze();
466b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /** @hide */
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native   void setFreezeTint(int tint);
468b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /** @hide */
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native   void setFlags(int flags, int mask);
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
472b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final Parcelable.Creator<Surface> CREATOR
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            = new Parcelable.Creator<Surface>()
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Surface createFromParcel(Parcel source) {
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return new Surface(source);
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (Exception e) {
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.e(LOG_TAG, "Exception creating surface from parcel", e);
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Surface[] newArray(int size) {
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return new Surface[size];
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void finalize() throws Throwable {
492d10cd5765a2b706fc174f16b951d6b0a5d3740d3Romain Guy        try {
493d10cd5765a2b706fc174f16b951d6b0a5d3740d3Romain Guy            super.finalize();
494d10cd5765a2b706fc174f16b951d6b0a5d3740d3Romain Guy        } finally {
495d10cd5765a2b706fc174f16b951d6b0a5d3740d3Romain Guy            if (mNativeSurface != 0 || mSurfaceControl != 0) {
496d10cd5765a2b706fc174f16b951d6b0a5d3740d3Romain Guy                if (DEBUG_RELEASE) {
497d10cd5765a2b706fc174f16b951d6b0a5d3740d3Romain Guy                    Log.w(LOG_TAG, "Surface.finalize() has work. You should have called release() ("
498d10cd5765a2b706fc174f16b951d6b0a5d3740d3Romain Guy                            + mNativeSurface + ", " + mSurfaceControl + ")", mCreationStack);
499d10cd5765a2b706fc174f16b951d6b0a5d3740d3Romain Guy                } else {
500d10cd5765a2b706fc174f16b951d6b0a5d3740d3Romain Guy                    Log.w(LOG_TAG, "Surface.finalize() has work. You should have called release() ("
501d10cd5765a2b706fc174f16b951d6b0a5d3740d3Romain Guy                            + mNativeSurface + ", " + mSurfaceControl + ")");
502d10cd5765a2b706fc174f16b951d6b0a5d3740d3Romain Guy                }
503f5e32f33eddc6e22edee1df486b38294ddc76cc3Mathias Agopian            }
504d10cd5765a2b706fc174f16b951d6b0a5d3740d3Romain Guy            release();
505f5e32f33eddc6e22edee1df486b38294ddc76cc3Mathias Agopian        }
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private native void init(SurfaceSession s,
5095d26c1e38dabb3ad8b4b6e1000375f3b1a6b7693Mathias Agopian            int pid, String name, int display, int w, int h, int format, int flags)
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws OutOfResourcesException;
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private native void init(Parcel source);
5138138cb49e47f9a9905a316a217757710185c66aaMarco Nelissen
5140de171b0d490a5928d54d2fb67c912d140aac643Ted Bonkenburg    private native void initFromSurfaceTexture(SurfaceTexture surfaceTexture);
5150de171b0d490a5928d54d2fb67c912d140aac643Ted Bonkenburg
5168138cb49e47f9a9905a316a217757710185c66aaMarco Nelissen    private native int getIdentity();
5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
518