blob: d9f6be96a15665f9a7b95a39549063bd2bd4db92 [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
211 // get dirty region
212 Region dirtyRegion;
213 if (dirtyRectObj) {
214 Rect dirty;
215 dirty.left = env->GetIntField(dirtyRectObj, gRectClassInfo.left);
216 dirty.top = env->GetIntField(dirtyRectObj, gRectClassInfo.top);
217 dirty.right = env->GetIntField(dirtyRectObj, gRectClassInfo.right);
218 dirty.bottom = env->GetIntField(dirtyRectObj, gRectClassInfo.bottom);
219 if (!dirty.isEmpty()) {
220 dirtyRegion.set(dirty);
221 }
222 } else {
223 dirtyRegion.set(Rect(0x3FFF, 0x3FFF));
224 }
225
Mathias Agopian52800612013-02-14 17:11:20 -0800226 ANativeWindow_Buffer outBuffer;
227 Rect dirtyBounds(dirtyRegion.getBounds());
228 status_t err = surface->lock(&outBuffer, &dirtyBounds);
Mathias Agopianf798a8e2013-02-15 16:35:09 -0800229 dirtyRegion.set(dirtyBounds);
Jeff Brown64a55af2012-08-26 02:47:39 -0700230 if (err < 0) {
231 const char* const exception = (err == NO_MEMORY) ?
232 OutOfResourcesException :
233 "java/lang/IllegalArgumentException";
234 jniThrowException(env, exception, NULL);
Jeff Brownfc0ebd72013-04-30 16:33:00 -0700235 return;
Jeff Brown64a55af2012-08-26 02:47:39 -0700236 }
237
238 // Associate a SkCanvas object to this surface
Mathias Agopian52800612013-02-14 17:11:20 -0800239 env->SetIntField(canvasObj, gCanvasClassInfo.mSurfaceFormat, outBuffer.format);
Jeff Brown64a55af2012-08-26 02:47:39 -0700240
Jeff Brown64a55af2012-08-26 02:47:39 -0700241 SkBitmap bitmap;
Mathias Agopian52800612013-02-14 17:11:20 -0800242 ssize_t bpr = outBuffer.stride * bytesPerPixel(outBuffer.format);
243 bitmap.setConfig(convertPixelFormat(outBuffer.format), outBuffer.width, outBuffer.height, bpr);
244 if (outBuffer.format == PIXEL_FORMAT_RGBX_8888) {
Jeff Brown64a55af2012-08-26 02:47:39 -0700245 bitmap.setIsOpaque(true);
246 }
Mathias Agopian52800612013-02-14 17:11:20 -0800247 if (outBuffer.width > 0 && outBuffer.height > 0) {
248 bitmap.setPixels(outBuffer.bits);
Jeff Brown64a55af2012-08-26 02:47:39 -0700249 } else {
250 // be safe with an empty bitmap.
251 bitmap.setPixels(NULL);
252 }
Derek Sollenbergerfc615a02012-12-20 14:39:57 -0500253
254 SkCanvas* nativeCanvas = SkNEW_ARGS(SkCanvas, (bitmap));
255 swapCanvasPtr(env, canvasObj, nativeCanvas);
Jeff Brown64a55af2012-08-26 02:47:39 -0700256
257 SkRegion clipReg;
258 if (dirtyRegion.isRect()) { // very common case
259 const Rect b(dirtyRegion.getBounds());
260 clipReg.setRect(b.left, b.top, b.right, b.bottom);
261 } else {
262 size_t count;
263 Rect const* r = dirtyRegion.getArray(&count);
264 while (count) {
265 clipReg.op(r->left, r->top, r->right, r->bottom, SkRegion::kUnion_Op);
266 r++, count--;
267 }
268 }
269
270 nativeCanvas->clipRegion(clipReg);
271
Jeff Brown64a55af2012-08-26 02:47:39 -0700272 if (dirtyRectObj) {
273 const Rect& bounds(dirtyRegion.getBounds());
274 env->SetIntField(dirtyRectObj, gRectClassInfo.left, bounds.left);
275 env->SetIntField(dirtyRectObj, gRectClassInfo.top, bounds.top);
276 env->SetIntField(dirtyRectObj, gRectClassInfo.right, bounds.right);
277 env->SetIntField(dirtyRectObj, gRectClassInfo.bottom, bounds.bottom);
278 }
Jeff Brown64a55af2012-08-26 02:47:39 -0700279}
280
Jeff Brownfc0ebd72013-04-30 16:33:00 -0700281static void nativeUnlockCanvasAndPost(JNIEnv* env, jclass clazz,
282 jint nativeObject, jobject canvasObj) {
Mathias Agopian3866f0d2013-02-11 22:08:48 -0800283 sp<Surface> surface(reinterpret_cast<Surface *>(nativeObject));
Mathias Agopian52800612013-02-14 17:11:20 -0800284 if (!isSurfaceValid(surface)) {
Jeff Brown64a55af2012-08-26 02:47:39 -0700285 return;
286 }
287
288 // detach the canvas from the surface
Derek Sollenbergerfc615a02012-12-20 14:39:57 -0500289 SkCanvas* nativeCanvas = SkNEW(SkCanvas);
290 swapCanvasPtr(env, canvasObj, nativeCanvas);
Jeff Brown64a55af2012-08-26 02:47:39 -0700291
292 // unlock surface
293 status_t err = surface->unlockAndPost();
294 if (err < 0) {
295 doThrowIAE(env);
296 }
297}
298
Mathias Agopian17f638b2009-04-16 20:04:08 -0700299// ----------------------------------------------------------------------------
300
Jeff Brownfc0ebd72013-04-30 16:33:00 -0700301static jint nativeCreateFromSurfaceControl(JNIEnv* env, jclass clazz,
302 jint surfaceControlNativeObj) {
Mathias Agopian17f638b2009-04-16 20:04:08 -0700303 /*
304 * This is used by the WindowManagerService just after constructing
305 * a Surface and is necessary for returning the Surface reference to
306 * the caller. At this point, we should only have a SurfaceControl.
Mathias Agopian17f638b2009-04-16 20:04:08 -0700307 */
Mathias Agopianfae5cb22010-06-04 18:26:32 -0700308
Mathias Agopian3866f0d2013-02-11 22:08:48 -0800309 sp<SurfaceControl> ctrl(reinterpret_cast<SurfaceControl *>(surfaceControlNativeObj));
Jeff Brownfc0ebd72013-04-30 16:33:00 -0700310 sp<Surface> surface(ctrl->getSurface());
311 if (surface != NULL) {
312 surface->incStrong(&sRefBaseOwner);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800313 }
Jeff Brownfc0ebd72013-04-30 16:33:00 -0700314 return reinterpret_cast<jint>(surface.get());
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800315}
316
Mathias Agopian29479eb2013-02-14 14:36:04 -0800317static jint nativeReadFromParcel(JNIEnv* env, jclass clazz,
Mathias Agopian3866f0d2013-02-11 22:08:48 -0800318 jint nativeObject, jobject parcelObj) {
319 Parcel* parcel = parcelForJavaObject(env, parcelObj);
320 if (parcel == NULL) {
321 doThrowNPE(env);
322 return 0;
323 }
Mathias Agopianc3b9cd62013-03-13 16:07:57 -0700324
Mathias Agopian3866f0d2013-02-11 22:08:48 -0800325 sp<Surface> self(reinterpret_cast<Surface *>(nativeObject));
Mathias Agopianc3b9cd62013-03-13 16:07:57 -0700326 sp<IBinder> binder(parcel->readStrongBinder());
327
328 // update the Surface only if the underlying IGraphicBufferProducer
329 // has changed.
330 if (self != NULL
331 && (self->getIGraphicBufferProducer()->asBinder() == binder)) {
332 // same IGraphicBufferProducer, return ourselves
333 return int(self.get());
Mathias Agopian3866f0d2013-02-11 22:08:48 -0800334 }
Mathias Agopian4a05f432013-03-12 18:43:34 -0700335
336 sp<Surface> sur;
Mathias Agopianc3b9cd62013-03-13 16:07:57 -0700337 sp<IGraphicBufferProducer> gbp(interface_cast<IGraphicBufferProducer>(binder));
Mathias Agopian4a05f432013-03-12 18:43:34 -0700338 if (gbp != NULL) {
Mathias Agopianc3b9cd62013-03-13 16:07:57 -0700339 // we have a new IGraphicBufferProducer, create a new Surface for it
Mathias Agopian4a05f432013-03-12 18:43:34 -0700340 sur = new Surface(gbp);
Mathias Agopianc3b9cd62013-03-13 16:07:57 -0700341 // and keep a reference before passing to java
Mathias Agopianb1d90c82013-03-06 17:45:42 -0800342 sur->incStrong(&sRefBaseOwner);
Mathias Agopian3866f0d2013-02-11 22:08:48 -0800343 }
Mathias Agopian4a05f432013-03-12 18:43:34 -0700344
Mathias Agopianc3b9cd62013-03-13 16:07:57 -0700345 if (self != NULL) {
346 // and loose the java reference to ourselves
347 self->decStrong(&sRefBaseOwner);
348 }
349
Mathias Agopian3866f0d2013-02-11 22:08:48 -0800350 return int(sur.get());
Dianne Hackborn61566cc2011-12-02 23:31:52 -0800351}
352
Mathias Agopian29479eb2013-02-14 14:36:04 -0800353static void nativeWriteToParcel(JNIEnv* env, jclass clazz,
Mathias Agopian3866f0d2013-02-11 22:08:48 -0800354 jint nativeObject, jobject parcelObj) {
Jeff Brown64a55af2012-08-26 02:47:39 -0700355 Parcel* parcel = parcelForJavaObject(env, parcelObj);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800356 if (parcel == NULL) {
Elliott Hughes8451b252011-04-07 19:17:57 -0700357 doThrowNPE(env);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800358 return;
359 }
Mathias Agopian3866f0d2013-02-11 22:08:48 -0800360 sp<Surface> self(reinterpret_cast<Surface *>(nativeObject));
Mathias Agopian4a05f432013-03-12 18:43:34 -0700361 parcel->writeStrongBinder( self != 0 ? self->getIGraphicBufferProducer()->asBinder() : NULL);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800362}
363
364// ----------------------------------------------------------------------------
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800365
366static JNINativeMethod gSurfaceMethods[] = {
Mathias Agopian3866f0d2013-02-11 22:08:48 -0800367 {"nativeCreateFromSurfaceTexture", "(Landroid/graphics/SurfaceTexture;)I",
Jeff Brown64a55af2012-08-26 02:47:39 -0700368 (void*)nativeCreateFromSurfaceTexture },
Mathias Agopian3866f0d2013-02-11 22:08:48 -0800369 {"nativeRelease", "(I)V",
Jeff Brown64a55af2012-08-26 02:47:39 -0700370 (void*)nativeRelease },
Mathias Agopian3866f0d2013-02-11 22:08:48 -0800371 {"nativeIsValid", "(I)Z",
Jeff Brown64a55af2012-08-26 02:47:39 -0700372 (void*)nativeIsValid },
Mathias Agopian3866f0d2013-02-11 22:08:48 -0800373 {"nativeIsConsumerRunningBehind", "(I)Z",
Jeff Brown64a55af2012-08-26 02:47:39 -0700374 (void*)nativeIsConsumerRunningBehind },
Jeff Brownfc0ebd72013-04-30 16:33:00 -0700375 {"nativeLockCanvas", "(ILandroid/graphics/Canvas;Landroid/graphics/Rect;)V",
Jeff Brown64a55af2012-08-26 02:47:39 -0700376 (void*)nativeLockCanvas },
Mathias Agopian3866f0d2013-02-11 22:08:48 -0800377 {"nativeUnlockCanvasAndPost", "(ILandroid/graphics/Canvas;)V",
Jeff Brown64a55af2012-08-26 02:47:39 -0700378 (void*)nativeUnlockCanvasAndPost },
Jeff Brownfc0ebd72013-04-30 16:33:00 -0700379 {"nativeCreateFromSurfaceControl", "(I)I",
380 (void*)nativeCreateFromSurfaceControl },
Mathias Agopian3866f0d2013-02-11 22:08:48 -0800381 {"nativeReadFromParcel", "(ILandroid/os/Parcel;)I",
Jeff Brown64a55af2012-08-26 02:47:39 -0700382 (void*)nativeReadFromParcel },
Mathias Agopian3866f0d2013-02-11 22:08:48 -0800383 {"nativeWriteToParcel", "(ILandroid/os/Parcel;)V",
Jeff Brown64a55af2012-08-26 02:47:39 -0700384 (void*)nativeWriteToParcel },
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800385};
386
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800387int register_android_view_Surface(JNIEnv* env)
388{
Jeff Brown64a55af2012-08-26 02:47:39 -0700389 int err = AndroidRuntime::registerNativeMethods(env, "android/view/Surface",
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800390 gSurfaceMethods, NELEM(gSurfaceMethods));
Jeff Brown64a55af2012-08-26 02:47:39 -0700391
392 jclass clazz = env->FindClass("android/view/Surface");
393 gSurfaceClassInfo.clazz = jclass(env->NewGlobalRef(clazz));
Mathias Agopian3866f0d2013-02-11 22:08:48 -0800394 gSurfaceClassInfo.mNativeObject =
Dave Burke236cc472013-05-05 19:46:33 -0700395 env->GetFieldID(gSurfaceClassInfo.clazz, "mNativeSurface", "I");
Jeff Brownfc0ebd72013-04-30 16:33:00 -0700396 gSurfaceClassInfo.mLock =
397 env->GetFieldID(gSurfaceClassInfo.clazz, "mLock", "Ljava/lang/Object;");
Mathias Agopianffddc9b2013-02-25 15:56:31 -0800398 gSurfaceClassInfo.ctor = env->GetMethodID(gSurfaceClassInfo.clazz, "<init>", "(I)V");
Jeff Brown64a55af2012-08-26 02:47:39 -0700399
400 clazz = env->FindClass("android/graphics/Canvas");
Derek Sollenbergerfc615a02012-12-20 14:39:57 -0500401 gCanvasClassInfo.mFinalizer = env->GetFieldID(clazz, "mFinalizer", "Landroid/graphics/Canvas$CanvasFinalizer;");
Jeff Brown64a55af2012-08-26 02:47:39 -0700402 gCanvasClassInfo.mNativeCanvas = env->GetFieldID(clazz, "mNativeCanvas", "I");
403 gCanvasClassInfo.mSurfaceFormat = env->GetFieldID(clazz, "mSurfaceFormat", "I");
404
Derek Sollenbergerfc615a02012-12-20 14:39:57 -0500405 clazz = env->FindClass("android/graphics/Canvas$CanvasFinalizer");
406 gCanvasFinalizerClassInfo.mNativeCanvas = env->GetFieldID(clazz, "mNativeCanvas", "I");
407
Jeff Brown64a55af2012-08-26 02:47:39 -0700408 clazz = env->FindClass("android/graphics/Rect");
409 gRectClassInfo.left = env->GetFieldID(clazz, "left", "I");
410 gRectClassInfo.top = env->GetFieldID(clazz, "top", "I");
411 gRectClassInfo.right = env->GetFieldID(clazz, "right", "I");
412 gRectClassInfo.bottom = env->GetFieldID(clazz, "bottom", "I");
413
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800414 return err;
415}
416
417};