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