android_view_SurfaceControl.cpp revision 0449a40586b45ee05f760802020dc2f8a6e0506b
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 Agopian#define LOG_TAG "SurfaceControl" 183866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 193866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian#include <stdio.h> 203866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 213866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian#include "jni.h" 223866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian#include "JNIHelp.h" 233866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 243866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian#include "android_os_Parcel.h" 253866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian#include "android_util_Binder.h" 263866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian#include "android/graphics/GraphicsJNI.h" 273866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian#include "android/graphics/Region.h" 283866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 293866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian#include <android_runtime/AndroidRuntime.h> 300449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian#include <android_runtime/android_view_Surface.h> 313866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian#include <android_runtime/android_view_SurfaceSession.h> 323866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 333866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian#include <gui/Surface.h> 343866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian#include <gui/SurfaceComposerClient.h> 353866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 363866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian#include <ui/DisplayInfo.h> 373866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian#include <ui/Rect.h> 383866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian#include <ui/Region.h> 393866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 403866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian#include <utils/Log.h> 413866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 423866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian#include <ScopedUtfChars.h> 433866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 443866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian// ---------------------------------------------------------------------------- 453866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 463866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopiannamespace android { 473866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 483866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopianstatic const char* const OutOfResourcesException = 493866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian "android/view/Surface$OutOfResourcesException"; 503866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 513866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopianstatic struct { 523866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian jfieldID width; 533866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian jfieldID height; 543866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian jfieldID refreshRate; 553866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian jfieldID density; 563866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian jfieldID xDpi; 573866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian jfieldID yDpi; 583866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian jfieldID secure; 593866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian} gPhysicalDisplayInfoClassInfo; 603866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 613866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 623866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopianclass ScreenshotPixelRef : public SkPixelRef { 633866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopianpublic: 643866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian ScreenshotPixelRef(SkColorTable* ctable) { 653866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian fCTable = ctable; 663866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian SkSafeRef(ctable); 673866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian setImmutable(); 683866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } 693866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 703866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian virtual ~ScreenshotPixelRef() { 713866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian SkSafeUnref(fCTable); 723866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } 733866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 743866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian status_t update(const sp<IBinder>& display, int width, int height, 753866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian int minLayer, int maxLayer, bool allLayers) { 763866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian status_t res = (width > 0 && height > 0) 773866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian ? (allLayers 783866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian ? mScreenshot.update(display, width, height) 793866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian : mScreenshot.update(display, width, height, minLayer, maxLayer)) 803866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian : mScreenshot.update(display); 813866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian if (res != NO_ERROR) { 823866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian return res; 833866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } 843866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 853866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian return NO_ERROR; 863866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } 873866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 883866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian uint32_t getWidth() const { 893866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian return mScreenshot.getWidth(); 903866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } 913866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 923866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian uint32_t getHeight() const { 933866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian return mScreenshot.getHeight(); 943866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } 953866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 963866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian uint32_t getStride() const { 973866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian return mScreenshot.getStride(); 983866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } 993866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 1003866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian uint32_t getFormat() const { 1013866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian return mScreenshot.getFormat(); 1023866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } 1033866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 1043866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopianprotected: 1053866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian // overrides from SkPixelRef 1063866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian virtual void* onLockPixels(SkColorTable** ct) { 1073866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian *ct = fCTable; 1083866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian return (void*)mScreenshot.getPixels(); 1093866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } 1103866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 1113866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian virtual void onUnlockPixels() { 1123866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } 1133866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 114e32e2b343dca94086badfe34080fb24b4215db27Kristian Monsen SK_DECLARE_UNFLATTENABLE_OBJECT() 1153866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopianprivate: 1163866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian ScreenshotClient mScreenshot; 1173866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian SkColorTable* fCTable; 1183866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 1193866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian typedef SkPixelRef INHERITED; 1203866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian}; 1213866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 1223866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 1233866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian// ---------------------------------------------------------------------------- 1243866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 12529479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopianstatic jint nativeCreate(JNIEnv* env, jclass clazz, jobject sessionObj, 1263866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian jstring nameStr, jint w, jint h, jint format, jint flags) { 1273866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian ScopedUtfChars name(env, nameStr); 1283866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian sp<SurfaceComposerClient> client(android_view_SurfaceSession_getClient(env, sessionObj)); 1293866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian sp<SurfaceControl> surface = client->createSurface( 1303866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian String8(name.c_str()), w, h, format, flags); 1313866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian if (surface == NULL) { 1323866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian jniThrowException(env, OutOfResourcesException, NULL); 1333866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian return 0; 1343866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } 13529479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian surface->incStrong(clazz); 1363866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian return int(surface.get()); 1373866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian} 1383866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 13929479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopianstatic void nativeRelease(JNIEnv* env, jclass clazz, jint nativeObject) { 1403866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian sp<SurfaceControl> ctrl(reinterpret_cast<SurfaceControl *>(nativeObject)); 14129479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian ctrl->decStrong(clazz); 1423866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian} 1433866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 14429479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopianstatic void nativeDestroy(JNIEnv* env, jclass clazz, jint nativeObject) { 1453866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian sp<SurfaceControl> ctrl(reinterpret_cast<SurfaceControl *>(nativeObject)); 1463866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian ctrl->clear(); 14729479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian ctrl->decStrong(clazz); 1483866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian} 1493866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 1503866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopianstatic inline SkBitmap::Config convertPixelFormat(PixelFormat format) { 1513866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian /* note: if PIXEL_FORMAT_RGBX_8888 means that all alpha bytes are 0xFF, then 1523866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian we can map to SkBitmap::kARGB_8888_Config, and optionally call 1533866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian bitmap.setIsOpaque(true) on the resulting SkBitmap (as an accelerator) 1543866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian */ 1553866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian switch (format) { 1563866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian case PIXEL_FORMAT_RGBX_8888: return SkBitmap::kARGB_8888_Config; 1573866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian case PIXEL_FORMAT_RGBA_8888: return SkBitmap::kARGB_8888_Config; 1583866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian case PIXEL_FORMAT_RGBA_4444: return SkBitmap::kARGB_4444_Config; 1593866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian case PIXEL_FORMAT_RGB_565: return SkBitmap::kRGB_565_Config; 1603866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian case PIXEL_FORMAT_A_8: return SkBitmap::kA8_Config; 1613866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian default: return SkBitmap::kNo_Config; 1623866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } 1633866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian} 1643866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 1650449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopianstatic jobject nativeScreenshotBitmap(JNIEnv* env, jclass clazz, jobject displayTokenObj, 1663866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian jint width, jint height, jint minLayer, jint maxLayer, bool allLayers) { 1673866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian sp<IBinder> displayToken = ibinderForJavaObject(env, displayTokenObj); 1683866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian if (displayToken == NULL) { 1693866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian return NULL; 1703866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } 1713866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 1723866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian ScreenshotPixelRef* pixels = new ScreenshotPixelRef(NULL); 1733866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian if (pixels->update(displayToken, width, height, 1743866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian minLayer, maxLayer, allLayers) != NO_ERROR) { 1753866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian delete pixels; 1763866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian return NULL; 1773866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } 1783866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 1793866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian uint32_t w = pixels->getWidth(); 1803866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian uint32_t h = pixels->getHeight(); 1813866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian uint32_t s = pixels->getStride(); 1823866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian uint32_t f = pixels->getFormat(); 1833866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian ssize_t bpr = s * android::bytesPerPixel(f); 1843866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 1853866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian SkBitmap* bitmap = new SkBitmap(); 1863866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian bitmap->setConfig(convertPixelFormat(f), w, h, bpr); 1873866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian if (f == PIXEL_FORMAT_RGBX_8888) { 1883866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian bitmap->setIsOpaque(true); 1893866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } 1903866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 1913866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian if (w > 0 && h > 0) { 1923866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian bitmap->setPixelRef(pixels)->unref(); 1933866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian bitmap->lockPixels(); 1943866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } else { 1953866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian // be safe with an empty bitmap. 1963866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian delete pixels; 1973866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian bitmap->setPixels(NULL); 1983866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } 1993866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 2003866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian return GraphicsJNI::createBitmap(env, bitmap, false, NULL); 2013866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian} 2023866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 2030449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopianstatic void nativeScreenshot(JNIEnv* env, jclass clazz, 2040449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian jobject displayTokenObj, jobject surfaceObj, 2050449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian jint width, jint height, jint minLayer, jint maxLayer, bool allLayers) { 2060449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian sp<IBinder> displayToken = ibinderForJavaObject(env, displayTokenObj); 2070449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian if (displayToken != NULL) { 2080449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian sp<Surface> consumer = android_view_Surface_getSurface(env, surfaceObj); 2090449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian if (consumer != NULL) { 2100449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian if (allLayers) { 2110449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian minLayer = 0; 2120449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian maxLayer = -1; 2130449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian } 2140449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian ScreenshotClient::capture( 2150449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian displayToken, consumer->getIGraphicBufferProducer(), 2160449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian width, height, uint32_t(minLayer), uint32_t(maxLayer)); 2170449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian } 2180449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian } 2190449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian} 2200449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian 2213866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopianstatic void nativeOpenTransaction(JNIEnv* env, jclass clazz) { 2223866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian SurfaceComposerClient::openGlobalTransaction(); 2233866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian} 2243866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 2253866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopianstatic void nativeCloseTransaction(JNIEnv* env, jclass clazz) { 2263866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian SurfaceComposerClient::closeGlobalTransaction(); 2273866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian} 2283866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 2293866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopianstatic void nativeSetAnimationTransaction(JNIEnv* env, jclass clazz) { 2303866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian SurfaceComposerClient::setAnimationTransaction(); 2313866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian} 2323866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 23329479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopianstatic void nativeSetLayer(JNIEnv* env, jclass clazz, jint nativeObject, jint zorder) { 2343866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl *>(nativeObject); 2353866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian status_t err = ctrl->setLayer(zorder); 2363866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian if (err < 0 && err != NO_INIT) { 2373866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian doThrowIAE(env); 2383866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } 2393866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian} 2403866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 24129479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopianstatic void nativeSetPosition(JNIEnv* env, jclass clazz, jint nativeObject, jfloat x, jfloat y) { 2423866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl *>(nativeObject); 2433866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian status_t err = ctrl->setPosition(x, y); 2443866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian if (err < 0 && err != NO_INIT) { 2453866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian doThrowIAE(env); 2463866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } 2473866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian} 2483866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 24929479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopianstatic void nativeSetSize(JNIEnv* env, jclass clazz, jint nativeObject, jint w, jint h) { 2503866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl *>(nativeObject); 2513866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian status_t err = ctrl->setSize(w, h); 2523866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian if (err < 0 && err != NO_INIT) { 2533866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian doThrowIAE(env); 2543866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } 2553866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian} 2563866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 25729479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopianstatic void nativeSetFlags(JNIEnv* env, jclass clazz, jint nativeObject, jint flags, jint mask) { 2583866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl *>(nativeObject); 2593866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian status_t err = ctrl->setFlags(flags, mask); 2603866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian if (err < 0 && err != NO_INIT) { 2613866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian doThrowIAE(env); 2623866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } 2633866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian} 2643866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 26529479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopianstatic void nativeSetTransparentRegionHint(JNIEnv* env, jclass clazz, jint nativeObject, jobject regionObj) { 2663866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl *>(nativeObject); 2673866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian SkRegion* region = android_graphics_Region_getSkRegion(env, regionObj); 2683866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian if (!region) { 2693866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian doThrowIAE(env); 2703866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian return; 2713866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } 2723866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 2733866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian const SkIRect& b(region->getBounds()); 2743866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian Region reg(Rect(b.fLeft, b.fTop, b.fRight, b.fBottom)); 2753866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian if (region->isComplex()) { 2763866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian SkRegion::Iterator it(*region); 2773866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian while (!it.done()) { 2783866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian const SkIRect& r(it.rect()); 2793866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian reg.addRectUnchecked(r.fLeft, r.fTop, r.fRight, r.fBottom); 2803866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian it.next(); 2813866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } 2823866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } 2833866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 2843866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian status_t err = ctrl->setTransparentRegionHint(reg); 2853866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian if (err < 0 && err != NO_INIT) { 2863866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian doThrowIAE(env); 2873866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } 2883866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian} 2893866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 29029479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopianstatic void nativeSetAlpha(JNIEnv* env, jclass clazz, jint nativeObject, jfloat alpha) { 2913866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl *>(nativeObject); 2923866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian status_t err = ctrl->setAlpha(alpha); 2933866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian if (err < 0 && err != NO_INIT) { 2943866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian doThrowIAE(env); 2953866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } 2963866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian} 2973866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 29829479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopianstatic void nativeSetMatrix(JNIEnv* env, jclass clazz, jint nativeObject, 2993866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian jfloat dsdx, jfloat dtdx, jfloat dsdy, jfloat dtdy) { 3003866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl *>(nativeObject); 3013866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian status_t err = ctrl->setMatrix(dsdx, dtdx, dsdy, dtdy); 3023866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian if (err < 0 && err != NO_INIT) { 3033866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian doThrowIAE(env); 3043866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } 3053866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian} 3063866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 30729479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopianstatic void nativeSetWindowCrop(JNIEnv* env, jclass clazz, jint nativeObject, 3083866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian jint l, jint t, jint r, jint b) { 3093866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl *>(nativeObject); 3103866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian Rect crop(l, t, r, b); 3113866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian status_t err = ctrl->setCrop(crop); 3123866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian if (err < 0 && err != NO_INIT) { 3133866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian doThrowIAE(env); 3143866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } 3153866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian} 3163866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 31729479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopianstatic void nativeSetLayerStack(JNIEnv* env, jclass clazz, jint nativeObject, jint layerStack) { 3183866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl *>(nativeObject); 3193866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian status_t err = ctrl->setLayerStack(layerStack); 3203866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian if (err < 0 && err != NO_INIT) { 3213866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian doThrowIAE(env); 3223866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } 3233866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian} 3243866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 3253866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopianstatic jobject nativeGetBuiltInDisplay(JNIEnv* env, jclass clazz, jint id) { 3263866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian sp<IBinder> token(SurfaceComposerClient::getBuiltInDisplay(id)); 3273866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian return javaObjectForIBinder(env, token); 3283866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian} 3293866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 3303866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopianstatic jobject nativeCreateDisplay(JNIEnv* env, jclass clazz, jstring nameObj, 3313866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian jboolean secure) { 3323866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian ScopedUtfChars name(env, nameObj); 3333866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian sp<IBinder> token(SurfaceComposerClient::createDisplay( 3343866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian String8(name.c_str()), bool(secure))); 3353866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian return javaObjectForIBinder(env, token); 3363866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian} 3373866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 3383866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopianstatic void nativeSetDisplaySurface(JNIEnv* env, jclass clazz, 3393866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian jobject tokenObj, jint nativeSurfaceObject) { 3403866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian sp<IBinder> token(ibinderForJavaObject(env, tokenObj)); 3413866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian if (token == NULL) return; 342ffddc9b8045235a493ec506965ae4892601eb23dMathias Agopian sp<IGraphicBufferProducer> bufferProducer; 3433866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian sp<Surface> sur(reinterpret_cast<Surface *>(nativeSurfaceObject)); 344ffddc9b8045235a493ec506965ae4892601eb23dMathias Agopian if (sur != NULL) { 345ffddc9b8045235a493ec506965ae4892601eb23dMathias Agopian bufferProducer = sur->getIGraphicBufferProducer(); 346ffddc9b8045235a493ec506965ae4892601eb23dMathias Agopian } 3473866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian SurfaceComposerClient::setDisplaySurface(token, bufferProducer); 3483866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian} 3493866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 3503866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopianstatic void nativeSetDisplayLayerStack(JNIEnv* env, jclass clazz, 3513866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian jobject tokenObj, jint layerStack) { 3523866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian sp<IBinder> token(ibinderForJavaObject(env, tokenObj)); 3533866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian if (token == NULL) return; 3543866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 3553866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian SurfaceComposerClient::setDisplayLayerStack(token, layerStack); 3563866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian} 3573866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 3583866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopianstatic void nativeSetDisplayProjection(JNIEnv* env, jclass clazz, 3593866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian jobject tokenObj, jint orientation, 3603866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian jint layerStackRect_left, jint layerStackRect_top, jint layerStackRect_right, jint layerStackRect_bottom, 3613866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian jint displayRect_left, jint displayRect_top, jint displayRect_right, jint displayRect_bottom) { 3623866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian sp<IBinder> token(ibinderForJavaObject(env, tokenObj)); 3633866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian if (token == NULL) return; 3643866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian Rect layerStackRect(layerStackRect_left, layerStackRect_top, layerStackRect_right, layerStackRect_bottom); 3653866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian Rect displayRect(displayRect_left, displayRect_top, displayRect_right, displayRect_bottom); 3663866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian SurfaceComposerClient::setDisplayProjection(token, orientation, layerStackRect, displayRect); 3673866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian} 3683866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 3693866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopianstatic jboolean nativeGetDisplayInfo(JNIEnv* env, jclass clazz, 3703866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian jobject tokenObj, jobject infoObj) { 3713866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian sp<IBinder> token(ibinderForJavaObject(env, tokenObj)); 3723866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian if (token == NULL) return JNI_FALSE; 3733866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 3743866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian DisplayInfo info; 3753866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian if (SurfaceComposerClient::getDisplayInfo(token, &info)) { 3763866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian return JNI_FALSE; 3773866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } 3783866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 3793866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian env->SetIntField(infoObj, gPhysicalDisplayInfoClassInfo.width, info.w); 3803866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian env->SetIntField(infoObj, gPhysicalDisplayInfoClassInfo.height, info.h); 3813866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian env->SetFloatField(infoObj, gPhysicalDisplayInfoClassInfo.refreshRate, info.fps); 3823866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian env->SetFloatField(infoObj, gPhysicalDisplayInfoClassInfo.density, info.density); 3833866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian env->SetFloatField(infoObj, gPhysicalDisplayInfoClassInfo.xDpi, info.xdpi); 3843866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian env->SetFloatField(infoObj, gPhysicalDisplayInfoClassInfo.yDpi, info.ydpi); 3853866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian env->SetBooleanField(infoObj, gPhysicalDisplayInfoClassInfo.secure, info.secure); 3863866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian return JNI_TRUE; 3873866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian} 3883866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 3893866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopianstatic void nativeBlankDisplay(JNIEnv* env, jclass clazz, jobject tokenObj) { 3903866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian sp<IBinder> token(ibinderForJavaObject(env, tokenObj)); 3913866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian if (token == NULL) return; 3923866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 3933866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian ALOGD_IF_SLOW(100, "Excessive delay in blankDisplay() while turning screen off"); 3943866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian SurfaceComposerClient::blankDisplay(token); 3953866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian} 3963866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 3973866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopianstatic void nativeUnblankDisplay(JNIEnv* env, jclass clazz, jobject tokenObj) { 3983866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian sp<IBinder> token(ibinderForJavaObject(env, tokenObj)); 3993866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian if (token == NULL) return; 4003866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 4013866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian ALOGD_IF_SLOW(100, "Excessive delay in unblankDisplay() while turning screen on"); 4023866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian SurfaceComposerClient::unblankDisplay(token); 4033866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian} 4043866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 4053866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian// ---------------------------------------------------------------------------- 4063866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 4073866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopianstatic JNINativeMethod sSurfaceControlMethods[] = { 4083866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian {"nativeCreate", "(Landroid/view/SurfaceSession;Ljava/lang/String;IIII)I", 4093866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian (void*)nativeCreate }, 4103866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian {"nativeRelease", "(I)V", 4113866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian (void*)nativeRelease }, 4123866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian {"nativeDestroy", "(I)V", 4133866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian (void*)nativeDestroy }, 4143866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian {"nativeScreenshot", "(Landroid/os/IBinder;IIIIZ)Landroid/graphics/Bitmap;", 4150449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian (void*)nativeScreenshotBitmap }, 4160449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian {"nativeScreenshot", "(Landroid/os/IBinder;Landroid/view/Surface;IIIIZ)V", 4173866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian (void*)nativeScreenshot }, 4183866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian {"nativeOpenTransaction", "()V", 4193866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian (void*)nativeOpenTransaction }, 4203866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian {"nativeCloseTransaction", "()V", 4213866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian (void*)nativeCloseTransaction }, 4223866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian {"nativeSetAnimationTransaction", "()V", 4233866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian (void*)nativeSetAnimationTransaction }, 4243866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian {"nativeSetLayer", "(II)V", 4253866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian (void*)nativeSetLayer }, 4263866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian {"nativeSetPosition", "(IFF)V", 4273866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian (void*)nativeSetPosition }, 4283866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian {"nativeSetSize", "(III)V", 4293866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian (void*)nativeSetSize }, 4303866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian {"nativeSetTransparentRegionHint", "(ILandroid/graphics/Region;)V", 4313866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian (void*)nativeSetTransparentRegionHint }, 4323866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian {"nativeSetAlpha", "(IF)V", 4333866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian (void*)nativeSetAlpha }, 4343866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian {"nativeSetMatrix", "(IFFFF)V", 4353866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian (void*)nativeSetMatrix }, 4363866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian {"nativeSetFlags", "(III)V", 4373866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian (void*)nativeSetFlags }, 4383866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian {"nativeSetWindowCrop", "(IIIII)V", 4393866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian (void*)nativeSetWindowCrop }, 4403866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian {"nativeSetLayerStack", "(II)V", 4413866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian (void*)nativeSetLayerStack }, 4423866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian {"nativeGetBuiltInDisplay", "(I)Landroid/os/IBinder;", 4433866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian (void*)nativeGetBuiltInDisplay }, 4443866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian {"nativeCreateDisplay", "(Ljava/lang/String;Z)Landroid/os/IBinder;", 4453866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian (void*)nativeCreateDisplay }, 4463866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian {"nativeSetDisplaySurface", "(Landroid/os/IBinder;I)V", 4473866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian (void*)nativeSetDisplaySurface }, 4483866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian {"nativeSetDisplayLayerStack", "(Landroid/os/IBinder;I)V", 4493866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian (void*)nativeSetDisplayLayerStack }, 4503866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian {"nativeSetDisplayProjection", "(Landroid/os/IBinder;IIIIIIIII)V", 4513866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian (void*)nativeSetDisplayProjection }, 4523866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian {"nativeGetDisplayInfo", "(Landroid/os/IBinder;Landroid/view/SurfaceControl$PhysicalDisplayInfo;)Z", 4533866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian (void*)nativeGetDisplayInfo }, 4543866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian {"nativeBlankDisplay", "(Landroid/os/IBinder;)V", 4553866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian (void*)nativeBlankDisplay }, 4563866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian {"nativeUnblankDisplay", "(Landroid/os/IBinder;)V", 4573866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian (void*)nativeUnblankDisplay }, 4583866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian}; 4593866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 4603866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopianint register_android_view_SurfaceControl(JNIEnv* env) 4613866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian{ 4623866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian int err = AndroidRuntime::registerNativeMethods(env, "android/view/SurfaceControl", 4633866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian sSurfaceControlMethods, NELEM(sSurfaceControlMethods)); 4643866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 4653866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian jclass clazz = env->FindClass("android/view/SurfaceControl$PhysicalDisplayInfo"); 4663866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian gPhysicalDisplayInfoClassInfo.width = env->GetFieldID(clazz, "width", "I"); 4673866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian gPhysicalDisplayInfoClassInfo.height = env->GetFieldID(clazz, "height", "I"); 4683866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian gPhysicalDisplayInfoClassInfo.refreshRate = env->GetFieldID(clazz, "refreshRate", "F"); 4693866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian gPhysicalDisplayInfoClassInfo.density = env->GetFieldID(clazz, "density", "F"); 4703866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian gPhysicalDisplayInfoClassInfo.xDpi = env->GetFieldID(clazz, "xDpi", "F"); 4713866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian gPhysicalDisplayInfoClassInfo.yDpi = env->GetFieldID(clazz, "yDpi", "F"); 4723866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian gPhysicalDisplayInfoClassInfo.secure = env->GetFieldID(clazz, "secure", "Z"); 4733866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian return err; 4743866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian} 4753866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 4763866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian}; 477