android_view_Surface.cpp revision 64a55af0ac700baecb0877235eb42caac59a3560
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>
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown#include <ScopedUtfChars.h>
5364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android {
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const char* const OutOfResourcesException =
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    "android/view/Surface$OutOfResourcesException";
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6264a55af0ac700baecb0877235eb42caac59a3560Jeff Brownstatic struct {
6364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    jclass clazz;
6464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    jfieldID mNativeSurface;
6564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    jfieldID mNativeSurfaceControl;
6664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    jfieldID mGenerationId;
6764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    jfieldID mCanvas;
6864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    jfieldID mCanvasSaveCount;
6964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown} gSurfaceClassInfo;
7064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
7164a55af0ac700baecb0877235eb42caac59a3560Jeff Brownstatic struct {
7264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    jfieldID left;
7364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    jfieldID top;
7464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    jfieldID right;
7564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    jfieldID bottom;
7664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown} gRectClassInfo;
7764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
7864a55af0ac700baecb0877235eb42caac59a3560Jeff Brownstatic struct {
7964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    jfieldID mNativeCanvas;
8064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    jfieldID mSurfaceFormat;
8164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown} gCanvasClassInfo;
8264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
8364a55af0ac700baecb0877235eb42caac59a3560Jeff Brownstatic struct {
8464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    jfieldID width;
8564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    jfieldID height;
8664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    jfieldID refreshRate;
8764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    jfieldID density;
8864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    jfieldID xDpi;
8964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    jfieldID yDpi;
9064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown} gPhysicalDisplayInfoClassInfo;
91050316184b01c0d1a01c46afae7429b89a27c31btedbo
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9364a55af0ac700baecb0877235eb42caac59a3560Jeff Brownclass ScreenshotPixelRef : public SkPixelRef {
9464a55af0ac700baecb0877235eb42caac59a3560Jeff Brownpublic:
9564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    ScreenshotPixelRef(SkColorTable* ctable) {
9664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        fCTable = ctable;
9764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        SkSafeRef(ctable);
9864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        setImmutable();
9964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    }
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    virtual ~ScreenshotPixelRef() {
10264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        SkSafeUnref(fCTable);
10364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    }
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    status_t update(const sp<IBinder>& display, int width, int height,
10664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            int minLayer, int maxLayer, bool allLayers) {
10764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        status_t res = (width > 0 && height > 0)
10864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown                ? (allLayers
10964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown                        ? mScreenshot.update(display, width, height)
11064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown                        : mScreenshot.update(display, width, height, minLayer, maxLayer))
11164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown                : mScreenshot.update(display);
11264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        if (res != NO_ERROR) {
11364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            return res;
11464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        }
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        return NO_ERROR;
11764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    }
11864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
11964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    uint32_t getWidth() const {
12064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        return mScreenshot.getWidth();
12164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    }
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    uint32_t getHeight() const {
12464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        return mScreenshot.getHeight();
12564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    }
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    uint32_t getStride() const {
12864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        return mScreenshot.getStride();
12964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    }
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    uint32_t getFormat() const {
13264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        return mScreenshot.getFormat();
13364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    }
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13564a55af0ac700baecb0877235eb42caac59a3560Jeff Brownprotected:
13664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    // overrides from SkPixelRef
13764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    virtual void* onLockPixels(SkColorTable** ct) {
13864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        *ct = fCTable;
13964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        return (void*)mScreenshot.getPixels();
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    virtual void onUnlockPixels() {
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
14564a55af0ac700baecb0877235eb42caac59a3560Jeff Brownprivate:
14664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    ScreenshotClient mScreenshot;
14764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    SkColorTable*    fCTable;
14864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
14964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    typedef SkPixelRef INHERITED;
15064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown};
15164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15564a55af0ac700baecb0877235eb42caac59a3560Jeff Brownstatic sp<SurfaceControl> getSurfaceControl(JNIEnv* env, jobject surfaceObj) {
15664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    return reinterpret_cast<SurfaceControl*>(
15764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            env->GetIntField(surfaceObj, gSurfaceClassInfo.mNativeSurfaceControl));
15817f638b39f2e8b610ecfa1290e5bc42ab7700c98Mathias Agopian}
15917f638b39f2e8b610ecfa1290e5bc42ab7700c98Mathias Agopian
16064a55af0ac700baecb0877235eb42caac59a3560Jeff Brownstatic void setSurfaceControl(JNIEnv* env, jobject surfaceObj,
16164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        const sp<SurfaceControl>& surface) {
16264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    SurfaceControl* const p = reinterpret_cast<SurfaceControl*>(
16364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            env->GetIntField(surfaceObj, gSurfaceClassInfo.mNativeSurfaceControl));
16417f638b39f2e8b610ecfa1290e5bc42ab7700c98Mathias Agopian    if (surface.get()) {
16564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        surface->incStrong(surfaceObj);
16617f638b39f2e8b610ecfa1290e5bc42ab7700c98Mathias Agopian    }
16717f638b39f2e8b610ecfa1290e5bc42ab7700c98Mathias Agopian    if (p) {
16864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        p->decStrong(surfaceObj);
16917f638b39f2e8b610ecfa1290e5bc42ab7700c98Mathias Agopian    }
17064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    env->SetIntField(surfaceObj, gSurfaceClassInfo.mNativeSurfaceControl,
17164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            reinterpret_cast<jint>(surface.get()));
17217f638b39f2e8b610ecfa1290e5bc42ab7700c98Mathias Agopian}
17317f638b39f2e8b610ecfa1290e5bc42ab7700c98Mathias Agopian
17464a55af0ac700baecb0877235eb42caac59a3560Jeff Brownstatic sp<Surface> getSurface(JNIEnv* env, jobject surfaceObj) {
17564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    sp<Surface> result(android_view_Surface_getSurface(env, surfaceObj));
17664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    if (result == NULL) {
17769d62097e8195c947de7e4cdc4a491181aa56e61Mathias Agopian        /*
17869d62097e8195c947de7e4cdc4a491181aa56e61Mathias Agopian         * if this method is called from the WindowManager's process, it means
17969d62097e8195c947de7e4cdc4a491181aa56e61Mathias Agopian         * the client is is not remote, and therefore is allowed to have
1808451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes         * a Surface (data), so we create it here.
18169d62097e8195c947de7e4cdc4a491181aa56e61Mathias Agopian         * If we don't have a SurfaceControl, it means we're in a different
18269d62097e8195c947de7e4cdc4a491181aa56e61Mathias Agopian         * process.
18369d62097e8195c947de7e4cdc4a491181aa56e61Mathias Agopian         */
1848451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes
18564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        SurfaceControl* const control = reinterpret_cast<SurfaceControl*>(
18664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown                env->GetIntField(surfaceObj, gSurfaceClassInfo.mNativeSurfaceControl));
18769d62097e8195c947de7e4cdc4a491181aa56e61Mathias Agopian        if (control) {
18869d62097e8195c947de7e4cdc4a491181aa56e61Mathias Agopian            result = control->getSurface();
18964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            if (result != NULL) {
19064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown                result->incStrong(surfaceObj);
19164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown                env->SetIntField(surfaceObj, gSurfaceClassInfo.mNativeSurface,
19264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown                        reinterpret_cast<jint>(result.get()));
19369d62097e8195c947de7e4cdc4a491181aa56e61Mathias Agopian            }
19469d62097e8195c947de7e4cdc4a491181aa56e61Mathias Agopian        }
19569d62097e8195c947de7e4cdc4a491181aa56e61Mathias Agopian    }
19669d62097e8195c947de7e4cdc4a491181aa56e61Mathias Agopian    return result;
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19964a55af0ac700baecb0877235eb42caac59a3560Jeff Brownsp<ANativeWindow> android_view_Surface_getNativeWindow(JNIEnv* env, jobject surfaceObj) {
20064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    return getSurface(env, surfaceObj);
2018b73ae4a1e5321753e54354e5202a38c5560fea9Mathias Agopian}
2028b73ae4a1e5321753e54354e5202a38c5560fea9Mathias Agopian
20364a55af0ac700baecb0877235eb42caac59a3560Jeff Brownbool android_view_Surface_isInstanceOf(JNIEnv* env, jobject obj) {
20464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    return env->IsInstanceOf(obj, gSurfaceClassInfo.clazz);
205050316184b01c0d1a01c46afae7429b89a27c31btedbo}
206050316184b01c0d1a01c46afae7429b89a27c31btedbo
20764a55af0ac700baecb0877235eb42caac59a3560Jeff Brownsp<Surface> android_view_Surface_getSurface(JNIEnv* env, jobject surfaceObj) {
20864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    return reinterpret_cast<Surface*>(
20964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            env->GetIntField(surfaceObj, gSurfaceClassInfo.mNativeSurface));
2104e8a5c922c287ec97fec847194e930f8598a1941tedbo}
2114e8a5c922c287ec97fec847194e930f8598a1941tedbo
21264a55af0ac700baecb0877235eb42caac59a3560Jeff Brownstatic void setSurface(JNIEnv* env, jobject surfaceObj, const sp<Surface>& surface) {
21364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    Surface* const p = reinterpret_cast<Surface*>(
21464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            env->GetIntField(surfaceObj, gSurfaceClassInfo.mNativeSurface));
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (surface.get()) {
21664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        surface->incStrong(surfaceObj);
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (p) {
21964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        p->decStrong(surfaceObj);
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
22164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    env->SetIntField(surfaceObj, gSurfaceClassInfo.mNativeSurface,
22264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            reinterpret_cast<jint>(surface.get()));
22364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
2242a83f001fdb189f945e82e81e717ba204824b112Romain Guy    // This test is conservative and it would be better to compare the ISurfaces
2252a83f001fdb189f945e82e81e717ba204824b112Romain Guy    if (p && p != surface.get()) {
22664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        jint generationId = env->GetIntField(surfaceObj,
22764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown                gSurfaceClassInfo.mGenerationId);
2282a83f001fdb189f945e82e81e717ba204824b112Romain Guy        generationId++;
22964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        env->SetIntField(surfaceObj,
23064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown                gSurfaceClassInfo.mGenerationId, generationId);
2312a83f001fdb189f945e82e81e717ba204824b112Romain Guy    }
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23664a55af0ac700baecb0877235eb42caac59a3560Jeff Brownstatic void nativeCreate(JNIEnv* env, jobject surfaceObj, jobject sessionObj,
23764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        jstring nameStr, jint w, jint h, jint format, jint flags) {
23864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    ScopedUtfChars name(env, nameStr);
23964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    sp<SurfaceComposerClient> client(android_view_SurfaceSession_getClient(env, sessionObj));
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    sp<SurfaceControl> surface = client->createSurface(
24264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            String8(name.c_str()), w, h, format, flags);
24364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    if (surface == NULL) {
2448451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes        jniThrowException(env, OutOfResourcesException, NULL);
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    setSurfaceControl(env, surfaceObj, surface);
24964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown}
2502e76c992bfa955cb637417005941e3e93810a99dDaniel Lam
25164a55af0ac700baecb0877235eb42caac59a3560Jeff Brownstatic void nativeCreateFromSurfaceTexture(JNIEnv* env, jobject surfaceObj,
25264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        jobject surfaceTextureObj) {
25364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    sp<SurfaceTexture> st(SurfaceTexture_getSurfaceTexture(env, surfaceTextureObj));
2542e76c992bfa955cb637417005941e3e93810a99dDaniel Lam    if (st == NULL) {
2552e76c992bfa955cb637417005941e3e93810a99dDaniel Lam        jniThrowException(env, "java/lang/IllegalArgumentException",
2562e76c992bfa955cb637417005941e3e93810a99dDaniel Lam                "SurfaceTexture has already been released");
2572e76c992bfa955cb637417005941e3e93810a99dDaniel Lam        return;
2582e76c992bfa955cb637417005941e3e93810a99dDaniel Lam    }
25964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
2602e76c992bfa955cb637417005941e3e93810a99dDaniel Lam    sp<ISurfaceTexture> bq = st->getBufferQueue();
2612e76c992bfa955cb637417005941e3e93810a99dDaniel Lam
2622e76c992bfa955cb637417005941e3e93810a99dDaniel Lam    sp<Surface> surface(new Surface(bq));
2630de171b0d490a5928d54d2fb67c912d140aac643Ted Bonkenburg    if (surface == NULL) {
2640de171b0d490a5928d54d2fb67c912d140aac643Ted Bonkenburg        jniThrowException(env, OutOfResourcesException, NULL);
2650de171b0d490a5928d54d2fb67c912d140aac643Ted Bonkenburg        return;
2660de171b0d490a5928d54d2fb67c912d140aac643Ted Bonkenburg    }
2670de171b0d490a5928d54d2fb67c912d140aac643Ted Bonkenburg
26864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    setSurface(env, surfaceObj, surface);
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27164a55af0ac700baecb0877235eb42caac59a3560Jeff Brownstatic void nativeRelease(JNIEnv* env, jobject surfaceObj) {
27264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    setSurfaceControl(env, surfaceObj, NULL);
27364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    setSurface(env, surfaceObj, NULL);
2748138cb49e47f9a9905a316a217757710185c66aaMarco Nelissen}
2758138cb49e47f9a9905a316a217757710185c66aaMarco Nelissen
27664a55af0ac700baecb0877235eb42caac59a3560Jeff Brownstatic void nativeDestroy(JNIEnv* env, jobject surfaceObj) {
27764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    sp<SurfaceControl> surfaceControl(getSurfaceControl(env, surfaceObj));
27864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    if (SurfaceControl::isValid(surfaceControl)) {
27964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        surfaceControl->clear();
280402c34649f514669517c2208e35caa58ff8bb2b9Mathias Agopian    }
28164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    setSurfaceControl(env, surfaceObj, NULL);
28264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    setSurface(env, surfaceObj, NULL);
283402c34649f514669517c2208e35caa58ff8bb2b9Mathias Agopian}
284402c34649f514669517c2208e35caa58ff8bb2b9Mathias Agopian
28564a55af0ac700baecb0877235eb42caac59a3560Jeff Brownstatic jboolean nativeIsValid(JNIEnv* env, jobject surfaceObj) {
28664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    sp<SurfaceControl> surfaceControl(getSurfaceControl(env, surfaceObj));
28764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    if (surfaceControl != NULL) {
28817f638b39f2e8b610ecfa1290e5bc42ab7700c98Mathias Agopian        return SurfaceControl::isValid(surfaceControl) ? JNI_TRUE : JNI_FALSE;
28917f638b39f2e8b610ecfa1290e5bc42ab7700c98Mathias Agopian    }
29064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
29164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    sp<Surface> surface(getSurface(env, surfaceObj));
292402c34649f514669517c2208e35caa58ff8bb2b9Mathias Agopian    return Surface::isValid(surface) ? JNI_TRUE : JNI_FALSE;
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29564a55af0ac700baecb0877235eb42caac59a3560Jeff Brownstatic jint nativeGetIdentity(JNIEnv* env, jobject surfaceObj) {
29664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    sp<SurfaceControl> control(getSurfaceControl(env, surfaceObj));
29764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    if (control != NULL) {
29864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        return jint(control->getIdentity());
29964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    }
30064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
30164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    sp<Surface> surface(getSurface(env, surfaceObj));
30264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    if (surface != NULL) {
30364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        return jint(surface->getIdentity());
30464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    }
30564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
30664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    return -1;
30764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown}
30864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
30964a55af0ac700baecb0877235eb42caac59a3560Jeff Brownstatic jboolean nativeIsConsumerRunningBehind(JNIEnv* env, jobject surfaceObj) {
31064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    sp<Surface> surface(getSurface(env, surfaceObj));
311c14bacf1fb511472138eeb5dc84a9423fc003214Mathias Agopian    if (!Surface::isValid(surface)) {
312c14bacf1fb511472138eeb5dc84a9423fc003214Mathias Agopian        doThrowIAE(env);
31364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        return JNI_FALSE;
314c14bacf1fb511472138eeb5dc84a9423fc003214Mathias Agopian    }
31564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
31664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    int value = 0;
31764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    ANativeWindow* anw = static_cast<ANativeWindow*>(surface.get());
318c14bacf1fb511472138eeb5dc84a9423fc003214Mathias Agopian    anw->query(anw, NATIVE_WINDOW_CONSUMER_RUNNING_BEHIND, &value);
31964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    return value;
320c14bacf1fb511472138eeb5dc84a9423fc003214Mathias Agopian}
321c14bacf1fb511472138eeb5dc84a9423fc003214Mathias Agopian
32264a55af0ac700baecb0877235eb42caac59a3560Jeff Brownstatic inline SkBitmap::Config convertPixelFormat(PixelFormat format) {
323f1e5b0d4e5d0d2a78c234cd0cbd3005a74a79429Mathias Agopian    /* note: if PIXEL_FORMAT_RGBX_8888 means that all alpha bytes are 0xFF, then
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        we can map to SkBitmap::kARGB_8888_Config, and optionally call
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        bitmap.setIsOpaque(true) on the resulting SkBitmap (as an accelerator)
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    */
3278138cb49e47f9a9905a316a217757710185c66aaMarco Nelissen    switch (format) {
3288138cb49e47f9a9905a316a217757710185c66aaMarco Nelissen    case PIXEL_FORMAT_RGBX_8888:    return SkBitmap::kARGB_8888_Config;
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case PIXEL_FORMAT_RGBA_8888:    return SkBitmap::kARGB_8888_Config;
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case PIXEL_FORMAT_RGBA_4444:    return SkBitmap::kARGB_4444_Config;
3318138cb49e47f9a9905a316a217757710185c66aaMarco Nelissen    case PIXEL_FORMAT_RGB_565:      return SkBitmap::kRGB_565_Config;
3328138cb49e47f9a9905a316a217757710185c66aaMarco Nelissen    case PIXEL_FORMAT_A_8:          return SkBitmap::kA8_Config;
3338138cb49e47f9a9905a316a217757710185c66aaMarco Nelissen    default:                        return SkBitmap::kNo_Config;
3348138cb49e47f9a9905a316a217757710185c66aaMarco Nelissen    }
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33764a55af0ac700baecb0877235eb42caac59a3560Jeff Brownstatic jobject nativeLockCanvas(JNIEnv* env, jobject surfaceObj, jobject dirtyRectObj) {
33864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    sp<Surface> surface(getSurface(env, surfaceObj));
339fea12b87f2988f20ea87314c4a1b47e1a0f4d95eRomain Guy    if (!Surface::isValid(surface)) {
3408451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes        doThrowIAE(env);
34164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        return NULL;
342fea12b87f2988f20ea87314c4a1b47e1a0f4d95eRomain Guy    }
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // get dirty region
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Region dirtyRegion;
34664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    if (dirtyRectObj) {
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Rect dirty;
34864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        dirty.left = env->GetIntField(dirtyRectObj, gRectClassInfo.left);
34964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        dirty.top = env->GetIntField(dirtyRectObj, gRectClassInfo.top);
35064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        dirty.right = env->GetIntField(dirtyRectObj, gRectClassInfo.right);
35164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        dirty.bottom = env->GetIntField(dirtyRectObj, gRectClassInfo.bottom);
3526158b1bf0364da1582468a98ec09d004ba99deecMathias Agopian        if (!dirty.isEmpty()) {
3538451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes            dirtyRegion.set(dirty);
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else {
35664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        dirtyRegion.set(Rect(0x3FFF, 0x3FFF));
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Surface::SurfaceInfo info;
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status_t err = surface->lock(&info, &dirtyRegion);
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (err < 0) {
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const char* const exception = (err == NO_MEMORY) ?
36364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown                OutOfResourcesException :
36464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown                "java/lang/IllegalArgumentException";
3658451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes        jniThrowException(env, exception, NULL);
36664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        return NULL;
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Associate a SkCanvas object to this surface
37064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    jobject canvasObj = env->GetObjectField(surfaceObj, gSurfaceClassInfo.mCanvas);
37164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    env->SetIntField(canvasObj, gCanvasClassInfo.mSurfaceFormat, info.format);
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    SkCanvas* nativeCanvas = reinterpret_cast<SkCanvas*>(
37464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            env->GetIntField(canvasObj, gCanvasClassInfo.mNativeCanvas));
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    SkBitmap bitmap;
3761473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    ssize_t bpr = info.s * bytesPerPixel(info.format);
3771473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    bitmap.setConfig(convertPixelFormat(info.format), info.w, info.h, bpr);
378f1e5b0d4e5d0d2a78c234cd0cbd3005a74a79429Mathias Agopian    if (info.format == PIXEL_FORMAT_RGBX_8888) {
379f1e5b0d4e5d0d2a78c234cd0cbd3005a74a79429Mathias Agopian        bitmap.setIsOpaque(true);
380f1e5b0d4e5d0d2a78c234cd0cbd3005a74a79429Mathias Agopian    }
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (info.w > 0 && info.h > 0) {
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        bitmap.setPixels(info.bits);
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else {
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // be safe with an empty bitmap.
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        bitmap.setPixels(NULL);
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    nativeCanvas->setBitmapDevice(bitmap);
3888451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes
3896158b1bf0364da1582468a98ec09d004ba99deecMathias Agopian    SkRegion clipReg;
3906158b1bf0364da1582468a98ec09d004ba99deecMathias Agopian    if (dirtyRegion.isRect()) { // very common case
391a8a0aa8b922c45fb4633f51610f264a19f9bd825Mathias Agopian        const Rect b(dirtyRegion.getBounds());
3926158b1bf0364da1582468a98ec09d004ba99deecMathias Agopian        clipReg.setRect(b.left, b.top, b.right, b.bottom);
3936158b1bf0364da1582468a98ec09d004ba99deecMathias Agopian    } else {
3946158b1bf0364da1582468a98ec09d004ba99deecMathias Agopian        size_t count;
3956158b1bf0364da1582468a98ec09d004ba99deecMathias Agopian        Rect const* r = dirtyRegion.getArray(&count);
3966158b1bf0364da1582468a98ec09d004ba99deecMathias Agopian        while (count) {
3976158b1bf0364da1582468a98ec09d004ba99deecMathias Agopian            clipReg.op(r->left, r->top, r->right, r->bottom, SkRegion::kUnion_Op);
3986158b1bf0364da1582468a98ec09d004ba99deecMathias Agopian            r++, count--;
3996158b1bf0364da1582468a98ec09d004ba99deecMathias Agopian        }
4006158b1bf0364da1582468a98ec09d004ba99deecMathias Agopian    }
4016158b1bf0364da1582468a98ec09d004ba99deecMathias Agopian
4026158b1bf0364da1582468a98ec09d004ba99deecMathias Agopian    nativeCanvas->clipRegion(clipReg);
4038451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int saveCount = nativeCanvas->save();
40564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    env->SetIntField(surfaceObj, gSurfaceClassInfo.mCanvasSaveCount, saveCount);
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    if (dirtyRectObj) {
4086158b1bf0364da1582468a98ec09d004ba99deecMathias Agopian        const Rect& bounds(dirtyRegion.getBounds());
40964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        env->SetIntField(dirtyRectObj, gRectClassInfo.left, bounds.left);
41064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        env->SetIntField(dirtyRectObj, gRectClassInfo.top, bounds.top);
41164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        env->SetIntField(dirtyRectObj, gRectClassInfo.right, bounds.right);
41264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        env->SetIntField(dirtyRectObj, gRectClassInfo.bottom, bounds.bottom);
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4148451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes
41564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    return canvasObj;
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
41864a55af0ac700baecb0877235eb42caac59a3560Jeff Brownstatic void nativeUnlockCanvasAndPost(JNIEnv* env, jobject surfaceObj, jobject canvasObj) {
41964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    jobject ownCanvasObj = env->GetObjectField(surfaceObj, gSurfaceClassInfo.mCanvas);
42064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    if (!env->IsSameObject(ownCanvasObj, canvasObj)) {
4218451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes        doThrowIAE(env);
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4248451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes
42564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    sp<Surface> surface(getSurface(env, surfaceObj));
42664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    if (!Surface::isValid(surface)) {
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
42864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    }
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // detach the canvas from the surface
43164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    SkCanvas* nativeCanvas = reinterpret_cast<SkCanvas*>(
43264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            env->GetIntField(canvasObj, gCanvasClassInfo.mNativeCanvas));
43364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    int saveCount = env->GetIntField(surfaceObj, gSurfaceClassInfo.mCanvasSaveCount);
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    nativeCanvas->restoreToCount(saveCount);
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    nativeCanvas->setBitmapDevice(SkBitmap());
43664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    env->SetIntField(surfaceObj, gSurfaceClassInfo.mCanvasSaveCount, 0);
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // unlock surface
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status_t err = surface->unlockAndPost();
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (err < 0) {
4418451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes        doThrowIAE(env);
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44564a55af0ac700baecb0877235eb42caac59a3560Jeff Brownstatic jobject nativeScreenshot(JNIEnv* env, jclass clazz, jobject displayTokenObj,
44664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        jint width, jint height, jint minLayer, jint maxLayer, bool allLayers) {
44764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    sp<IBinder> displayToken = ibinderForJavaObject(env, displayTokenObj);
44864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    if (displayToken == NULL) {
44964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        return NULL;
450a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn    }
451a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn
4521f5b195ed0f7f4a3398903fc064af1788c108badDianne Hackborn    ScreenshotPixelRef* pixels = new ScreenshotPixelRef(NULL);
45364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    if (pixels->update(displayToken, width, height,
4540b722fe9ce98d97dbcb6fefd170b85ab7037e528Jeff Brown            minLayer, maxLayer, allLayers) != NO_ERROR) {
4551f5b195ed0f7f4a3398903fc064af1788c108badDianne Hackborn        delete pixels;
45664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        return NULL;
457a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn    }
458a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn
4591f5b195ed0f7f4a3398903fc064af1788c108badDianne Hackborn    uint32_t w = pixels->getWidth();
4601f5b195ed0f7f4a3398903fc064af1788c108badDianne Hackborn    uint32_t h = pixels->getHeight();
4611f5b195ed0f7f4a3398903fc064af1788c108badDianne Hackborn    uint32_t s = pixels->getStride();
4621f5b195ed0f7f4a3398903fc064af1788c108badDianne Hackborn    uint32_t f = pixels->getFormat();
4631f5b195ed0f7f4a3398903fc064af1788c108badDianne Hackborn    ssize_t bpr = s * android::bytesPerPixel(f);
4641f5b195ed0f7f4a3398903fc064af1788c108badDianne Hackborn
4651f5b195ed0f7f4a3398903fc064af1788c108badDianne Hackborn    SkBitmap* bitmap = new SkBitmap();
4661f5b195ed0f7f4a3398903fc064af1788c108badDianne Hackborn    bitmap->setConfig(convertPixelFormat(f), w, h, bpr);
4671f5b195ed0f7f4a3398903fc064af1788c108badDianne Hackborn    if (f == PIXEL_FORMAT_RGBX_8888) {
4681f5b195ed0f7f4a3398903fc064af1788c108badDianne Hackborn        bitmap->setIsOpaque(true);
4691f5b195ed0f7f4a3398903fc064af1788c108badDianne Hackborn    }
4701f5b195ed0f7f4a3398903fc064af1788c108badDianne Hackborn
4711f5b195ed0f7f4a3398903fc064af1788c108badDianne Hackborn    if (w > 0 && h > 0) {
4721f5b195ed0f7f4a3398903fc064af1788c108badDianne Hackborn        bitmap->setPixelRef(pixels)->unref();
4731f5b195ed0f7f4a3398903fc064af1788c108badDianne Hackborn        bitmap->lockPixels();
4741f5b195ed0f7f4a3398903fc064af1788c108badDianne Hackborn    } else {
4751f5b195ed0f7f4a3398903fc064af1788c108badDianne Hackborn        // be safe with an empty bitmap.
4761f5b195ed0f7f4a3398903fc064af1788c108badDianne Hackborn        delete pixels;
4771f5b195ed0f7f4a3398903fc064af1788c108badDianne Hackborn        bitmap->setPixels(NULL);
4781f5b195ed0f7f4a3398903fc064af1788c108badDianne Hackborn    }
4791f5b195ed0f7f4a3398903fc064af1788c108badDianne Hackborn
480a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn    return GraphicsJNI::createBitmap(env, bitmap, false, NULL);
481a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn}
482a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn
48364a55af0ac700baecb0877235eb42caac59a3560Jeff Brownstatic void nativeOpenTransaction(JNIEnv* env, jclass clazz) {
48464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    SurfaceComposerClient::openGlobalTransaction();
485d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn}
486d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn
48764a55af0ac700baecb0877235eb42caac59a3560Jeff Brownstatic void nativeCloseTransaction(JNIEnv* env, jclass clazz) {
48864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    SurfaceComposerClient::closeGlobalTransaction();
489d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn}
490d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn
49164a55af0ac700baecb0877235eb42caac59a3560Jeff Brownstatic void nativeSetLayer(JNIEnv* env, jobject surfaceObj, jint zorder) {
49264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    sp<SurfaceControl> surface(getSurfaceControl(env, surfaceObj));
49364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    if (surface == NULL) return;
49464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
49517f638b39f2e8b610ecfa1290e5bc42ab7700c98Mathias Agopian    status_t err = surface->setLayer(zorder);
49664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    if (err < 0 && err != NO_INIT) {
4978451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes        doThrowIAE(env);
4988451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes    }
4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
50164a55af0ac700baecb0877235eb42caac59a3560Jeff Brownstatic void nativeSetPosition(JNIEnv* env, jobject surfaceObj, jfloat x, jfloat y) {
50264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    sp<SurfaceControl> surface(getSurfaceControl(env, surfaceObj));
50364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    if (surface == NULL) return;
50464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
50517f638b39f2e8b610ecfa1290e5bc42ab7700c98Mathias Agopian    status_t err = surface->setPosition(x, y);
50664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    if (err < 0 && err != NO_INIT) {
5078451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes        doThrowIAE(env);
5088451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes    }
5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
51164a55af0ac700baecb0877235eb42caac59a3560Jeff Brownstatic void nativeSetSize(JNIEnv* env, jobject surfaceObj, jint w, jint h) {
51264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    sp<SurfaceControl> surface(getSurfaceControl(env, surfaceObj));
51364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    if (surface == NULL) return;
51464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
51517f638b39f2e8b610ecfa1290e5bc42ab7700c98Mathias Agopian    status_t err = surface->setSize(w, h);
51664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    if (err < 0 && err != NO_INIT) {
5178451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes        doThrowIAE(env);
5188451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes    }
5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
52164a55af0ac700baecb0877235eb42caac59a3560Jeff Brownstatic void nativeSetFlags(JNIEnv* env, jobject surfaceObj, jint flags, jint mask) {
52264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    sp<SurfaceControl> surface(getSurfaceControl(env, surfaceObj));
52364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    if (surface == NULL) return;
5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
52564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    status_t err = surface->setFlags(flags, mask);
52664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    if (err < 0 && err != NO_INIT) {
5278451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes        doThrowIAE(env);
5288451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes    }
5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
53164a55af0ac700baecb0877235eb42caac59a3560Jeff Brownstatic void nativeSetTransparentRegionHint(JNIEnv* env, jobject surfaceObj, jobject regionObj) {
53264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    sp<SurfaceControl> surface(getSurfaceControl(env, surfaceObj));
53364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    if (surface == NULL) return;
53464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
53564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    SkRegion* region = android_graphics_Region_getSkRegion(env, regionObj);
53664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    if (!region) {
5378451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes        doThrowIAE(env);
53864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        return;
5398451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes    }
5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
54164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    const SkIRect& b(region->getBounds());
5426158b1bf0364da1582468a98ec09d004ba99deecMathias Agopian    Region reg(Rect(b.fLeft, b.fTop, b.fRight, b.fBottom));
54364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    if (region->isComplex()) {
54464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        SkRegion::Iterator it(*region);
5456158b1bf0364da1582468a98ec09d004ba99deecMathias Agopian        while (!it.done()) {
5466158b1bf0364da1582468a98ec09d004ba99deecMathias Agopian            const SkIRect& r(it.rect());
5476158b1bf0364da1582468a98ec09d004ba99deecMathias Agopian            reg.addRectUnchecked(r.fLeft, r.fTop, r.fRight, r.fBottom);
5486158b1bf0364da1582468a98ec09d004ba99deecMathias Agopian            it.next();
5496158b1bf0364da1582468a98ec09d004ba99deecMathias Agopian        }
5506158b1bf0364da1582468a98ec09d004ba99deecMathias Agopian    }
5518451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes
5526158b1bf0364da1582468a98ec09d004ba99deecMathias Agopian    status_t err = surface->setTransparentRegionHint(reg);
55364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    if (err < 0 && err != NO_INIT) {
5548451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes        doThrowIAE(env);
5558451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes    }
5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
55864a55af0ac700baecb0877235eb42caac59a3560Jeff Brownstatic void nativeSetAlpha(JNIEnv* env, jobject surfaceObj, jfloat alpha) {
55964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    sp<SurfaceControl> surface(getSurfaceControl(env, surfaceObj));
56064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    if (surface == NULL) return;
56164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
56217f638b39f2e8b610ecfa1290e5bc42ab7700c98Mathias Agopian    status_t err = surface->setAlpha(alpha);
56364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    if (err < 0 && err != NO_INIT) {
5648451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes        doThrowIAE(env);
5658451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes    }
5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
56864a55af0ac700baecb0877235eb42caac59a3560Jeff Brownstatic void nativeSetMatrix(JNIEnv* env, jobject surfaceObj,
56964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        jfloat dsdx, jfloat dtdx, jfloat dsdy, jfloat dtdy) {
57064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    sp<SurfaceControl> surface(getSurfaceControl(env, surfaceObj));
57164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    if (surface == NULL) return;
57264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
57317f638b39f2e8b610ecfa1290e5bc42ab7700c98Mathias Agopian    status_t err = surface->setMatrix(dsdx, dtdx, dsdy, dtdy);
57464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    if (err < 0 && err != NO_INIT) {
5758451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes        doThrowIAE(env);
5768451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes    }
5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
57964a55af0ac700baecb0877235eb42caac59a3560Jeff Brownstatic void nativeSetWindowCrop(JNIEnv* env, jobject surfaceObj, jobject cropObj) {
58064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    const sp<SurfaceControl>& surface(getSurfaceControl(env, surfaceObj));
58164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    if (surface == NULL) return;
58264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
58364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    Rect crop;
58464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    if (cropObj) {
58564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        crop.left = env->GetIntField(cropObj, gRectClassInfo.left);
58664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        crop.top = env->GetIntField(cropObj, gRectClassInfo.top);
58764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        crop.right = env->GetIntField(cropObj, gRectClassInfo.right);
58864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        crop.bottom = env->GetIntField(cropObj, gRectClassInfo.bottom);
58978b8ef3f3ad8ab935f677d8d672db0d97bff8119Jamie Gennis    } else {
59064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        crop.left = crop.top = crop.right = crop.bottom = 0;
59178b8ef3f3ad8ab935f677d8d672db0d97bff8119Jamie Gennis    }
59278b8ef3f3ad8ab935f677d8d672db0d97bff8119Jamie Gennis
59364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    status_t err = surface->setCrop(crop);
59464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    if (err < 0 && err != NO_INIT) {
59578b8ef3f3ad8ab935f677d8d672db0d97bff8119Jamie Gennis        doThrowIAE(env);
59678b8ef3f3ad8ab935f677d8d672db0d97bff8119Jamie Gennis    }
59778b8ef3f3ad8ab935f677d8d672db0d97bff8119Jamie Gennis}
59878b8ef3f3ad8ab935f677d8d672db0d97bff8119Jamie Gennis
59964a55af0ac700baecb0877235eb42caac59a3560Jeff Brownstatic void nativeSetLayerStack(JNIEnv* env, jobject surfaceObj, jint layerStack) {
60064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    sp<SurfaceControl> surface(getSurfaceControl(env, surfaceObj));
60164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    if (surface == NULL) return;
60264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
6030b722fe9ce98d97dbcb6fefd170b85ab7037e528Jeff Brown    status_t err = surface->setLayerStack(layerStack);
60464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    if (err < 0 && err != NO_INIT) {
6050b722fe9ce98d97dbcb6fefd170b85ab7037e528Jeff Brown        doThrowIAE(env);
6060b722fe9ce98d97dbcb6fefd170b85ab7037e528Jeff Brown    }
6079de4936c99b979f6010440b043edc6d6142d1980Craig Mautner}
6089de4936c99b979f6010440b043edc6d6142d1980Craig Mautner
60964a55af0ac700baecb0877235eb42caac59a3560Jeff Brownstatic jobject nativeGetBuiltInDisplay(JNIEnv* env, jclass clazz, jint id) {
61064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    sp<IBinder> token(SurfaceComposerClient::getBuiltInDisplay(id));
61164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    return javaObjectForIBinder(env, token);
61264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown}
61317f638b39f2e8b610ecfa1290e5bc42ab7700c98Mathias Agopian
61464a55af0ac700baecb0877235eb42caac59a3560Jeff Brownstatic jobject nativeCreateDisplay(JNIEnv* env, jclass clazz, jstring nameObj) {
61564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    ScopedUtfChars name(env, nameObj);
61664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    // TODO: pass the name to SF.
61764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    sp<IBinder> token(SurfaceComposerClient::createDisplay());
61864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    return javaObjectForIBinder(env, token);
61964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown}
62064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
62164a55af0ac700baecb0877235eb42caac59a3560Jeff Brownstatic void nativeSetDisplaySurface(JNIEnv* env, jclass clazz,
62264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        jobject tokenObj, jobject surfaceTextureObj) {
62364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    sp<IBinder> token(ibinderForJavaObject(env, tokenObj));
62464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    if (token == NULL) return;
62564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
62664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    if (!surfaceTextureObj) {
62764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        SurfaceComposerClient::setDisplaySurface(token, NULL);
6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
62964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    }
6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
63164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    sp<SurfaceTexture> st(SurfaceTexture_getSurfaceTexture(env, surfaceTextureObj));
63264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    if (st == NULL) {
63364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        jniThrowException(env, "java/lang/IllegalArgumentException",
63464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown                "SurfaceTexture has already been released");
6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
63864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    sp<ISurfaceTexture> bq = st->getBufferQueue();
63964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    SurfaceComposerClient::setDisplaySurface(token, bq);
64064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown}
64164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
64264a55af0ac700baecb0877235eb42caac59a3560Jeff Brownstatic void nativeSetDisplayLayerStack(JNIEnv* env, jclass clazz,
64364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        jobject tokenObj, jint layerStack) {
64464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    sp<IBinder> token(ibinderForJavaObject(env, tokenObj));
64564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    if (token == NULL) return;
64664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
64764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    SurfaceComposerClient::setDisplayLayerStack(token, layerStack);
64864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown}
64964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
65064a55af0ac700baecb0877235eb42caac59a3560Jeff Brownstatic void nativeSetDisplayOrientation(JNIEnv* env, jclass clazz,
65164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        jobject tokenObj, jint orientation) {
65264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    sp<IBinder> token(ibinderForJavaObject(env, tokenObj));
65364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    if (token == NULL) return;
65464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
65564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    SurfaceComposerClient::setDisplayOrientation(token, orientation);
65664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown}
65764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
65864a55af0ac700baecb0877235eb42caac59a3560Jeff Brownstatic void nativeSetDisplayViewport(JNIEnv* env, jclass clazz,
65964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        jobject tokenObj, jobject rectObj) {
66064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    sp<IBinder> token(ibinderForJavaObject(env, tokenObj));
66164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    if (token == NULL) return;
66264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
66364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    Rect rect;
66464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    rect.left = env->GetIntField(rectObj, gRectClassInfo.left);
66564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    rect.top = env->GetIntField(rectObj, gRectClassInfo.top);
66664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    rect.right = env->GetIntField(rectObj, gRectClassInfo.right);
66764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    rect.bottom = env->GetIntField(rectObj, gRectClassInfo.bottom);
66864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    SurfaceComposerClient::setDisplayViewport(token, rect);
66964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown}
67064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
67164a55af0ac700baecb0877235eb42caac59a3560Jeff Brownstatic void nativeSetDisplayFrame(JNIEnv* env, jclass clazz,
67264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        jobject tokenObj, jobject rectObj) {
67364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    sp<IBinder> token(ibinderForJavaObject(env, tokenObj));
67464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    if (token == NULL) return;
67564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
67664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    Rect rect;
67764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    rect.left = env->GetIntField(rectObj, gRectClassInfo.left);
67864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    rect.top = env->GetIntField(rectObj, gRectClassInfo.top);
67964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    rect.right = env->GetIntField(rectObj, gRectClassInfo.right);
68064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    rect.bottom = env->GetIntField(rectObj, gRectClassInfo.bottom);
68164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    SurfaceComposerClient::setDisplayFrame(token, rect);
68264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown}
68364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
68464a55af0ac700baecb0877235eb42caac59a3560Jeff Brownstatic jboolean nativeGetDisplayInfo(JNIEnv* env, jclass clazz,
68564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        jobject tokenObj, jobject infoObj) {
68664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    sp<IBinder> token(ibinderForJavaObject(env, tokenObj));
68764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    if (token == NULL) return JNI_FALSE;
68864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
68964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    DisplayInfo info;
69064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    if (SurfaceComposerClient::getDisplayInfo(token, &info)) {
69164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        return JNI_FALSE;
69264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    }
69364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
69464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    env->SetIntField(infoObj, gPhysicalDisplayInfoClassInfo.width, info.w);
69564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    env->SetIntField(infoObj, gPhysicalDisplayInfoClassInfo.height, info.h);
69664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    env->SetFloatField(infoObj, gPhysicalDisplayInfoClassInfo.refreshRate, info.fps);
69764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    env->SetFloatField(infoObj, gPhysicalDisplayInfoClassInfo.density, info.density);
69864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    env->SetFloatField(infoObj, gPhysicalDisplayInfoClassInfo.xDpi, info.xdpi);
69964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    env->SetFloatField(infoObj, gPhysicalDisplayInfoClassInfo.yDpi, info.ydpi);
70064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    return JNI_TRUE;
70164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown}
70264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
70364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown// ----------------------------------------------------------------------------
70464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
70564a55af0ac700baecb0877235eb42caac59a3560Jeff Brownstatic void nativeCopyFrom(JNIEnv* env, jobject surfaceObj, jobject otherObj) {
70617f638b39f2e8b610ecfa1290e5bc42ab7700c98Mathias Agopian    /*
70717f638b39f2e8b610ecfa1290e5bc42ab7700c98Mathias Agopian     * This is used by the WindowManagerService just after constructing
70817f638b39f2e8b610ecfa1290e5bc42ab7700c98Mathias Agopian     * a Surface and is necessary for returning the Surface reference to
70917f638b39f2e8b610ecfa1290e5bc42ab7700c98Mathias Agopian     * the caller. At this point, we should only have a SurfaceControl.
71017f638b39f2e8b610ecfa1290e5bc42ab7700c98Mathias Agopian     */
711fae5cb2b356a1fef172b43066180a7ab4c32dbacMathias Agopian
71264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    sp<SurfaceControl> surface(getSurfaceControl(env, surfaceObj));
71364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    sp<SurfaceControl> other(getSurfaceControl(env, otherObj));
71464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    if (!SurfaceControl::isSameSurface(surface, other)) {
7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // we reassign the surface only if it's a different one
7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // otherwise we would loose our client-side state.
71764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        setSurfaceControl(env, surfaceObj, other);
7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
72164a55af0ac700baecb0877235eb42caac59a3560Jeff Brownstatic void nativeTransferFrom(JNIEnv* env, jobject surfaceObj, jobject otherObj) {
72264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    sp<SurfaceControl> control(getSurfaceControl(env, otherObj));
72364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    sp<Surface> surface(android_view_Surface_getSurface(env, otherObj));
72464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    setSurfaceControl(env, surfaceObj, control);
72564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    setSurface(env, surfaceObj, surface);
72664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    setSurfaceControl(env, otherObj, NULL);
72764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    setSurface(env, otherObj, NULL);
72861566cc1932468720a831ad5cbc68ee080d613c9Dianne Hackborn}
72961566cc1932468720a831ad5cbc68ee080d613c9Dianne Hackborn
73064a55af0ac700baecb0877235eb42caac59a3560Jeff Brownstatic void nativeReadFromParcel(JNIEnv* env, jobject surfaceObj, jobject parcelObj) {
73164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    Parcel* parcel = parcelForJavaObject(env, parcelObj);
7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (parcel == NULL) {
7338451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes        doThrowNPE(env);
7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
73764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    sp<Surface> surface(Surface::readFromParcel(*parcel));
73864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    setSurfaceControl(env, surfaceObj, NULL);
73964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    setSurface(env, surfaceObj, surface);
7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
74264a55af0ac700baecb0877235eb42caac59a3560Jeff Brownstatic void nativeWriteToParcel(JNIEnv* env, jobject surfaceObj, jobject parcelObj) {
74364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    Parcel* parcel = parcelForJavaObject(env, parcelObj);
7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (parcel == NULL) {
7458451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes        doThrowNPE(env);
7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7490de171b0d490a5928d54d2fb67c912d140aac643Ted Bonkenburg    // The Java instance may have a SurfaceControl (in the case of the
7500de171b0d490a5928d54d2fb67c912d140aac643Ted Bonkenburg    // WindowManager or a system app). In that case, we defer to the
7510de171b0d490a5928d54d2fb67c912d140aac643Ted Bonkenburg    // SurfaceControl to send its ISurface. Otherwise, if the Surface is
7520de171b0d490a5928d54d2fb67c912d140aac643Ted Bonkenburg    // available we let it parcel itself. Finally, if the Surface is also
7530de171b0d490a5928d54d2fb67c912d140aac643Ted Bonkenburg    // NULL we fall back to using the SurfaceControl path which sends an
7540de171b0d490a5928d54d2fb67c912d140aac643Ted Bonkenburg    // empty surface; this matches legacy behavior.
75564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    sp<SurfaceControl> control(getSurfaceControl(env, surfaceObj));
7560de171b0d490a5928d54d2fb67c912d140aac643Ted Bonkenburg    if (control != NULL) {
7570de171b0d490a5928d54d2fb67c912d140aac643Ted Bonkenburg        SurfaceControl::writeSurfaceToParcel(control, parcel);
7580de171b0d490a5928d54d2fb67c912d140aac643Ted Bonkenburg    } else {
75964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        sp<Surface> surface(android_view_Surface_getSurface(env, surfaceObj));
7600de171b0d490a5928d54d2fb67c912d140aac643Ted Bonkenburg        if (surface != NULL) {
7610de171b0d490a5928d54d2fb67c912d140aac643Ted Bonkenburg            Surface::writeToParcel(surface, parcel);
7620de171b0d490a5928d54d2fb67c912d140aac643Ted Bonkenburg        } else {
7630de171b0d490a5928d54d2fb67c912d140aac643Ted Bonkenburg            SurfaceControl::writeSurfaceToParcel(NULL, parcel);
7640de171b0d490a5928d54d2fb67c912d140aac643Ted Bonkenburg        }
7650de171b0d490a5928d54d2fb67c912d140aac643Ted Bonkenburg    }
7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNINativeMethod gSurfaceMethods[] = {
77164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    {"nativeCreate", "(Landroid/view/SurfaceSession;Ljava/lang/String;IIII)V",
77264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            (void*)nativeCreate },
77364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    {"nativeCreateFromSurfaceTexture", "(Landroid/graphics/SurfaceTexture;)V",
77464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            (void*)nativeCreateFromSurfaceTexture },
77564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    {"nativeRelease", "()V",
77664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            (void*)nativeRelease },
77764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    {"nativeDestroy", "()V",
77864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            (void*)nativeDestroy },
77964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    {"nativeIsValid", "()Z",
78064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            (void*)nativeIsValid },
78164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    {"nativeGetIdentity", "()I",
78264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            (void*)nativeGetIdentity },
78364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    {"nativeIsConsumerRunningBehind", "()Z",
78464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            (void*)nativeIsConsumerRunningBehind },
78564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    {"nativeLockCanvas", "(Landroid/graphics/Rect;)Landroid/graphics/Canvas;",
78664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            (void*)nativeLockCanvas },
78764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    {"nativeUnlockCanvasAndPost", "(Landroid/graphics/Canvas;)V",
78864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            (void*)nativeUnlockCanvasAndPost },
78964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    {"nativeScreenshot", "(Landroid/os/IBinder;IIIIZ)Landroid/graphics/Bitmap;",
79064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            (void*)nativeScreenshot },
79164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    {"nativeOpenTransaction", "()V",
79264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            (void*)nativeOpenTransaction },
79364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    {"nativeCloseTransaction", "()V",
79464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            (void*)nativeCloseTransaction },
79564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    {"nativeSetLayer", "(I)V",
79664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            (void*)nativeSetLayer },
79764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    {"nativeSetPosition", "(FF)V",
79864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            (void*)nativeSetPosition },
79964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    {"nativeSetSize", "(II)V",
80064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            (void*)nativeSetSize },
80164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    {"nativeSetTransparentRegionHint", "(Landroid/graphics/Region;)V",
80264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            (void*)nativeSetTransparentRegionHint },
80364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    {"nativeSetAlpha", "(F)V",
80464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            (void*)nativeSetAlpha },
80564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    {"nativeSetMatrix", "(FFFF)V",
80664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            (void*)nativeSetMatrix },
80764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    {"nativeSetFlags", "(II)V",
80864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            (void*)nativeSetFlags },
80964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    {"nativeSetWindowCrop", "(Landroid/graphics/Rect;)V",
81064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            (void*)nativeSetWindowCrop },
81164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    {"nativeSetLayerStack", "(I)V",
81264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            (void*)nativeSetLayerStack },
81364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    {"nativeGetBuiltInDisplay", "(I)Landroid/os/IBinder;",
81464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            (void*)nativeGetBuiltInDisplay },
81564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    {"nativeCreateDisplay", "(Ljava/lang/String;)Landroid/os/IBinder;",
81664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            (void*)nativeCreateDisplay },
81764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    {"nativeSetDisplaySurface", "(Landroid/os/IBinder;Landroid/graphics/SurfaceTexture;)V",
81864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            (void*)nativeSetDisplaySurface },
81964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    {"nativeSetDisplayLayerStack", "(Landroid/os/IBinder;I)V",
82064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            (void*)nativeSetDisplayLayerStack },
82164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    {"nativeSetDisplayOrientation", "(Landroid/os/IBinder;I)V",
82264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            (void*)nativeSetDisplayOrientation },
82364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    {"nativeSetDisplayViewport", "(Landroid/os/IBinder;Landroid/graphics/Rect;)V",
82464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            (void*)nativeSetDisplayViewport },
82564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    {"nativeSetDisplayFrame", "(Landroid/os/IBinder;Landroid/graphics/Rect;)V",
82664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            (void*)nativeSetDisplayFrame },
82764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    {"nativeGetDisplayInfo", "(Landroid/os/IBinder;Landroid/view/Surface$PhysicalDisplayInfo;)Z",
82864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            (void*)nativeGetDisplayInfo },
82964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    {"nativeCopyFrom", "(Landroid/view/Surface;)V",
83064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            (void*)nativeCopyFrom },
83164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    {"nativeTransferFrom", "(Landroid/view/Surface;)V",
83264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            (void*)nativeTransferFrom },
83364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    {"nativeReadFromParcel", "(Landroid/os/Parcel;)V",
83464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            (void*)nativeReadFromParcel },
83564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    {"nativeWriteToParcel", "(Landroid/os/Parcel;)V",
83664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            (void*)nativeWriteToParcel },
8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint register_android_view_Surface(JNIEnv* env)
8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
84164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    int err = AndroidRuntime::registerNativeMethods(env, "android/view/Surface",
8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            gSurfaceMethods, NELEM(gSurfaceMethods));
84364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
84464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    jclass clazz = env->FindClass("android/view/Surface");
84564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    gSurfaceClassInfo.clazz = jclass(env->NewGlobalRef(clazz));
84664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    gSurfaceClassInfo.mNativeSurface =
84764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            env->GetFieldID(gSurfaceClassInfo.clazz, ANDROID_VIEW_SURFACE_JNI_ID, "I");
84864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    gSurfaceClassInfo.mNativeSurfaceControl =
84964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            env->GetFieldID(gSurfaceClassInfo.clazz, "mNativeSurfaceControl", "I");
85064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    gSurfaceClassInfo.mGenerationId =
85164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            env->GetFieldID(gSurfaceClassInfo.clazz, "mGenerationId", "I");
85264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    gSurfaceClassInfo.mCanvas =
85364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            env->GetFieldID(gSurfaceClassInfo.clazz, "mCanvas", "Landroid/graphics/Canvas;");
85464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    gSurfaceClassInfo.mCanvasSaveCount =
85564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            env->GetFieldID(gSurfaceClassInfo.clazz, "mCanvasSaveCount", "I");
85664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
85764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    clazz = env->FindClass("android/graphics/Canvas");
85864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    gCanvasClassInfo.mNativeCanvas = env->GetFieldID(clazz, "mNativeCanvas", "I");
85964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    gCanvasClassInfo.mSurfaceFormat = env->GetFieldID(clazz, "mSurfaceFormat", "I");
86064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
86164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    clazz = env->FindClass("android/graphics/Rect");
86264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    gRectClassInfo.left = env->GetFieldID(clazz, "left", "I");
86364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    gRectClassInfo.top = env->GetFieldID(clazz, "top", "I");
86464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    gRectClassInfo.right = env->GetFieldID(clazz, "right", "I");
86564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    gRectClassInfo.bottom = env->GetFieldID(clazz, "bottom", "I");
86664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
86764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    clazz = env->FindClass("android/view/Surface$PhysicalDisplayInfo");
86864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    gPhysicalDisplayInfoClassInfo.width = env->GetFieldID(clazz, "width", "I");
86964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    gPhysicalDisplayInfoClassInfo.height = env->GetFieldID(clazz, "height", "I");
87064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    gPhysicalDisplayInfoClassInfo.refreshRate = env->GetFieldID(clazz, "refreshRate", "F");
87164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    gPhysicalDisplayInfoClassInfo.density = env->GetFieldID(clazz, "density", "F");
87264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    gPhysicalDisplayInfoClassInfo.xDpi = env->GetFieldID(clazz, "xDpi", "F");
87364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    gPhysicalDisplayInfoClassInfo.yDpi = env->GetFieldID(clazz, "yDpi", "F");
8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return err;
8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
878