android_view_Surface.cpp revision 7bbf8163fb83afc54b353a8def52bfb87ecce047
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17fae5cb2b356a1fef172b43066180a7ab4c32dbacMathias Agopian#define LOG_TAG "Surface"
18fae5cb2b356a1fef172b43066180a7ab4c32dbacMathias Agopian
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdio.h>
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown#include "android_os_Parcel.h"
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "android_util_Binder.h"
23a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn#include "android/graphics/GraphicsJNI.h"
2464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown#include "android/graphics/Region.h"
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn#include <binder/IMemory.h>
278335f1ccccedb6655d96d9d5b697a7f0938235ddMathias Agopian
280b722fe9ce98d97dbcb6fefd170b85ab7037e528Jeff Brown#include <gui/ISurfaceComposer.h>
298335f1ccccedb6655d96d9d5b697a7f0938235ddMathias Agopian#include <gui/Surface.h>
308335f1ccccedb6655d96d9d5b697a7f0938235ddMathias Agopian#include <gui/SurfaceComposerClient.h>
310de171b0d490a5928d54d2fb67c912d140aac643Ted Bonkenburg#include <gui/SurfaceTexture.h>
328335f1ccccedb6655d96d9d5b697a7f0938235ddMathias Agopian
3364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown#include <ui/DisplayInfo.h>
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <ui/Rect.h>
358335f1ccccedb6655d96d9d5b697a7f0938235ddMathias Agopian#include <ui/Region.h>
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
378b73ae4a1e5321753e54354e5202a38c5560fea9Mathias Agopian#include <EGL/egl.h>
388b73ae4a1e5321753e54354e5202a38c5560fea9Mathias Agopian
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <SkCanvas.h>
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <SkBitmap.h>
416158b1bf0364da1582468a98ec09d004ba99deecMathias Agopian#include <SkRegion.h>
421f5b195ed0f7f4a3398903fc064af1788c108badDianne Hackborn#include <SkPixelRef.h>
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "jni.h"
458451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes#include "JNIHelp.h"
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <android_runtime/AndroidRuntime.h>
47289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn#include <android_runtime/android_view_Surface.h>
4864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown#include <android_runtime/android_view_SurfaceSession.h>
490de171b0d490a5928d54d2fb67c912d140aac643Ted Bonkenburg#include <android_runtime/android_graphics_SurfaceTexture.h>
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/misc.h>
519e316a1a2a8d734315bbd56a85308f9657a92913Jeff Brown#include <utils/Log.h>
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown#include <ScopedUtfChars.h>
5464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android {
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const char* const OutOfResourcesException =
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    "android/view/Surface$OutOfResourcesException";
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6364a55af0ac700baecb0877235eb42caac59a3560Jeff Brownstatic struct {
6464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    jclass clazz;
6564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    jfieldID mNativeSurface;
6664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    jfieldID mNativeSurfaceControl;
6764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    jfieldID mGenerationId;
6864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    jfieldID mCanvas;
6964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    jfieldID mCanvasSaveCount;
70cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown    jmethodID ctor;
7164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown} gSurfaceClassInfo;
7264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
7364a55af0ac700baecb0877235eb42caac59a3560Jeff Brownstatic struct {
7464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    jfieldID left;
7564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    jfieldID top;
7664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    jfieldID right;
7764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    jfieldID bottom;
7864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown} gRectClassInfo;
7964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
8064a55af0ac700baecb0877235eb42caac59a3560Jeff Brownstatic struct {
8164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    jfieldID mNativeCanvas;
8264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    jfieldID mSurfaceFormat;
8364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown} gCanvasClassInfo;
8464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
8564a55af0ac700baecb0877235eb42caac59a3560Jeff Brownstatic struct {
8664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    jfieldID width;
8764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    jfieldID height;
8864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    jfieldID refreshRate;
8964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    jfieldID density;
9064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    jfieldID xDpi;
9164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    jfieldID yDpi;
9264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown} gPhysicalDisplayInfoClassInfo;
93050316184b01c0d1a01c46afae7429b89a27c31btedbo
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9564a55af0ac700baecb0877235eb42caac59a3560Jeff Brownclass ScreenshotPixelRef : public SkPixelRef {
9664a55af0ac700baecb0877235eb42caac59a3560Jeff Brownpublic:
9764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    ScreenshotPixelRef(SkColorTable* ctable) {
9864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        fCTable = ctable;
9964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        SkSafeRef(ctable);
10064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        setImmutable();
10164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    }
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    virtual ~ScreenshotPixelRef() {
10464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        SkSafeUnref(fCTable);
10564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    }
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    status_t update(const sp<IBinder>& display, int width, int height,
10864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            int minLayer, int maxLayer, bool allLayers) {
10964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        status_t res = (width > 0 && height > 0)
11064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown                ? (allLayers
11164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown                        ? mScreenshot.update(display, width, height)
11264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown                        : mScreenshot.update(display, width, height, minLayer, maxLayer))
11364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown                : mScreenshot.update(display);
11464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        if (res != NO_ERROR) {
11564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            return res;
11664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        }
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        return NO_ERROR;
11964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    }
12064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
12164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    uint32_t getWidth() const {
12264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        return mScreenshot.getWidth();
12364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    }
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    uint32_t getHeight() const {
12664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        return mScreenshot.getHeight();
12764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    }
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    uint32_t getStride() const {
13064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        return mScreenshot.getStride();
13164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    }
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    uint32_t getFormat() const {
13464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        return mScreenshot.getFormat();
13564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    }
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13764a55af0ac700baecb0877235eb42caac59a3560Jeff Brownprotected:
13864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    // overrides from SkPixelRef
13964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    virtual void* onLockPixels(SkColorTable** ct) {
14064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        *ct = fCTable;
14164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        return (void*)mScreenshot.getPixels();
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    virtual void onUnlockPixels() {
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
14764a55af0ac700baecb0877235eb42caac59a3560Jeff Brownprivate:
14864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    ScreenshotClient mScreenshot;
14964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    SkColorTable*    fCTable;
15064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
15164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    typedef SkPixelRef INHERITED;
15264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown};
15364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15764a55af0ac700baecb0877235eb42caac59a3560Jeff Brownstatic sp<SurfaceControl> getSurfaceControl(JNIEnv* env, jobject surfaceObj) {
15864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    return reinterpret_cast<SurfaceControl*>(
15964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            env->GetIntField(surfaceObj, gSurfaceClassInfo.mNativeSurfaceControl));
16017f638b39f2e8b610ecfa1290e5bc42ab7700c98Mathias Agopian}
16117f638b39f2e8b610ecfa1290e5bc42ab7700c98Mathias Agopian
16264a55af0ac700baecb0877235eb42caac59a3560Jeff Brownstatic void setSurfaceControl(JNIEnv* env, jobject surfaceObj,
16364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        const sp<SurfaceControl>& surface) {
16464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    SurfaceControl* const p = reinterpret_cast<SurfaceControl*>(
16564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            env->GetIntField(surfaceObj, gSurfaceClassInfo.mNativeSurfaceControl));
16617f638b39f2e8b610ecfa1290e5bc42ab7700c98Mathias Agopian    if (surface.get()) {
16764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        surface->incStrong(surfaceObj);
16817f638b39f2e8b610ecfa1290e5bc42ab7700c98Mathias Agopian    }
16917f638b39f2e8b610ecfa1290e5bc42ab7700c98Mathias Agopian    if (p) {
17064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        p->decStrong(surfaceObj);
17117f638b39f2e8b610ecfa1290e5bc42ab7700c98Mathias Agopian    }
17264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    env->SetIntField(surfaceObj, gSurfaceClassInfo.mNativeSurfaceControl,
17364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            reinterpret_cast<jint>(surface.get()));
17417f638b39f2e8b610ecfa1290e5bc42ab7700c98Mathias Agopian}
17517f638b39f2e8b610ecfa1290e5bc42ab7700c98Mathias Agopian
17664a55af0ac700baecb0877235eb42caac59a3560Jeff Brownstatic sp<Surface> getSurface(JNIEnv* env, jobject surfaceObj) {
17764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    sp<Surface> result(android_view_Surface_getSurface(env, surfaceObj));
17864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    if (result == NULL) {
17969d62097e8195c947de7e4cdc4a491181aa56e61Mathias Agopian        /*
18069d62097e8195c947de7e4cdc4a491181aa56e61Mathias Agopian         * if this method is called from the WindowManager's process, it means
18169d62097e8195c947de7e4cdc4a491181aa56e61Mathias Agopian         * the client is is not remote, and therefore is allowed to have
1828451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes         * a Surface (data), so we create it here.
18369d62097e8195c947de7e4cdc4a491181aa56e61Mathias Agopian         * If we don't have a SurfaceControl, it means we're in a different
18469d62097e8195c947de7e4cdc4a491181aa56e61Mathias Agopian         * process.
18569d62097e8195c947de7e4cdc4a491181aa56e61Mathias Agopian         */
1868451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes
18764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        SurfaceControl* const control = reinterpret_cast<SurfaceControl*>(
18864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown                env->GetIntField(surfaceObj, gSurfaceClassInfo.mNativeSurfaceControl));
18969d62097e8195c947de7e4cdc4a491181aa56e61Mathias Agopian        if (control) {
19069d62097e8195c947de7e4cdc4a491181aa56e61Mathias Agopian            result = control->getSurface();
19164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            if (result != NULL) {
19264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown                result->incStrong(surfaceObj);
19364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown                env->SetIntField(surfaceObj, gSurfaceClassInfo.mNativeSurface,
19464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown                        reinterpret_cast<jint>(result.get()));
19569d62097e8195c947de7e4cdc4a491181aa56e61Mathias Agopian            }
19669d62097e8195c947de7e4cdc4a491181aa56e61Mathias Agopian        }
19769d62097e8195c947de7e4cdc4a491181aa56e61Mathias Agopian    }
19869d62097e8195c947de7e4cdc4a491181aa56e61Mathias Agopian    return result;
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20164a55af0ac700baecb0877235eb42caac59a3560Jeff Brownsp<ANativeWindow> android_view_Surface_getNativeWindow(JNIEnv* env, jobject surfaceObj) {
20264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    return getSurface(env, surfaceObj);
2038b73ae4a1e5321753e54354e5202a38c5560fea9Mathias Agopian}
2048b73ae4a1e5321753e54354e5202a38c5560fea9Mathias Agopian
20564a55af0ac700baecb0877235eb42caac59a3560Jeff Brownbool android_view_Surface_isInstanceOf(JNIEnv* env, jobject obj) {
20664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    return env->IsInstanceOf(obj, gSurfaceClassInfo.clazz);
207050316184b01c0d1a01c46afae7429b89a27c31btedbo}
208050316184b01c0d1a01c46afae7429b89a27c31btedbo
20964a55af0ac700baecb0877235eb42caac59a3560Jeff Brownsp<Surface> android_view_Surface_getSurface(JNIEnv* env, jobject surfaceObj) {
21064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    return reinterpret_cast<Surface*>(
21164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            env->GetIntField(surfaceObj, gSurfaceClassInfo.mNativeSurface));
2124e8a5c922c287ec97fec847194e930f8598a1941tedbo}
2134e8a5c922c287ec97fec847194e930f8598a1941tedbo
21464a55af0ac700baecb0877235eb42caac59a3560Jeff Brownstatic void setSurface(JNIEnv* env, jobject surfaceObj, const sp<Surface>& surface) {
21564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    Surface* const p = reinterpret_cast<Surface*>(
21664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            env->GetIntField(surfaceObj, gSurfaceClassInfo.mNativeSurface));
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (surface.get()) {
21864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        surface->incStrong(surfaceObj);
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (p) {
22164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        p->decStrong(surfaceObj);
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
22364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    env->SetIntField(surfaceObj, gSurfaceClassInfo.mNativeSurface,
22464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            reinterpret_cast<jint>(surface.get()));
22564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
2262a83f001fdb189f945e82e81e717ba204824b112Romain Guy    // This test is conservative and it would be better to compare the ISurfaces
2272a83f001fdb189f945e82e81e717ba204824b112Romain Guy    if (p && p != surface.get()) {
22864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        jint generationId = env->GetIntField(surfaceObj,
22964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown                gSurfaceClassInfo.mGenerationId);
2302a83f001fdb189f945e82e81e717ba204824b112Romain Guy        generationId++;
23164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        env->SetIntField(surfaceObj,
23264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown                gSurfaceClassInfo.mGenerationId, generationId);
2332a83f001fdb189f945e82e81e717ba204824b112Romain Guy    }
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
236cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brownstatic sp<ISurfaceTexture> getISurfaceTexture(JNIEnv* env, jobject surfaceObj) {
237cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown    if (surfaceObj) {
238cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown        sp<Surface> surface(getSurface(env, surfaceObj));
239cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown        if (surface != NULL) {
240cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown            return surface->getSurfaceTexture();
241cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown        }
242cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown    }
243cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown    return NULL;
244cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown}
245cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown
246cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brownjobject android_view_Surface_createFromISurfaceTexture(JNIEnv* env,
247cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown        const sp<ISurfaceTexture>& surfaceTexture) {
248cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown    if (surfaceTexture == NULL) {
249cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown        return NULL;
250cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown    }
251cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown
252cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown    sp<Surface> surface(new Surface(surfaceTexture));
253cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown    if (surface == NULL) {
254cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown        return NULL;
255cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown    }
256cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown
257cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown    jobject surfaceObj = env->NewObject(gSurfaceClassInfo.clazz, gSurfaceClassInfo.ctor);
258cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown    if (surfaceObj == NULL) {
259cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown        if (env->ExceptionCheck()) {
260cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown            ALOGE("Could not create instance of Surface from ISurfaceTexture.");
261cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown            LOGE_EX(env);
262cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown            env->ExceptionClear();
263cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown        }
264cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown        return NULL;
265cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown    }
266cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown
267cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown    setSurface(env, surfaceObj, surface);
268cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown    return surfaceObj;
269cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown}
270cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown
271cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27464a55af0ac700baecb0877235eb42caac59a3560Jeff Brownstatic void nativeCreate(JNIEnv* env, jobject surfaceObj, jobject sessionObj,
27564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        jstring nameStr, jint w, jint h, jint format, jint flags) {
27664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    ScopedUtfChars name(env, nameStr);
27764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    sp<SurfaceComposerClient> client(android_view_SurfaceSession_getClient(env, sessionObj));
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    sp<SurfaceControl> surface = client->createSurface(
28064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            String8(name.c_str()), w, h, format, flags);
28164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    if (surface == NULL) {
2828451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes        jniThrowException(env, OutOfResourcesException, NULL);
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    setSurfaceControl(env, surfaceObj, surface);
28764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown}
2882e76c992bfa955cb637417005941e3e93810a99dDaniel Lam
28964a55af0ac700baecb0877235eb42caac59a3560Jeff Brownstatic void nativeCreateFromSurfaceTexture(JNIEnv* env, jobject surfaceObj,
29064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        jobject surfaceTextureObj) {
29164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    sp<SurfaceTexture> st(SurfaceTexture_getSurfaceTexture(env, surfaceTextureObj));
2922e76c992bfa955cb637417005941e3e93810a99dDaniel Lam    if (st == NULL) {
2932e76c992bfa955cb637417005941e3e93810a99dDaniel Lam        jniThrowException(env, "java/lang/IllegalArgumentException",
2942e76c992bfa955cb637417005941e3e93810a99dDaniel Lam                "SurfaceTexture has already been released");
2952e76c992bfa955cb637417005941e3e93810a99dDaniel Lam        return;
2962e76c992bfa955cb637417005941e3e93810a99dDaniel Lam    }
29764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
2982e76c992bfa955cb637417005941e3e93810a99dDaniel Lam    sp<ISurfaceTexture> bq = st->getBufferQueue();
2992e76c992bfa955cb637417005941e3e93810a99dDaniel Lam
3002e76c992bfa955cb637417005941e3e93810a99dDaniel Lam    sp<Surface> surface(new Surface(bq));
3010de171b0d490a5928d54d2fb67c912d140aac643Ted Bonkenburg    if (surface == NULL) {
3020de171b0d490a5928d54d2fb67c912d140aac643Ted Bonkenburg        jniThrowException(env, OutOfResourcesException, NULL);
3030de171b0d490a5928d54d2fb67c912d140aac643Ted Bonkenburg        return;
3040de171b0d490a5928d54d2fb67c912d140aac643Ted Bonkenburg    }
3050de171b0d490a5928d54d2fb67c912d140aac643Ted Bonkenburg
30664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    setSurface(env, surfaceObj, surface);
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30964a55af0ac700baecb0877235eb42caac59a3560Jeff Brownstatic void nativeRelease(JNIEnv* env, jobject surfaceObj) {
31064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    setSurfaceControl(env, surfaceObj, NULL);
31164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    setSurface(env, surfaceObj, NULL);
3128138cb49e47f9a9905a316a217757710185c66aaMarco Nelissen}
3138138cb49e47f9a9905a316a217757710185c66aaMarco Nelissen
31464a55af0ac700baecb0877235eb42caac59a3560Jeff Brownstatic void nativeDestroy(JNIEnv* env, jobject surfaceObj) {
31564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    sp<SurfaceControl> surfaceControl(getSurfaceControl(env, surfaceObj));
31664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    if (SurfaceControl::isValid(surfaceControl)) {
31764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        surfaceControl->clear();
318402c34649f514669517c2208e35caa58ff8bb2b9Mathias Agopian    }
31964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    setSurfaceControl(env, surfaceObj, NULL);
32064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    setSurface(env, surfaceObj, NULL);
321402c34649f514669517c2208e35caa58ff8bb2b9Mathias Agopian}
322402c34649f514669517c2208e35caa58ff8bb2b9Mathias Agopian
32364a55af0ac700baecb0877235eb42caac59a3560Jeff Brownstatic jboolean nativeIsValid(JNIEnv* env, jobject surfaceObj) {
32464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    sp<SurfaceControl> surfaceControl(getSurfaceControl(env, surfaceObj));
32564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    if (surfaceControl != NULL) {
32617f638b39f2e8b610ecfa1290e5bc42ab7700c98Mathias Agopian        return SurfaceControl::isValid(surfaceControl) ? JNI_TRUE : JNI_FALSE;
32717f638b39f2e8b610ecfa1290e5bc42ab7700c98Mathias Agopian    }
32864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
32964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    sp<Surface> surface(getSurface(env, surfaceObj));
330402c34649f514669517c2208e35caa58ff8bb2b9Mathias Agopian    return Surface::isValid(surface) ? JNI_TRUE : JNI_FALSE;
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33364a55af0ac700baecb0877235eb42caac59a3560Jeff Brownstatic jint nativeGetIdentity(JNIEnv* env, jobject surfaceObj) {
33464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    sp<SurfaceControl> control(getSurfaceControl(env, surfaceObj));
33564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    if (control != NULL) {
33664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        return jint(control->getIdentity());
33764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    }
33864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
33964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    sp<Surface> surface(getSurface(env, surfaceObj));
34064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    if (surface != NULL) {
34164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        return jint(surface->getIdentity());
34264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    }
34364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
34464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    return -1;
34564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown}
34664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
34764a55af0ac700baecb0877235eb42caac59a3560Jeff Brownstatic jboolean nativeIsConsumerRunningBehind(JNIEnv* env, jobject surfaceObj) {
34864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    sp<Surface> surface(getSurface(env, surfaceObj));
349c14bacf1fb511472138eeb5dc84a9423fc003214Mathias Agopian    if (!Surface::isValid(surface)) {
350c14bacf1fb511472138eeb5dc84a9423fc003214Mathias Agopian        doThrowIAE(env);
35164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        return JNI_FALSE;
352c14bacf1fb511472138eeb5dc84a9423fc003214Mathias Agopian    }
35364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
35464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    int value = 0;
35564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    ANativeWindow* anw = static_cast<ANativeWindow*>(surface.get());
356c14bacf1fb511472138eeb5dc84a9423fc003214Mathias Agopian    anw->query(anw, NATIVE_WINDOW_CONSUMER_RUNNING_BEHIND, &value);
35764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    return value;
358c14bacf1fb511472138eeb5dc84a9423fc003214Mathias Agopian}
359c14bacf1fb511472138eeb5dc84a9423fc003214Mathias Agopian
36064a55af0ac700baecb0877235eb42caac59a3560Jeff Brownstatic inline SkBitmap::Config convertPixelFormat(PixelFormat format) {
361f1e5b0d4e5d0d2a78c234cd0cbd3005a74a79429Mathias Agopian    /* note: if PIXEL_FORMAT_RGBX_8888 means that all alpha bytes are 0xFF, then
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        we can map to SkBitmap::kARGB_8888_Config, and optionally call
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        bitmap.setIsOpaque(true) on the resulting SkBitmap (as an accelerator)
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    */
3658138cb49e47f9a9905a316a217757710185c66aaMarco Nelissen    switch (format) {
3668138cb49e47f9a9905a316a217757710185c66aaMarco Nelissen    case PIXEL_FORMAT_RGBX_8888:    return SkBitmap::kARGB_8888_Config;
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case PIXEL_FORMAT_RGBA_8888:    return SkBitmap::kARGB_8888_Config;
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case PIXEL_FORMAT_RGBA_4444:    return SkBitmap::kARGB_4444_Config;
3698138cb49e47f9a9905a316a217757710185c66aaMarco Nelissen    case PIXEL_FORMAT_RGB_565:      return SkBitmap::kRGB_565_Config;
3708138cb49e47f9a9905a316a217757710185c66aaMarco Nelissen    case PIXEL_FORMAT_A_8:          return SkBitmap::kA8_Config;
3718138cb49e47f9a9905a316a217757710185c66aaMarco Nelissen    default:                        return SkBitmap::kNo_Config;
3728138cb49e47f9a9905a316a217757710185c66aaMarco Nelissen    }
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37564a55af0ac700baecb0877235eb42caac59a3560Jeff Brownstatic jobject nativeLockCanvas(JNIEnv* env, jobject surfaceObj, jobject dirtyRectObj) {
37664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    sp<Surface> surface(getSurface(env, surfaceObj));
377fea12b87f2988f20ea87314c4a1b47e1a0f4d95eRomain Guy    if (!Surface::isValid(surface)) {
3788451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes        doThrowIAE(env);
37964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        return NULL;
380fea12b87f2988f20ea87314c4a1b47e1a0f4d95eRomain Guy    }
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // get dirty region
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Region dirtyRegion;
38464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    if (dirtyRectObj) {
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Rect dirty;
38664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        dirty.left = env->GetIntField(dirtyRectObj, gRectClassInfo.left);
38764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        dirty.top = env->GetIntField(dirtyRectObj, gRectClassInfo.top);
38864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        dirty.right = env->GetIntField(dirtyRectObj, gRectClassInfo.right);
38964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        dirty.bottom = env->GetIntField(dirtyRectObj, gRectClassInfo.bottom);
3906158b1bf0364da1582468a98ec09d004ba99deecMathias Agopian        if (!dirty.isEmpty()) {
3918451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes            dirtyRegion.set(dirty);
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else {
39464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        dirtyRegion.set(Rect(0x3FFF, 0x3FFF));
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Surface::SurfaceInfo info;
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status_t err = surface->lock(&info, &dirtyRegion);
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (err < 0) {
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const char* const exception = (err == NO_MEMORY) ?
40164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown                OutOfResourcesException :
40264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown                "java/lang/IllegalArgumentException";
4038451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes        jniThrowException(env, exception, NULL);
40464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        return NULL;
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Associate a SkCanvas object to this surface
40864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    jobject canvasObj = env->GetObjectField(surfaceObj, gSurfaceClassInfo.mCanvas);
40964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    env->SetIntField(canvasObj, gCanvasClassInfo.mSurfaceFormat, info.format);
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
41164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    SkCanvas* nativeCanvas = reinterpret_cast<SkCanvas*>(
41264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            env->GetIntField(canvasObj, gCanvasClassInfo.mNativeCanvas));
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    SkBitmap bitmap;
4141473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    ssize_t bpr = info.s * bytesPerPixel(info.format);
4151473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    bitmap.setConfig(convertPixelFormat(info.format), info.w, info.h, bpr);
416f1e5b0d4e5d0d2a78c234cd0cbd3005a74a79429Mathias Agopian    if (info.format == PIXEL_FORMAT_RGBX_8888) {
417f1e5b0d4e5d0d2a78c234cd0cbd3005a74a79429Mathias Agopian        bitmap.setIsOpaque(true);
418f1e5b0d4e5d0d2a78c234cd0cbd3005a74a79429Mathias Agopian    }
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (info.w > 0 && info.h > 0) {
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        bitmap.setPixels(info.bits);
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else {
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // be safe with an empty bitmap.
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        bitmap.setPixels(NULL);
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    nativeCanvas->setBitmapDevice(bitmap);
4268451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes
4276158b1bf0364da1582468a98ec09d004ba99deecMathias Agopian    SkRegion clipReg;
4286158b1bf0364da1582468a98ec09d004ba99deecMathias Agopian    if (dirtyRegion.isRect()) { // very common case
429a8a0aa8b922c45fb4633f51610f264a19f9bd825Mathias Agopian        const Rect b(dirtyRegion.getBounds());
4306158b1bf0364da1582468a98ec09d004ba99deecMathias Agopian        clipReg.setRect(b.left, b.top, b.right, b.bottom);
4316158b1bf0364da1582468a98ec09d004ba99deecMathias Agopian    } else {
4326158b1bf0364da1582468a98ec09d004ba99deecMathias Agopian        size_t count;
4336158b1bf0364da1582468a98ec09d004ba99deecMathias Agopian        Rect const* r = dirtyRegion.getArray(&count);
4346158b1bf0364da1582468a98ec09d004ba99deecMathias Agopian        while (count) {
4356158b1bf0364da1582468a98ec09d004ba99deecMathias Agopian            clipReg.op(r->left, r->top, r->right, r->bottom, SkRegion::kUnion_Op);
4366158b1bf0364da1582468a98ec09d004ba99deecMathias Agopian            r++, count--;
4376158b1bf0364da1582468a98ec09d004ba99deecMathias Agopian        }
4386158b1bf0364da1582468a98ec09d004ba99deecMathias Agopian    }
4396158b1bf0364da1582468a98ec09d004ba99deecMathias Agopian
4406158b1bf0364da1582468a98ec09d004ba99deecMathias Agopian    nativeCanvas->clipRegion(clipReg);
4418451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int saveCount = nativeCanvas->save();
44364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    env->SetIntField(surfaceObj, gSurfaceClassInfo.mCanvasSaveCount, saveCount);
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    if (dirtyRectObj) {
4466158b1bf0364da1582468a98ec09d004ba99deecMathias Agopian        const Rect& bounds(dirtyRegion.getBounds());
44764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        env->SetIntField(dirtyRectObj, gRectClassInfo.left, bounds.left);
44864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        env->SetIntField(dirtyRectObj, gRectClassInfo.top, bounds.top);
44964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        env->SetIntField(dirtyRectObj, gRectClassInfo.right, bounds.right);
45064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        env->SetIntField(dirtyRectObj, gRectClassInfo.bottom, bounds.bottom);
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4528451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes
45364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    return canvasObj;
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45664a55af0ac700baecb0877235eb42caac59a3560Jeff Brownstatic void nativeUnlockCanvasAndPost(JNIEnv* env, jobject surfaceObj, jobject canvasObj) {
45764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    jobject ownCanvasObj = env->GetObjectField(surfaceObj, gSurfaceClassInfo.mCanvas);
45864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    if (!env->IsSameObject(ownCanvasObj, canvasObj)) {
4598451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes        doThrowIAE(env);
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4628451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes
46364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    sp<Surface> surface(getSurface(env, surfaceObj));
46464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    if (!Surface::isValid(surface)) {
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
46664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    }
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // detach the canvas from the surface
46964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    SkCanvas* nativeCanvas = reinterpret_cast<SkCanvas*>(
47064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            env->GetIntField(canvasObj, gCanvasClassInfo.mNativeCanvas));
47164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    int saveCount = env->GetIntField(surfaceObj, gSurfaceClassInfo.mCanvasSaveCount);
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    nativeCanvas->restoreToCount(saveCount);
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    nativeCanvas->setBitmapDevice(SkBitmap());
47464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    env->SetIntField(surfaceObj, gSurfaceClassInfo.mCanvasSaveCount, 0);
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // unlock surface
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status_t err = surface->unlockAndPost();
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (err < 0) {
4798451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes        doThrowIAE(env);
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
48364a55af0ac700baecb0877235eb42caac59a3560Jeff Brownstatic jobject nativeScreenshot(JNIEnv* env, jclass clazz, jobject displayTokenObj,
48464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        jint width, jint height, jint minLayer, jint maxLayer, bool allLayers) {
48564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    sp<IBinder> displayToken = ibinderForJavaObject(env, displayTokenObj);
48664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    if (displayToken == NULL) {
48764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        return NULL;
488a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn    }
489a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn
4901f5b195ed0f7f4a3398903fc064af1788c108badDianne Hackborn    ScreenshotPixelRef* pixels = new ScreenshotPixelRef(NULL);
49164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    if (pixels->update(displayToken, width, height,
4920b722fe9ce98d97dbcb6fefd170b85ab7037e528Jeff Brown            minLayer, maxLayer, allLayers) != NO_ERROR) {
4931f5b195ed0f7f4a3398903fc064af1788c108badDianne Hackborn        delete pixels;
49464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        return NULL;
495a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn    }
496a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn
4971f5b195ed0f7f4a3398903fc064af1788c108badDianne Hackborn    uint32_t w = pixels->getWidth();
4981f5b195ed0f7f4a3398903fc064af1788c108badDianne Hackborn    uint32_t h = pixels->getHeight();
4991f5b195ed0f7f4a3398903fc064af1788c108badDianne Hackborn    uint32_t s = pixels->getStride();
5001f5b195ed0f7f4a3398903fc064af1788c108badDianne Hackborn    uint32_t f = pixels->getFormat();
5011f5b195ed0f7f4a3398903fc064af1788c108badDianne Hackborn    ssize_t bpr = s * android::bytesPerPixel(f);
5021f5b195ed0f7f4a3398903fc064af1788c108badDianne Hackborn
5031f5b195ed0f7f4a3398903fc064af1788c108badDianne Hackborn    SkBitmap* bitmap = new SkBitmap();
5041f5b195ed0f7f4a3398903fc064af1788c108badDianne Hackborn    bitmap->setConfig(convertPixelFormat(f), w, h, bpr);
5051f5b195ed0f7f4a3398903fc064af1788c108badDianne Hackborn    if (f == PIXEL_FORMAT_RGBX_8888) {
5061f5b195ed0f7f4a3398903fc064af1788c108badDianne Hackborn        bitmap->setIsOpaque(true);
5071f5b195ed0f7f4a3398903fc064af1788c108badDianne Hackborn    }
5081f5b195ed0f7f4a3398903fc064af1788c108badDianne Hackborn
5091f5b195ed0f7f4a3398903fc064af1788c108badDianne Hackborn    if (w > 0 && h > 0) {
5101f5b195ed0f7f4a3398903fc064af1788c108badDianne Hackborn        bitmap->setPixelRef(pixels)->unref();
5111f5b195ed0f7f4a3398903fc064af1788c108badDianne Hackborn        bitmap->lockPixels();
5121f5b195ed0f7f4a3398903fc064af1788c108badDianne Hackborn    } else {
5131f5b195ed0f7f4a3398903fc064af1788c108badDianne Hackborn        // be safe with an empty bitmap.
5141f5b195ed0f7f4a3398903fc064af1788c108badDianne Hackborn        delete pixels;
5151f5b195ed0f7f4a3398903fc064af1788c108badDianne Hackborn        bitmap->setPixels(NULL);
5161f5b195ed0f7f4a3398903fc064af1788c108badDianne Hackborn    }
5171f5b195ed0f7f4a3398903fc064af1788c108badDianne Hackborn
518a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn    return GraphicsJNI::createBitmap(env, bitmap, false, NULL);
519a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn}
520a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn
52164a55af0ac700baecb0877235eb42caac59a3560Jeff Brownstatic void nativeOpenTransaction(JNIEnv* env, jclass clazz) {
52264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    SurfaceComposerClient::openGlobalTransaction();
523d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn}
524d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn
52564a55af0ac700baecb0877235eb42caac59a3560Jeff Brownstatic void nativeCloseTransaction(JNIEnv* env, jclass clazz) {
52664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    SurfaceComposerClient::closeGlobalTransaction();
527d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn}
528d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn
529b6ce6e42cc89864354c7ecb9ae80504a6c9dddcfJamie Gennisstatic void nativeSetAnimationTransaction(JNIEnv* env, jclass clazz) {
530b6ce6e42cc89864354c7ecb9ae80504a6c9dddcfJamie Gennis    SurfaceComposerClient::setAnimationTransaction();
531b6ce6e42cc89864354c7ecb9ae80504a6c9dddcfJamie Gennis}
532b6ce6e42cc89864354c7ecb9ae80504a6c9dddcfJamie Gennis
53364a55af0ac700baecb0877235eb42caac59a3560Jeff Brownstatic void nativeSetLayer(JNIEnv* env, jobject surfaceObj, jint zorder) {
53464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    sp<SurfaceControl> surface(getSurfaceControl(env, surfaceObj));
53564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    if (surface == NULL) return;
53664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
53717f638b39f2e8b610ecfa1290e5bc42ab7700c98Mathias Agopian    status_t err = surface->setLayer(zorder);
53864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    if (err < 0 && err != NO_INIT) {
5398451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes        doThrowIAE(env);
5408451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes    }
5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
54364a55af0ac700baecb0877235eb42caac59a3560Jeff Brownstatic void nativeSetPosition(JNIEnv* env, jobject surfaceObj, jfloat x, jfloat y) {
54464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    sp<SurfaceControl> surface(getSurfaceControl(env, surfaceObj));
54564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    if (surface == NULL) return;
54664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
54717f638b39f2e8b610ecfa1290e5bc42ab7700c98Mathias Agopian    status_t err = surface->setPosition(x, y);
54864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    if (err < 0 && err != NO_INIT) {
5498451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes        doThrowIAE(env);
5508451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes    }
5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
55364a55af0ac700baecb0877235eb42caac59a3560Jeff Brownstatic void nativeSetSize(JNIEnv* env, jobject surfaceObj, jint w, jint h) {
55464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    sp<SurfaceControl> surface(getSurfaceControl(env, surfaceObj));
55564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    if (surface == NULL) return;
55664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
55717f638b39f2e8b610ecfa1290e5bc42ab7700c98Mathias Agopian    status_t err = surface->setSize(w, h);
55864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    if (err < 0 && err != NO_INIT) {
5598451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes        doThrowIAE(env);
5608451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes    }
5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
56364a55af0ac700baecb0877235eb42caac59a3560Jeff Brownstatic void nativeSetFlags(JNIEnv* env, jobject surfaceObj, jint flags, jint mask) {
56464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    sp<SurfaceControl> surface(getSurfaceControl(env, surfaceObj));
56564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    if (surface == NULL) return;
5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
56764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    status_t err = surface->setFlags(flags, mask);
56864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    if (err < 0 && err != NO_INIT) {
5698451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes        doThrowIAE(env);
5708451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes    }
5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
57364a55af0ac700baecb0877235eb42caac59a3560Jeff Brownstatic void nativeSetTransparentRegionHint(JNIEnv* env, jobject surfaceObj, jobject regionObj) {
57464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    sp<SurfaceControl> surface(getSurfaceControl(env, surfaceObj));
57564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    if (surface == NULL) return;
57664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
57764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    SkRegion* region = android_graphics_Region_getSkRegion(env, regionObj);
57864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    if (!region) {
5798451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes        doThrowIAE(env);
58064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        return;
5818451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes    }
5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
58364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    const SkIRect& b(region->getBounds());
5846158b1bf0364da1582468a98ec09d004ba99deecMathias Agopian    Region reg(Rect(b.fLeft, b.fTop, b.fRight, b.fBottom));
58564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    if (region->isComplex()) {
58664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        SkRegion::Iterator it(*region);
5876158b1bf0364da1582468a98ec09d004ba99deecMathias Agopian        while (!it.done()) {
5886158b1bf0364da1582468a98ec09d004ba99deecMathias Agopian            const SkIRect& r(it.rect());
5896158b1bf0364da1582468a98ec09d004ba99deecMathias Agopian            reg.addRectUnchecked(r.fLeft, r.fTop, r.fRight, r.fBottom);
5906158b1bf0364da1582468a98ec09d004ba99deecMathias Agopian            it.next();
5916158b1bf0364da1582468a98ec09d004ba99deecMathias Agopian        }
5926158b1bf0364da1582468a98ec09d004ba99deecMathias Agopian    }
5938451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes
5946158b1bf0364da1582468a98ec09d004ba99deecMathias Agopian    status_t err = surface->setTransparentRegionHint(reg);
59564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    if (err < 0 && err != NO_INIT) {
5968451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes        doThrowIAE(env);
5978451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes    }
5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
60064a55af0ac700baecb0877235eb42caac59a3560Jeff Brownstatic void nativeSetAlpha(JNIEnv* env, jobject surfaceObj, jfloat alpha) {
60164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    sp<SurfaceControl> surface(getSurfaceControl(env, surfaceObj));
60264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    if (surface == NULL) return;
60364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
60417f638b39f2e8b610ecfa1290e5bc42ab7700c98Mathias Agopian    status_t err = surface->setAlpha(alpha);
60564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    if (err < 0 && err != NO_INIT) {
6068451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes        doThrowIAE(env);
6078451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes    }
6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
61064a55af0ac700baecb0877235eb42caac59a3560Jeff Brownstatic void nativeSetMatrix(JNIEnv* env, jobject surfaceObj,
61164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        jfloat dsdx, jfloat dtdx, jfloat dsdy, jfloat dtdy) {
61264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    sp<SurfaceControl> surface(getSurfaceControl(env, surfaceObj));
61364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    if (surface == NULL) return;
61464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
61517f638b39f2e8b610ecfa1290e5bc42ab7700c98Mathias Agopian    status_t err = surface->setMatrix(dsdx, dtdx, dsdy, dtdy);
61664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    if (err < 0 && err != NO_INIT) {
6178451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes        doThrowIAE(env);
6188451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes    }
6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
62164a55af0ac700baecb0877235eb42caac59a3560Jeff Brownstatic void nativeSetWindowCrop(JNIEnv* env, jobject surfaceObj, jobject cropObj) {
62264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    const sp<SurfaceControl>& surface(getSurfaceControl(env, surfaceObj));
62364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    if (surface == NULL) return;
62464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
62564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    Rect crop;
62664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    if (cropObj) {
62764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        crop.left = env->GetIntField(cropObj, gRectClassInfo.left);
62864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        crop.top = env->GetIntField(cropObj, gRectClassInfo.top);
62964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        crop.right = env->GetIntField(cropObj, gRectClassInfo.right);
63064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        crop.bottom = env->GetIntField(cropObj, gRectClassInfo.bottom);
63178b8ef3f3ad8ab935f677d8d672db0d97bff8119Jamie Gennis    } else {
63264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        crop.left = crop.top = crop.right = crop.bottom = 0;
63378b8ef3f3ad8ab935f677d8d672db0d97bff8119Jamie Gennis    }
63478b8ef3f3ad8ab935f677d8d672db0d97bff8119Jamie Gennis
63564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    status_t err = surface->setCrop(crop);
63664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    if (err < 0 && err != NO_INIT) {
63778b8ef3f3ad8ab935f677d8d672db0d97bff8119Jamie Gennis        doThrowIAE(env);
63878b8ef3f3ad8ab935f677d8d672db0d97bff8119Jamie Gennis    }
63978b8ef3f3ad8ab935f677d8d672db0d97bff8119Jamie Gennis}
64078b8ef3f3ad8ab935f677d8d672db0d97bff8119Jamie Gennis
64164a55af0ac700baecb0877235eb42caac59a3560Jeff Brownstatic void nativeSetLayerStack(JNIEnv* env, jobject surfaceObj, jint layerStack) {
64264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    sp<SurfaceControl> surface(getSurfaceControl(env, surfaceObj));
64364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    if (surface == NULL) return;
64464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
6450b722fe9ce98d97dbcb6fefd170b85ab7037e528Jeff Brown    status_t err = surface->setLayerStack(layerStack);
64664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    if (err < 0 && err != NO_INIT) {
6470b722fe9ce98d97dbcb6fefd170b85ab7037e528Jeff Brown        doThrowIAE(env);
6480b722fe9ce98d97dbcb6fefd170b85ab7037e528Jeff Brown    }
6499de4936c99b979f6010440b043edc6d6142d1980Craig Mautner}
6509de4936c99b979f6010440b043edc6d6142d1980Craig Mautner
65164a55af0ac700baecb0877235eb42caac59a3560Jeff Brownstatic jobject nativeGetBuiltInDisplay(JNIEnv* env, jclass clazz, jint id) {
65264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    sp<IBinder> token(SurfaceComposerClient::getBuiltInDisplay(id));
65364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    return javaObjectForIBinder(env, token);
65464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown}
65517f638b39f2e8b610ecfa1290e5bc42ab7700c98Mathias Agopian
6567bbf8163fb83afc54b353a8def52bfb87ecce047Jamie Gennisstatic jobject nativeCreateDisplay(JNIEnv* env, jclass clazz, jstring nameObj,
6577bbf8163fb83afc54b353a8def52bfb87ecce047Jamie Gennis        jboolean secure) {
65864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    ScopedUtfChars name(env, nameObj);
6597bbf8163fb83afc54b353a8def52bfb87ecce047Jamie Gennis    sp<IBinder> token(SurfaceComposerClient::createDisplay(
6607bbf8163fb83afc54b353a8def52bfb87ecce047Jamie Gennis            String8(name.c_str()), bool(secure)));
66164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    return javaObjectForIBinder(env, token);
66264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown}
66364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
66464a55af0ac700baecb0877235eb42caac59a3560Jeff Brownstatic void nativeSetDisplaySurface(JNIEnv* env, jclass clazz,
665cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown        jobject tokenObj, jobject surfaceObj) {
66664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    sp<IBinder> token(ibinderForJavaObject(env, tokenObj));
66764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    if (token == NULL) return;
66864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
669cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown    sp<ISurfaceTexture> surfaceTexture(getISurfaceTexture(env, surfaceObj));
670cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown    SurfaceComposerClient::setDisplaySurface(token, surfaceTexture);
67164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown}
67264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
67364a55af0ac700baecb0877235eb42caac59a3560Jeff Brownstatic void nativeSetDisplayLayerStack(JNIEnv* env, jclass clazz,
67464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        jobject tokenObj, jint layerStack) {
67564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    sp<IBinder> token(ibinderForJavaObject(env, tokenObj));
67664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    if (token == NULL) return;
67764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
67864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    SurfaceComposerClient::setDisplayLayerStack(token, layerStack);
67964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown}
68064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
68163f1c43fbef157397869475ef30d23e631b88bbeMathias Agopianstatic void nativeSetDisplayProjection(JNIEnv* env, jclass clazz,
682cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown        jobject tokenObj, jint orientation, jobject layerStackRectObj, jobject displayRectObj) {
68364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    sp<IBinder> token(ibinderForJavaObject(env, tokenObj));
68464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    if (token == NULL) return;
68564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
686cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown    Rect layerStackRect;
687cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown    layerStackRect.left = env->GetIntField(layerStackRectObj, gRectClassInfo.left);
688cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown    layerStackRect.top = env->GetIntField(layerStackRectObj, gRectClassInfo.top);
689cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown    layerStackRect.right = env->GetIntField(layerStackRectObj, gRectClassInfo.right);
690cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown    layerStackRect.bottom = env->GetIntField(layerStackRectObj, gRectClassInfo.bottom);
69164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
692cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown    Rect displayRect;
693cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown    displayRect.left = env->GetIntField(displayRectObj, gRectClassInfo.left);
694cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown    displayRect.top = env->GetIntField(displayRectObj, gRectClassInfo.top);
695cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown    displayRect.right = env->GetIntField(displayRectObj, gRectClassInfo.right);
696cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown    displayRect.bottom = env->GetIntField(displayRectObj, gRectClassInfo.bottom);
69764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
698cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown    SurfaceComposerClient::setDisplayProjection(token, orientation, layerStackRect, displayRect);
69964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown}
70064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
70164a55af0ac700baecb0877235eb42caac59a3560Jeff Brownstatic jboolean nativeGetDisplayInfo(JNIEnv* env, jclass clazz,
70264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        jobject tokenObj, jobject infoObj) {
70364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    sp<IBinder> token(ibinderForJavaObject(env, tokenObj));
70464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    if (token == NULL) return JNI_FALSE;
70564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
70664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    DisplayInfo info;
70764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    if (SurfaceComposerClient::getDisplayInfo(token, &info)) {
70864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        return JNI_FALSE;
70964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    }
71064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
71164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    env->SetIntField(infoObj, gPhysicalDisplayInfoClassInfo.width, info.w);
71264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    env->SetIntField(infoObj, gPhysicalDisplayInfoClassInfo.height, info.h);
71364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    env->SetFloatField(infoObj, gPhysicalDisplayInfoClassInfo.refreshRate, info.fps);
71464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    env->SetFloatField(infoObj, gPhysicalDisplayInfoClassInfo.density, info.density);
71564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    env->SetFloatField(infoObj, gPhysicalDisplayInfoClassInfo.xDpi, info.xdpi);
71664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    env->SetFloatField(infoObj, gPhysicalDisplayInfoClassInfo.yDpi, info.ydpi);
71764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    return JNI_TRUE;
71864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown}
71964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
7209e316a1a2a8d734315bbd56a85308f9657a92913Jeff Brownstatic void nativeBlankDisplay(JNIEnv* env, jclass clazz, jobject tokenObj) {
7219e316a1a2a8d734315bbd56a85308f9657a92913Jeff Brown    sp<IBinder> token(ibinderForJavaObject(env, tokenObj));
7229e316a1a2a8d734315bbd56a85308f9657a92913Jeff Brown    if (token == NULL) return;
7239e316a1a2a8d734315bbd56a85308f9657a92913Jeff Brown
7249e316a1a2a8d734315bbd56a85308f9657a92913Jeff Brown    ALOGD_IF_SLOW(100, "Excessive delay in blankDisplay() while turning screen off");
7259e316a1a2a8d734315bbd56a85308f9657a92913Jeff Brown    SurfaceComposerClient::blankDisplay(token);
7269e316a1a2a8d734315bbd56a85308f9657a92913Jeff Brown}
7279e316a1a2a8d734315bbd56a85308f9657a92913Jeff Brown
7289e316a1a2a8d734315bbd56a85308f9657a92913Jeff Brownstatic void nativeUnblankDisplay(JNIEnv* env, jclass clazz, jobject tokenObj) {
7299e316a1a2a8d734315bbd56a85308f9657a92913Jeff Brown    sp<IBinder> token(ibinderForJavaObject(env, tokenObj));
7309e316a1a2a8d734315bbd56a85308f9657a92913Jeff Brown    if (token == NULL) return;
7319e316a1a2a8d734315bbd56a85308f9657a92913Jeff Brown
7329e316a1a2a8d734315bbd56a85308f9657a92913Jeff Brown    ALOGD_IF_SLOW(100, "Excessive delay in unblankDisplay() while turning screen on");
7339e316a1a2a8d734315bbd56a85308f9657a92913Jeff Brown    SurfaceComposerClient::unblankDisplay(token);
7349e316a1a2a8d734315bbd56a85308f9657a92913Jeff Brown}
7359e316a1a2a8d734315bbd56a85308f9657a92913Jeff Brown
73664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown// ----------------------------------------------------------------------------
73764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
73864a55af0ac700baecb0877235eb42caac59a3560Jeff Brownstatic void nativeCopyFrom(JNIEnv* env, jobject surfaceObj, jobject otherObj) {
73917f638b39f2e8b610ecfa1290e5bc42ab7700c98Mathias Agopian    /*
74017f638b39f2e8b610ecfa1290e5bc42ab7700c98Mathias Agopian     * This is used by the WindowManagerService just after constructing
74117f638b39f2e8b610ecfa1290e5bc42ab7700c98Mathias Agopian     * a Surface and is necessary for returning the Surface reference to
74217f638b39f2e8b610ecfa1290e5bc42ab7700c98Mathias Agopian     * the caller. At this point, we should only have a SurfaceControl.
74317f638b39f2e8b610ecfa1290e5bc42ab7700c98Mathias Agopian     */
744fae5cb2b356a1fef172b43066180a7ab4c32dbacMathias Agopian
74564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    sp<SurfaceControl> surface(getSurfaceControl(env, surfaceObj));
74664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    sp<SurfaceControl> other(getSurfaceControl(env, otherObj));
74764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    if (!SurfaceControl::isSameSurface(surface, other)) {
7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // we reassign the surface only if it's a different one
7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // otherwise we would loose our client-side state.
75064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        setSurfaceControl(env, surfaceObj, other);
7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
75464a55af0ac700baecb0877235eb42caac59a3560Jeff Brownstatic void nativeTransferFrom(JNIEnv* env, jobject surfaceObj, jobject otherObj) {
75564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    sp<SurfaceControl> control(getSurfaceControl(env, otherObj));
75664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    sp<Surface> surface(android_view_Surface_getSurface(env, otherObj));
75764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    setSurfaceControl(env, surfaceObj, control);
75864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    setSurface(env, surfaceObj, surface);
75964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    setSurfaceControl(env, otherObj, NULL);
76064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    setSurface(env, otherObj, NULL);
76161566cc1932468720a831ad5cbc68ee080d613c9Dianne Hackborn}
76261566cc1932468720a831ad5cbc68ee080d613c9Dianne Hackborn
76364a55af0ac700baecb0877235eb42caac59a3560Jeff Brownstatic void nativeReadFromParcel(JNIEnv* env, jobject surfaceObj, jobject parcelObj) {
76464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    Parcel* parcel = parcelForJavaObject(env, parcelObj);
7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (parcel == NULL) {
7668451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes        doThrowNPE(env);
7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
77064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    sp<Surface> surface(Surface::readFromParcel(*parcel));
77164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    setSurfaceControl(env, surfaceObj, NULL);
77264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    setSurface(env, surfaceObj, surface);
7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
77564a55af0ac700baecb0877235eb42caac59a3560Jeff Brownstatic void nativeWriteToParcel(JNIEnv* env, jobject surfaceObj, jobject parcelObj) {
77664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    Parcel* parcel = parcelForJavaObject(env, parcelObj);
7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (parcel == NULL) {
7788451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes        doThrowNPE(env);
7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7820de171b0d490a5928d54d2fb67c912d140aac643Ted Bonkenburg    // The Java instance may have a SurfaceControl (in the case of the
7830de171b0d490a5928d54d2fb67c912d140aac643Ted Bonkenburg    // WindowManager or a system app). In that case, we defer to the
7840de171b0d490a5928d54d2fb67c912d140aac643Ted Bonkenburg    // SurfaceControl to send its ISurface. Otherwise, if the Surface is
7850de171b0d490a5928d54d2fb67c912d140aac643Ted Bonkenburg    // available we let it parcel itself. Finally, if the Surface is also
7860de171b0d490a5928d54d2fb67c912d140aac643Ted Bonkenburg    // NULL we fall back to using the SurfaceControl path which sends an
7870de171b0d490a5928d54d2fb67c912d140aac643Ted Bonkenburg    // empty surface; this matches legacy behavior.
78864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    sp<SurfaceControl> control(getSurfaceControl(env, surfaceObj));
7890de171b0d490a5928d54d2fb67c912d140aac643Ted Bonkenburg    if (control != NULL) {
7900de171b0d490a5928d54d2fb67c912d140aac643Ted Bonkenburg        SurfaceControl::writeSurfaceToParcel(control, parcel);
7910de171b0d490a5928d54d2fb67c912d140aac643Ted Bonkenburg    } else {
79264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        sp<Surface> surface(android_view_Surface_getSurface(env, surfaceObj));
7930de171b0d490a5928d54d2fb67c912d140aac643Ted Bonkenburg        if (surface != NULL) {
7940de171b0d490a5928d54d2fb67c912d140aac643Ted Bonkenburg            Surface::writeToParcel(surface, parcel);
7950de171b0d490a5928d54d2fb67c912d140aac643Ted Bonkenburg        } else {
7960de171b0d490a5928d54d2fb67c912d140aac643Ted Bonkenburg            SurfaceControl::writeSurfaceToParcel(NULL, parcel);
7970de171b0d490a5928d54d2fb67c912d140aac643Ted Bonkenburg        }
7980de171b0d490a5928d54d2fb67c912d140aac643Ted Bonkenburg    }
7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNINativeMethod gSurfaceMethods[] = {
80464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    {"nativeCreate", "(Landroid/view/SurfaceSession;Ljava/lang/String;IIII)V",
80564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            (void*)nativeCreate },
80664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    {"nativeCreateFromSurfaceTexture", "(Landroid/graphics/SurfaceTexture;)V",
80764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            (void*)nativeCreateFromSurfaceTexture },
80864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    {"nativeRelease", "()V",
80964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            (void*)nativeRelease },
81064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    {"nativeDestroy", "()V",
81164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            (void*)nativeDestroy },
81264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    {"nativeIsValid", "()Z",
81364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            (void*)nativeIsValid },
81464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    {"nativeGetIdentity", "()I",
81564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            (void*)nativeGetIdentity },
81664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    {"nativeIsConsumerRunningBehind", "()Z",
81764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            (void*)nativeIsConsumerRunningBehind },
81864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    {"nativeLockCanvas", "(Landroid/graphics/Rect;)Landroid/graphics/Canvas;",
81964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            (void*)nativeLockCanvas },
82064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    {"nativeUnlockCanvasAndPost", "(Landroid/graphics/Canvas;)V",
82164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            (void*)nativeUnlockCanvasAndPost },
82264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    {"nativeScreenshot", "(Landroid/os/IBinder;IIIIZ)Landroid/graphics/Bitmap;",
82364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            (void*)nativeScreenshot },
82464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    {"nativeOpenTransaction", "()V",
82564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            (void*)nativeOpenTransaction },
82664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    {"nativeCloseTransaction", "()V",
82764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            (void*)nativeCloseTransaction },
828b6ce6e42cc89864354c7ecb9ae80504a6c9dddcfJamie Gennis    {"nativeSetAnimationTransaction", "()V",
829b6ce6e42cc89864354c7ecb9ae80504a6c9dddcfJamie Gennis            (void*)nativeSetAnimationTransaction },
83064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    {"nativeSetLayer", "(I)V",
83164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            (void*)nativeSetLayer },
83264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    {"nativeSetPosition", "(FF)V",
83364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            (void*)nativeSetPosition },
83464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    {"nativeSetSize", "(II)V",
83564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            (void*)nativeSetSize },
83664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    {"nativeSetTransparentRegionHint", "(Landroid/graphics/Region;)V",
83764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            (void*)nativeSetTransparentRegionHint },
83864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    {"nativeSetAlpha", "(F)V",
83964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            (void*)nativeSetAlpha },
84064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    {"nativeSetMatrix", "(FFFF)V",
84164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            (void*)nativeSetMatrix },
84264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    {"nativeSetFlags", "(II)V",
84364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            (void*)nativeSetFlags },
84464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    {"nativeSetWindowCrop", "(Landroid/graphics/Rect;)V",
84564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            (void*)nativeSetWindowCrop },
84664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    {"nativeSetLayerStack", "(I)V",
84764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            (void*)nativeSetLayerStack },
84864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    {"nativeGetBuiltInDisplay", "(I)Landroid/os/IBinder;",
84964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            (void*)nativeGetBuiltInDisplay },
8507bbf8163fb83afc54b353a8def52bfb87ecce047Jamie Gennis    {"nativeCreateDisplay", "(Ljava/lang/String;Z)Landroid/os/IBinder;",
85164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            (void*)nativeCreateDisplay },
852cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown    {"nativeSetDisplaySurface", "(Landroid/os/IBinder;Landroid/view/Surface;)V",
85364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            (void*)nativeSetDisplaySurface },
85464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    {"nativeSetDisplayLayerStack", "(Landroid/os/IBinder;I)V",
85564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            (void*)nativeSetDisplayLayerStack },
85663f1c43fbef157397869475ef30d23e631b88bbeMathias Agopian    {"nativeSetDisplayProjection", "(Landroid/os/IBinder;ILandroid/graphics/Rect;Landroid/graphics/Rect;)V",
85763f1c43fbef157397869475ef30d23e631b88bbeMathias Agopian            (void*)nativeSetDisplayProjection },
85864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    {"nativeGetDisplayInfo", "(Landroid/os/IBinder;Landroid/view/Surface$PhysicalDisplayInfo;)Z",
85964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            (void*)nativeGetDisplayInfo },
8609e316a1a2a8d734315bbd56a85308f9657a92913Jeff Brown    {"nativeBlankDisplay", "(Landroid/os/IBinder;)V",
8619e316a1a2a8d734315bbd56a85308f9657a92913Jeff Brown            (void*)nativeBlankDisplay },
8629e316a1a2a8d734315bbd56a85308f9657a92913Jeff Brown    {"nativeUnblankDisplay", "(Landroid/os/IBinder;)V",
8639e316a1a2a8d734315bbd56a85308f9657a92913Jeff Brown            (void*)nativeUnblankDisplay },
86464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    {"nativeCopyFrom", "(Landroid/view/Surface;)V",
86564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            (void*)nativeCopyFrom },
86664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    {"nativeTransferFrom", "(Landroid/view/Surface;)V",
86764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            (void*)nativeTransferFrom },
86864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    {"nativeReadFromParcel", "(Landroid/os/Parcel;)V",
86964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            (void*)nativeReadFromParcel },
87064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    {"nativeWriteToParcel", "(Landroid/os/Parcel;)V",
87164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            (void*)nativeWriteToParcel },
8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint register_android_view_Surface(JNIEnv* env)
8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
87664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    int err = AndroidRuntime::registerNativeMethods(env, "android/view/Surface",
8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            gSurfaceMethods, NELEM(gSurfaceMethods));
87864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
87964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    jclass clazz = env->FindClass("android/view/Surface");
88064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    gSurfaceClassInfo.clazz = jclass(env->NewGlobalRef(clazz));
88164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    gSurfaceClassInfo.mNativeSurface =
88264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            env->GetFieldID(gSurfaceClassInfo.clazz, ANDROID_VIEW_SURFACE_JNI_ID, "I");
88364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    gSurfaceClassInfo.mNativeSurfaceControl =
88464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            env->GetFieldID(gSurfaceClassInfo.clazz, "mNativeSurfaceControl", "I");
88564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    gSurfaceClassInfo.mGenerationId =
88664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            env->GetFieldID(gSurfaceClassInfo.clazz, "mGenerationId", "I");
88764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    gSurfaceClassInfo.mCanvas =
88864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            env->GetFieldID(gSurfaceClassInfo.clazz, "mCanvas", "Landroid/graphics/Canvas;");
88964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    gSurfaceClassInfo.mCanvasSaveCount =
89064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            env->GetFieldID(gSurfaceClassInfo.clazz, "mCanvasSaveCount", "I");
891cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown    gSurfaceClassInfo.ctor = env->GetMethodID(gSurfaceClassInfo.clazz, "<init>", "()V");
89264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
89364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    clazz = env->FindClass("android/graphics/Canvas");
89464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    gCanvasClassInfo.mNativeCanvas = env->GetFieldID(clazz, "mNativeCanvas", "I");
89564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    gCanvasClassInfo.mSurfaceFormat = env->GetFieldID(clazz, "mSurfaceFormat", "I");
89664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
89764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    clazz = env->FindClass("android/graphics/Rect");
89864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    gRectClassInfo.left = env->GetFieldID(clazz, "left", "I");
89964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    gRectClassInfo.top = env->GetFieldID(clazz, "top", "I");
90064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    gRectClassInfo.right = env->GetFieldID(clazz, "right", "I");
90164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    gRectClassInfo.bottom = env->GetFieldID(clazz, "bottom", "I");
90264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
90364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    clazz = env->FindClass("android/view/Surface$PhysicalDisplayInfo");
90464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    gPhysicalDisplayInfoClassInfo.width = env->GetFieldID(clazz, "width", "I");
90564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    gPhysicalDisplayInfoClassInfo.height = env->GetFieldID(clazz, "height", "I");
90664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    gPhysicalDisplayInfoClassInfo.refreshRate = env->GetFieldID(clazz, "refreshRate", "F");
90764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    gPhysicalDisplayInfoClassInfo.density = env->GetFieldID(clazz, "density", "F");
90864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    gPhysicalDisplayInfoClassInfo.xDpi = env->GetFieldID(clazz, "xDpi", "F");
90964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    gPhysicalDisplayInfoClassInfo.yDpi = env->GetFieldID(clazz, "yDpi", "F");
9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return err;
9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
914