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