13866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian/* 23866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * Copyright (C) 2013 The Android Open Source Project 33866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * 43866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * Licensed under the Apache License, Version 2.0 (the "License"); 53866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * you may not use this file except in compliance with the License. 63866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * You may obtain a copy of the License at 73866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * 83866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * http://www.apache.org/licenses/LICENSE-2.0 93866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * 103866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * Unless required by applicable law or agreed to in writing, software 113866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * distributed under the License is distributed on an "AS IS" BASIS, 123866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 133866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * See the License for the specific language governing permissions and 143866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * limitations under the License. 153866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian */ 163866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 173866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopianpackage android.view; 183866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 193866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopianimport dalvik.system.CloseGuard; 203866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopianimport android.graphics.Bitmap; 213866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopianimport android.graphics.Rect; 223866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopianimport android.graphics.Region; 233866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopianimport android.os.IBinder; 243866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopianimport android.util.Log; 25a86ab640f7bb0bf3cb4eaed80473ca8c5d131903Igor Murashkinimport android.view.Surface.OutOfResourcesException; 263866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 273866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian/** 283866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * SurfaceControl 293866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * @hide 303866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian */ 313866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopianpublic class SurfaceControl { 323866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian private static final String TAG = "SurfaceControl"; 3329479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian 3436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native long nativeCreate(SurfaceSession session, String name, 3529479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian int w, int h, int format, int flags) 3629479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian throws OutOfResourcesException; 3736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native void nativeRelease(long nativeObject); 3836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native void nativeDestroy(long nativeObject); 3929479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian 4029479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian private static native Bitmap nativeScreenshot(IBinder displayToken, 419890e341bf9d565309cd7db5e6c4194c66c0a1d8Dan Stoza Rect sourceCrop, int width, int height, int minLayer, int maxLayer, 421d13406538b79785d2d0928689b8d5037e851ecfRiley Andrews boolean allLayers, boolean useIdentityTransform, int rotation); 430449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian private static native void nativeScreenshot(IBinder displayToken, Surface consumer, 449890e341bf9d565309cd7db5e6c4194c66c0a1d8Dan Stoza Rect sourceCrop, int width, int height, int minLayer, int maxLayer, 459890e341bf9d565309cd7db5e6c4194c66c0a1d8Dan Stoza boolean allLayers, boolean useIdentityTransform); 4629479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian 4729479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian private static native void nativeOpenTransaction(); 4829479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian private static native void nativeCloseTransaction(); 4929479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian private static native void nativeSetAnimationTransaction(); 5029479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian 5136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native void nativeSetLayer(long nativeObject, int zorder); 5236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native void nativeSetPosition(long nativeObject, float x, float y); 5336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native void nativeSetSize(long nativeObject, int w, int h); 5436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native void nativeSetTransparentRegionHint(long nativeObject, Region region); 5536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native void nativeSetAlpha(long nativeObject, float alpha); 5636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native void nativeSetMatrix(long nativeObject, float dsdx, float dtdx, float dsdy, float dtdy); 5736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native void nativeSetFlags(long nativeObject, int flags, int mask); 5836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native void nativeSetWindowCrop(long nativeObject, int l, int t, int r, int b); 5936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native void nativeSetLayerStack(long nativeObject, int layerStack); 6029479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian 611376d600d8e0eefdbc0aa11d398cf7517fc77129Svetoslav private static native boolean nativeClearContentFrameStats(long nativeObject); 621376d600d8e0eefdbc0aa11d398cf7517fc77129Svetoslav private static native boolean nativeGetContentFrameStats(long nativeObject, WindowContentFrameStats outStats); 631376d600d8e0eefdbc0aa11d398cf7517fc77129Svetoslav private static native boolean nativeClearAnimationFrameStats(); 641376d600d8e0eefdbc0aa11d398cf7517fc77129Svetoslav private static native boolean nativeGetAnimationFrameStats(WindowAnimationFrameStats outStats); 651376d600d8e0eefdbc0aa11d398cf7517fc77129Svetoslav 6629479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian private static native IBinder nativeGetBuiltInDisplay(int physicalDisplayId); 6729479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian private static native IBinder nativeCreateDisplay(String name, boolean secure); 686a6bc216d15293886ad088bb0ca99aadb7df85dcJesse Hall private static native void nativeDestroyDisplay(IBinder displayToken); 6929479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian private static native void nativeSetDisplaySurface( 7036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat IBinder displayToken, long nativeSurfaceObject); 7129479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian private static native void nativeSetDisplayLayerStack( 7229479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian IBinder displayToken, int layerStack); 7329479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian private static native void nativeSetDisplayProjection( 7429479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian IBinder displayToken, int orientation, 756a6bc216d15293886ad088bb0ca99aadb7df85dcJesse Hall int l, int t, int r, int b, 7629479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian int L, int T, int R, int B); 7701e840ff9441e005153d799e71d65b38bcb21902Michael Wright private static native void nativeSetDisplaySize(IBinder displayToken, int width, int height); 7800101052b5bf99a29acea3525864ed64b709c16cDan Stoza private static native SurfaceControl.PhysicalDisplayInfo[] nativeGetDisplayConfigs( 7900101052b5bf99a29acea3525864ed64b709c16cDan Stoza IBinder displayToken); 8000101052b5bf99a29acea3525864ed64b709c16cDan Stoza private static native int nativeGetActiveConfig(IBinder displayToken); 8100101052b5bf99a29acea3525864ed64b709c16cDan Stoza private static native boolean nativeSetActiveConfig(IBinder displayToken, int id); 82c55929a2a5686fe456b19cd54a73b8bde2a4332bPrashant Malani private static native void nativeSetDisplayPowerMode( 83c55929a2a5686fe456b19cd54a73b8bde2a4332bPrashant Malani IBinder displayToken, int mode); 8429479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian 8529479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian 863866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian private final CloseGuard mCloseGuard = CloseGuard.get(); 87a86ab640f7bb0bf3cb4eaed80473ca8c5d131903Igor Murashkin private final String mName; 8836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat long mNativeObject; // package visibility only for Surface.java access 893866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 903866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian /* flags used in constructor (keep in sync with ISurfaceComposerClient.h) */ 913866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 923866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian /** 933866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * Surface creation flag: Surface is created hidden 943866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian */ 953866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian public static final int HIDDEN = 0x00000004; 963866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 973866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian /** 983866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * Surface creation flag: The surface contains secure content, special 993866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * measures will be taken to disallow the surface's content to be copied 1003866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * from another process. In particular, screenshots and VNC servers will 1013866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * be disabled, but other measures can take place, for instance the 1026a6bc216d15293886ad088bb0ca99aadb7df85dcJesse Hall * surface might not be hardware accelerated. 1033866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * 1043866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian */ 1053866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian public static final int SECURE = 0x00000080; 1063866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 1073866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian /** 1083866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * Surface creation flag: Creates a surface where color components are interpreted 1093866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * as "non pre-multiplied" by their alpha channel. Of course this flag is 1103866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * meaningless for surfaces without an alpha channel. By default 1113866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * surfaces are pre-multiplied, which means that each color component is 1123866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * already multiplied by its alpha value. In this case the blending 1133866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * equation used is: 114314405bf891904d1bbeeaf0f9fc387c1a1aded9aAndy McFadden * <p> 115314405bf891904d1bbeeaf0f9fc387c1a1aded9aAndy McFadden * <code>DEST = SRC + DEST * (1-SRC_ALPHA)</code> 116314405bf891904d1bbeeaf0f9fc387c1a1aded9aAndy McFadden * <p> 1173866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * By contrast, non pre-multiplied surfaces use the following equation: 118314405bf891904d1bbeeaf0f9fc387c1a1aded9aAndy McFadden * <p> 119314405bf891904d1bbeeaf0f9fc387c1a1aded9aAndy McFadden * <code>DEST = SRC * SRC_ALPHA * DEST * (1-SRC_ALPHA)</code> 120314405bf891904d1bbeeaf0f9fc387c1a1aded9aAndy McFadden * <p> 1213866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * pre-multiplied surfaces must always be used if transparent pixels are 1223866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * composited on top of each-other into the surface. A pre-multiplied 1233866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * surface can never lower the value of the alpha component of a given 1243866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * pixel. 125314405bf891904d1bbeeaf0f9fc387c1a1aded9aAndy McFadden * <p> 1263866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * In some rare situations, a non pre-multiplied surface is preferable. 1273866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * 1283866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian */ 1293866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian public static final int NON_PREMULTIPLIED = 0x00000100; 1303866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 1313866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian /** 1323866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * Surface creation flag: Indicates that the surface must be considered opaque, 1333866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * even if its pixel format is set to translucent. This can be useful if an 1343866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * application needs full RGBA 8888 support for instance but will 1353866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * still draw every pixel opaque. 136314405bf891904d1bbeeaf0f9fc387c1a1aded9aAndy McFadden * <p> 137314405bf891904d1bbeeaf0f9fc387c1a1aded9aAndy McFadden * This flag is ignored if setAlpha() is used to make the surface non-opaque. 138314405bf891904d1bbeeaf0f9fc387c1a1aded9aAndy McFadden * Combined effects are (assuming a buffer format with an alpha channel): 139314405bf891904d1bbeeaf0f9fc387c1a1aded9aAndy McFadden * <ul> 140314405bf891904d1bbeeaf0f9fc387c1a1aded9aAndy McFadden * <li>OPAQUE + alpha(1.0) == opaque composition 141314405bf891904d1bbeeaf0f9fc387c1a1aded9aAndy McFadden * <li>OPAQUE + alpha(0.x) == blended composition 142314405bf891904d1bbeeaf0f9fc387c1a1aded9aAndy McFadden * <li>!OPAQUE + alpha(1.0) == blended composition 143314405bf891904d1bbeeaf0f9fc387c1a1aded9aAndy McFadden * <li>!OPAQUE + alpha(0.x) == blended composition 144314405bf891904d1bbeeaf0f9fc387c1a1aded9aAndy McFadden * </ul> 145314405bf891904d1bbeeaf0f9fc387c1a1aded9aAndy McFadden * If the underlying buffer lacks an alpha channel, the OPAQUE flag is effectively 146314405bf891904d1bbeeaf0f9fc387c1a1aded9aAndy McFadden * set automatically. 1473866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian */ 1483866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian public static final int OPAQUE = 0x00000400; 1493866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 1503866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian /** 1513866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * Surface creation flag: Application requires a hardware-protected path to an 1523866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * external display sink. If a hardware-protected path is not available, 1533866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * then this surface will not be displayed on the external sink. 1543866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * 1553866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian */ 1563866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian public static final int PROTECTED_APP = 0x00000800; 1573866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 1583866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian // 0x1000 is reserved for an independent DRM protected flag in framework 1593866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 1603866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian /** 16168eccdade2aad22b7eb34a28572c204dcd54f7b9Riley Andrews * Surface creation flag: Window represents a cursor glyph. 16268eccdade2aad22b7eb34a28572c204dcd54f7b9Riley Andrews */ 16368eccdade2aad22b7eb34a28572c204dcd54f7b9Riley Andrews public static final int CURSOR_WINDOW = 0x00002000; 16468eccdade2aad22b7eb34a28572c204dcd54f7b9Riley Andrews 16568eccdade2aad22b7eb34a28572c204dcd54f7b9Riley Andrews /** 1663866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * Surface creation flag: Creates a normal surface. 1673866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * This is the default. 1683866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * 1693866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian */ 1703866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian public static final int FX_SURFACE_NORMAL = 0x00000000; 1713866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 1723866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian /** 1733866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * Surface creation flag: Creates a Dim surface. 1743866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * Everything behind this surface is dimmed by the amount specified 1753866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * in {@link #setAlpha}. It is an error to lock a Dim surface, since it 1763866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * doesn't have a backing store. 1773866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * 1783866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian */ 1793866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian public static final int FX_SURFACE_DIM = 0x00020000; 1803866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 1813866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian /** 1823866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * Mask used for FX values above. 1833866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * 1843866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian */ 1853866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian public static final int FX_SURFACE_MASK = 0x000F0000; 1863866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 1873866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian /* flags used with setFlags() (keep in sync with ISurfaceComposer.h) */ 1883866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 1893866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian /** 1903866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * Surface flag: Hide the surface. 1913866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * Equivalent to calling hide(). 192314405bf891904d1bbeeaf0f9fc387c1a1aded9aAndy McFadden * Updates the value set during Surface creation (see {@link #HIDDEN}). 1933866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian */ 19440b9ef1e2d91615cba6fb5d9527f81090a705026Andy McFadden private static final int SURFACE_HIDDEN = 0x01; 1953866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 196314405bf891904d1bbeeaf0f9fc387c1a1aded9aAndy McFadden /** 197314405bf891904d1bbeeaf0f9fc387c1a1aded9aAndy McFadden * Surface flag: composite without blending when possible. 198314405bf891904d1bbeeaf0f9fc387c1a1aded9aAndy McFadden * Updates the value set during Surface creation (see {@link #OPAQUE}). 199314405bf891904d1bbeeaf0f9fc387c1a1aded9aAndy McFadden */ 20040b9ef1e2d91615cba6fb5d9527f81090a705026Andy McFadden private static final int SURFACE_OPAQUE = 0x02; 201314405bf891904d1bbeeaf0f9fc387c1a1aded9aAndy McFadden 2023866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 2033866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian /* built-in physical display ids (keep in sync with ISurfaceComposer.h) 2043866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * these are different from the logical display ids used elsewhere in the framework */ 2053866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 2063866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian /** 2073866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * Built-in physical display id: Main display. 20840b9ef1e2d91615cba6fb5d9527f81090a705026Andy McFadden * Use only with {@link SurfaceControl#getBuiltInDisplay(int)}. 2093866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian */ 2103866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian public static final int BUILT_IN_DISPLAY_ID_MAIN = 0; 2113866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 2123866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian /** 2133866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * Built-in physical display id: Attached HDMI display. 21440b9ef1e2d91615cba6fb5d9527f81090a705026Andy McFadden * Use only with {@link SurfaceControl#getBuiltInDisplay(int)}. 2153866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian */ 2163866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian public static final int BUILT_IN_DISPLAY_ID_HDMI = 1; 2173866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 218c55929a2a5686fe456b19cd54a73b8bde2a4332bPrashant Malani /* Display power modes * / 219c55929a2a5686fe456b19cd54a73b8bde2a4332bPrashant Malani 220c55929a2a5686fe456b19cd54a73b8bde2a4332bPrashant Malani /** 221c55929a2a5686fe456b19cd54a73b8bde2a4332bPrashant Malani * Display power mode off: used while blanking the screen. 2225dc219142a756d57355b511c8f8ab913c01710daJeff Brown * Use only with {@link SurfaceControl#setDisplayPowerMode}. 223c55929a2a5686fe456b19cd54a73b8bde2a4332bPrashant Malani */ 224c55929a2a5686fe456b19cd54a73b8bde2a4332bPrashant Malani public static final int POWER_MODE_OFF = 0; 225c55929a2a5686fe456b19cd54a73b8bde2a4332bPrashant Malani 226c55929a2a5686fe456b19cd54a73b8bde2a4332bPrashant Malani /** 227c55929a2a5686fe456b19cd54a73b8bde2a4332bPrashant Malani * Display power mode doze: used while putting the screen into low power mode. 2285dc219142a756d57355b511c8f8ab913c01710daJeff Brown * Use only with {@link SurfaceControl#setDisplayPowerMode}. 229c55929a2a5686fe456b19cd54a73b8bde2a4332bPrashant Malani */ 230c55929a2a5686fe456b19cd54a73b8bde2a4332bPrashant Malani public static final int POWER_MODE_DOZE = 1; 231c55929a2a5686fe456b19cd54a73b8bde2a4332bPrashant Malani 232c55929a2a5686fe456b19cd54a73b8bde2a4332bPrashant Malani /** 233c55929a2a5686fe456b19cd54a73b8bde2a4332bPrashant Malani * Display power mode normal: used while unblanking the screen. 2345dc219142a756d57355b511c8f8ab913c01710daJeff Brown * Use only with {@link SurfaceControl#setDisplayPowerMode}. 235c55929a2a5686fe456b19cd54a73b8bde2a4332bPrashant Malani */ 236c55929a2a5686fe456b19cd54a73b8bde2a4332bPrashant Malani public static final int POWER_MODE_NORMAL = 2; 2373866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 2385dc219142a756d57355b511c8f8ab913c01710daJeff Brown /** 2395dc219142a756d57355b511c8f8ab913c01710daJeff Brown * Display power mode doze: used while putting the screen into a suspended 2405dc219142a756d57355b511c8f8ab913c01710daJeff Brown * low power mode. Use only with {@link SurfaceControl#setDisplayPowerMode}. 2415dc219142a756d57355b511c8f8ab913c01710daJeff Brown */ 2425dc219142a756d57355b511c8f8ab913c01710daJeff Brown public static final int POWER_MODE_DOZE_SUSPEND = 3; 2433866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 2443866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian /** 2453866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * Create a surface with a name. 246314405bf891904d1bbeeaf0f9fc387c1a1aded9aAndy McFadden * <p> 2473866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * The surface creation flags specify what kind of surface to create and 2483866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * certain options such as whether the surface can be assumed to be opaque 2493866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * and whether it should be initially hidden. Surfaces should always be 2503866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * created with the {@link #HIDDEN} flag set to ensure that they are not 2513866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * made visible prematurely before all of the surface's properties have been 2523866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * configured. 253314405bf891904d1bbeeaf0f9fc387c1a1aded9aAndy McFadden * <p> 2543866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * Good practice is to first create the surface with the {@link #HIDDEN} flag 2553866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * specified, open a transaction, set the surface layer, layer stack, alpha, 2563866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * and position, call {@link #show} if appropriate, and close the transaction. 2573866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * 2583866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * @param session The surface session, must not be null. 2593866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * @param name The surface name, must not be null. 2603866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * @param w The surface initial width. 2613866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * @param h The surface initial height. 2623866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * @param flags The surface creation flags. Should always include {@link #HIDDEN} 2633866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * in the creation flags. 264a86ab640f7bb0bf3cb4eaed80473ca8c5d131903Igor Murashkin * 265a86ab640f7bb0bf3cb4eaed80473ca8c5d131903Igor Murashkin * @throws throws OutOfResourcesException If the SurfaceControl cannot be created. 2663866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian */ 2673866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian public SurfaceControl(SurfaceSession session, 2683866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian String name, int w, int h, int format, int flags) 2693866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian throws OutOfResourcesException { 2703866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian if (session == null) { 2713866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian throw new IllegalArgumentException("session must not be null"); 2723866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } 2733866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian if (name == null) { 2743866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian throw new IllegalArgumentException("name must not be null"); 2753866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } 2763866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 2773866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian if ((flags & SurfaceControl.HIDDEN) == 0) { 2783866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian Log.w(TAG, "Surfaces should always be created with the HIDDEN flag set " 2793866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian + "to ensure that they are not made visible prematurely before " 2803866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian + "all of the surface's properties have been configured. " 2813866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian + "Set the other properties and make the surface visible within " 2823866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian + "a transaction. New surface name: " + name, 2833866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian new Throwable()); 2843866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } 2853866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 2863866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian mName = name; 2873866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian mNativeObject = nativeCreate(session, name, w, h, format, flags); 2883866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian if (mNativeObject == 0) { 2893866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian throw new OutOfResourcesException( 2903866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian "Couldn't allocate SurfaceControl native object"); 2913866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } 2926a6bc216d15293886ad088bb0ca99aadb7df85dcJesse Hall 2933866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian mCloseGuard.open("release"); 2943866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } 2956a6bc216d15293886ad088bb0ca99aadb7df85dcJesse Hall 2963866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian @Override 2973866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian protected void finalize() throws Throwable { 2983866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian try { 2993866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian if (mCloseGuard != null) { 3003866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian mCloseGuard.warnIfOpen(); 3013866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } 3023866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian if (mNativeObject != 0) { 3033866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian nativeRelease(mNativeObject); 3043866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } 3053866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } finally { 3063866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian super.finalize(); 3073866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } 3083866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } 3093866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 3103866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian @Override 3113866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian public String toString() { 3123866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian return "Surface(name=" + mName + ")"; 3133866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } 3143866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 3153866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian /** 3163866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * Release the local reference to the server-side surface. 3173866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * Always call release() when you're done with a Surface. 3183866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * This will make the surface invalid. 3193866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian */ 3203866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian public void release() { 3213866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian if (mNativeObject != 0) { 3223866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian nativeRelease(mNativeObject); 3233866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian mNativeObject = 0; 3243866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } 3253866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian mCloseGuard.close(); 3263866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } 3273866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 3283866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian /** 3293866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * Free all server-side state associated with this surface and 3303866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * release this object's reference. This method can only be 3313866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * called from the process that created the service. 3323866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian */ 3333866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian public void destroy() { 3343866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian if (mNativeObject != 0) { 3353866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian nativeDestroy(mNativeObject); 3363866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian mNativeObject = 0; 3373866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } 3383866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian mCloseGuard.close(); 3393866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } 3403866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 3413866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian private void checkNotReleased() { 3423866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian if (mNativeObject == 0) throw new NullPointerException( 3433866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian "mNativeObject is null. Have you called release() already?"); 3443866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } 3456a6bc216d15293886ad088bb0ca99aadb7df85dcJesse Hall 3463866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian /* 3473866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * set surface parameters. 3483866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * needs to be inside open/closeTransaction block 3493866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian */ 3503866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 3513866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian /** start a transaction */ 3523866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian public static void openTransaction() { 3533866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian nativeOpenTransaction(); 3543866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } 3553866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 3563866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian /** end a transaction */ 3573866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian public static void closeTransaction() { 3583866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian nativeCloseTransaction(); 3593866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } 3603866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 3613866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian /** flag the transaction as an animation */ 3623866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian public static void setAnimationTransaction() { 3633866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian nativeSetAnimationTransaction(); 3643866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } 3653866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 3663866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian public void setLayer(int zorder) { 3673866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian checkNotReleased(); 3683866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian nativeSetLayer(mNativeObject, zorder); 3693866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } 3703866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 3713866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian public void setPosition(float x, float y) { 3723866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian checkNotReleased(); 3733866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian nativeSetPosition(mNativeObject, x, y); 3743866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } 3753866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 3763866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian public void setSize(int w, int h) { 3773866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian checkNotReleased(); 3783866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian nativeSetSize(mNativeObject, w, h); 3793866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } 3803866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 3813866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian public void hide() { 3823866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian checkNotReleased(); 3833866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian nativeSetFlags(mNativeObject, SURFACE_HIDDEN, SURFACE_HIDDEN); 3843866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } 3853866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 3863866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian public void show() { 3873866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian checkNotReleased(); 3883866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian nativeSetFlags(mNativeObject, 0, SURFACE_HIDDEN); 3893866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } 3903866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 3913866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian public void setTransparentRegionHint(Region region) { 3923866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian checkNotReleased(); 3933866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian nativeSetTransparentRegionHint(mNativeObject, region); 3943866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } 3953866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 3961376d600d8e0eefdbc0aa11d398cf7517fc77129Svetoslav public boolean clearContentFrameStats() { 3971376d600d8e0eefdbc0aa11d398cf7517fc77129Svetoslav checkNotReleased(); 3981376d600d8e0eefdbc0aa11d398cf7517fc77129Svetoslav return nativeClearContentFrameStats(mNativeObject); 3991376d600d8e0eefdbc0aa11d398cf7517fc77129Svetoslav } 4001376d600d8e0eefdbc0aa11d398cf7517fc77129Svetoslav 4011376d600d8e0eefdbc0aa11d398cf7517fc77129Svetoslav public boolean getContentFrameStats(WindowContentFrameStats outStats) { 4021376d600d8e0eefdbc0aa11d398cf7517fc77129Svetoslav checkNotReleased(); 4031376d600d8e0eefdbc0aa11d398cf7517fc77129Svetoslav return nativeGetContentFrameStats(mNativeObject, outStats); 4041376d600d8e0eefdbc0aa11d398cf7517fc77129Svetoslav } 4051376d600d8e0eefdbc0aa11d398cf7517fc77129Svetoslav 4061376d600d8e0eefdbc0aa11d398cf7517fc77129Svetoslav public static boolean clearAnimationFrameStats() { 4071376d600d8e0eefdbc0aa11d398cf7517fc77129Svetoslav return nativeClearAnimationFrameStats(); 4081376d600d8e0eefdbc0aa11d398cf7517fc77129Svetoslav } 4091376d600d8e0eefdbc0aa11d398cf7517fc77129Svetoslav 4101376d600d8e0eefdbc0aa11d398cf7517fc77129Svetoslav public static boolean getAnimationFrameStats(WindowAnimationFrameStats outStats) { 4111376d600d8e0eefdbc0aa11d398cf7517fc77129Svetoslav return nativeGetAnimationFrameStats(outStats); 4121376d600d8e0eefdbc0aa11d398cf7517fc77129Svetoslav } 4131376d600d8e0eefdbc0aa11d398cf7517fc77129Svetoslav 414314405bf891904d1bbeeaf0f9fc387c1a1aded9aAndy McFadden /** 415314405bf891904d1bbeeaf0f9fc387c1a1aded9aAndy McFadden * Sets an alpha value for the entire Surface. This value is combined with the 416314405bf891904d1bbeeaf0f9fc387c1a1aded9aAndy McFadden * per-pixel alpha. It may be used with opaque Surfaces. 417314405bf891904d1bbeeaf0f9fc387c1a1aded9aAndy McFadden */ 4183866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian public void setAlpha(float alpha) { 4193866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian checkNotReleased(); 4203866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian nativeSetAlpha(mNativeObject, alpha); 4213866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } 4223866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 4233866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian public void setMatrix(float dsdx, float dtdx, float dsdy, float dtdy) { 4243866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian checkNotReleased(); 4253866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian nativeSetMatrix(mNativeObject, dsdx, dtdx, dsdy, dtdy); 4263866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } 4273866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 4283866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian public void setWindowCrop(Rect crop) { 4293866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian checkNotReleased(); 4303866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian if (crop != null) { 4316a6bc216d15293886ad088bb0ca99aadb7df85dcJesse Hall nativeSetWindowCrop(mNativeObject, 4323866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian crop.left, crop.top, crop.right, crop.bottom); 4333866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } else { 4343866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian nativeSetWindowCrop(mNativeObject, 0, 0, 0, 0); 4353866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } 4363866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } 4373866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 4383866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian public void setLayerStack(int layerStack) { 4393866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian checkNotReleased(); 4403866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian nativeSetLayerStack(mNativeObject, layerStack); 4413866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } 4423866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 443314405bf891904d1bbeeaf0f9fc387c1a1aded9aAndy McFadden /** 444314405bf891904d1bbeeaf0f9fc387c1a1aded9aAndy McFadden * Sets the opacity of the surface. Setting the flag is equivalent to creating the 445314405bf891904d1bbeeaf0f9fc387c1a1aded9aAndy McFadden * Surface with the {@link #OPAQUE} flag. 446314405bf891904d1bbeeaf0f9fc387c1a1aded9aAndy McFadden */ 447314405bf891904d1bbeeaf0f9fc387c1a1aded9aAndy McFadden public void setOpaque(boolean isOpaque) { 448314405bf891904d1bbeeaf0f9fc387c1a1aded9aAndy McFadden checkNotReleased(); 449314405bf891904d1bbeeaf0f9fc387c1a1aded9aAndy McFadden if (isOpaque) { 450314405bf891904d1bbeeaf0f9fc387c1a1aded9aAndy McFadden nativeSetFlags(mNativeObject, SURFACE_OPAQUE, SURFACE_OPAQUE); 451314405bf891904d1bbeeaf0f9fc387c1a1aded9aAndy McFadden } else { 452314405bf891904d1bbeeaf0f9fc387c1a1aded9aAndy McFadden nativeSetFlags(mNativeObject, 0, SURFACE_OPAQUE); 453314405bf891904d1bbeeaf0f9fc387c1a1aded9aAndy McFadden } 454314405bf891904d1bbeeaf0f9fc387c1a1aded9aAndy McFadden } 455314405bf891904d1bbeeaf0f9fc387c1a1aded9aAndy McFadden 4563866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian /* 4573866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * set display parameters. 4583866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * needs to be inside open/closeTransaction block 4593866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian */ 4603866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 4613866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian /** 4623866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * Describes the properties of a physical display known to surface flinger. 4633866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian */ 4643866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian public static final class PhysicalDisplayInfo { 4653866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian public int width; 4663866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian public int height; 4673866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian public float refreshRate; 4683866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian public float density; 4693866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian public float xDpi; 4703866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian public float yDpi; 4713866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian public boolean secure; 472e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden public long appVsyncOffsetNanos; 473e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden public long presentationDeadlineNanos; 4746a6bc216d15293886ad088bb0ca99aadb7df85dcJesse Hall 4753866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian public PhysicalDisplayInfo() { 4763866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } 4776a6bc216d15293886ad088bb0ca99aadb7df85dcJesse Hall 4783866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian public PhysicalDisplayInfo(PhysicalDisplayInfo other) { 4793866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian copyFrom(other); 4803866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } 4816a6bc216d15293886ad088bb0ca99aadb7df85dcJesse Hall 4823866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian @Override 4833866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian public boolean equals(Object o) { 4843866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian return o instanceof PhysicalDisplayInfo && equals((PhysicalDisplayInfo)o); 4853866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } 4866a6bc216d15293886ad088bb0ca99aadb7df85dcJesse Hall 4873866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian public boolean equals(PhysicalDisplayInfo other) { 4883866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian return other != null 4893866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian && width == other.width 4903866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian && height == other.height 4913866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian && refreshRate == other.refreshRate 4923866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian && density == other.density 4933866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian && xDpi == other.xDpi 4943866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian && yDpi == other.yDpi 495e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden && secure == other.secure 496e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden && appVsyncOffsetNanos == other.appVsyncOffsetNanos 497e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden && presentationDeadlineNanos == other.presentationDeadlineNanos; 4983866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } 4996a6bc216d15293886ad088bb0ca99aadb7df85dcJesse Hall 5003866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian @Override 5013866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian public int hashCode() { 5023866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian return 0; // don't care 5033866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } 5046a6bc216d15293886ad088bb0ca99aadb7df85dcJesse Hall 5053866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian public void copyFrom(PhysicalDisplayInfo other) { 5063866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian width = other.width; 5073866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian height = other.height; 5083866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian refreshRate = other.refreshRate; 5093866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian density = other.density; 5103866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian xDpi = other.xDpi; 5113866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian yDpi = other.yDpi; 5123866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian secure = other.secure; 513e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden appVsyncOffsetNanos = other.appVsyncOffsetNanos; 514e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden presentationDeadlineNanos = other.presentationDeadlineNanos; 5153866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } 5166a6bc216d15293886ad088bb0ca99aadb7df85dcJesse Hall 5173866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian // For debugging purposes 5183866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian @Override 5193866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian public String toString() { 5203866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian return "PhysicalDisplayInfo{" + width + " x " + height + ", " + refreshRate + " fps, " 5213866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian + "density " + density + ", " + xDpi + " x " + yDpi + " dpi, secure " + secure 522e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden + ", appVsyncOffset " + appVsyncOffsetNanos 523e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden + ", bufferDeadline " + presentationDeadlineNanos + "}"; 5243866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } 5253866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } 5263866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 527c55929a2a5686fe456b19cd54a73b8bde2a4332bPrashant Malani public static void setDisplayPowerMode(IBinder displayToken, int mode) { 5283866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian if (displayToken == null) { 5293866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian throw new IllegalArgumentException("displayToken must not be null"); 5303866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } 531c55929a2a5686fe456b19cd54a73b8bde2a4332bPrashant Malani nativeSetDisplayPowerMode(displayToken, mode); 5323866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } 5333866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 53400101052b5bf99a29acea3525864ed64b709c16cDan Stoza public static SurfaceControl.PhysicalDisplayInfo[] getDisplayConfigs(IBinder displayToken) { 5353866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian if (displayToken == null) { 5363866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian throw new IllegalArgumentException("displayToken must not be null"); 5373866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } 53800101052b5bf99a29acea3525864ed64b709c16cDan Stoza return nativeGetDisplayConfigs(displayToken); 53900101052b5bf99a29acea3525864ed64b709c16cDan Stoza } 54000101052b5bf99a29acea3525864ed64b709c16cDan Stoza 54100101052b5bf99a29acea3525864ed64b709c16cDan Stoza public static int getActiveConfig(IBinder displayToken) { 54200101052b5bf99a29acea3525864ed64b709c16cDan Stoza if (displayToken == null) { 54300101052b5bf99a29acea3525864ed64b709c16cDan Stoza throw new IllegalArgumentException("displayToken must not be null"); 54400101052b5bf99a29acea3525864ed64b709c16cDan Stoza } 54500101052b5bf99a29acea3525864ed64b709c16cDan Stoza return nativeGetActiveConfig(displayToken); 54600101052b5bf99a29acea3525864ed64b709c16cDan Stoza } 54700101052b5bf99a29acea3525864ed64b709c16cDan Stoza 54800101052b5bf99a29acea3525864ed64b709c16cDan Stoza public static boolean setActiveConfig(IBinder displayToken, int id) { 54900101052b5bf99a29acea3525864ed64b709c16cDan Stoza if (displayToken == null) { 55000101052b5bf99a29acea3525864ed64b709c16cDan Stoza throw new IllegalArgumentException("displayToken must not be null"); 5513866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } 55200101052b5bf99a29acea3525864ed64b709c16cDan Stoza return nativeSetActiveConfig(displayToken, id); 5533866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } 5543866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 5553866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian public static void setDisplayProjection(IBinder displayToken, 5563866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian int orientation, Rect layerStackRect, Rect displayRect) { 5573866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian if (displayToken == null) { 5583866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian throw new IllegalArgumentException("displayToken must not be null"); 5593866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } 5603866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian if (layerStackRect == null) { 5613866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian throw new IllegalArgumentException("layerStackRect must not be null"); 5623866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } 5633866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian if (displayRect == null) { 5643866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian throw new IllegalArgumentException("displayRect must not be null"); 5653866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } 5663866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian nativeSetDisplayProjection(displayToken, orientation, 5676a6bc216d15293886ad088bb0ca99aadb7df85dcJesse Hall layerStackRect.left, layerStackRect.top, layerStackRect.right, layerStackRect.bottom, 5683866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian displayRect.left, displayRect.top, displayRect.right, displayRect.bottom); 5693866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } 5703866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 5713866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian public static void setDisplayLayerStack(IBinder displayToken, int layerStack) { 5723866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian if (displayToken == null) { 5733866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian throw new IllegalArgumentException("displayToken must not be null"); 5743866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } 5753866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian nativeSetDisplayLayerStack(displayToken, layerStack); 5763866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } 5773866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 5783866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian public static void setDisplaySurface(IBinder displayToken, Surface surface) { 5793866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian if (displayToken == null) { 5803866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian throw new IllegalArgumentException("displayToken must not be null"); 5813866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } 582fc0ebd7d379ff63c00ebf78ca252fab5070213daJeff Brown 583fc0ebd7d379ff63c00ebf78ca252fab5070213daJeff Brown if (surface != null) { 584fc0ebd7d379ff63c00ebf78ca252fab5070213daJeff Brown synchronized (surface.mLock) { 585fc0ebd7d379ff63c00ebf78ca252fab5070213daJeff Brown nativeSetDisplaySurface(displayToken, surface.mNativeObject); 586fc0ebd7d379ff63c00ebf78ca252fab5070213daJeff Brown } 587fc0ebd7d379ff63c00ebf78ca252fab5070213daJeff Brown } else { 588fc0ebd7d379ff63c00ebf78ca252fab5070213daJeff Brown nativeSetDisplaySurface(displayToken, 0); 589fc0ebd7d379ff63c00ebf78ca252fab5070213daJeff Brown } 5903866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } 5913866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 59201e840ff9441e005153d799e71d65b38bcb21902Michael Wright public static void setDisplaySize(IBinder displayToken, int width, int height) { 59301e840ff9441e005153d799e71d65b38bcb21902Michael Wright if (displayToken == null) { 59401e840ff9441e005153d799e71d65b38bcb21902Michael Wright throw new IllegalArgumentException("displayToken must not be null"); 59501e840ff9441e005153d799e71d65b38bcb21902Michael Wright } 59601e840ff9441e005153d799e71d65b38bcb21902Michael Wright if (width <= 0 || height <= 0) { 59701e840ff9441e005153d799e71d65b38bcb21902Michael Wright throw new IllegalArgumentException("width and height must be positive"); 59801e840ff9441e005153d799e71d65b38bcb21902Michael Wright } 59901e840ff9441e005153d799e71d65b38bcb21902Michael Wright 60001e840ff9441e005153d799e71d65b38bcb21902Michael Wright nativeSetDisplaySize(displayToken, width, height); 60101e840ff9441e005153d799e71d65b38bcb21902Michael Wright } 60201e840ff9441e005153d799e71d65b38bcb21902Michael Wright 6033866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian public static IBinder createDisplay(String name, boolean secure) { 6043866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian if (name == null) { 6053866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian throw new IllegalArgumentException("name must not be null"); 6063866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } 6073866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian return nativeCreateDisplay(name, secure); 6083866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } 6093866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 6106a6bc216d15293886ad088bb0ca99aadb7df85dcJesse Hall public static void destroyDisplay(IBinder displayToken) { 6116a6bc216d15293886ad088bb0ca99aadb7df85dcJesse Hall if (displayToken == null) { 6126a6bc216d15293886ad088bb0ca99aadb7df85dcJesse Hall throw new IllegalArgumentException("displayToken must not be null"); 6136a6bc216d15293886ad088bb0ca99aadb7df85dcJesse Hall } 6146a6bc216d15293886ad088bb0ca99aadb7df85dcJesse Hall nativeDestroyDisplay(displayToken); 6156a6bc216d15293886ad088bb0ca99aadb7df85dcJesse Hall } 6166a6bc216d15293886ad088bb0ca99aadb7df85dcJesse Hall 6173866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian public static IBinder getBuiltInDisplay(int builtInDisplayId) { 6183866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian return nativeGetBuiltInDisplay(builtInDisplayId); 6193866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } 6203866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 6210449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian /** 6220449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian * Copy the current screen contents into the provided {@link Surface} 6230449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian * 6240449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian * @param display The display to take the screenshot of. 6250449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian * @param consumer The {@link Surface} to take the screenshot into. 6260449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian * @param width The desired width of the returned bitmap; the raw 6270449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian * screen will be scaled down to this size. 6280449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian * @param height The desired height of the returned bitmap; the raw 6290449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian * screen will be scaled down to this size. 6300449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian * @param minLayer The lowest (bottom-most Z order) surface layer to 6310449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian * include in the screenshot. 6320449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian * @param maxLayer The highest (top-most Z order) surface layer to 6330449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian * include in the screenshot. 63416ec12ae77fdd2b09ea0ea0885ac52f11bd32c59Dan Stoza * @param useIdentityTransform Replace whatever transformation (rotation, 63516ec12ae77fdd2b09ea0ea0885ac52f11bd32c59Dan Stoza * scaling, translation) the surface layers are currently using with the 63616ec12ae77fdd2b09ea0ea0885ac52f11bd32c59Dan Stoza * identity transformation while taking the screenshot. 6370449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian */ 6380449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian public static void screenshot(IBinder display, Surface consumer, 63916ec12ae77fdd2b09ea0ea0885ac52f11bd32c59Dan Stoza int width, int height, int minLayer, int maxLayer, 64016ec12ae77fdd2b09ea0ea0885ac52f11bd32c59Dan Stoza boolean useIdentityTransform) { 6419890e341bf9d565309cd7db5e6c4194c66c0a1d8Dan Stoza screenshot(display, consumer, new Rect(), width, height, minLayer, maxLayer, 6429890e341bf9d565309cd7db5e6c4194c66c0a1d8Dan Stoza false, useIdentityTransform); 6430449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian } 6440449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian 6450449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian /** 6460449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian * Copy the current screen contents into the provided {@link Surface} 6470449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian * 6480449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian * @param display The display to take the screenshot of. 6490449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian * @param consumer The {@link Surface} to take the screenshot into. 6500449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian * @param width The desired width of the returned bitmap; the raw 6510449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian * screen will be scaled down to this size. 6520449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian * @param height The desired height of the returned bitmap; the raw 6530449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian * screen will be scaled down to this size. 6540449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian */ 6550449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian public static void screenshot(IBinder display, Surface consumer, 6560449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian int width, int height) { 6579890e341bf9d565309cd7db5e6c4194c66c0a1d8Dan Stoza screenshot(display, consumer, new Rect(), width, height, 0, 0, true, false); 6580449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian } 6590449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian 6600449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian /** 6610449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian * Copy the current screen contents into the provided {@link Surface} 6620449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian * 6630449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian * @param display The display to take the screenshot of. 6640449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian * @param consumer The {@link Surface} to take the screenshot into. 6650449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian */ 6660449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian public static void screenshot(IBinder display, Surface consumer) { 6679890e341bf9d565309cd7db5e6c4194c66c0a1d8Dan Stoza screenshot(display, consumer, new Rect(), 0, 0, 0, 0, true, false); 6680449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian } 6690449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian 6703866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian /** 6713866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * Copy the current screen contents into a bitmap and return it. 6723866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * 6730449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian * CAVEAT: Versions of screenshot that return a {@link Bitmap} can 6740449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian * be extremely slow; avoid use unless absolutely necessary; prefer 6750449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian * the versions that use a {@link Surface} instead, such as 6760449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian * {@link SurfaceControl#screenshot(IBinder, Surface)}. 6770449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian * 6789890e341bf9d565309cd7db5e6c4194c66c0a1d8Dan Stoza * @param sourceCrop The portion of the screen to capture into the Bitmap; 6799890e341bf9d565309cd7db5e6c4194c66c0a1d8Dan Stoza * caller may pass in 'new Rect()' if no cropping is desired. 6803866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * @param width The desired width of the returned bitmap; the raw 6813866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * screen will be scaled down to this size. 6823866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * @param height The desired height of the returned bitmap; the raw 6833866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * screen will be scaled down to this size. 6843866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * @param minLayer The lowest (bottom-most Z order) surface layer to 6853866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * include in the screenshot. 6863866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * @param maxLayer The highest (top-most Z order) surface layer to 6873866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * include in the screenshot. 68816ec12ae77fdd2b09ea0ea0885ac52f11bd32c59Dan Stoza * @param useIdentityTransform Replace whatever transformation (rotation, 68916ec12ae77fdd2b09ea0ea0885ac52f11bd32c59Dan Stoza * scaling, translation) the surface layers are currently using with the 69016ec12ae77fdd2b09ea0ea0885ac52f11bd32c59Dan Stoza * identity transformation while taking the screenshot. 6911d13406538b79785d2d0928689b8d5037e851ecfRiley Andrews * @param rotation Apply a custom clockwise rotation to the screenshot, i.e. 6921d13406538b79785d2d0928689b8d5037e851ecfRiley Andrews * Surface.ROTATION_0,90,180,270. Surfaceflinger will always take 6931d13406538b79785d2d0928689b8d5037e851ecfRiley Andrews * screenshots in its native portrait orientation by default, so this is 6941d13406538b79785d2d0928689b8d5037e851ecfRiley Andrews * useful for returning screenshots that are independent of device 6951d13406538b79785d2d0928689b8d5037e851ecfRiley Andrews * orientation. 6963866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * @return Returns a Bitmap containing the screen contents, or null 69749ff2c615e53cd9c3e8b5e4792a68026fb079671Mathias Agopian * if an error occurs. Make sure to call Bitmap.recycle() as soon as 69849ff2c615e53cd9c3e8b5e4792a68026fb079671Mathias Agopian * possible, once its content is not needed anymore. 6993866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian */ 7009890e341bf9d565309cd7db5e6c4194c66c0a1d8Dan Stoza public static Bitmap screenshot(Rect sourceCrop, int width, int height, 7011d13406538b79785d2d0928689b8d5037e851ecfRiley Andrews int minLayer, int maxLayer, boolean useIdentityTransform, 7021d13406538b79785d2d0928689b8d5037e851ecfRiley Andrews int rotation) { 7033866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian // TODO: should take the display as a parameter 7040449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian IBinder displayToken = SurfaceControl.getBuiltInDisplay( 7050449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian SurfaceControl.BUILT_IN_DISPLAY_ID_MAIN); 7069890e341bf9d565309cd7db5e6c4194c66c0a1d8Dan Stoza return nativeScreenshot(displayToken, sourceCrop, width, height, 7071d13406538b79785d2d0928689b8d5037e851ecfRiley Andrews minLayer, maxLayer, false, useIdentityTransform, rotation); 7083866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } 7093866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 7103866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian /** 7111376d600d8e0eefdbc0aa11d398cf7517fc77129Svetoslav * Like {@link SurfaceControl#screenshot(int, int, int, int, boolean)} but 7121376d600d8e0eefdbc0aa11d398cf7517fc77129Svetoslav * includes all Surfaces in the screenshot. 71349ff2c615e53cd9c3e8b5e4792a68026fb079671Mathias Agopian * 71449ff2c615e53cd9c3e8b5e4792a68026fb079671Mathias Agopian * @param width The desired width of the returned bitmap; the raw 71549ff2c615e53cd9c3e8b5e4792a68026fb079671Mathias Agopian * screen will be scaled down to this size. 71649ff2c615e53cd9c3e8b5e4792a68026fb079671Mathias Agopian * @param height The desired height of the returned bitmap; the raw 71749ff2c615e53cd9c3e8b5e4792a68026fb079671Mathias Agopian * screen will be scaled down to this size. 71849ff2c615e53cd9c3e8b5e4792a68026fb079671Mathias Agopian * @return Returns a Bitmap containing the screen contents, or null 71949ff2c615e53cd9c3e8b5e4792a68026fb079671Mathias Agopian * if an error occurs. Make sure to call Bitmap.recycle() as soon as 72049ff2c615e53cd9c3e8b5e4792a68026fb079671Mathias Agopian * possible, once its content is not needed anymore. 7213866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian */ 7223866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian public static Bitmap screenshot(int width, int height) { 7233866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian // TODO: should take the display as a parameter 7240449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian IBinder displayToken = SurfaceControl.getBuiltInDisplay( 7250449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian SurfaceControl.BUILT_IN_DISPLAY_ID_MAIN); 7261d13406538b79785d2d0928689b8d5037e851ecfRiley Andrews return nativeScreenshot(displayToken, new Rect(), width, height, 0, 0, true, 7271d13406538b79785d2d0928689b8d5037e851ecfRiley Andrews false, Surface.ROTATION_0); 7283866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } 7296a6bc216d15293886ad088bb0ca99aadb7df85dcJesse Hall 7309890e341bf9d565309cd7db5e6c4194c66c0a1d8Dan Stoza private static void screenshot(IBinder display, Surface consumer, Rect sourceCrop, 73116ec12ae77fdd2b09ea0ea0885ac52f11bd32c59Dan Stoza int width, int height, int minLayer, int maxLayer, boolean allLayers, 73216ec12ae77fdd2b09ea0ea0885ac52f11bd32c59Dan Stoza boolean useIdentityTransform) { 7330449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian if (display == null) { 7340449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian throw new IllegalArgumentException("displayToken must not be null"); 7350449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian } 7360449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian if (consumer == null) { 7370449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian throw new IllegalArgumentException("consumer must not be null"); 7380449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian } 7399890e341bf9d565309cd7db5e6c4194c66c0a1d8Dan Stoza nativeScreenshot(display, consumer, sourceCrop, width, height, 7409890e341bf9d565309cd7db5e6c4194c66c0a1d8Dan Stoza minLayer, maxLayer, allLayers, useIdentityTransform); 7410449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian } 7423866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian} 743