android_view_SurfaceControl.cpp revision b1d90c8f60f71422196c337f1d078b68867f5710
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    }
135b1d90c8f60f71422196c337f1d078b68867f5710Mathias Agopian    surface->incStrong((void *)nativeCreate);
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));
141b1d90c8f60f71422196c337f1d078b68867f5710Mathias Agopian    ctrl->decStrong((void *)nativeCreate);
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();
147b1d90c8f60f71422196c337f1d078b68867f5710Mathias Agopian    ctrl->decStrong((void *)nativeCreate);
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