Surface.java revision a111187a5b4dc5d287e29ced7d65e8d20edca140
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;
2338ed7d7701514ee7127d0430e952930854608c4fMitsuru Oshimaimport android.util.DisplayMetrics;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Handle on to a raw buffer that is being managed by the screen compositor.
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class Surface implements Parcelable {
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String LOG_TAG = "Surface";
31f5e32f33eddc6e22edee1df486b38294ddc76cc3Mathias Agopian    private static final boolean DEBUG_RELEASE = false;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /* flags used in constructor (keep in sync with ISurfaceComposer.h) */
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Surface is created hidden */
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int HIDDEN              = 0x00000004;
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38317a6280cc109e873646e4652be1582d870eedfdMathias Agopian    /** The surface is to be used by hardware accelerators or DMA engines
39317a6280cc109e873646e4652be1582d870eedfdMathias Agopian     * @deprecated this is ignored, this value is set automatically when needed.
40317a6280cc109e873646e4652be1582d870eedfdMathias Agopian     */
41317a6280cc109e873646e4652be1582d870eedfdMathias Agopian    @Deprecated
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int HARDWARE            = 0x00000010;
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Implies "HARDWARE", the surface is to be used by the GPU
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * additionally the backbuffer is never preserved for these
46317a6280cc109e873646e4652be1582d870eedfdMathias Agopian     * surfaces.
47317a6280cc109e873646e4652be1582d870eedfdMathias Agopian     * @deprecated this is ignored, this value is set automatically when needed.
48317a6280cc109e873646e4652be1582d870eedfdMathias Agopian     */
49317a6280cc109e873646e4652be1582d870eedfdMathias Agopian    @Deprecated
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int GPU                 = 0x00000028;
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** The surface contains secure content, special measures will
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * be taken to disallow the surface's content to be copied from
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * another process. In particular, screenshots and VNC servers will
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * be disabled, but other measures can take place, for instance the
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * surface might not be hardware accelerated. */
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int SECURE              = 0x00000080;
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Creates a surface where color components are interpreted as
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  "non pre-multiplied" by their alpha channel. Of course this flag is
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  meaningless for surfaces without an alpha channel. By default
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  surfaces are pre-multiplied, which means that each color component is
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  already multiplied by its alpha value. In this case the blending
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  equation used is:
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *    DEST = SRC + DEST * (1-SRC_ALPHA)
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  By contrast, non pre-multiplied surfaces use the following equation:
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *    DEST = SRC * SRC_ALPHA * DEST * (1-SRC_ALPHA)
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  pre-multiplied surfaces must always be used if transparent pixels are
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  composited on top of each-other into the surface. A pre-multiplied
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  surface can never lower the value of the alpha component of a given
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  pixel.
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  In some rare situations, a non pre-multiplied surface is preferable.
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int NON_PREMULTIPLIED   = 0x00000100;
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Creates a surface without a rendering buffer. Instead, the content
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * of the surface must be pushed by an external entity. This is type
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * of surface can be used for efficient camera preview or movie
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * play back.
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int PUSH_BUFFERS        = 0x00000200;
89d10cd5765a2b706fc174f16b951d6b0a5d3740d3Romain Guy    /**
90d10cd5765a2b706fc174f16b951d6b0a5d3740d3Romain Guy     * Indicates that the surface must be considered opaque, even if its
91d10cd5765a2b706fc174f16b951d6b0a5d3740d3Romain Guy     * pixel format is set to translucent. This can be useful if an
92d10cd5765a2b706fc174f16b951d6b0a5d3740d3Romain Guy     * application needs full RGBA 8888 support for instance but will
93d10cd5765a2b706fc174f16b951d6b0a5d3740d3Romain Guy     * still draw every pixel opaque.
94d10cd5765a2b706fc174f16b951d6b0a5d3740d3Romain Guy     *
95d10cd5765a2b706fc174f16b951d6b0a5d3740d3Romain Guy     * @hide
96d10cd5765a2b706fc174f16b951d6b0a5d3740d3Romain Guy     */
97d10cd5765a2b706fc174f16b951d6b0a5d3740d3Romain Guy    public static final int OPAQUE              = 0x00000400;
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Creates a normal surface. This is the default */
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int FX_SURFACE_NORMAL   = 0x00000000;
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Creates a Blur surface. Everything behind this surface is blurred
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * by some amount. The quality and refresh speed of the blur effect
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is not settable or guaranteed.
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * It is an error to lock a Blur surface, since it doesn't have
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * a backing store.
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int FX_SURFACE_BLUR     = 0x00010000;
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Creates a Dim surface. Everything behind this surface is dimmed
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * by the amount specified in setAlpha().
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * It is an error to lock a Dim surface, since it doesn't have
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * a backing store.
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int FX_SURFACE_DIM     = 0x00020000;
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Mask used for FX values above */
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int FX_SURFACE_MASK     = 0x000F0000;
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /* flags used with setFlags() (keep in sync with ISurfaceComposer.h) */
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Hide the surface. Equivalent to calling hide() */
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int SURFACE_HIDDEN    = 0x01;
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Freeze the surface. Equivalent to calling freeze() */
126c87c4a3e3b3c3949ae3c6f8fd245b71691d5ca3bMathias Agopian    public static final int SURFACE_FROZEN     = 0x02;
127c87c4a3e3b3c3949ae3c6f8fd245b71691d5ca3bMathias Agopian
128c87c4a3e3b3c3949ae3c6f8fd245b71691d5ca3bMathias Agopian    /**
129c87c4a3e3b3c3949ae3c6f8fd245b71691d5ca3bMathias Agopian     * @deprecated use {@link #SURFACE_FROZEN} instead.
130c87c4a3e3b3c3949ae3c6f8fd245b71691d5ca3bMathias Agopian     */
131c87c4a3e3b3c3949ae3c6f8fd245b71691d5ca3bMathias Agopian    @Deprecated
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int SURACE_FROZEN     = 0x02;
133c87c4a3e3b3c3949ae3c6f8fd245b71691d5ca3bMathias Agopian
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Enable dithering when compositing this surface */
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int SURFACE_DITHER    = 0x04;
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int SURFACE_BLUR_FREEZE= 0x10;
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /* orientations for setOrientation() */
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int ROTATION_0       = 0;
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int ROTATION_90      = 1;
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int ROTATION_180     = 2;
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int ROTATION_270     = 3;
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
145eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian    /**
146eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian     * Disable the orientation animation
147eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian     * {@hide}
148eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian     */
149eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian    public static final int FLAGS_ORIENTATION_ANIMATION_DISABLE = 0x000000001;
150eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @SuppressWarnings("unused")
15217f638b39f2e8b610ecfa1290e5bc42ab7700c98Mathias Agopian    private int mSurfaceControl;
15317f638b39f2e8b610ecfa1290e5bc42ab7700c98Mathias Agopian    @SuppressWarnings("unused")
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mSaveCount;
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @SuppressWarnings("unused")
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Canvas mCanvas;
1578b138323d54e36fd66b22a634494648e20c53373Mathias Agopian    @SuppressWarnings("unused")
1588b138323d54e36fd66b22a634494648e20c53373Mathias Agopian    private int mNativeSurface;
1598138cb49e47f9a9905a316a217757710185c66aaMarco Nelissen    private String mName;
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16138ed7d7701514ee7127d0430e952930854608c4fMitsuru Oshima    // The display metrics used to provide the pseudo canvas size for applications
162240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima    // running in compatibility mode. This is set to null for non compatibility mode.
163240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima    private DisplayMetrics mCompatibleDisplayMetrics;
164240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima
165240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima    // A matrix to scale the matrix set by application. This is set to null for
166240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima    // non compatibility mode.
167240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima    private Matrix mCompatibleMatrix;
16838ed7d7701514ee7127d0430e952930854608c4fMitsuru Oshima
169f5e32f33eddc6e22edee1df486b38294ddc76cc3Mathias Agopian    @SuppressWarnings("unused")
170f5e32f33eddc6e22edee1df486b38294ddc76cc3Mathias Agopian    private Exception mCreationStack;
171f5e32f33eddc6e22edee1df486b38294ddc76cc3Mathias Agopian
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Exception thrown when a surface couldn't be created or resized
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static class OutOfResourcesException extends Exception {
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public OutOfResourcesException() {
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public OutOfResourcesException(String name) {
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super(name);
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * We use a class initializer to allow the native code to cache some
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * field offsets.
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    native private static void nativeClassInit();
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static { nativeClassInit(); }
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * create a surface
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Surface(SurfaceSession s,
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int pid, int display, int w, int h, int format, int flags)
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throws OutOfResourcesException {
198f5e32f33eddc6e22edee1df486b38294ddc76cc3Mathias Agopian        if (DEBUG_RELEASE) {
199f5e32f33eddc6e22edee1df486b38294ddc76cc3Mathias Agopian            mCreationStack = new Exception();
200f5e32f33eddc6e22edee1df486b38294ddc76cc3Mathias Agopian        }
2010586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn        mCanvas = new CompatibleCanvas();
2025d26c1e38dabb3ad8b4b6e1000375f3b1a6b7693Mathias Agopian        init(s,pid,null,display,w,h,format,flags);
2035d26c1e38dabb3ad8b4b6e1000375f3b1a6b7693Mathias Agopian    }
2045d26c1e38dabb3ad8b4b6e1000375f3b1a6b7693Mathias Agopian
2055d26c1e38dabb3ad8b4b6e1000375f3b1a6b7693Mathias Agopian    /**
2065d26c1e38dabb3ad8b4b6e1000375f3b1a6b7693Mathias Agopian     * create a surface with a name
2075d26c1e38dabb3ad8b4b6e1000375f3b1a6b7693Mathias Agopian     * {@hide}
2085d26c1e38dabb3ad8b4b6e1000375f3b1a6b7693Mathias Agopian     */
2095d26c1e38dabb3ad8b4b6e1000375f3b1a6b7693Mathias Agopian    public Surface(SurfaceSession s,
2105d26c1e38dabb3ad8b4b6e1000375f3b1a6b7693Mathias Agopian            int pid, String name, int display, int w, int h, int format, int flags)
2115d26c1e38dabb3ad8b4b6e1000375f3b1a6b7693Mathias Agopian        throws OutOfResourcesException {
212f5e32f33eddc6e22edee1df486b38294ddc76cc3Mathias Agopian        if (DEBUG_RELEASE) {
213f5e32f33eddc6e22edee1df486b38294ddc76cc3Mathias Agopian            mCreationStack = new Exception();
214f5e32f33eddc6e22edee1df486b38294ddc76cc3Mathias Agopian        }
2155d26c1e38dabb3ad8b4b6e1000375f3b1a6b7693Mathias Agopian        mCanvas = new CompatibleCanvas();
2165d26c1e38dabb3ad8b4b6e1000375f3b1a6b7693Mathias Agopian        init(s,pid,name,display,w,h,format,flags);
2178138cb49e47f9a9905a316a217757710185c66aaMarco Nelissen        mName = name;
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Create an empty surface, which will later be filled in by
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * readFromParcel().
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Surface() {
226f5e32f33eddc6e22edee1df486b38294ddc76cc3Mathias Agopian        if (DEBUG_RELEASE) {
227f5e32f33eddc6e22edee1df486b38294ddc76cc3Mathias Agopian            mCreationStack = new Exception();
228f5e32f33eddc6e22edee1df486b38294ddc76cc3Mathias Agopian        }
229240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima        mCanvas = new CompatibleCanvas();
230240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima    }
231240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima
232240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima    /**
233240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima     * A Canvas class that can handle the compatibility mode. This does two things differently.
234240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima     * <ul>
235240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima     *  <li> Returns the width and height of the target metrics, rather than native.
236240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima     *  For example, the canvas returns 320x480 even if an app is running in WVGA high density.
237240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima     *  <li> Scales the matrix in setMatrix by the application scale, except if the matrix looks
238240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima     *  like obtained from getMatrix. This is a hack to handle the case that an application
239240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima     *  uses getMatrix to keep the original matrix, set matrix of its own, then set the original
240240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima     *  matrix back. There is no perfect solution that works for all cases, and there are a lot of
241240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima     *  cases that this model dose not work, but we hope this works for many apps.
242240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima     * </ul>
243240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima     */
244240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima    private class CompatibleCanvas extends Canvas {
245240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima        // A temp matrix to remember what an application obtained via {@link getMatrix}
246240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima        private Matrix mOrigMatrix = null;
247240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima
248240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima        @Override
249240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima        public int getWidth() {
250240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima            return mCompatibleDisplayMetrics == null ?
251240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima                    super.getWidth() : mCompatibleDisplayMetrics.widthPixels;
252240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima        }
253240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima
254240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima        @Override
255240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima        public int getHeight() {
256240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima            return mCompatibleDisplayMetrics == null ?
257240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima                    super.getHeight() : mCompatibleDisplayMetrics.heightPixels;
258240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima        }
259240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima
260240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima        @Override
261240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima        public void setMatrix(Matrix matrix) {
262240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima            if (mCompatibleMatrix == null || mOrigMatrix == null || mOrigMatrix.equals(matrix)) {
263240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima                // don't scale the matrix if it's not compatibility mode, or
264240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima                // the matrix was obtained from getMatrix.
265240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima                super.setMatrix(matrix);
266240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima            } else {
267240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima                Matrix m = new Matrix(mCompatibleMatrix);
268240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima                m.preConcat(matrix);
269240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima                super.setMatrix(m);
27038ed7d7701514ee7127d0430e952930854608c4fMitsuru Oshima            }
271240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima        }
272240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima
273240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima        @Override
274240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima        public void getMatrix(Matrix m) {
275240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima            super.getMatrix(m);
276240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima            if (mOrigMatrix == null) {
277240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima                mOrigMatrix = new Matrix();
27838ed7d7701514ee7127d0430e952930854608c4fMitsuru Oshima            }
279240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima            mOrigMatrix.set(m);
280240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima        }
281d10cd5765a2b706fc174f16b951d6b0a5d3740d3Romain Guy    }
28238ed7d7701514ee7127d0430e952930854608c4fMitsuru Oshima
28338ed7d7701514ee7127d0430e952930854608c4fMitsuru Oshima    /**
284b2f8450db8dfbc05724624f93d9ec5e65f0b7e54Mathias Agopian     * Sets the display metrics used to provide canva's width/height in compatibility mode.
28538ed7d7701514ee7127d0430e952930854608c4fMitsuru Oshima     */
286240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima    void setCompatibleDisplayMetrics(DisplayMetrics metrics, Translator translator) {
287240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima        mCompatibleDisplayMetrics = metrics;
288240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima        if (translator != null) {
289240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima            float appScale = translator.applicationScale;
290240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima            mCompatibleMatrix = new Matrix();
291240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima            mCompatibleMatrix.setScale(appScale, appScale);
292240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima        }
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Copy another surface to this one.  This surface now holds a reference
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to the same data as the original surface, and is -not- the owner.
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native   void copyFrom(Surface o);
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Does this object hold a valid surface?  Returns true if it holds
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * a physical surface, so lockCanvas() will succeed.  Otherwise
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * returns false.
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native   boolean isValid();
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3090586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn    /** Free all server-side state associated with this surface and
3100586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn     * release this object's reference. {@hide} */
3110586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn    public native void destroy();
3120586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn
3130586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn    /** Release the local reference to the server-side surface. @hide */
3140586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn    public native void release();
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** draw into a surface */
317b2f8450db8dfbc05724624f93d9ec5e65f0b7e54Mathias Agopian    public Canvas lockCanvas(Rect dirty) throws OutOfResourcesException, IllegalArgumentException
318b2f8450db8dfbc05724624f93d9ec5e65f0b7e54Mathias Agopian    {
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /* the dirty rectangle may be expanded to the surface's size, if
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * for instance it has been resized or if the bits were lost, since
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * the last call.
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return lockCanvasNative(dirty);
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private native Canvas lockCanvasNative(Rect dirty);
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** unlock the surface and asks a page flip */
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native   void unlockCanvasAndPost(Canvas canvas);
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * unlock the surface. the screen won't be updated until
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * post() or postAll() is called
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native   void unlockCanvas(Canvas canvas);
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** start/end a transaction {@hide} */
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static native   void openTransaction();
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** {@hide} */
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static native   void closeTransaction();
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Freezes the specified display, No updating of the screen will occur
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * until unfreezeDisplay() is called. Everything else works as usual though,
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * in particular transactions.
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param display
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static native   void freezeDisplay(int display);
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * resume updating the specified display.
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param display
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static native   void unfreezeDisplay(int display);
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * set the orientation of the given display.
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param display
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param orientation
362eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian     * @param flags
363eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian     * {@hide}
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
365eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian    public static native   void setOrientation(int display, int orientation, int flags);
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
368eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian     * set the orientation of the given display.
369eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian     * @param display
370eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian     * @param orientation
371eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian     */
372eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian    public static void setOrientation(int display, int orientation) {
373eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian        setOrientation(display, orientation, 0);
374eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian    }
375eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian
376eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian    /**
377a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn     * Copy the current screen contents into a bitmap and return it.
378a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn     *
379a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn     * @param width The desired width of the returned bitmap; the raw
380a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn     * screen will be scaled down to this size.
381a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn     * @param height The desired height of the returned bitmap; the raw
382a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn     * screen will be scaled down to this size.
383a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn     * @return Returns a Bitmap containing the screen contents.
384a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn     *
385a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn     * @hide
386a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn     */
387a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn    public static native Bitmap screenshot(int width, int height);
388a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn
389a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn    /**
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * set surface parameters.
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * needs to be inside open/closeTransaction block
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native   void setLayer(int zorder);
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native   void setPosition(int x, int y);
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native   void setSize(int w, int h);
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native   void hide();
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native   void show();
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native   void setTransparentRegionHint(Region region);
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native   void setAlpha(float alpha);
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native   void setMatrix(float dsdx, float dtdx,
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                   float dsdy, float dtdy);
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native   void freeze();
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native   void unfreeze();
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native   void setFreezeTint(int tint);
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native   void setFlags(int flags, int mask);
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String toString() {
4138138cb49e47f9a9905a316a217757710185c66aaMarco Nelissen        return "Surface(name=" + mName + ", identity=" + getIdentity() + ")";
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Surface(Parcel source) throws OutOfResourcesException {
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        init(source);
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int describeContents() {
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native   void readFromParcel(Parcel source);
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native   void writeToParcel(Parcel dest, int flags);
426402c34649f514669517c2208e35caa58ff8bb2b9Mathias Agopian
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final Parcelable.Creator<Surface> CREATOR
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            = new Parcelable.Creator<Surface>()
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Surface createFromParcel(Parcel source) {
4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return new Surface(source);
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (Exception e) {
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.e(LOG_TAG, "Exception creating surface from parcel", e);
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Surface[] newArray(int size) {
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return new Surface[size];
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /* no user serviceable parts here ... */
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void finalize() throws Throwable {
447d10cd5765a2b706fc174f16b951d6b0a5d3740d3Romain Guy        try {
448d10cd5765a2b706fc174f16b951d6b0a5d3740d3Romain Guy            super.finalize();
449d10cd5765a2b706fc174f16b951d6b0a5d3740d3Romain Guy        } finally {
450d10cd5765a2b706fc174f16b951d6b0a5d3740d3Romain Guy            if (mNativeSurface != 0 || mSurfaceControl != 0) {
451d10cd5765a2b706fc174f16b951d6b0a5d3740d3Romain Guy                if (DEBUG_RELEASE) {
452d10cd5765a2b706fc174f16b951d6b0a5d3740d3Romain Guy                    Log.w(LOG_TAG, "Surface.finalize() has work. You should have called release() ("
453d10cd5765a2b706fc174f16b951d6b0a5d3740d3Romain Guy                            + mNativeSurface + ", " + mSurfaceControl + ")", mCreationStack);
454d10cd5765a2b706fc174f16b951d6b0a5d3740d3Romain Guy                } else {
455d10cd5765a2b706fc174f16b951d6b0a5d3740d3Romain Guy                    Log.w(LOG_TAG, "Surface.finalize() has work. You should have called release() ("
456d10cd5765a2b706fc174f16b951d6b0a5d3740d3Romain Guy                            + mNativeSurface + ", " + mSurfaceControl + ")");
457d10cd5765a2b706fc174f16b951d6b0a5d3740d3Romain Guy                }
458f5e32f33eddc6e22edee1df486b38294ddc76cc3Mathias Agopian            }
459d10cd5765a2b706fc174f16b951d6b0a5d3740d3Romain Guy            release();
460f5e32f33eddc6e22edee1df486b38294ddc76cc3Mathias Agopian        }
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private native void init(SurfaceSession s,
4645d26c1e38dabb3ad8b4b6e1000375f3b1a6b7693Mathias Agopian            int pid, String name, int display, int w, int h, int format, int flags)
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws OutOfResourcesException;
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private native void init(Parcel source);
4688138cb49e47f9a9905a316a217757710185c66aaMarco Nelissen
4698138cb49e47f9a9905a316a217757710185c66aaMarco Nelissen    private native int getIdentity();
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
471