Surface.java revision 8b138323d54e36fd66b22a634494648e20c53373
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; 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Creates a normal surface. This is the default */ 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int FX_SURFACE_NORMAL = 0x00000000; 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Creates a Blur surface. Everything behind this surface is blurred 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * by some amount. The quality and refresh speed of the blur effect 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is not settable or guaranteed. 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * It is an error to lock a Blur surface, since it doesn't have 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a backing store. 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int FX_SURFACE_BLUR = 0x00010000; 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Creates a Dim surface. Everything behind this surface is dimmed 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * by the amount specified in setAlpha(). 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * It is an error to lock a Dim surface, since it doesn't have 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a backing store. 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int FX_SURFACE_DIM = 0x00020000; 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Mask used for FX values above */ 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int FX_SURFACE_MASK = 0x000F0000; 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* flags used with setFlags() (keep in sync with ISurfaceComposer.h) */ 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Hide the surface. Equivalent to calling hide() */ 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int SURFACE_HIDDEN = 0x01; 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Freeze the surface. Equivalent to calling freeze() */ 117c87c4a3e3b3c3949ae3c6f8fd245b71691d5ca3bMathias Agopian public static final int SURFACE_FROZEN = 0x02; 118c87c4a3e3b3c3949ae3c6f8fd245b71691d5ca3bMathias Agopian 119c87c4a3e3b3c3949ae3c6f8fd245b71691d5ca3bMathias Agopian /** 120c87c4a3e3b3c3949ae3c6f8fd245b71691d5ca3bMathias Agopian * @deprecated use {@link #SURFACE_FROZEN} instead. 121c87c4a3e3b3c3949ae3c6f8fd245b71691d5ca3bMathias Agopian */ 122c87c4a3e3b3c3949ae3c6f8fd245b71691d5ca3bMathias Agopian @Deprecated 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int SURACE_FROZEN = 0x02; 124c87c4a3e3b3c3949ae3c6f8fd245b71691d5ca3bMathias Agopian 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Enable dithering when compositing this surface */ 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int SURFACE_DITHER = 0x04; 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int SURFACE_BLUR_FREEZE= 0x10; 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* orientations for setOrientation() */ 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int ROTATION_0 = 0; 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int ROTATION_90 = 1; 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int ROTATION_180 = 2; 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int ROTATION_270 = 3; 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 136eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian /** 137eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian * Disable the orientation animation 138eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian * {@hide} 139eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian */ 140eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian public static final int FLAGS_ORIENTATION_ANIMATION_DISABLE = 0x000000001; 141eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @SuppressWarnings("unused") 14317f638b39f2e8b610ecfa1290e5bc42ab7700c98Mathias Agopian private int mSurfaceControl; 14417f638b39f2e8b610ecfa1290e5bc42ab7700c98Mathias Agopian @SuppressWarnings("unused") 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mSaveCount; 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @SuppressWarnings("unused") 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Canvas mCanvas; 1488b138323d54e36fd66b22a634494648e20c53373Mathias Agopian @SuppressWarnings("unused") 1498b138323d54e36fd66b22a634494648e20c53373Mathias Agopian private int mNativeSurface; 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15138ed7d7701514ee7127d0430e952930854608c4fMitsuru Oshima // The display metrics used to provide the pseudo canvas size for applications 152240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima // running in compatibility mode. This is set to null for non compatibility mode. 153240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima private DisplayMetrics mCompatibleDisplayMetrics; 154240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima 155240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima // A matrix to scale the matrix set by application. This is set to null for 156240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima // non compatibility mode. 157240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima private Matrix mCompatibleMatrix; 15838ed7d7701514ee7127d0430e952930854608c4fMitsuru Oshima 159f5e32f33eddc6e22edee1df486b38294ddc76cc3Mathias Agopian @SuppressWarnings("unused") 160f5e32f33eddc6e22edee1df486b38294ddc76cc3Mathias Agopian private Exception mCreationStack; 161f5e32f33eddc6e22edee1df486b38294ddc76cc3Mathias Agopian 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Exception thrown when a surface couldn't be created or resized 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static class OutOfResourcesException extends Exception { 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public OutOfResourcesException() { 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public OutOfResourcesException(String name) { 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(name); 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * We use a class initializer to allow the native code to cache some 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * field offsets. 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project native private static void nativeClassInit(); 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static { nativeClassInit(); } 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * create a surface 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide} 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Surface(SurfaceSession s, 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int pid, int display, int w, int h, int format, int flags) 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws OutOfResourcesException { 188f5e32f33eddc6e22edee1df486b38294ddc76cc3Mathias Agopian if (DEBUG_RELEASE) { 189f5e32f33eddc6e22edee1df486b38294ddc76cc3Mathias Agopian mCreationStack = new Exception(); 190f5e32f33eddc6e22edee1df486b38294ddc76cc3Mathias Agopian } 1910586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn mCanvas = new CompatibleCanvas(); 1925d26c1e38dabb3ad8b4b6e1000375f3b1a6b7693Mathias Agopian init(s,pid,null,display,w,h,format,flags); 1935d26c1e38dabb3ad8b4b6e1000375f3b1a6b7693Mathias Agopian } 1945d26c1e38dabb3ad8b4b6e1000375f3b1a6b7693Mathias Agopian 1955d26c1e38dabb3ad8b4b6e1000375f3b1a6b7693Mathias Agopian /** 1965d26c1e38dabb3ad8b4b6e1000375f3b1a6b7693Mathias Agopian * create a surface with a name 1975d26c1e38dabb3ad8b4b6e1000375f3b1a6b7693Mathias Agopian * {@hide} 1985d26c1e38dabb3ad8b4b6e1000375f3b1a6b7693Mathias Agopian */ 1995d26c1e38dabb3ad8b4b6e1000375f3b1a6b7693Mathias Agopian public Surface(SurfaceSession s, 2005d26c1e38dabb3ad8b4b6e1000375f3b1a6b7693Mathias Agopian int pid, String name, int display, int w, int h, int format, int flags) 2015d26c1e38dabb3ad8b4b6e1000375f3b1a6b7693Mathias Agopian throws OutOfResourcesException { 202f5e32f33eddc6e22edee1df486b38294ddc76cc3Mathias Agopian if (DEBUG_RELEASE) { 203f5e32f33eddc6e22edee1df486b38294ddc76cc3Mathias Agopian mCreationStack = new Exception(); 204f5e32f33eddc6e22edee1df486b38294ddc76cc3Mathias Agopian } 2055d26c1e38dabb3ad8b4b6e1000375f3b1a6b7693Mathias Agopian mCanvas = new CompatibleCanvas(); 2065d26c1e38dabb3ad8b4b6e1000375f3b1a6b7693Mathias Agopian init(s,pid,name,display,w,h,format,flags); 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Create an empty surface, which will later be filled in by 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * readFromParcel(). 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide} 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Surface() { 215f5e32f33eddc6e22edee1df486b38294ddc76cc3Mathias Agopian if (DEBUG_RELEASE) { 216f5e32f33eddc6e22edee1df486b38294ddc76cc3Mathias Agopian mCreationStack = new Exception(); 217f5e32f33eddc6e22edee1df486b38294ddc76cc3Mathias Agopian } 218240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima mCanvas = new CompatibleCanvas(); 219240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima } 220240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima 221240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima /** 222240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima * A Canvas class that can handle the compatibility mode. This does two things differently. 223240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima * <ul> 224240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima * <li> Returns the width and height of the target metrics, rather than native. 225240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima * For example, the canvas returns 320x480 even if an app is running in WVGA high density. 226240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima * <li> Scales the matrix in setMatrix by the application scale, except if the matrix looks 227240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima * like obtained from getMatrix. This is a hack to handle the case that an application 228240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima * uses getMatrix to keep the original matrix, set matrix of its own, then set the original 229240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima * matrix back. There is no perfect solution that works for all cases, and there are a lot of 230240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima * cases that this model dose not work, but we hope this works for many apps. 231240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima * </ul> 232240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima */ 233240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima private class CompatibleCanvas extends Canvas { 234240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima // A temp matrix to remember what an application obtained via {@link getMatrix} 235240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima private Matrix mOrigMatrix = null; 236240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima 237240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima @Override 238240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima public int getWidth() { 239240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima return mCompatibleDisplayMetrics == null ? 240240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima super.getWidth() : mCompatibleDisplayMetrics.widthPixels; 241240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima } 242240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima 243240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima @Override 244240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima public int getHeight() { 245240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima return mCompatibleDisplayMetrics == null ? 246240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima super.getHeight() : mCompatibleDisplayMetrics.heightPixels; 247240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima } 248240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima 249240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima @Override 250240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima public void setMatrix(Matrix matrix) { 251240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima if (mCompatibleMatrix == null || mOrigMatrix == null || mOrigMatrix.equals(matrix)) { 252240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima // don't scale the matrix if it's not compatibility mode, or 253240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima // the matrix was obtained from getMatrix. 254240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima super.setMatrix(matrix); 255240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima } else { 256240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima Matrix m = new Matrix(mCompatibleMatrix); 257240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima m.preConcat(matrix); 258240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima super.setMatrix(m); 25938ed7d7701514ee7127d0430e952930854608c4fMitsuru Oshima } 260240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima } 261240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima 262240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima @Override 263240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima public void getMatrix(Matrix m) { 264240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima super.getMatrix(m); 265240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima if (mOrigMatrix == null) { 266240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima mOrigMatrix = new Matrix(); 26738ed7d7701514ee7127d0430e952930854608c4fMitsuru Oshima } 268240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima mOrigMatrix.set(m); 269240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima } 270240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima }; 27138ed7d7701514ee7127d0430e952930854608c4fMitsuru Oshima 27238ed7d7701514ee7127d0430e952930854608c4fMitsuru Oshima /** 273b2f8450db8dfbc05724624f93d9ec5e65f0b7e54Mathias Agopian * Sets the display metrics used to provide canva's width/height in compatibility mode. 27438ed7d7701514ee7127d0430e952930854608c4fMitsuru Oshima */ 275240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima void setCompatibleDisplayMetrics(DisplayMetrics metrics, Translator translator) { 276240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima mCompatibleDisplayMetrics = metrics; 277240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima if (translator != null) { 278240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima float appScale = translator.applicationScale; 279240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima mCompatibleMatrix = new Matrix(); 280240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima mCompatibleMatrix.setScale(appScale, appScale); 281240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima } 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copy another surface to this one. This surface now holds a reference 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to the same data as the original surface, and is -not- the owner. 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide} 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native void copyFrom(Surface o); 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Does this object hold a valid surface? Returns true if it holds 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a physical surface, so lockCanvas() will succeed. Otherwise 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * returns false. 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native boolean isValid(); 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2980586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn /** Free all server-side state associated with this surface and 2990586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn * release this object's reference. {@hide} */ 3000586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn public native void destroy(); 3010586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn 3020586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn /** Release the local reference to the server-side surface. @hide */ 3030586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn public native void release(); 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** draw into a surface */ 306b2f8450db8dfbc05724624f93d9ec5e65f0b7e54Mathias Agopian public Canvas lockCanvas(Rect dirty) throws OutOfResourcesException, IllegalArgumentException 307b2f8450db8dfbc05724624f93d9ec5e65f0b7e54Mathias Agopian { 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* the dirty rectangle may be expanded to the surface's size, if 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * for instance it has been resized or if the bits were lost, since 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the last call. 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return lockCanvasNative(dirty); 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private native Canvas lockCanvasNative(Rect dirty); 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** unlock the surface and asks a page flip */ 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native void unlockCanvasAndPost(Canvas canvas); 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * unlock the surface. the screen won't be updated until 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * post() or postAll() is called 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native void unlockCanvas(Canvas canvas); 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** start/end a transaction {@hide} */ 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static native void openTransaction(); 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** {@hide} */ 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static native void closeTransaction(); 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Freezes the specified display, No updating of the screen will occur 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * until unfreezeDisplay() is called. Everything else works as usual though, 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in particular transactions. 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param display 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide} 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static native void freezeDisplay(int display); 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * resume updating the specified display. 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param display 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide} 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static native void unfreezeDisplay(int display); 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * set the orientation of the given display. 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param display 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param orientation 351eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian * @param flags 352eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian * {@hide} 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 354eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian public static native void setOrientation(int display, int orientation, int flags); 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 357eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian * set the orientation of the given display. 358eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian * @param display 359eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian * @param orientation 360eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian */ 361eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian public static void setOrientation(int display, int orientation) { 362eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian setOrientation(display, orientation, 0); 363eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian } 364eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian 365eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian /** 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * set surface parameters. 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * needs to be inside open/closeTransaction block 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native void setLayer(int zorder); 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native void setPosition(int x, int y); 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native void setSize(int w, int h); 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native void hide(); 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native void show(); 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native void setTransparentRegionHint(Region region); 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native void setAlpha(float alpha); 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native void setMatrix(float dsdx, float dtdx, 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float dsdy, float dtdy); 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native void freeze(); 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native void unfreeze(); 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native void setFreezeTint(int tint); 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native void setFlags(int flags, int mask); 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 38917f638b39f2e8b610ecfa1290e5bc42ab7700c98Mathias Agopian return "Surface(native-token=" + mSurfaceControl + ")"; 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Surface(Parcel source) throws OutOfResourcesException { 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project init(source); 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int describeContents() { 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native void readFromParcel(Parcel source); 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native void writeToParcel(Parcel dest, int flags); 402402c34649f514669517c2208e35caa58ff8bb2b9Mathias Agopian 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final Parcelable.Creator<Surface> CREATOR 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project = new Parcelable.Creator<Surface>() 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Surface createFromParcel(Parcel source) { 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new Surface(source); 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (Exception e) { 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e(LOG_TAG, "Exception creating surface from parcel", e); 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Surface[] newArray(int size) { 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new Surface[size]; 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* no user serviceable parts here ... */ 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void finalize() throws Throwable { 4238b138323d54e36fd66b22a634494648e20c53373Mathias Agopian if (mNativeSurface != 0 || mSurfaceControl != 0) { 424f5e32f33eddc6e22edee1df486b38294ddc76cc3Mathias Agopian if (DEBUG_RELEASE) { 425f5e32f33eddc6e22edee1df486b38294ddc76cc3Mathias Agopian Log.w(LOG_TAG, "Surface.finalize() has work. You should have called release() (" 4268b138323d54e36fd66b22a634494648e20c53373Mathias Agopian + mNativeSurface + ", " + mSurfaceControl + ")", mCreationStack); 427f5e32f33eddc6e22edee1df486b38294ddc76cc3Mathias Agopian } else { 428f5e32f33eddc6e22edee1df486b38294ddc76cc3Mathias Agopian Log.w(LOG_TAG, "Surface.finalize() has work. You should have called release() (" 4298b138323d54e36fd66b22a634494648e20c53373Mathias Agopian + mNativeSurface + ", " + mSurfaceControl + ")"); 430f5e32f33eddc6e22edee1df486b38294ddc76cc3Mathias Agopian } 431f5e32f33eddc6e22edee1df486b38294ddc76cc3Mathias Agopian } 432402c34649f514669517c2208e35caa58ff8bb2b9Mathias Agopian release(); 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private native void init(SurfaceSession s, 4365d26c1e38dabb3ad8b4b6e1000375f3b1a6b7693Mathias Agopian int pid, String name, int display, int w, int h, int format, int flags) 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws OutOfResourcesException; 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private native void init(Parcel source); 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 441