Surface.java revision f9136fd9692158574d187af8d4031fa4b1e2b6e6
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
1964a55af0ac700baecb0877235eb42caac59a3560Jeff Brownimport dalvik.system.CloseGuard;
2064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
21240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshimaimport android.content.res.CompatibilityInfo.Translator;
220b722fe9ce98d97dbcb6fefd170b85ab7037e528Jeff Brownimport android.graphics.Bitmap;
230b722fe9ce98d97dbcb6fefd170b85ab7037e528Jeff Brownimport android.graphics.Canvas;
240b722fe9ce98d97dbcb6fefd170b85ab7037e528Jeff Brownimport android.graphics.Matrix;
250b722fe9ce98d97dbcb6fefd170b85ab7037e528Jeff Brownimport android.graphics.Rect;
260b722fe9ce98d97dbcb6fefd170b85ab7037e528Jeff Brownimport android.graphics.Region;
270b722fe9ce98d97dbcb6fefd170b85ab7037e528Jeff Brownimport android.graphics.SurfaceTexture;
2864a55af0ac700baecb0877235eb42caac59a3560Jeff Brownimport android.os.IBinder;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcelable;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcel;
31b85c933d850286874005f97a9764c9b22e49a597Kevin Hesterimport android.os.SystemProperties;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log;
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
35334031cd07c3bd09d23fce0ebaf946fc6ecfee26Glenn Kasten * Handle onto a raw buffer that is being managed by the screen compositor.
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class Surface implements Parcelable {
3864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    private static final String TAG = "Surface";
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    private static final boolean HEADLESS = "1".equals(
41b85c933d850286874005f97a9764c9b22e49a597Kevin Hester        SystemProperties.get("ro.config.headless", "0"));
42b85c933d850286874005f97a9764c9b22e49a597Kevin Hester
4364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    public static final Parcelable.Creator<Surface> CREATOR =
4464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            new Parcelable.Creator<Surface>() {
4564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        public Surface createFromParcel(Parcel source) {
4664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            try {
4764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown                Surface s = new Surface();
4864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown                s.readFromParcel(source);
4964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown                return s;
5064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            } catch (Exception e) {
5164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown                Log.e(TAG, "Exception creating surface from parcel", e);
5264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown                return null;
5364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            }
54b85c933d850286874005f97a9764c9b22e49a597Kevin Hester        }
55b85c933d850286874005f97a9764c9b22e49a597Kevin Hester
5664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        public Surface[] newArray(int size) {
5764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            return new Surface[size];
58df0c84f90894c677c50bdc967a0598f516ac86d7Jamie Gennis        }
5964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    };
60df0c84f90894c677c50bdc967a0598f516ac86d7Jamie Gennis
61df0c84f90894c677c50bdc967a0598f516ac86d7Jamie Gennis    /**
6264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * Rotation constant: 0 degree rotation (natural orientation)
63b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     */
6464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    public static final int ROTATION_0 = 0;
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    /**
6764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * Rotation constant: 90 degree rotation.
68317a6280cc109e873646e4652be1582d870eedfdMathias Agopian     */
6964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    public static final int ROTATION_90 = 1;
70b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian
7164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    /**
7264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * Rotation constant: 180 degree rotation.
73317a6280cc109e873646e4652be1582d870eedfdMathias Agopian     */
7464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    public static final int ROTATION_180 = 2;
75b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian
7664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    /**
7764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * Rotation constant: 270 degree rotation.
7864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     */
7964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    public static final int ROTATION_270 = 3;
80b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian
8164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    /* built-in physical display ids (keep in sync with ISurfaceComposer.h)
8264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * these are different from the logical display ids used elsewhere in the framework */
83b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian
84b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /**
8564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * Built-in physical display id: Main display.
8664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * Use only with {@link #getBuiltInDisplay()}.
8764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * @hide
88b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     */
8964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    public static final int BUILT_IN_DISPLAY_ID_MAIN = 0;
9064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
9164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    /**
9264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * Built-in physical display id: Attached HDMI display.
9364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * Use only with {@link #getBuiltInDisplay()}.
9464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * @hide
95b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     */
9664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    public static final int BUILT_IN_DISPLAY_ID_HDMI = 1;
97b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian
9864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    /* flags used in constructor (keep in sync with ISurfaceComposerClient.h) */
99b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian
10064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    /**
10164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * Surface creation flag: Surface is created hidden
10264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * @hide */
10364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    public static final int HIDDEN = 0x00000004;
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    /**
10664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * Surface creation flag: The surface contains secure content, special
10764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * measures will be taken to disallow the surface's content to be copied
10864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * from another process. In particular, screenshots and VNC servers will
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * be disabled, but other measures can take place, for instance the
110b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * surface might not be hardware accelerated.
11164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * @hide
11264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     */
11364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    public static final int SECURE = 0x00000080;
11464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
11564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    /**
11664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * Surface creation flag: Creates a surface where color components are interpreted
11764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * as "non pre-multiplied" by their alpha channel. Of course this flag is
11864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * meaningless for surfaces without an alpha channel. By default
11964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * surfaces are pre-multiplied, which means that each color component is
12064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * already multiplied by its alpha value. In this case the blending
12164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * equation used is:
12264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     *
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *    DEST = SRC + DEST * (1-SRC_ALPHA)
12464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     *
12564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * By contrast, non pre-multiplied surfaces use the following equation:
12664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     *
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *    DEST = SRC * SRC_ALPHA * DEST * (1-SRC_ALPHA)
12864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     *
12964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * pre-multiplied surfaces must always be used if transparent pixels are
13064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * composited on top of each-other into the surface. A pre-multiplied
13164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * surface can never lower the value of the alpha component of a given
13264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * pixel.
13364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     *
13464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * In some rare situations, a non pre-multiplied surface is preferable.
13564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * @hide
13664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     */
13764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    public static final int NON_PREMULTIPLIED = 0x00000100;
13864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
14064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * Surface creation flag: Indicates that the surface must be considered opaque,
14164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * even if its pixel format is set to translucent. This can be useful if an
142d10cd5765a2b706fc174f16b951d6b0a5d3740d3Romain Guy     * application needs full RGBA 8888 support for instance but will
143d10cd5765a2b706fc174f16b951d6b0a5d3740d3Romain Guy     * still draw every pixel opaque.
144d10cd5765a2b706fc174f16b951d6b0a5d3740d3Romain Guy     * @hide
145d10cd5765a2b706fc174f16b951d6b0a5d3740d3Romain Guy     */
14664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    public static final int OPAQUE = 0x00000400;
14764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
148d6f5bde96b2fe82bc7e5d4e64266d585108c4648Glenn Kasten    /**
14964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * Surface creation flag: Application requires a hardware-protected path to an
150d6f5bde96b2fe82bc7e5d4e64266d585108c4648Glenn Kasten     * external display sink. If a hardware-protected path is not available,
151d6f5bde96b2fe82bc7e5d4e64266d585108c4648Glenn Kasten     * then this surface will not be displayed on the external sink.
152d6f5bde96b2fe82bc7e5d4e64266d585108c4648Glenn Kasten     * @hide
153d6f5bde96b2fe82bc7e5d4e64266d585108c4648Glenn Kasten     */
15464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    public static final int PROTECTED_APP = 0x00000800;
155d6f5bde96b2fe82bc7e5d4e64266d585108c4648Glenn Kasten
156d6f5bde96b2fe82bc7e5d4e64266d585108c4648Glenn Kasten    // 0x1000 is reserved for an independent DRM protected flag in framework
157d6f5bde96b2fe82bc7e5d4e64266d585108c4648Glenn Kasten
15864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    /**
15964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * Surface creation flag: Creates a normal surface.
16064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * This is the default.
16164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * @hide
16264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     */
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int FX_SURFACE_NORMAL   = 0x00000000;
16464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
16564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    /**
16664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * Surface creation flag: Creates a Blur surface.
16764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * Everything behind this surface is blurred by some amount.
16864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * The quality and refresh speed of the blur effect is not settable or guaranteed.
16964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * It is an error to lock a Blur surface, since it doesn't have a backing store.
170b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * @hide
17167403e096e6f59b7cd18a90d0d3f5c3d17c31407Mathias Agopian     * @deprecated
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
17367403e096e6f59b7cd18a90d0d3f5c3d17c31407Mathias Agopian    @Deprecated
17464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    public static final int FX_SURFACE_BLUR = 0x00010000;
17564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
17664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    /**
17764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * Surface creation flag: Creates a Dim surface.
17864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * Everything behind this surface is dimmed by the amount specified
17964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * in {@link #setAlpha}.  It is an error to lock a Dim surface, since it
18064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * doesn't have a backing store.
181b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * @hide
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
18364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    public static final int FX_SURFACE_DIM = 0x00020000;
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    /**
18664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * @hide
18764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     */
18864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    public static final int FX_SURFACE_SCREENSHOT = 0x00030000;
1890ab84ef507f23505a72798fbe25cf4bb2c507ea3Mathias Agopian
19064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    /**
19164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * Mask used for FX values above.
19264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * @hide
19364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     */
19464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    public static final int FX_SURFACE_MASK = 0x000F0000;
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /* flags used with setFlags() (keep in sync with ISurfaceComposer.h) */
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    /**
19964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * Surface flag: Hide the surface.
20064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * Equivalent to calling hide().
20164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * @hide
20264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     */
20364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    public static final int SURFACE_HIDDEN = 0x01;
20464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
20564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
20664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    private final CloseGuard mCloseGuard = CloseGuard.get();
20764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    private String mName;
208c87c4a3e3b3c3949ae3c6f8fd245b71691d5ca3bMathias Agopian
20964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    // Note: These fields are accessed by native code.
2100de171b0d490a5928d54d2fb67c912d140aac643Ted Bonkenburg    // The mSurfaceControl will only be present for Surfaces used by the window
2110de171b0d490a5928d54d2fb67c912d140aac643Ted Bonkenburg    // server or system processes. When this class is parceled we defer to the
212b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    // mSurfaceControl to do the parceling. Otherwise we parcel the
213b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    // mNativeSurface.
21464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    private int mNativeSurface; // Surface*
21564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    private int mNativeSurfaceControl; // SurfaceControl*
21664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    private int mGenerationId; // incremented each time mNativeSurface changes
21764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    private final Canvas mCanvas = new CompatibleCanvas();
2187c1a49f5f5ed6613d736464bf5001b777e89ced2Chris Craik    private int mCanvasSaveCount; // Canvas save count at time of lockCanvas()
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2205be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn    // The Translator for density compatibility mode.  This is used for scaling
2215be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn    // the canvas to perform the appropriate density transformation.
2225be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn    private Translator mCompatibilityTranslator;
223240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima
224240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima    // A matrix to scale the matrix set by application. This is set to null for
225240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima    // non compatibility mode.
226240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima    private Matrix mCompatibleMatrix;
22738ed7d7701514ee7127d0430e952930854608c4fMitsuru Oshima
22864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    private native void nativeCreate(SurfaceSession session, String name,
22964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            int w, int h, int format, int flags)
23064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            throws OutOfResourcesException;
23164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    private native void nativeCreateFromSurfaceTexture(SurfaceTexture surfaceTexture)
23264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            throws OutOfResourcesException;
23364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    private native void nativeRelease();
23464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    private native void nativeDestroy();
23564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
23664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    private native boolean nativeIsValid();
23764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    private native boolean nativeIsConsumerRunningBehind();
23864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
23964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    private native Canvas nativeLockCanvas(Rect dirty);
24064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    private native void nativeUnlockCanvasAndPost(Canvas canvas);
24164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
24264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    private static native Bitmap nativeScreenshot(IBinder displayToken,
24364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            int width, int height, int minLayer, int maxLayer, boolean allLayers);
24464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
24564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    private static native void nativeOpenTransaction();
24664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    private static native void nativeCloseTransaction();
247b6ce6e42cc89864354c7ecb9ae80504a6c9dddcfJamie Gennis    private static native void nativeSetAnimationTransaction();
24864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
24964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    private native void nativeSetLayer(int zorder);
25064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    private native void nativeSetPosition(float x, float y);
25164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    private native void nativeSetSize(int w, int h);
25264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    private native void nativeSetTransparentRegionHint(Region region);
25364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    private native void nativeSetAlpha(float alpha);
25464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    private native void nativeSetMatrix(float dsdx, float dtdx, float dsdy, float dtdy);
25564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    private native void nativeSetFlags(int flags, int mask);
25664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    private native void nativeSetWindowCrop(Rect crop);
25764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    private native void nativeSetLayerStack(int layerStack);
25864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
25964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    private static native IBinder nativeGetBuiltInDisplay(int physicalDisplayId);
2607bbf8163fb83afc54b353a8def52bfb87ecce047Jamie Gennis    private static native IBinder nativeCreateDisplay(String name, boolean secure);
26164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    private static native void nativeSetDisplaySurface(
262cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown            IBinder displayToken, Surface surface);
26364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    private static native void nativeSetDisplayLayerStack(
26464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            IBinder displayToken, int layerStack);
26563f1c43fbef157397869475ef30d23e631b88bbeMathias Agopian    private static native void nativeSetDisplayProjection(
26663f1c43fbef157397869475ef30d23e631b88bbeMathias Agopian            IBinder displayToken, int orientation, Rect layerStackRect, Rect displayRect);
26764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    private static native boolean nativeGetDisplayInfo(
26864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            IBinder displayToken, PhysicalDisplayInfo outInfo);
2699e316a1a2a8d734315bbd56a85308f9657a92913Jeff Brown    private static native void nativeBlankDisplay(IBinder displayToken);
2709e316a1a2a8d734315bbd56a85308f9657a92913Jeff Brown    private static native void nativeUnblankDisplay(IBinder displayToken);
27164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
27264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    private native void nativeCopyFrom(Surface other);
27364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    private native void nativeTransferFrom(Surface other);
27464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    private native void nativeReadFromParcel(Parcel source);
27564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    private native void nativeWriteToParcel(Parcel dest);
276f5e32f33eddc6e22edee1df486b38294ddc76cc3Mathias Agopian
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    /**
27964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * Create an empty surface, which will later be filled in by readFromParcel().
28064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * @hide
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
28264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    public Surface() {
283b85c933d850286874005f97a9764c9b22e49a597Kevin Hester        checkHeadless();
284b85c933d850286874005f97a9764c9b22e49a597Kevin Hester
28564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        mCloseGuard.open("release");
28664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    }
2870b722fe9ce98d97dbcb6fefd170b85ab7037e528Jeff Brown
28864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    /**
28964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * Create a surface with a name.
29064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     *
29164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * The surface creation flags specify what kind of surface to create and
29264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * certain options such as whether the surface can be assumed to be opaque
29364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * and whether it should be initially hidden.  Surfaces should always be
29464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * created with the {@link #HIDDEN} flag set to ensure that they are not
29564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * made visible prematurely before all of the surface's properties have been
29664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * configured.
29764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     *
29864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * Good practice is to first create the surface with the {@link #HIDDEN} flag
29964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * specified, open a transaction, set the surface layer, layer stack, alpha,
30064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * and position, call {@link #show} if appropriate, and close the transaction.
30164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     *
30264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * @param session The surface session, must not be null.
30364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * @param name The surface name, must not be null.
30464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * @param w The surface initial width.
30564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * @param h The surface initial height.
30664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * @param flags The surface creation flags.  Should always include {@link #HIDDEN}
30764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * in the creation flags.
30864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * @hide
30964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     */
31064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    public Surface(SurfaceSession session,
31164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            String name, int w, int h, int format, int flags)
31264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            throws OutOfResourcesException {
31364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        if (session == null) {
31464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            throw new IllegalArgumentException("session must not be null");
31564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        }
3160b722fe9ce98d97dbcb6fefd170b85ab7037e528Jeff Brown        if (name == null) {
31764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            throw new IllegalArgumentException("name must not be null");
31864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        }
31964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
32064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        if ((flags & HIDDEN) == 0) {
32164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            Log.w(TAG, "Surfaces should always be created with the HIDDEN flag set "
32264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown                    + "to ensure that they are not made visible prematurely before "
32364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown                    + "all of the surface's properties have been configured.  "
32464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown                    + "Set the other properties and make the surface visible within "
32564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown                    + "a transaction.  New surface name: " + name,
32664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown                    new Throwable());
3270b722fe9ce98d97dbcb6fefd170b85ab7037e528Jeff Brown        }
3280b722fe9ce98d97dbcb6fefd170b85ab7037e528Jeff Brown
32964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        checkHeadless();
33064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
3318138cb49e47f9a9905a316a217757710185c66aaMarco Nelissen        mName = name;
33264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        nativeCreate(session, name, w, h, format, flags);
33364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
33464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        mCloseGuard.open("release");
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
33864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * Create Surface from a {@link SurfaceTexture}.
33964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     *
34064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * Images drawn to the Surface will be made available to the {@link
34164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * SurfaceTexture}, which can attach them to an OpenGL ES texture via {@link
34264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * SurfaceTexture#updateTexImage}.
34364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     *
34464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * @param surfaceTexture The {@link SurfaceTexture} that is updated by this
34564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * Surface.
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
34764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    public Surface(SurfaceTexture surfaceTexture) {
34864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        if (surfaceTexture == null) {
34964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            throw new IllegalArgumentException("surfaceTexture must not be null");
35064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        }
35164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
352b85c933d850286874005f97a9764c9b22e49a597Kevin Hester        checkHeadless();
353b85c933d850286874005f97a9764c9b22e49a597Kevin Hester
35464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        mName = surfaceTexture.toString();
35564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        try {
35664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            nativeCreateFromSurfaceTexture(surfaceTexture);
35764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        } catch (OutOfResourcesException ex) {
35864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            // We can't throw OutOfResourcesException because it would be an API change.
35964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            throw new RuntimeException(ex);
360f5e32f33eddc6e22edee1df486b38294ddc76cc3Mathias Agopian        }
36164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
36264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        mCloseGuard.open("release");
363240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima    }
364240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima
36564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    @Override
36664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    protected void finalize() throws Throwable {
36764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        try {
36864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            if (mCloseGuard != null) {
36964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown                mCloseGuard.warnIfOpen();
37064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            }
37164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            nativeRelease();
37264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        } finally {
37364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            super.finalize();
37464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        }
375b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    }
376b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian
377240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima    /**
37864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * Release the local reference to the server-side surface.
37964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * Always call release() when you're done with a Surface.
38064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * This will make the surface invalid.
38164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     */
38264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    public void release() {
38364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        nativeRelease();
38464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        mCloseGuard.close();
38564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    }
38664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
38764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    /**
38864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * Free all server-side state associated with this surface and
38964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * release this object's reference.  This method can only be
39064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * called from the process that created the service.
391b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * @hide
392b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     */
39364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    public void destroy() {
39464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        nativeDestroy();
39564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        mCloseGuard.close();
39664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    }
39761566cc1932468720a831ad5cbc68ee080d613c9Dianne Hackborn
39861566cc1932468720a831ad5cbc68ee080d613c9Dianne Hackborn    /**
39964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * Returns true if this object holds a valid surface.
40064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     *
40164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * @return True if it holds a physical surface, so lockCanvas() will succeed.
40264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * Otherwise returns false.
40361566cc1932468720a831ad5cbc68ee080d613c9Dianne Hackborn     */
40464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    public boolean isValid() {
40564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        return nativeIsValid();
40664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    }
40761566cc1932468720a831ad5cbc68ee080d613c9Dianne Hackborn
40864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    /**
40964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * Gets the generation number of this surface, incremented each time
41064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * the native surface contained within this object changes.
41164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     *
41264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * @return The current generation number.
41364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * @hide
41464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     */
415b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    public int getGenerationId() {
41664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        return mGenerationId;
417b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    }
418b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian
419c14bacf1fb511472138eeb5dc84a9423fc003214Mathias Agopian    /**
42064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * Returns true if the consumer of this Surface is running behind the producer.
42164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     *
42264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * @return True if the consumer is more than one buffer ahead of the producer.
423c14bacf1fb511472138eeb5dc84a9423fc003214Mathias Agopian     * @hide
424c14bacf1fb511472138eeb5dc84a9423fc003214Mathias Agopian     */
42564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    public boolean isConsumerRunningBehind() {
42664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        return nativeIsConsumerRunningBehind();
42764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    }
428c14bacf1fb511472138eeb5dc84a9423fc003214Mathias Agopian
429b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /**
43064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * Gets a {@link Canvas} for drawing into this surface.
43164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     *
43264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * After drawing into the provided {@link Canvas}, the caller should
43364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * invoke {@link #unlockCanvasAndPost} to post the new contents to the surface.
43464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     *
43564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * @param dirty A rectangle that represents the dirty region that the caller wants
43664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * to redraw.  This function may choose to expand the dirty rectangle if for example
43764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * the surface has been resized or if the previous contents of the surface were
43864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * not available.  The caller should redraw the entire dirty region as represented
43964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * by the contents of the dirty rect upon return from this function.
44064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * The caller may also pass <code>null</code> instead, in the case where the
44164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * entire surface should be redrawn.
44264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * @return A canvas for drawing into the surface.
443240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima     */
44464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    public Canvas lockCanvas(Rect dirty)
44564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            throws OutOfResourcesException, IllegalArgumentException {
44664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        return nativeLockCanvas(dirty);
44764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    }
448240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima
44964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    /**
45064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * Posts the new contents of the {@link Canvas} to the surface and
45164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * releases the {@link Canvas}.
45264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     *
45364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * @param canvas The canvas previously obtained from {@link #lockCanvas}.
45464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     */
45564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    public void unlockCanvasAndPost(Canvas canvas) {
45664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        nativeUnlockCanvasAndPost(canvas);
45764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    }
458240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima
45964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    /**
46064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * @deprecated This API has been removed and is not supported.  Do not use.
46164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     */
46264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    @Deprecated
46364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    public void unlockCanvas(Canvas canvas) {
46464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        throw new UnsupportedOperationException();
465d10cd5765a2b706fc174f16b951d6b0a5d3740d3Romain Guy    }
46638ed7d7701514ee7127d0430e952930854608c4fMitsuru Oshima
46738ed7d7701514ee7127d0430e952930854608c4fMitsuru Oshima    /**
468b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * Sets the translator used to scale canvas's width/height in compatibility
469b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian     * mode.
47038ed7d7701514ee7127d0430e952930854608c4fMitsuru Oshima     */
4715be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn    void setCompatibilityTranslator(Translator translator) {
472240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima        if (translator != null) {
473240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima            float appScale = translator.applicationScale;
474240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima            mCompatibleMatrix = new Matrix();
475240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima            mCompatibleMatrix.setScale(appScale, appScale);
476240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima        }
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
480d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn     * Like {@link #screenshot(int, int, int, int)} but includes all
481d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn     * Surfaces in the screenshot.
482d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn     *
483d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn     * @hide
484d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn     */
48564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    public static Bitmap screenshot(int width, int height) {
48664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        // TODO: should take the display as a parameter
48764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        IBinder displayToken = getBuiltInDisplay(BUILT_IN_DISPLAY_ID_MAIN);
48864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        return nativeScreenshot(displayToken, width, height, 0, 0, true);
48964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    }
49064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
491d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn    /**
492a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn     * Copy the current screen contents into a bitmap and return it.
493a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn     *
494a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn     * @param width The desired width of the returned bitmap; the raw
495a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn     * screen will be scaled down to this size.
496a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn     * @param height The desired height of the returned bitmap; the raw
497a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn     * screen will be scaled down to this size.
498d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn     * @param minLayer The lowest (bottom-most Z order) surface layer to
499d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn     * include in the screenshot.
500d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn     * @param maxLayer The highest (top-most Z order) surface layer to
501d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn     * include in the screenshot.
50264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * @return Returns a Bitmap containing the screen contents, or null
50364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * if an error occurs.
504a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn     *
505a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn     * @hide
506a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn     */
50764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    public static Bitmap screenshot(int width, int height, int minLayer, int maxLayer) {
50864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        // TODO: should take the display as a parameter
50964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        IBinder displayToken = getBuiltInDisplay(BUILT_IN_DISPLAY_ID_MAIN);
51064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        return nativeScreenshot(displayToken, width, height, minLayer, maxLayer, false);
51164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    }
512a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn
513b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /*
5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * set surface parameters.
5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * needs to be inside open/closeTransaction block
5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
51764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
518b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /** start a transaction @hide */
51964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    public static void openTransaction() {
52064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        nativeOpenTransaction();
52164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    }
52264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
523b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /** end a transaction @hide */
52464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    public static void closeTransaction() {
52564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        nativeCloseTransaction();
52664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    }
52764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
528b6ce6e42cc89864354c7ecb9ae80504a6c9dddcfJamie Gennis    /** flag the transaction as an animation @hide */
529b6ce6e42cc89864354c7ecb9ae80504a6c9dddcfJamie Gennis    public static void setAnimationTransaction() {
530b6ce6e42cc89864354c7ecb9ae80504a6c9dddcfJamie Gennis        nativeSetAnimationTransaction();
531b6ce6e42cc89864354c7ecb9ae80504a6c9dddcfJamie Gennis    }
532b6ce6e42cc89864354c7ecb9ae80504a6c9dddcfJamie Gennis
53364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    /** @hide */
53464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    public void setLayer(int zorder) {
53564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        nativeSetLayer(zorder);
53664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    }
53764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
53864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    /** @hide */
53964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    public void setPosition(int x, int y) {
54064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        nativeSetPosition((float)x, (float)y);
54164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    }
54264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
54364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    /** @hide */
54464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    public void setPosition(float x, float y) {
54564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        nativeSetPosition(x, y);
54664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    }
54764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
54864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    /** @hide */
54964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    public void setSize(int w, int h) {
55064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        nativeSetSize(w, h);
55164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    }
55264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
553b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /** @hide */
55464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    public void hide() {
55564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        nativeSetFlags(SURFACE_HIDDEN, SURFACE_HIDDEN);
55664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    }
55764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
558b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /** @hide */
55964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    public void show() {
56064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        nativeSetFlags(0, SURFACE_HIDDEN);
56164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    }
56264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
56334cb9f2a960c4173bdafb4b8a2444c1bca4c5f0dMathias Agopian    /** @hide */
56464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    public void setTransparentRegionHint(Region region) {
56564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        nativeSetTransparentRegionHint(region);
56664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    }
56764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
56864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    /** @hide */
56964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    public void setAlpha(float alpha) {
57064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        nativeSetAlpha(alpha);
57164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    }
57264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
57364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    /** @hide */
57464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    public void setMatrix(float dsdx, float dtdx, float dsdy, float dtdy) {
57564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        nativeSetMatrix(dsdx, dtdx, dsdy, dtdy);
57664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    }
57764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
578b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /** @hide */
57964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    public void setFlags(int flags, int mask) {
58064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        nativeSetFlags(flags, mask);
58164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    }
58264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
583b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /** @hide */
58464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    public void setWindowCrop(Rect crop) {
58564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        nativeSetWindowCrop(crop);
58664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    }
58764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
588b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /** @hide */
58964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    public void setLayerStack(int layerStack) {
59064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        nativeSetLayerStack(layerStack);
59164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    }
59264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
593b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /** @hide */
59464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    public static IBinder getBuiltInDisplay(int builtInDisplayId) {
59564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        return nativeGetBuiltInDisplay(builtInDisplayId);
59664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    }
59764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
598b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /** @hide */
5997bbf8163fb83afc54b353a8def52bfb87ecce047Jamie Gennis    public static IBinder createDisplay(String name, boolean secure) {
60064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        if (name == null) {
60164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            throw new IllegalArgumentException("name must not be null");
60264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        }
6037bbf8163fb83afc54b353a8def52bfb87ecce047Jamie Gennis        return nativeCreateDisplay(name, secure);
60464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    }
60564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
606b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /** @hide */
607cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown    public static void setDisplaySurface(IBinder displayToken, Surface surface) {
60864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        if (displayToken == null) {
60964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            throw new IllegalArgumentException("displayToken must not be null");
61064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        }
611cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown        nativeSetDisplaySurface(displayToken, surface);
61264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    }
61364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
614b923066deeffbbaad14a117bd56259bd6ee20a08Mathias Agopian    /** @hide */
61564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    public static void setDisplayLayerStack(IBinder displayToken, int layerStack) {
61664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        if (displayToken == null) {
61764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            throw new IllegalArgumentException("displayToken must not be null");
61864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        }
61964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        nativeSetDisplayLayerStack(displayToken, layerStack);
62064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    }
62164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
622b40696cc216f6a5874189fe83055ddaa7b428ce0Jamie Gennis    /** @hide */
62363f1c43fbef157397869475ef30d23e631b88bbeMathias Agopian    public static void setDisplayProjection(IBinder displayToken,
62463f1c43fbef157397869475ef30d23e631b88bbeMathias Agopian            int orientation, Rect layerStackRect, Rect displayRect) {
62564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        if (displayToken == null) {
62664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            throw new IllegalArgumentException("displayToken must not be null");
62764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        }
62863f1c43fbef157397869475ef30d23e631b88bbeMathias Agopian        if (layerStackRect == null) {
62963f1c43fbef157397869475ef30d23e631b88bbeMathias Agopian            throw new IllegalArgumentException("layerStackRect must not be null");
63064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        }
63163f1c43fbef157397869475ef30d23e631b88bbeMathias Agopian        if (displayRect == null) {
63263f1c43fbef157397869475ef30d23e631b88bbeMathias Agopian            throw new IllegalArgumentException("displayRect must not be null");
63364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        }
63463f1c43fbef157397869475ef30d23e631b88bbeMathias Agopian        nativeSetDisplayProjection(displayToken, orientation, layerStackRect, displayRect);
63564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    }
6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
63764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    /** @hide */
63864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    public static boolean getDisplayInfo(IBinder displayToken, PhysicalDisplayInfo outInfo) {
63964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        if (displayToken == null) {
64064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            throw new IllegalArgumentException("displayToken must not be null");
6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
64264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        if (outInfo == null) {
64364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            throw new IllegalArgumentException("outInfo must not be null");
64464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        }
64564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        return nativeGetDisplayInfo(displayToken, outInfo);
64664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    }
6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6489e316a1a2a8d734315bbd56a85308f9657a92913Jeff Brown    /** @hide */
6499e316a1a2a8d734315bbd56a85308f9657a92913Jeff Brown    public static void blankDisplay(IBinder displayToken) {
6509e316a1a2a8d734315bbd56a85308f9657a92913Jeff Brown        if (displayToken == null) {
6519e316a1a2a8d734315bbd56a85308f9657a92913Jeff Brown            throw new IllegalArgumentException("displayToken must not be null");
6529e316a1a2a8d734315bbd56a85308f9657a92913Jeff Brown        }
6539e316a1a2a8d734315bbd56a85308f9657a92913Jeff Brown        nativeBlankDisplay(displayToken);
6549e316a1a2a8d734315bbd56a85308f9657a92913Jeff Brown    }
6559e316a1a2a8d734315bbd56a85308f9657a92913Jeff Brown
6569e316a1a2a8d734315bbd56a85308f9657a92913Jeff Brown    /** @hide */
6579e316a1a2a8d734315bbd56a85308f9657a92913Jeff Brown    public static void unblankDisplay(IBinder displayToken) {
6589e316a1a2a8d734315bbd56a85308f9657a92913Jeff Brown        if (displayToken == null) {
6599e316a1a2a8d734315bbd56a85308f9657a92913Jeff Brown            throw new IllegalArgumentException("displayToken must not be null");
6609e316a1a2a8d734315bbd56a85308f9657a92913Jeff Brown        }
6619e316a1a2a8d734315bbd56a85308f9657a92913Jeff Brown        nativeUnblankDisplay(displayToken);
6629e316a1a2a8d734315bbd56a85308f9657a92913Jeff Brown    }
6639e316a1a2a8d734315bbd56a85308f9657a92913Jeff Brown
66464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    /**
66564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * Copy another surface to this one.  This surface now holds a reference
66664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * to the same data as the original surface, and is -not- the owner.
66764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * This is for use by the window manager when returning a window surface
66864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * back from a client, converting it from the representation being managed
66964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * by the window manager to the representation the client uses to draw
67064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * in to it.
67164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * @hide
67264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     */
67364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    public void copyFrom(Surface other) {
67464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        if (other == null) {
67564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            throw new IllegalArgumentException("other must not be null");
6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
67764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        if (other != this) {
67864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            nativeCopyFrom(other);
67964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        }
68064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    }
68164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
68264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    /**
68364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * Transfer the native state from 'other' to this surface, releasing it
68464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * from 'other'.  This is for use in the client side for drawing into a
68564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * surface; not guaranteed to work on the window manager side.
68664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * This is for use by the client to move the underlying surface from
68764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * one Surface object to another, in particular in SurfaceFlinger.
68864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * @hide.
68964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     */
69064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    public void transferFrom(Surface other) {
69164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        if (other == null) {
69264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            throw new IllegalArgumentException("other must not be null");
69364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        }
69464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        if (other != this) {
69564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            nativeTransferFrom(other);
69664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        }
69764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    }
6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
70064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    public int describeContents() {
70164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        return 0;
70264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    }
70364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
70464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    public void readFromParcel(Parcel source) {
70564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        if (source == null) {
70664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            throw new IllegalArgumentException("source must not be null");
707f5e32f33eddc6e22edee1df486b38294ddc76cc3Mathias Agopian        }
70864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
70964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        mName = source.readString();
71064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        nativeReadFromParcel(source);
7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
71364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    @Override
71464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    public void writeToParcel(Parcel dest, int flags) {
71564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        if (dest == null) {
71664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            throw new IllegalArgumentException("dest must not be null");
71764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        }
7188138cb49e47f9a9905a316a217757710185c66aaMarco Nelissen
71964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        dest.writeString(mName);
72064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        nativeWriteToParcel(dest);
72164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        if ((flags & Parcelable.PARCELABLE_WRITE_RETURN_VALUE) != 0) {
72264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            release();
72364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        }
72464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    }
7250de171b0d490a5928d54d2fb67c912d140aac643Ted Bonkenburg
72664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    @Override
72764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    public String toString() {
728f9136fd9692158574d187af8d4031fa4b1e2b6e6Mathias Agopian        return "Surface(name=" + mName + ")";
72964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    }
73064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
73164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    private static void checkHeadless() {
73264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        if (HEADLESS) {
73364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            throw new UnsupportedOperationException("Device is headless");
73464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        }
73564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    }
73664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
73764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    /**
73864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * Exception thrown when a surface couldn't be created or resized.
73964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     */
74064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    public static class OutOfResourcesException extends Exception {
74164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        public OutOfResourcesException() {
74264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        }
74364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
74464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        public OutOfResourcesException(String name) {
74564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            super(name);
74664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        }
74764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    }
74864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
74964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    /**
7504ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown     * Describes the properties of a physical display known to surface flinger.
75164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * @hide
75264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     */
75364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    public static final class PhysicalDisplayInfo {
75464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        public int width;
75564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        public int height;
75664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        public float refreshRate;
75764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        public float density;
75864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        public float xDpi;
75964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        public float yDpi;
76095429c3d1b8113c23b0aad3b74d724dccfad7fa9Jamie Gennis        public boolean secure;
7614ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown
7624ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown        public PhysicalDisplayInfo() {
7634ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown        }
7644ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown
7654ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown        public PhysicalDisplayInfo(PhysicalDisplayInfo other) {
7664ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown            copyFrom(other);
7674ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown        }
7684ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown
7694ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown        @Override
7704ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown        public boolean equals(Object o) {
7714ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown            return o instanceof PhysicalDisplayInfo && equals((PhysicalDisplayInfo)o);
7724ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown        }
7734ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown
7744ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown        public boolean equals(PhysicalDisplayInfo other) {
7754ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown            return other != null
7764ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown                    && width == other.width
7774ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown                    && height == other.height
7784ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown                    && refreshRate == other.refreshRate
7794ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown                    && density == other.density
7804ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown                    && xDpi == other.xDpi
78195429c3d1b8113c23b0aad3b74d724dccfad7fa9Jamie Gennis                    && yDpi == other.yDpi
78295429c3d1b8113c23b0aad3b74d724dccfad7fa9Jamie Gennis                    && secure == other.secure;
7834ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown        }
7844ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown
7854ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown        @Override
7864ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown        public int hashCode() {
7874ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown            return 0; // don't care
7884ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown        }
7894ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown
7904ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown        public void copyFrom(PhysicalDisplayInfo other) {
7914ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown            width = other.width;
7924ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown            height = other.height;
7934ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown            refreshRate = other.refreshRate;
7944ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown            density = other.density;
7954ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown            xDpi = other.xDpi;
7964ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown            yDpi = other.yDpi;
79795429c3d1b8113c23b0aad3b74d724dccfad7fa9Jamie Gennis            secure = other.secure;
7984ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown        }
7994ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown
8004ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown        // For debugging purposes
8014ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown        @Override
8024ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown        public String toString() {
8034ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown            return "PhysicalDisplayInfo{" + width + " x " + height + ", " + refreshRate + " fps, "
80495429c3d1b8113c23b0aad3b74d724dccfad7fa9Jamie Gennis                    + "density " + density + ", " + xDpi + " x " + yDpi + " dpi, secure " + secure
80595429c3d1b8113c23b0aad3b74d724dccfad7fa9Jamie Gennis                    + "}";
8064ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown        }
80764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    }
80864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
80964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    /**
810152e9bb81aa5b2ab4637f4b2dae04b3ce89fa891Svetoslav Ganov     * Returns a human readable representation of a rotation.
811152e9bb81aa5b2ab4637f4b2dae04b3ce89fa891Svetoslav Ganov     *
812152e9bb81aa5b2ab4637f4b2dae04b3ce89fa891Svetoslav Ganov     * @param rotation The rotation.
813152e9bb81aa5b2ab4637f4b2dae04b3ce89fa891Svetoslav Ganov     * @return The rotation symbolic name.
814545252f4fde6fbb70b07e97a120c7d1405758017Svetoslav Ganov     *
815545252f4fde6fbb70b07e97a120c7d1405758017Svetoslav Ganov     * @hide
816152e9bb81aa5b2ab4637f4b2dae04b3ce89fa891Svetoslav Ganov     */
817152e9bb81aa5b2ab4637f4b2dae04b3ce89fa891Svetoslav Ganov    public static String rotationToString(int rotation) {
818152e9bb81aa5b2ab4637f4b2dae04b3ce89fa891Svetoslav Ganov        switch (rotation) {
819152e9bb81aa5b2ab4637f4b2dae04b3ce89fa891Svetoslav Ganov            case Surface.ROTATION_0: {
820152e9bb81aa5b2ab4637f4b2dae04b3ce89fa891Svetoslav Ganov                return "ROTATION_0";
821152e9bb81aa5b2ab4637f4b2dae04b3ce89fa891Svetoslav Ganov            }
822152e9bb81aa5b2ab4637f4b2dae04b3ce89fa891Svetoslav Ganov            case Surface.ROTATION_90: {
823152e9bb81aa5b2ab4637f4b2dae04b3ce89fa891Svetoslav Ganov                return "ROATATION_90";
824152e9bb81aa5b2ab4637f4b2dae04b3ce89fa891Svetoslav Ganov            }
825152e9bb81aa5b2ab4637f4b2dae04b3ce89fa891Svetoslav Ganov            case Surface.ROTATION_180: {
826152e9bb81aa5b2ab4637f4b2dae04b3ce89fa891Svetoslav Ganov                return "ROATATION_180";
827152e9bb81aa5b2ab4637f4b2dae04b3ce89fa891Svetoslav Ganov            }
828152e9bb81aa5b2ab4637f4b2dae04b3ce89fa891Svetoslav Ganov            case Surface.ROTATION_270: {
829152e9bb81aa5b2ab4637f4b2dae04b3ce89fa891Svetoslav Ganov                return "ROATATION_270";
830152e9bb81aa5b2ab4637f4b2dae04b3ce89fa891Svetoslav Ganov            }
831152e9bb81aa5b2ab4637f4b2dae04b3ce89fa891Svetoslav Ganov            default: {
832152e9bb81aa5b2ab4637f4b2dae04b3ce89fa891Svetoslav Ganov                throw new IllegalArgumentException("Invalid rotation: " + rotation);
833152e9bb81aa5b2ab4637f4b2dae04b3ce89fa891Svetoslav Ganov            }
834152e9bb81aa5b2ab4637f4b2dae04b3ce89fa891Svetoslav Ganov        }
835152e9bb81aa5b2ab4637f4b2dae04b3ce89fa891Svetoslav Ganov    }
836152e9bb81aa5b2ab4637f4b2dae04b3ce89fa891Svetoslav Ganov
837152e9bb81aa5b2ab4637f4b2dae04b3ce89fa891Svetoslav Ganov    /**
83864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * A Canvas class that can handle the compatibility mode.
83964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * This does two things differently.
84064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * <ul>
84164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * <li>Returns the width and height of the target metrics, rather than
84264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * native. For example, the canvas returns 320x480 even if an app is running
84364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * in WVGA high density.
84464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * <li>Scales the matrix in setMatrix by the application scale, except if
84564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * the matrix looks like obtained from getMatrix. This is a hack to handle
84664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * the case that an application uses getMatrix to keep the original matrix,
84764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * set matrix of its own, then set the original matrix back. There is no
84864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * perfect solution that works for all cases, and there are a lot of cases
84964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * that this model does not work, but we hope this works for many apps.
85064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * </ul>
85164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     */
85264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    private final class CompatibleCanvas extends Canvas {
85364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        // A temp matrix to remember what an application obtained via {@link getMatrix}
85464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        private Matrix mOrigMatrix = null;
85564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
85664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        @Override
85764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        public int getWidth() {
85864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            int w = super.getWidth();
85964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            if (mCompatibilityTranslator != null) {
86064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown                w = (int)(w * mCompatibilityTranslator.applicationInvertedScale + .5f);
86164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            }
86264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            return w;
86364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        }
86464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
86564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        @Override
86664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        public int getHeight() {
86764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            int h = super.getHeight();
86864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            if (mCompatibilityTranslator != null) {
86964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown                h = (int)(h * mCompatibilityTranslator.applicationInvertedScale + .5f);
87064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            }
87164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            return h;
87264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        }
87364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
87464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        @Override
87564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        public void setMatrix(Matrix matrix) {
87664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            if (mCompatibleMatrix == null || mOrigMatrix == null || mOrigMatrix.equals(matrix)) {
87764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown                // don't scale the matrix if it's not compatibility mode, or
87864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown                // the matrix was obtained from getMatrix.
87964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown                super.setMatrix(matrix);
88064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            } else {
88164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown                Matrix m = new Matrix(mCompatibleMatrix);
88264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown                m.preConcat(matrix);
88364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown                super.setMatrix(m);
88464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            }
88564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        }
88664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
88764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        @Override
88864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        public void getMatrix(Matrix m) {
88964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            super.getMatrix(m);
89064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            if (mOrigMatrix == null) {
89164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown                mOrigMatrix = new Matrix();
89264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            }
89364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            mOrigMatrix.set(m);
89464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        }
89564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    }
8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
897