Surface.java revision 67403e096e6f59b7cd18a90d0d3f5c3d17c31407
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    /**
39b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * Does this object hold a valid surface?  Returns true if it holds
40b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * a physical surface, so lockCanvas() will succeed.  Otherwise
41b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * returns false.
42b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     */
43b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    public native   boolean isValid();
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /** Release the local reference to the server-side surface.
46b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * Always call release() when you're done with a Surface. This will
47b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * make the surface invalid.
48317a6280cc109e873646e4652be1582d870eedfdMathias Agopian     */
49b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    public native void release();
50b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian
51b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /** draw into a surface */
52b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    public Canvas lockCanvas(Rect dirty) throws OutOfResourcesException, IllegalArgumentException {
53b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian        /*
54b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian         * the dirty rectangle may be expanded to the surface's size, if for
55b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian         * instance it has been resized or if the bits were lost, since the last
56b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian         * call.
57b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian         */
58b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian        return lockCanvasNative(dirty);
59b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    }
60b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian
61b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /** unlock the surface and asks a page flip */
62b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    public native   void unlockCanvasAndPost(Canvas canvas);
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
64b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /**
65b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * unlock the surface. the screen won't be updated until
66b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * post() or postAll() is called
67317a6280cc109e873646e4652be1582d870eedfdMathias Agopian     */
68b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    public native   void unlockCanvas(Canvas canvas);
69b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian
70b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    @Override
71b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    public String toString() {
72b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian        return "Surface(name=" + mName + ", identity=" + getIdentity() + ")";
73b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    }
74b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian
75b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    public int describeContents() {
76b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian        return 0;
77b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    }
78b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian
79b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    public native   void readFromParcel(Parcel source);
80b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    public native   void writeToParcel(Parcel dest, int flags);
81b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian
82b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /**
83b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * Exception thrown when a surface couldn't be created or resized
84b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     */
85b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    public static class OutOfResourcesException extends Exception {
86b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian        public OutOfResourcesException() {
87b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian        }
88b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian        public OutOfResourcesException(String name) {
89b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian            super(name);
90b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian        }
91b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    }
92b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian
93b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /*
94b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * -----------------------------------------------------------------------
95b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * No user serviceable parts beyond this point
96b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * -----------------------------------------------------------------------
97b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     */
98b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian
99b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /* flags used in constructor (keep in sync with ISurfaceComposer.h) */
100b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian
101b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /** Surface is created hidden @hide */
102b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    public static final int HIDDEN              = 0x00000004;
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** The surface contains secure content, special measures will
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * be taken to disallow the surface's content to be copied from
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * another process. In particular, screenshots and VNC servers will
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * be disabled, but other measures can take place, for instance the
108b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * surface might not be hardware accelerated.
109b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * @hide*/
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int SECURE              = 0x00000080;
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Creates a surface where color components are interpreted as
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  "non pre-multiplied" by their alpha channel. Of course this flag is
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  meaningless for surfaces without an alpha channel. By default
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  surfaces are pre-multiplied, which means that each color component is
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  already multiplied by its alpha value. In this case the blending
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  equation used is:
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *    DEST = SRC + DEST * (1-SRC_ALPHA)
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  By contrast, non pre-multiplied surfaces use the following equation:
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *    DEST = SRC * SRC_ALPHA * DEST * (1-SRC_ALPHA)
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  pre-multiplied surfaces must always be used if transparent pixels are
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  composited on top of each-other into the surface. A pre-multiplied
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  surface can never lower the value of the alpha component of a given
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  pixel.
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  In some rare situations, a non pre-multiplied surface is preferable.
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
132b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     *  @hide
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int NON_PREMULTIPLIED   = 0x00000100;
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
137d10cd5765a2b706fc174f16b951d6b0a5d3740d3Romain Guy     * Indicates that the surface must be considered opaque, even if its
138d10cd5765a2b706fc174f16b951d6b0a5d3740d3Romain Guy     * pixel format is set to translucent. This can be useful if an
139d10cd5765a2b706fc174f16b951d6b0a5d3740d3Romain Guy     * application needs full RGBA 8888 support for instance but will
140d10cd5765a2b706fc174f16b951d6b0a5d3740d3Romain Guy     * still draw every pixel opaque.
141d10cd5765a2b706fc174f16b951d6b0a5d3740d3Romain Guy     *
142d10cd5765a2b706fc174f16b951d6b0a5d3740d3Romain Guy     * @hide
143d10cd5765a2b706fc174f16b951d6b0a5d3740d3Romain Guy     */
144d10cd5765a2b706fc174f16b951d6b0a5d3740d3Romain Guy    public static final int OPAQUE              = 0x00000400;
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
146d6f5bde96b2fe82bc7e5d4e64266d585108c4648Glenn Kasten    /**
147d6f5bde96b2fe82bc7e5d4e64266d585108c4648Glenn Kasten     * Application requires a hardware-protected path to an
148d6f5bde96b2fe82bc7e5d4e64266d585108c4648Glenn Kasten     * external display sink. If a hardware-protected path is not available,
149d6f5bde96b2fe82bc7e5d4e64266d585108c4648Glenn Kasten     * then this surface will not be displayed on the external sink.
150d6f5bde96b2fe82bc7e5d4e64266d585108c4648Glenn Kasten     *
151d6f5bde96b2fe82bc7e5d4e64266d585108c4648Glenn Kasten     * @hide
152d6f5bde96b2fe82bc7e5d4e64266d585108c4648Glenn Kasten     */
153d6f5bde96b2fe82bc7e5d4e64266d585108c4648Glenn Kasten    public static final int PROTECTED_APP       = 0x00000800;
154d6f5bde96b2fe82bc7e5d4e64266d585108c4648Glenn Kasten
155d6f5bde96b2fe82bc7e5d4e64266d585108c4648Glenn Kasten    // 0x1000 is reserved for an independent DRM protected flag in framework
156d6f5bde96b2fe82bc7e5d4e64266d585108c4648Glenn Kasten
157b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /** Creates a normal surface. This is the default. @hide */
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int FX_SURFACE_NORMAL   = 0x00000000;
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Creates a Blur surface. Everything behind this surface is blurred
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * by some amount. The quality and refresh speed of the blur effect
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is not settable or guaranteed.
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * It is an error to lock a Blur surface, since it doesn't have
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * a backing store.
165b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * @hide
16667403e096e6f59b7cd18a90d0d3f5c3d17c31407Mathias Agopian     * @deprecated
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
16867403e096e6f59b7cd18a90d0d3f5c3d17c31407Mathias Agopian    @Deprecated
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int FX_SURFACE_BLUR     = 0x00010000;
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Creates a Dim surface. Everything behind this surface is dimmed
172334031cd07c3bd09d23fce0ebaf946fc6ecfee26Glenn Kasten     * by the amount specified in {@link #setAlpha}.
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * It is an error to lock a Dim surface, since it doesn't have
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * a backing store.
175b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * @hide
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int FX_SURFACE_DIM     = 0x00020000;
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /** Mask used for FX values above @hide */
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int FX_SURFACE_MASK     = 0x000F0000;
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /* flags used with setFlags() (keep in sync with ISurfaceComposer.h) */
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
184b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /** Hide the surface. Equivalent to calling hide(). @hide */
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int SURFACE_HIDDEN    = 0x01;
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
187b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /** Freeze the surface. Equivalent to calling freeze(). @hide */
188c87c4a3e3b3c3949ae3c6f8fd245b71691d5ca3bMathias Agopian    public static final int SURFACE_FROZEN     = 0x02;
189c87c4a3e3b3c3949ae3c6f8fd245b71691d5ca3bMathias Agopian
190b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /** Enable dithering when compositing this surface @hide */
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int SURFACE_DITHER    = 0x04;
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
193b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /** Disable the orientation animation @hide */
194eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian    public static final int FLAGS_ORIENTATION_ANIMATION_DISABLE = 0x000000001;
195eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian
1960de171b0d490a5928d54d2fb67c912d140aac643Ted Bonkenburg    // The mSurfaceControl will only be present for Surfaces used by the window
1970de171b0d490a5928d54d2fb67c912d140aac643Ted Bonkenburg    // server or system processes. When this class is parceled we defer to the
198b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    // mSurfaceControl to do the parceling. Otherwise we parcel the
199b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    // mNativeSurface.
20017f638b39f2e8b610ecfa1290e5bc42ab7700c98Mathias Agopian    private int mSurfaceControl;
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mSaveCount;
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Canvas mCanvas;
2038b138323d54e36fd66b22a634494648e20c53373Mathias Agopian    private int mNativeSurface;
2042a83f001fdb189f945e82e81e717ba204824b112Romain Guy    private int mSurfaceGenerationId;
2058138cb49e47f9a9905a316a217757710185c66aaMarco Nelissen    private String mName;
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2075be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn    // The Translator for density compatibility mode.  This is used for scaling
2085be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn    // the canvas to perform the appropriate density transformation.
2095be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn    private Translator mCompatibilityTranslator;
210240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima
211240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima    // A matrix to scale the matrix set by application. This is set to null for
212240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima    // non compatibility mode.
213240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima    private Matrix mCompatibleMatrix;
21438ed7d7701514ee7127d0430e952930854608c4fMitsuru Oshima
215f5e32f33eddc6e22edee1df486b38294ddc76cc3Mathias Agopian    private Exception mCreationStack;
216f5e32f33eddc6e22edee1df486b38294ddc76cc3Mathias Agopian
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * We use a class initializer to allow the native code to cache some
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * field offsets.
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    native private static void nativeClassInit();
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static { nativeClassInit(); }
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2250de171b0d490a5928d54d2fb67c912d140aac643Ted Bonkenburg    /**
2260de171b0d490a5928d54d2fb67c912d140aac643Ted Bonkenburg     * Create Surface from a SurfaceTexture.
2270de171b0d490a5928d54d2fb67c912d140aac643Ted Bonkenburg     *
2280de171b0d490a5928d54d2fb67c912d140aac643Ted Bonkenburg     * @param surfaceTexture The {@link SurfaceTexture} that is updated by this Surface.
2290de171b0d490a5928d54d2fb67c912d140aac643Ted Bonkenburg     * @hide
2300de171b0d490a5928d54d2fb67c912d140aac643Ted Bonkenburg     */
2310de171b0d490a5928d54d2fb67c912d140aac643Ted Bonkenburg    public Surface(SurfaceTexture surfaceTexture) {
2320de171b0d490a5928d54d2fb67c912d140aac643Ted Bonkenburg        if (DEBUG_RELEASE) {
2330de171b0d490a5928d54d2fb67c912d140aac643Ted Bonkenburg            mCreationStack = new Exception();
2340de171b0d490a5928d54d2fb67c912d140aac643Ted Bonkenburg        }
2350de171b0d490a5928d54d2fb67c912d140aac643Ted Bonkenburg        mCanvas = new CompatibleCanvas();
2360de171b0d490a5928d54d2fb67c912d140aac643Ted Bonkenburg        initFromSurfaceTexture(surfaceTexture);
2370de171b0d490a5928d54d2fb67c912d140aac643Ted Bonkenburg    }
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
239b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /** create a surface @hide */
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Surface(SurfaceSession s,
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int pid, int display, int w, int h, int format, int flags)
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throws OutOfResourcesException {
243f5e32f33eddc6e22edee1df486b38294ddc76cc3Mathias Agopian        if (DEBUG_RELEASE) {
244f5e32f33eddc6e22edee1df486b38294ddc76cc3Mathias Agopian            mCreationStack = new Exception();
245f5e32f33eddc6e22edee1df486b38294ddc76cc3Mathias Agopian        }
2460586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn        mCanvas = new CompatibleCanvas();
2475d26c1e38dabb3ad8b4b6e1000375f3b1a6b7693Mathias Agopian        init(s,pid,null,display,w,h,format,flags);
2485d26c1e38dabb3ad8b4b6e1000375f3b1a6b7693Mathias Agopian    }
2495d26c1e38dabb3ad8b4b6e1000375f3b1a6b7693Mathias Agopian
250b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /** create a surface with a name @hide */
2515d26c1e38dabb3ad8b4b6e1000375f3b1a6b7693Mathias Agopian    public Surface(SurfaceSession s,
2525d26c1e38dabb3ad8b4b6e1000375f3b1a6b7693Mathias Agopian            int pid, String name, int display, int w, int h, int format, int flags)
2535d26c1e38dabb3ad8b4b6e1000375f3b1a6b7693Mathias Agopian        throws OutOfResourcesException {
254f5e32f33eddc6e22edee1df486b38294ddc76cc3Mathias Agopian        if (DEBUG_RELEASE) {
255f5e32f33eddc6e22edee1df486b38294ddc76cc3Mathias Agopian            mCreationStack = new Exception();
256f5e32f33eddc6e22edee1df486b38294ddc76cc3Mathias Agopian        }
2575d26c1e38dabb3ad8b4b6e1000375f3b1a6b7693Mathias Agopian        mCanvas = new CompatibleCanvas();
2585d26c1e38dabb3ad8b4b6e1000375f3b1a6b7693Mathias Agopian        init(s,pid,name,display,w,h,format,flags);
2598138cb49e47f9a9905a316a217757710185c66aaMarco Nelissen        mName = name;
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Create an empty surface, which will later be filled in by
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * readFromParcel().
265b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * @hide
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Surface() {
268f5e32f33eddc6e22edee1df486b38294ddc76cc3Mathias Agopian        if (DEBUG_RELEASE) {
269f5e32f33eddc6e22edee1df486b38294ddc76cc3Mathias Agopian            mCreationStack = new Exception();
270f5e32f33eddc6e22edee1df486b38294ddc76cc3Mathias Agopian        }
271240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima        mCanvas = new CompatibleCanvas();
272240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima    }
273240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima
274b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    private Surface(Parcel source) throws OutOfResourcesException {
275b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian        init(source);
276b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    }
277b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian
278240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima    /**
279b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * Copy another surface to this one.  This surface now holds a reference
280b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * to the same data as the original surface, and is -not- the owner.
281b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * @hide
282b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     */
283b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    public native void copyFrom(Surface o);
284b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian
285b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /** @hide */
286b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    public int getGenerationId() {
287b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian        return mSurfaceGenerationId;
288b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    }
289b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian
290b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /**
291b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * A Canvas class that can handle the compatibility mode. This does two
292b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * things differently.
293240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima     * <ul>
294b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * <li>Returns the width and height of the target metrics, rather than
295b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * native. For example, the canvas returns 320x480 even if an app is running
296b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * in WVGA high density.
297b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * <li>Scales the matrix in setMatrix by the application scale, except if
298b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * the matrix looks like obtained from getMatrix. This is a hack to handle
299b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * the case that an application uses getMatrix to keep the original matrix,
300b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * set matrix of its own, then set the original matrix back. There is no
301b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * perfect solution that works for all cases, and there are a lot of cases
302b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * that this model does not work, but we hope this works for many apps.
303240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima     * </ul>
304240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima     */
305240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima    private class CompatibleCanvas extends Canvas {
306240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima        // A temp matrix to remember what an application obtained via {@link getMatrix}
307240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima        private Matrix mOrigMatrix = null;
308240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima
309240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima        @Override
310240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima        public int getWidth() {
3115be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn            int w = super.getWidth();
3125be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn            if (mCompatibilityTranslator != null) {
3135be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn                w = (int)(w * mCompatibilityTranslator.applicationInvertedScale + .5f);
3145be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn            }
3155be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn            return w;
316240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima        }
317240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima
318240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima        @Override
319240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima        public int getHeight() {
3205be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn            int h = super.getHeight();
3215be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn            if (mCompatibilityTranslator != null) {
3225be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn                h = (int)(h * mCompatibilityTranslator.applicationInvertedScale + .5f);
3235be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn            }
3245be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn            return h;
325240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima        }
326240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima
327240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima        @Override
328240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima        public void setMatrix(Matrix matrix) {
329240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima            if (mCompatibleMatrix == null || mOrigMatrix == null || mOrigMatrix.equals(matrix)) {
330240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima                // don't scale the matrix if it's not compatibility mode, or
331240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima                // the matrix was obtained from getMatrix.
332240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima                super.setMatrix(matrix);
333240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima            } else {
334240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima                Matrix m = new Matrix(mCompatibleMatrix);
335240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima                m.preConcat(matrix);
336240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima                super.setMatrix(m);
33738ed7d7701514ee7127d0430e952930854608c4fMitsuru Oshima            }
338240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima        }
339240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima
340240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima        @Override
341240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima        public void getMatrix(Matrix m) {
342240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima            super.getMatrix(m);
343240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima            if (mOrigMatrix == null) {
344240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima                mOrigMatrix = new Matrix();
34538ed7d7701514ee7127d0430e952930854608c4fMitsuru Oshima            }
346240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima            mOrigMatrix.set(m);
347240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima        }
348d10cd5765a2b706fc174f16b951d6b0a5d3740d3Romain Guy    }
34938ed7d7701514ee7127d0430e952930854608c4fMitsuru Oshima
35038ed7d7701514ee7127d0430e952930854608c4fMitsuru Oshima    /**
351b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * Sets the translator used to scale canvas's width/height in compatibility
352b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * mode.
35338ed7d7701514ee7127d0430e952930854608c4fMitsuru Oshima     */
3545be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn    void setCompatibilityTranslator(Translator translator) {
355240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima        if (translator != null) {
356240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima            float appScale = translator.applicationScale;
357240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima            mCompatibleMatrix = new Matrix();
358240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima            mCompatibleMatrix.setScale(appScale, appScale);
359240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima        }
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3620586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn    /** Free all server-side state associated with this surface and
363b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * release this object's reference. @hide */
3640586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn    public native void destroy();
3650586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn
366b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    private native Canvas lockCanvasNative(Rect dirty);
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
368b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /*
369b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * set display parameters & screenshots
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Freezes the specified display, No updating of the screen will occur
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * until unfreezeDisplay() is called. Everything else works as usual though,
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * in particular transactions.
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param display
377b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * @hide
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static native   void freezeDisplay(int display);
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * resume updating the specified display.
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param display
384b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * @hide
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static native   void unfreezeDisplay(int display);
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * set the orientation of the given display.
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param display
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param orientation
392eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian     * @param flags
393b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * @hide
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
395eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian    public static native   void setOrientation(int display, int orientation, int flags);
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
398eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian     * set the orientation of the given display.
399eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian     * @param display
400eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian     * @param orientation
401b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * @hide
402eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian     */
403eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian    public static void setOrientation(int display, int orientation) {
404eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian        setOrientation(display, orientation, 0);
405eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian    }
406eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian
407eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian    /**
408d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn     * Like {@link #screenshot(int, int, int, int)} but includes all
409d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn     * Surfaces in the screenshot.
410d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn     *
411d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn     * @hide
412d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn     */
413d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn    public static native Bitmap screenshot(int width, int height);
414d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn
415d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn    /**
416a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn     * Copy the current screen contents into a bitmap and return it.
417a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn     *
418a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn     * @param width The desired width of the returned bitmap; the raw
419a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn     * screen will be scaled down to this size.
420a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn     * @param height The desired height of the returned bitmap; the raw
421a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn     * screen will be scaled down to this size.
422d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn     * @param minLayer The lowest (bottom-most Z order) surface layer to
423d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn     * include in the screenshot.
424d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn     * @param maxLayer The highest (top-most Z order) surface layer to
425d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn     * include in the screenshot.
426a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn     * @return Returns a Bitmap containing the screen contents.
427a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn     *
428a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn     * @hide
429a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn     */
430d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn    public static native Bitmap screenshot(int width, int height, int minLayer, int maxLayer);
431a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn
432b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian
433b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /*
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * set surface parameters.
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * needs to be inside open/closeTransaction block
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
437b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian
438b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /** start a transaction @hide */
439b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    public static native   void openTransaction();
440b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /** end a transaction @hide */
441b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    public static native   void closeTransaction();
442b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /** @hide */
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native   void setLayer(int zorder);
444b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /** @hide */
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native   void setPosition(int x, int y);
446b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /** @hide */
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native   void setSize(int w, int h);
448b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /** @hide */
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native   void hide();
450b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /** @hide */
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native   void show();
452b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /** @hide */
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native   void setTransparentRegionHint(Region region);
454b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /** @hide */
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native   void setAlpha(float alpha);
456b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /** @hide */
457b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    public native   void setMatrix(float dsdx, float dtdx, float dsdy, float dtdy);
458b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /** @hide */
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native   void freeze();
460b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /** @hide */
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native   void unfreeze();
462b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /** @hide */
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native   void setFreezeTint(int tint);
464b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /** @hide */
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native   void setFlags(int flags, int mask);
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
468b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final Parcelable.Creator<Surface> CREATOR
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            = new Parcelable.Creator<Surface>()
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Surface createFromParcel(Parcel source) {
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return new Surface(source);
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (Exception e) {
4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.e(LOG_TAG, "Exception creating surface from parcel", e);
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Surface[] newArray(int size) {
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return new Surface[size];
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void finalize() throws Throwable {
488d10cd5765a2b706fc174f16b951d6b0a5d3740d3Romain Guy        try {
489d10cd5765a2b706fc174f16b951d6b0a5d3740d3Romain Guy            super.finalize();
490d10cd5765a2b706fc174f16b951d6b0a5d3740d3Romain Guy        } finally {
491d10cd5765a2b706fc174f16b951d6b0a5d3740d3Romain Guy            if (mNativeSurface != 0 || mSurfaceControl != 0) {
492d10cd5765a2b706fc174f16b951d6b0a5d3740d3Romain Guy                if (DEBUG_RELEASE) {
493d10cd5765a2b706fc174f16b951d6b0a5d3740d3Romain Guy                    Log.w(LOG_TAG, "Surface.finalize() has work. You should have called release() ("
494d10cd5765a2b706fc174f16b951d6b0a5d3740d3Romain Guy                            + mNativeSurface + ", " + mSurfaceControl + ")", mCreationStack);
495d10cd5765a2b706fc174f16b951d6b0a5d3740d3Romain Guy                } else {
496d10cd5765a2b706fc174f16b951d6b0a5d3740d3Romain Guy                    Log.w(LOG_TAG, "Surface.finalize() has work. You should have called release() ("
497d10cd5765a2b706fc174f16b951d6b0a5d3740d3Romain Guy                            + mNativeSurface + ", " + mSurfaceControl + ")");
498d10cd5765a2b706fc174f16b951d6b0a5d3740d3Romain Guy                }
499f5e32f33eddc6e22edee1df486b38294ddc76cc3Mathias Agopian            }
500d10cd5765a2b706fc174f16b951d6b0a5d3740d3Romain Guy            release();
501f5e32f33eddc6e22edee1df486b38294ddc76cc3Mathias Agopian        }
5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private native void init(SurfaceSession s,
5055d26c1e38dabb3ad8b4b6e1000375f3b1a6b7693Mathias Agopian            int pid, String name, int display, int w, int h, int format, int flags)
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws OutOfResourcesException;
5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private native void init(Parcel source);
5098138cb49e47f9a9905a316a217757710185c66aaMarco Nelissen
5100de171b0d490a5928d54d2fb67c912d140aac643Ted Bonkenburg    private native void initFromSurfaceTexture(SurfaceTexture surfaceTexture);
5110de171b0d490a5928d54d2fb67c912d140aac643Ted Bonkenburg
5128138cb49e47f9a9905a316a217757710185c66aaMarco Nelissen    private native int getIdentity();
5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
514