blob: 842a7f7a5babcaa9c52e4d957851dac7f0008115 [file] [log] [blame]
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001/*
2 * Copyright (C) 2007 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Mathias Agopianfae5cb22010-06-04 18:26:32 -070017#define LOG_TAG "Surface"
18
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080019#include <stdio.h>
20
Mathias Agopian3866f0d2013-02-11 22:08:48 -080021#include "jni.h"
22#include "JNIHelp.h"
Jeff Brown64a55af2012-08-26 02:47:39 -070023#include "android_os_Parcel.h"
Dianne Hackborna1111872010-11-23 20:55:11 -080024#include "android/graphics/GraphicsJNI.h"
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080025
Mathias Agopian3866f0d2013-02-11 22:08:48 -080026#include <android_runtime/AndroidRuntime.h>
27#include <android_runtime/android_view_Surface.h>
28#include <android_runtime/android_graphics_SurfaceTexture.h>
Mathias Agopian8335f1c2012-02-25 18:48:35 -080029
Mathias Agopian4a05f432013-03-12 18:43:34 -070030#include <binder/Parcel.h>
31
Mathias Agopian8335f1c2012-02-25 18:48:35 -080032#include <gui/Surface.h>
Mathias Agopian52800612013-02-14 17:11:20 -080033#include <gui/SurfaceControl.h>
Andy McFaddend47f7d82012-12-18 09:48:38 -080034#include <gui/GLConsumer.h>
Mathias Agopian8335f1c2012-02-25 18:48:35 -080035
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080036#include <ui/Rect.h>
Mathias Agopian8335f1c2012-02-25 18:48:35 -080037#include <ui/Region.h>
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080038
39#include <SkCanvas.h>
40#include <SkBitmap.h>
Mathias Agopian6158b1b2009-05-11 00:03:41 -070041#include <SkRegion.h>
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080042
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080043#include <utils/misc.h>
Jeff Brown9e316a12012-10-08 19:17:06 -070044#include <utils/Log.h>
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080045
Jeff Brown64a55af2012-08-26 02:47:39 -070046#include <ScopedUtfChars.h>
47
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080048// ----------------------------------------------------------------------------
49
50namespace android {
51
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080052static const char* const OutOfResourcesException =
53 "android/view/Surface$OutOfResourcesException";
54
Jeff Brown64a55af2012-08-26 02:47:39 -070055static struct {
56 jclass clazz;
Mathias Agopian3866f0d2013-02-11 22:08:48 -080057 jfieldID mNativeObject;
Jeff Brownfc0ebd72013-04-30 16:33:00 -070058 jfieldID mLock;
Jeff Browncbad9762012-09-04 21:57:59 -070059 jmethodID ctor;
Jeff Brown64a55af2012-08-26 02:47:39 -070060} gSurfaceClassInfo;
tedbo05031612011-06-06 16:02:47 -070061
Jeff Brown64a55af2012-08-26 02:47:39 -070062static struct {
63 jfieldID left;
64 jfieldID top;
65 jfieldID right;
66 jfieldID bottom;
67} gRectClassInfo;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080068
Jeff Brown64a55af2012-08-26 02:47:39 -070069static struct {
Derek Sollenbergerfc615a02012-12-20 14:39:57 -050070 jfieldID mFinalizer;
Jeff Brown64a55af2012-08-26 02:47:39 -070071 jfieldID mNativeCanvas;
72 jfieldID mSurfaceFormat;
73} gCanvasClassInfo;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080074
Jeff Brown64a55af2012-08-26 02:47:39 -070075static struct {
Derek Sollenbergerfc615a02012-12-20 14:39:57 -050076 jfieldID mNativeCanvas;
77} gCanvasFinalizerClassInfo;
78
Jeff Brown64a55af2012-08-26 02:47:39 -070079// ----------------------------------------------------------------------------
80
Mathias Agopianb1d90c82013-03-06 17:45:42 -080081// this is just a pointer we use to pass to inc/decStrong
82static const void *sRefBaseOwner;
83
Jeff Brown64a55af2012-08-26 02:47:39 -070084bool android_view_Surface_isInstanceOf(JNIEnv* env, jobject obj) {
85 return env->IsInstanceOf(obj, gSurfaceClassInfo.clazz);
86}
87
Mathias Agopian3866f0d2013-02-11 22:08:48 -080088sp<ANativeWindow> android_view_Surface_getNativeWindow(JNIEnv* env, jobject surfaceObj) {
89 return android_view_Surface_getSurface(env, surfaceObj);
90}
91
Jeff Brown64a55af2012-08-26 02:47:39 -070092sp<Surface> android_view_Surface_getSurface(JNIEnv* env, jobject surfaceObj) {
Mathias Agopian7c116b52013-03-18 20:27:02 -070093 sp<Surface> sur;
94 jobject lock = env->GetObjectField(surfaceObj,
Jeff Brownfc0ebd72013-04-30 16:33:00 -070095 gSurfaceClassInfo.mLock);
Mathias Agopian7c116b52013-03-18 20:27:02 -070096 if (env->MonitorEnter(lock) == JNI_OK) {
97 sur = reinterpret_cast<Surface *>(
98 env->GetIntField(surfaceObj, gSurfaceClassInfo.mNativeObject));
99 env->MonitorExit(lock);
100 }
101 return sur;
Jeff Browncbad9762012-09-04 21:57:59 -0700102}
103
Mathias Agopian29479eb2013-02-14 14:36:04 -0800104jobject android_view_Surface_createFromIGraphicBufferProducer(JNIEnv* env,
Andy McFaddend47f7d82012-12-18 09:48:38 -0800105 const sp<IGraphicBufferProducer>& bufferProducer) {
106 if (bufferProducer == NULL) {
Jeff Browncbad9762012-09-04 21:57:59 -0700107 return NULL;
108 }
109
Andy McFaddend47f7d82012-12-18 09:48:38 -0800110 sp<Surface> surface(new Surface(bufferProducer));
Jeff Browncbad9762012-09-04 21:57:59 -0700111 if (surface == NULL) {
112 return NULL;
113 }
114
Mathias Agopian3866f0d2013-02-11 22:08:48 -0800115 jobject surfaceObj = env->NewObject(gSurfaceClassInfo.clazz, gSurfaceClassInfo.ctor, surface.get());
Jeff Browncbad9762012-09-04 21:57:59 -0700116 if (surfaceObj == NULL) {
117 if (env->ExceptionCheck()) {
Andy McFaddend47f7d82012-12-18 09:48:38 -0800118 ALOGE("Could not create instance of Surface from IGraphicBufferProducer.");
Jeff Browncbad9762012-09-04 21:57:59 -0700119 LOGE_EX(env);
120 env->ExceptionClear();
121 }
122 return NULL;
123 }
Mathias Agopianb1d90c82013-03-06 17:45:42 -0800124 surface->incStrong(&sRefBaseOwner);
Jeff Browncbad9762012-09-04 21:57:59 -0700125 return surfaceObj;
126}
127
Jeff Brown64a55af2012-08-26 02:47:39 -0700128// ----------------------------------------------------------------------------
129
Mathias Agopianf3d3b4d2013-02-19 18:26:15 -0800130static inline bool isSurfaceValid(const sp<Surface>& sur) {
131 return Surface::isValid(sur);
Mathias Agopian52800612013-02-14 17:11:20 -0800132}
133
134// ----------------------------------------------------------------------------
135
136static jint nativeCreateFromSurfaceTexture(JNIEnv* env, jclass clazz,
Jeff Brown64a55af2012-08-26 02:47:39 -0700137 jobject surfaceTextureObj) {
Andy McFaddend47f7d82012-12-18 09:48:38 -0800138 sp<GLConsumer> st(SurfaceTexture_getSurfaceTexture(env, surfaceTextureObj));
Jeff Brown64a55af2012-08-26 02:47:39 -0700139 if (st == NULL) {
140 jniThrowException(env, "java/lang/IllegalArgumentException",
141 "SurfaceTexture has already been released");
Mathias Agopian3866f0d2013-02-11 22:08:48 -0800142 return 0;
Jeff Brown64a55af2012-08-26 02:47:39 -0700143 }
144
Andy McFaddend47f7d82012-12-18 09:48:38 -0800145 sp<IGraphicBufferProducer> bq = st->getBufferQueue();
Jeff Brown64a55af2012-08-26 02:47:39 -0700146 sp<Surface> surface(new Surface(bq));
147 if (surface == NULL) {
148 jniThrowException(env, OutOfResourcesException, NULL);
Mathias Agopian3866f0d2013-02-11 22:08:48 -0800149 return 0;
Jeff Brown64a55af2012-08-26 02:47:39 -0700150 }
151
Mathias Agopianb1d90c82013-03-06 17:45:42 -0800152 surface->incStrong(&sRefBaseOwner);
Mathias Agopian3866f0d2013-02-11 22:08:48 -0800153 return int(surface.get());
Jeff Brown64a55af2012-08-26 02:47:39 -0700154}
155
Mathias Agopian29479eb2013-02-14 14:36:04 -0800156static void nativeRelease(JNIEnv* env, jclass clazz, jint nativeObject) {
Mathias Agopian3866f0d2013-02-11 22:08:48 -0800157 sp<Surface> sur(reinterpret_cast<Surface *>(nativeObject));
Mathias Agopianb1d90c82013-03-06 17:45:42 -0800158 sur->decStrong(&sRefBaseOwner);
Jeff Brown64a55af2012-08-26 02:47:39 -0700159}
160
Mathias Agopian29479eb2013-02-14 14:36:04 -0800161static jboolean nativeIsValid(JNIEnv* env, jclass clazz, jint nativeObject) {
Mathias Agopian3866f0d2013-02-11 22:08:48 -0800162 sp<Surface> sur(reinterpret_cast<Surface *>(nativeObject));
Mathias Agopian52800612013-02-14 17:11:20 -0800163 return isSurfaceValid(sur) ? JNI_TRUE : JNI_FALSE;
Jeff Brown64a55af2012-08-26 02:47:39 -0700164}
165
Mathias Agopian29479eb2013-02-14 14:36:04 -0800166static jboolean nativeIsConsumerRunningBehind(JNIEnv* env, jclass clazz, jint nativeObject) {
Mathias Agopian3866f0d2013-02-11 22:08:48 -0800167 sp<Surface> sur(reinterpret_cast<Surface *>(nativeObject));
Mathias Agopian52800612013-02-14 17:11:20 -0800168 if (!isSurfaceValid(sur)) {
Jeff Brown64a55af2012-08-26 02:47:39 -0700169 doThrowIAE(env);
170 return JNI_FALSE;
171 }
Jeff Brown64a55af2012-08-26 02:47:39 -0700172 int value = 0;
Mathias Agopian3866f0d2013-02-11 22:08:48 -0800173 ANativeWindow* anw = static_cast<ANativeWindow*>(sur.get());
Jeff Brown64a55af2012-08-26 02:47:39 -0700174 anw->query(anw, NATIVE_WINDOW_CONSUMER_RUNNING_BEHIND, &value);
175 return value;
176}
177
178static inline SkBitmap::Config convertPixelFormat(PixelFormat format) {
179 /* note: if PIXEL_FORMAT_RGBX_8888 means that all alpha bytes are 0xFF, then
180 we can map to SkBitmap::kARGB_8888_Config, and optionally call
181 bitmap.setIsOpaque(true) on the resulting SkBitmap (as an accelerator)
182 */
183 switch (format) {
184 case PIXEL_FORMAT_RGBX_8888: return SkBitmap::kARGB_8888_Config;
185 case PIXEL_FORMAT_RGBA_8888: return SkBitmap::kARGB_8888_Config;
186 case PIXEL_FORMAT_RGBA_4444: return SkBitmap::kARGB_4444_Config;
187 case PIXEL_FORMAT_RGB_565: return SkBitmap::kRGB_565_Config;
188 case PIXEL_FORMAT_A_8: return SkBitmap::kA8_Config;
189 default: return SkBitmap::kNo_Config;
190 }
191}
192
Derek Sollenbergerfc615a02012-12-20 14:39:57 -0500193static inline void swapCanvasPtr(JNIEnv* env, jobject canvasObj, SkCanvas* newCanvas) {
194 jobject canvasFinalizerObj = env->GetObjectField(canvasObj, gCanvasClassInfo.mFinalizer);
195 SkCanvas* previousCanvas = reinterpret_cast<SkCanvas*>(
196 env->GetIntField(canvasObj, gCanvasClassInfo.mNativeCanvas));
197 env->SetIntField(canvasObj, gCanvasClassInfo.mNativeCanvas, (int)newCanvas);
198 env->SetIntField(canvasFinalizerObj, gCanvasFinalizerClassInfo.mNativeCanvas, (int)newCanvas);
199 SkSafeUnref(previousCanvas);
200}
201
Jeff Brownfc0ebd72013-04-30 16:33:00 -0700202static void nativeLockCanvas(JNIEnv* env, jclass clazz,
203 jint nativeObject, jobject canvasObj, jobject dirtyRectObj) {
Mathias Agopian3866f0d2013-02-11 22:08:48 -0800204 sp<Surface> surface(reinterpret_cast<Surface *>(nativeObject));
205
Mathias Agopian52800612013-02-14 17:11:20 -0800206 if (!isSurfaceValid(surface)) {
Jeff Brown64a55af2012-08-26 02:47:39 -0700207 doThrowIAE(env);
Jeff Brownfc0ebd72013-04-30 16:33:00 -0700208 return;
Jeff Brown64a55af2012-08-26 02:47:39 -0700209 }
210
Mathias Agopian667809e2013-04-17 14:57:41 -0700211 Rect dirtyRect;
212 Rect* dirtyRectPtr = NULL;
213
Jeff Brown64a55af2012-08-26 02:47:39 -0700214 if (dirtyRectObj) {
Mathias Agopian667809e2013-04-17 14:57:41 -0700215 dirtyRect.left = env->GetIntField(dirtyRectObj, gRectClassInfo.left);
216 dirtyRect.top = env->GetIntField(dirtyRectObj, gRectClassInfo.top);
217 dirtyRect.right = env->GetIntField(dirtyRectObj, gRectClassInfo.right);
218 dirtyRect.bottom = env->GetIntField(dirtyRectObj, gRectClassInfo.bottom);
219 dirtyRectPtr = &dirtyRect;
Jeff Brown64a55af2012-08-26 02:47:39 -0700220 }
221
Mathias Agopian52800612013-02-14 17:11:20 -0800222 ANativeWindow_Buffer outBuffer;
Mathias Agopian667809e2013-04-17 14:57:41 -0700223 status_t err = surface->lock(&outBuffer, dirtyRectPtr);
Jeff Brown64a55af2012-08-26 02:47:39 -0700224 if (err < 0) {
225 const char* const exception = (err == NO_MEMORY) ?
226 OutOfResourcesException :
227 "java/lang/IllegalArgumentException";
228 jniThrowException(env, exception, NULL);
Jeff Brownfc0ebd72013-04-30 16:33:00 -0700229 return;
Jeff Brown64a55af2012-08-26 02:47:39 -0700230 }
231
232 // Associate a SkCanvas object to this surface
Mathias Agopian52800612013-02-14 17:11:20 -0800233 env->SetIntField(canvasObj, gCanvasClassInfo.mSurfaceFormat, outBuffer.format);
Jeff Brown64a55af2012-08-26 02:47:39 -0700234
Jeff Brown64a55af2012-08-26 02:47:39 -0700235 SkBitmap bitmap;
Mathias Agopian52800612013-02-14 17:11:20 -0800236 ssize_t bpr = outBuffer.stride * bytesPerPixel(outBuffer.format);
237 bitmap.setConfig(convertPixelFormat(outBuffer.format), outBuffer.width, outBuffer.height, bpr);
238 if (outBuffer.format == PIXEL_FORMAT_RGBX_8888) {
Jeff Brown64a55af2012-08-26 02:47:39 -0700239 bitmap.setIsOpaque(true);
240 }
Mathias Agopian52800612013-02-14 17:11:20 -0800241 if (outBuffer.width > 0 && outBuffer.height > 0) {
242 bitmap.setPixels(outBuffer.bits);
Jeff Brown64a55af2012-08-26 02:47:39 -0700243 } else {
244 // be safe with an empty bitmap.
245 bitmap.setPixels(NULL);
246 }
Derek Sollenbergerfc615a02012-12-20 14:39:57 -0500247
248 SkCanvas* nativeCanvas = SkNEW_ARGS(SkCanvas, (bitmap));
249 swapCanvasPtr(env, canvasObj, nativeCanvas);
Jeff Brown64a55af2012-08-26 02:47:39 -0700250
Mathias Agopian667809e2013-04-17 14:57:41 -0700251 if (dirtyRectPtr) {
252 nativeCanvas->clipRect( SkRect::Make(reinterpret_cast<const SkIRect&>(dirtyRect)) );
Jeff Brown64a55af2012-08-26 02:47:39 -0700253 }
254
Jeff Brown64a55af2012-08-26 02:47:39 -0700255 if (dirtyRectObj) {
Mathias Agopian667809e2013-04-17 14:57:41 -0700256 env->SetIntField(dirtyRectObj, gRectClassInfo.left, dirtyRect.left);
257 env->SetIntField(dirtyRectObj, gRectClassInfo.top, dirtyRect.top);
258 env->SetIntField(dirtyRectObj, gRectClassInfo.right, dirtyRect.right);
259 env->SetIntField(dirtyRectObj, gRectClassInfo.bottom, dirtyRect.bottom);
Jeff Brown64a55af2012-08-26 02:47:39 -0700260 }
Jeff Brown64a55af2012-08-26 02:47:39 -0700261}
262
Jeff Brownfc0ebd72013-04-30 16:33:00 -0700263static void nativeUnlockCanvasAndPost(JNIEnv* env, jclass clazz,
264 jint nativeObject, jobject canvasObj) {
Mathias Agopian3866f0d2013-02-11 22:08:48 -0800265 sp<Surface> surface(reinterpret_cast<Surface *>(nativeObject));
Mathias Agopian52800612013-02-14 17:11:20 -0800266 if (!isSurfaceValid(surface)) {
Jeff Brown64a55af2012-08-26 02:47:39 -0700267 return;
268 }
269
270 // detach the canvas from the surface
Derek Sollenbergerfc615a02012-12-20 14:39:57 -0500271 SkCanvas* nativeCanvas = SkNEW(SkCanvas);
272 swapCanvasPtr(env, canvasObj, nativeCanvas);
Jeff Brown64a55af2012-08-26 02:47:39 -0700273
274 // unlock surface
275 status_t err = surface->unlockAndPost();
276 if (err < 0) {
277 doThrowIAE(env);
278 }
279}
280
Mathias Agopian17f638b2009-04-16 20:04:08 -0700281// ----------------------------------------------------------------------------
282
Jeff Brownfc0ebd72013-04-30 16:33:00 -0700283static jint nativeCreateFromSurfaceControl(JNIEnv* env, jclass clazz,
284 jint surfaceControlNativeObj) {
Mathias Agopian17f638b2009-04-16 20:04:08 -0700285 /*
286 * This is used by the WindowManagerService just after constructing
287 * a Surface and is necessary for returning the Surface reference to
288 * the caller. At this point, we should only have a SurfaceControl.
Mathias Agopian17f638b2009-04-16 20:04:08 -0700289 */
Mathias Agopianfae5cb22010-06-04 18:26:32 -0700290
Mathias Agopian3866f0d2013-02-11 22:08:48 -0800291 sp<SurfaceControl> ctrl(reinterpret_cast<SurfaceControl *>(surfaceControlNativeObj));
Jeff Brownfc0ebd72013-04-30 16:33:00 -0700292 sp<Surface> surface(ctrl->getSurface());
293 if (surface != NULL) {
294 surface->incStrong(&sRefBaseOwner);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800295 }
Jeff Brownfc0ebd72013-04-30 16:33:00 -0700296 return reinterpret_cast<jint>(surface.get());
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800297}
298
Mathias Agopian29479eb2013-02-14 14:36:04 -0800299static jint nativeReadFromParcel(JNIEnv* env, jclass clazz,
Mathias Agopian3866f0d2013-02-11 22:08:48 -0800300 jint nativeObject, jobject parcelObj) {
301 Parcel* parcel = parcelForJavaObject(env, parcelObj);
302 if (parcel == NULL) {
303 doThrowNPE(env);
304 return 0;
305 }
Mathias Agopianc3b9cd62013-03-13 16:07:57 -0700306
Mathias Agopian3866f0d2013-02-11 22:08:48 -0800307 sp<Surface> self(reinterpret_cast<Surface *>(nativeObject));
Mathias Agopianc3b9cd62013-03-13 16:07:57 -0700308 sp<IBinder> binder(parcel->readStrongBinder());
309
310 // update the Surface only if the underlying IGraphicBufferProducer
311 // has changed.
312 if (self != NULL
313 && (self->getIGraphicBufferProducer()->asBinder() == binder)) {
314 // same IGraphicBufferProducer, return ourselves
315 return int(self.get());
Mathias Agopian3866f0d2013-02-11 22:08:48 -0800316 }
Mathias Agopian4a05f432013-03-12 18:43:34 -0700317
318 sp<Surface> sur;
Mathias Agopianc3b9cd62013-03-13 16:07:57 -0700319 sp<IGraphicBufferProducer> gbp(interface_cast<IGraphicBufferProducer>(binder));
Mathias Agopian4a05f432013-03-12 18:43:34 -0700320 if (gbp != NULL) {
Mathias Agopianc3b9cd62013-03-13 16:07:57 -0700321 // we have a new IGraphicBufferProducer, create a new Surface for it
Mathias Agopian4a05f432013-03-12 18:43:34 -0700322 sur = new Surface(gbp);
Mathias Agopianc3b9cd62013-03-13 16:07:57 -0700323 // and keep a reference before passing to java
Mathias Agopianb1d90c82013-03-06 17:45:42 -0800324 sur->incStrong(&sRefBaseOwner);
Mathias Agopian3866f0d2013-02-11 22:08:48 -0800325 }
Mathias Agopian4a05f432013-03-12 18:43:34 -0700326
Mathias Agopianc3b9cd62013-03-13 16:07:57 -0700327 if (self != NULL) {
328 // and loose the java reference to ourselves
329 self->decStrong(&sRefBaseOwner);
330 }
331
Mathias Agopian3866f0d2013-02-11 22:08:48 -0800332 return int(sur.get());
Dianne Hackborn61566cc2011-12-02 23:31:52 -0800333}
334
Mathias Agopian29479eb2013-02-14 14:36:04 -0800335static void nativeWriteToParcel(JNIEnv* env, jclass clazz,
Mathias Agopian3866f0d2013-02-11 22:08:48 -0800336 jint nativeObject, jobject parcelObj) {
Jeff Brown64a55af2012-08-26 02:47:39 -0700337 Parcel* parcel = parcelForJavaObject(env, parcelObj);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800338 if (parcel == NULL) {
Elliott Hughes8451b252011-04-07 19:17:57 -0700339 doThrowNPE(env);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800340 return;
341 }
Mathias Agopian3866f0d2013-02-11 22:08:48 -0800342 sp<Surface> self(reinterpret_cast<Surface *>(nativeObject));
Mathias Agopian4a05f432013-03-12 18:43:34 -0700343 parcel->writeStrongBinder( self != 0 ? self->getIGraphicBufferProducer()->asBinder() : NULL);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800344}
345
346// ----------------------------------------------------------------------------
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800347
348static JNINativeMethod gSurfaceMethods[] = {
Mathias Agopian3866f0d2013-02-11 22:08:48 -0800349 {"nativeCreateFromSurfaceTexture", "(Landroid/graphics/SurfaceTexture;)I",
Jeff Brown64a55af2012-08-26 02:47:39 -0700350 (void*)nativeCreateFromSurfaceTexture },
Mathias Agopian3866f0d2013-02-11 22:08:48 -0800351 {"nativeRelease", "(I)V",
Jeff Brown64a55af2012-08-26 02:47:39 -0700352 (void*)nativeRelease },
Mathias Agopian3866f0d2013-02-11 22:08:48 -0800353 {"nativeIsValid", "(I)Z",
Jeff Brown64a55af2012-08-26 02:47:39 -0700354 (void*)nativeIsValid },
Mathias Agopian3866f0d2013-02-11 22:08:48 -0800355 {"nativeIsConsumerRunningBehind", "(I)Z",
Jeff Brown64a55af2012-08-26 02:47:39 -0700356 (void*)nativeIsConsumerRunningBehind },
Jeff Brownfc0ebd72013-04-30 16:33:00 -0700357 {"nativeLockCanvas", "(ILandroid/graphics/Canvas;Landroid/graphics/Rect;)V",
Jeff Brown64a55af2012-08-26 02:47:39 -0700358 (void*)nativeLockCanvas },
Mathias Agopian3866f0d2013-02-11 22:08:48 -0800359 {"nativeUnlockCanvasAndPost", "(ILandroid/graphics/Canvas;)V",
Jeff Brown64a55af2012-08-26 02:47:39 -0700360 (void*)nativeUnlockCanvasAndPost },
Jeff Brownfc0ebd72013-04-30 16:33:00 -0700361 {"nativeCreateFromSurfaceControl", "(I)I",
362 (void*)nativeCreateFromSurfaceControl },
Mathias Agopian3866f0d2013-02-11 22:08:48 -0800363 {"nativeReadFromParcel", "(ILandroid/os/Parcel;)I",
Jeff Brown64a55af2012-08-26 02:47:39 -0700364 (void*)nativeReadFromParcel },
Mathias Agopian3866f0d2013-02-11 22:08:48 -0800365 {"nativeWriteToParcel", "(ILandroid/os/Parcel;)V",
Jeff Brown64a55af2012-08-26 02:47:39 -0700366 (void*)nativeWriteToParcel },
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800367};
368
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800369int register_android_view_Surface(JNIEnv* env)
370{
Jeff Brown64a55af2012-08-26 02:47:39 -0700371 int err = AndroidRuntime::registerNativeMethods(env, "android/view/Surface",
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800372 gSurfaceMethods, NELEM(gSurfaceMethods));
Jeff Brown64a55af2012-08-26 02:47:39 -0700373
374 jclass clazz = env->FindClass("android/view/Surface");
375 gSurfaceClassInfo.clazz = jclass(env->NewGlobalRef(clazz));
Mathias Agopian3866f0d2013-02-11 22:08:48 -0800376 gSurfaceClassInfo.mNativeObject =
377 env->GetFieldID(gSurfaceClassInfo.clazz, "mNativeObject", "I");
Jeff Brownfc0ebd72013-04-30 16:33:00 -0700378 gSurfaceClassInfo.mLock =
379 env->GetFieldID(gSurfaceClassInfo.clazz, "mLock", "Ljava/lang/Object;");
Mathias Agopianffddc9b2013-02-25 15:56:31 -0800380 gSurfaceClassInfo.ctor = env->GetMethodID(gSurfaceClassInfo.clazz, "<init>", "(I)V");
Jeff Brown64a55af2012-08-26 02:47:39 -0700381
382 clazz = env->FindClass("android/graphics/Canvas");
Derek Sollenbergerfc615a02012-12-20 14:39:57 -0500383 gCanvasClassInfo.mFinalizer = env->GetFieldID(clazz, "mFinalizer", "Landroid/graphics/Canvas$CanvasFinalizer;");
Jeff Brown64a55af2012-08-26 02:47:39 -0700384 gCanvasClassInfo.mNativeCanvas = env->GetFieldID(clazz, "mNativeCanvas", "I");
385 gCanvasClassInfo.mSurfaceFormat = env->GetFieldID(clazz, "mSurfaceFormat", "I");
386
Derek Sollenbergerfc615a02012-12-20 14:39:57 -0500387 clazz = env->FindClass("android/graphics/Canvas$CanvasFinalizer");
388 gCanvasFinalizerClassInfo.mNativeCanvas = env->GetFieldID(clazz, "mNativeCanvas", "I");
389
Jeff Brown64a55af2012-08-26 02:47:39 -0700390 clazz = env->FindClass("android/graphics/Rect");
391 gRectClassInfo.left = env->GetFieldID(clazz, "left", "I");
392 gRectClassInfo.top = env->GetFieldID(clazz, "top", "I");
393 gRectClassInfo.right = env->GetFieldID(clazz, "right", "I");
394 gRectClassInfo.bottom = env->GetFieldID(clazz, "bottom", "I");
395
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800396 return err;
397}
398
399};