blob: e4a89d78c28b27f2884f188c03e141f1fd194f63 [file] [log] [blame]
Romain Guye4d01122010-06-16 18:44:05 -07001/*
2 * Copyright (C) 2010 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
Romain Guya1db5742010-07-20 13:09:13 -070017#define LOG_TAG "OpenGLRenderer"
18
Romain Guye4d01122010-06-16 18:44:05 -070019#include "jni.h"
Patrick Dubroye4ac2d62010-12-01 11:23:13 -080020#include "GraphicsJNI.h"
Romain Guye4d01122010-06-16 18:44:05 -070021#include <nativehelper/JNIHelp.h>
22#include <android_runtime/AndroidRuntime.h>
Romain Guydeba7852010-07-07 17:54:48 -070023#include <utils/ResourceTypes.h>
Romain Guye4d01122010-06-16 18:44:05 -070024
Romain Guyce0537b2010-06-29 21:05:21 -070025#include <SkBitmap.h>
Romain Guyc7d53492010-06-25 13:41:57 -070026#include <SkCanvas.h>
Romain Guyf6a11b82010-06-23 17:47:49 -070027#include <SkMatrix.h>
Romain Guyc7d53492010-06-25 13:41:57 -070028#include <SkPaint.h>
Romain Guy079ba2c2010-07-16 14:12:24 -070029#include <SkRegion.h>
Romain Guya1db5742010-07-20 13:09:13 -070030#include <SkScalerContext.h>
Romain Guy61c8c9c2010-08-09 20:48:09 -070031#include <SkTemplates.h>
Romain Guy85bf02f2010-06-22 13:11:24 -070032#include <SkXfermode.h>
Romain Guye4d01122010-06-16 18:44:05 -070033
Romain Guyb051e892010-09-28 19:09:36 -070034#include <DisplayListRenderer.h>
Romain Guy6c319ca2011-01-11 14:29:25 -080035#include <LayerRenderer.h>
Romain Guye2d345e2010-09-24 18:39:22 -070036#include <OpenGLDebugRenderer.h>
Romain Guy85bf02f2010-06-22 13:11:24 -070037#include <OpenGLRenderer.h>
Romain Guy06f96e22010-07-30 19:18:16 -070038#include <SkiaShader.h>
Romain Guydb1938e2010-08-02 18:50:22 -070039#include <SkiaColorFilter.h>
Romain Guy9d5316e2010-06-24 19:30:36 -070040#include <Rect.h>
Romain Guy85bf02f2010-06-22 13:11:24 -070041
Romain Guye8e62a42010-07-23 18:55:21 -070042#include "TextLayout.h"
43
Romain Guye4d01122010-06-16 18:44:05 -070044namespace android {
45
Romain Guy9d5316e2010-06-24 19:30:36 -070046using namespace uirenderer;
47
Romain Guy16393512010-08-08 00:14:31 -070048/**
49 * Note: OpenGLRenderer JNI layer is generated and compiled only on supported
50 * devices. This means all the logic must be compiled only when the
51 * preprocessor variable USE_OPENGL_RENDERER is defined.
52 */
53#ifdef USE_OPENGL_RENDERER
54
Romain Guybdb801ca2010-10-04 17:22:29 -070055///////////////////////////////////////////////////////////////////////////////
56// Defines
57///////////////////////////////////////////////////////////////////////////////
58
59// Debug
Romain Guye2d345e2010-09-24 18:39:22 -070060#define DEBUG_RENDERER 0
Romain Guybdb801ca2010-10-04 17:22:29 -070061#define PROFILE_RENDERER 0
62
63// Debug
64#if DEBUG_RENDERER
65 #define RENDERER_LOGD(...) LOGD(__VA_ARGS__)
66#else
67 #define RENDERER_LOGD(...)
68#endif
Romain Guye2d345e2010-09-24 18:39:22 -070069
Romain Guy9d5316e2010-06-24 19:30:36 -070070// ----------------------------------------------------------------------------
Romain Guy9d5316e2010-06-24 19:30:36 -070071
72static struct {
Romain Guy7ae7ac42010-06-25 13:46:18 -070073 jclass clazz;
74 jmethodID set;
Romain Guy9d5316e2010-06-24 19:30:36 -070075} gRectClassInfo;
76
Romain Guye4d01122010-06-16 18:44:05 -070077// ----------------------------------------------------------------------------
78// Constructors
79// ----------------------------------------------------------------------------
80
Romain Guy6c319ca2011-01-11 14:29:25 -080081static OpenGLRenderer* android_view_GLES20Canvas_createRenderer(JNIEnv* env, jobject clazz) {
Romain Guybdb801ca2010-10-04 17:22:29 -070082 RENDERER_LOGD("Create OpenGLRenderer");
83#if PROFILE_RENDERER
Romain Guye2d345e2010-09-24 18:39:22 -070084 return new OpenGLDebugRenderer;
85#else
Romain Guy85bf02f2010-06-22 13:11:24 -070086 return new OpenGLRenderer;
Romain Guye2d345e2010-09-24 18:39:22 -070087#endif
Romain Guye4d01122010-06-16 18:44:05 -070088}
89
Chet Haase5c13d892010-10-08 08:37:55 -070090static void android_view_GLES20Canvas_destroyRenderer(JNIEnv* env, jobject clazz,
Romain Guyf6a11b82010-06-23 17:47:49 -070091 OpenGLRenderer* renderer) {
Romain Guybdb801ca2010-10-04 17:22:29 -070092 RENDERER_LOGD("Destroy OpenGLRenderer");
Romain Guyf6a11b82010-06-23 17:47:49 -070093 delete renderer;
Romain Guye4d01122010-06-16 18:44:05 -070094}
95
96// ----------------------------------------------------------------------------
97// Setup
98// ----------------------------------------------------------------------------
99
Romain Guyce0537b2010-06-29 21:05:21 -0700100static void android_view_GLES20Canvas_setViewport(JNIEnv* env, jobject canvas,
Romain Guyf6a11b82010-06-23 17:47:49 -0700101 OpenGLRenderer* renderer, jint width, jint height) {
102 renderer->setViewport(width, height);
Romain Guye4d01122010-06-16 18:44:05 -0700103}
104
Romain Guyce0537b2010-06-29 21:05:21 -0700105static void android_view_GLES20Canvas_prepare(JNIEnv* env, jobject canvas,
Romain Guy6b7bd242010-10-06 19:49:23 -0700106 OpenGLRenderer* renderer, jboolean opaque) {
107 renderer->prepare(opaque);
Romain Guye4d01122010-06-16 18:44:05 -0700108}
109
Romain Guyb025b9c2010-09-16 14:16:48 -0700110static void android_view_GLES20Canvas_finish(JNIEnv* env, jobject canvas,
111 OpenGLRenderer* renderer) {
112 renderer->finish();
113}
114
Romain Guyda8532c2010-08-31 11:50:35 -0700115static void android_view_GLES20Canvas_acquireContext(JNIEnv* env, jobject canvas,
116 OpenGLRenderer* renderer) {
117 renderer->acquireContext();
118}
119
Chet Haasedaf98e92011-01-10 14:10:36 -0800120static bool android_view_GLES20Canvas_callDrawGLFunction(JNIEnv* env, jobject canvas,
121 OpenGLRenderer* renderer, Functor *functor) {
122 return renderer->callDrawGLFunction(functor);
123}
124
Romain Guyda8532c2010-08-31 11:50:35 -0700125static void android_view_GLES20Canvas_releaseContext(JNIEnv* env, jobject canvas,
126 OpenGLRenderer* renderer) {
127 renderer->releaseContext();
128}
129
Romain Guye4d01122010-06-16 18:44:05 -0700130// ----------------------------------------------------------------------------
Romain Guybb9524b2010-06-22 18:56:38 -0700131// State
132// ----------------------------------------------------------------------------
133
Romain Guyce0537b2010-06-29 21:05:21 -0700134static jint android_view_GLES20Canvas_save(JNIEnv* env, jobject canvas, OpenGLRenderer* renderer,
Romain Guybb9524b2010-06-22 18:56:38 -0700135 jint flags) {
Romain Guyf6a11b82010-06-23 17:47:49 -0700136 return renderer->save(flags);
Romain Guybb9524b2010-06-22 18:56:38 -0700137}
138
Romain Guyce0537b2010-06-29 21:05:21 -0700139static jint android_view_GLES20Canvas_getSaveCount(JNIEnv* env, jobject canvas,
Romain Guyf6a11b82010-06-23 17:47:49 -0700140 OpenGLRenderer* renderer) {
141 return renderer->getSaveCount();
Romain Guybb9524b2010-06-22 18:56:38 -0700142}
143
Romain Guyce0537b2010-06-29 21:05:21 -0700144static void android_view_GLES20Canvas_restore(JNIEnv* env, jobject canvas,
Romain Guyf6a11b82010-06-23 17:47:49 -0700145 OpenGLRenderer* renderer) {
146 renderer->restore();
Romain Guybb9524b2010-06-22 18:56:38 -0700147}
148
Romain Guyce0537b2010-06-29 21:05:21 -0700149static void android_view_GLES20Canvas_restoreToCount(JNIEnv* env, jobject canvas,
Romain Guyf6a11b82010-06-23 17:47:49 -0700150 OpenGLRenderer* renderer, jint saveCount) {
151 renderer->restoreToCount(saveCount);
Romain Guybb9524b2010-06-22 18:56:38 -0700152}
153
154// ----------------------------------------------------------------------------
Romain Guybd6b79b2010-06-26 00:13:53 -0700155// Layers
156// ----------------------------------------------------------------------------
157
Romain Guyce0537b2010-06-29 21:05:21 -0700158static jint android_view_GLES20Canvas_saveLayer(JNIEnv* env, jobject canvas,
Romain Guybd6b79b2010-06-26 00:13:53 -0700159 OpenGLRenderer* renderer, jfloat left, jfloat top, jfloat right, jfloat bottom,
160 SkPaint* paint, jint saveFlags) {
161 return renderer->saveLayer(left, top, right, bottom, paint, saveFlags);
162}
163
Romain Guyce0537b2010-06-29 21:05:21 -0700164static jint android_view_GLES20Canvas_saveLayerAlpha(JNIEnv* env, jobject canvas,
Romain Guybd6b79b2010-06-26 00:13:53 -0700165 OpenGLRenderer* renderer, jfloat left, jfloat top, jfloat right, jfloat bottom,
166 jint alpha, jint saveFlags) {
167 return renderer->saveLayerAlpha(left, top, right, bottom, alpha, saveFlags);
168}
169
170// ----------------------------------------------------------------------------
Romain Guybb9524b2010-06-22 18:56:38 -0700171// Clipping
172// ----------------------------------------------------------------------------
173
Romain Guyce0537b2010-06-29 21:05:21 -0700174static bool android_view_GLES20Canvas_quickReject(JNIEnv* env, jobject canvas,
Romain Guyc7d53492010-06-25 13:41:57 -0700175 OpenGLRenderer* renderer, jfloat left, jfloat top, jfloat right, jfloat bottom,
176 SkCanvas::EdgeType edge) {
177 return renderer->quickReject(left, top, right, bottom);
178}
179
Romain Guyce0537b2010-06-29 21:05:21 -0700180static bool android_view_GLES20Canvas_clipRectF(JNIEnv* env, jobject canvas,
Romain Guy079ba2c2010-07-16 14:12:24 -0700181 OpenGLRenderer* renderer, jfloat left, jfloat top, jfloat right, jfloat bottom,
182 SkRegion::Op op) {
183 return renderer->clipRect(left, top, right, bottom, op);
Romain Guybb9524b2010-06-22 18:56:38 -0700184}
185
Romain Guyce0537b2010-06-29 21:05:21 -0700186static bool android_view_GLES20Canvas_clipRect(JNIEnv* env, jobject canvas,
Romain Guy079ba2c2010-07-16 14:12:24 -0700187 OpenGLRenderer* renderer, jint left, jint top, jint right, jint bottom,
188 SkRegion::Op op) {
189 return renderer->clipRect(float(left), float(top), float(right), float(bottom), op);
Romain Guyf6a11b82010-06-23 17:47:49 -0700190}
Romain Guybb9524b2010-06-22 18:56:38 -0700191
Romain Guyce0537b2010-06-29 21:05:21 -0700192static bool android_view_GLES20Canvas_getClipBounds(JNIEnv* env, jobject canvas,
Romain Guy9d5316e2010-06-24 19:30:36 -0700193 OpenGLRenderer* renderer, jobject rect) {
Romain Guy7ae7ac42010-06-25 13:46:18 -0700194 const android::uirenderer::Rect& bounds(renderer->getClipBounds());
Romain Guy9d5316e2010-06-24 19:30:36 -0700195
Romain Guy7ae7ac42010-06-25 13:46:18 -0700196 env->CallVoidMethod(rect, gRectClassInfo.set,
197 int(bounds.left), int(bounds.top), int(bounds.right), int(bounds.bottom));
Romain Guy9d5316e2010-06-24 19:30:36 -0700198
Romain Guy7ae7ac42010-06-25 13:46:18 -0700199 return !bounds.isEmpty();
Romain Guy9d5316e2010-06-24 19:30:36 -0700200}
201
Romain Guyf6a11b82010-06-23 17:47:49 -0700202// ----------------------------------------------------------------------------
203// Transforms
204// ----------------------------------------------------------------------------
205
Romain Guyce0537b2010-06-29 21:05:21 -0700206static void android_view_GLES20Canvas_translate(JNIEnv* env, jobject canvas,
Romain Guyf6a11b82010-06-23 17:47:49 -0700207 OpenGLRenderer* renderer, jfloat dx, jfloat dy) {
Romain Guy7ae7ac42010-06-25 13:46:18 -0700208 renderer->translate(dx, dy);
Romain Guyf6a11b82010-06-23 17:47:49 -0700209}
210
Romain Guyce0537b2010-06-29 21:05:21 -0700211static void android_view_GLES20Canvas_rotate(JNIEnv* env, jobject canvas,
Romain Guyf6a11b82010-06-23 17:47:49 -0700212 OpenGLRenderer* renderer, jfloat degrees) {
Romain Guy7ae7ac42010-06-25 13:46:18 -0700213 renderer->rotate(degrees);
Romain Guyf6a11b82010-06-23 17:47:49 -0700214}
215
Romain Guyce0537b2010-06-29 21:05:21 -0700216static void android_view_GLES20Canvas_scale(JNIEnv* env, jobject canvas,
Romain Guyf6a11b82010-06-23 17:47:49 -0700217 OpenGLRenderer* renderer, jfloat sx, jfloat sy) {
Romain Guy7ae7ac42010-06-25 13:46:18 -0700218 renderer->scale(sx, sy);
Romain Guyf6a11b82010-06-23 17:47:49 -0700219}
220
Romain Guy807daf72011-01-18 11:19:19 -0800221static void android_view_GLES20Canvas_skew(JNIEnv* env, jobject canvas,
222 OpenGLRenderer* renderer, jfloat sx, jfloat sy) {
223 renderer->skew(sx, sy);
224}
225
Romain Guyce0537b2010-06-29 21:05:21 -0700226static void android_view_GLES20Canvas_setMatrix(JNIEnv* env, jobject canvas,
Romain Guyf6a11b82010-06-23 17:47:49 -0700227 OpenGLRenderer* renderer, SkMatrix* matrix) {
Romain Guy7ae7ac42010-06-25 13:46:18 -0700228 renderer->setMatrix(matrix);
Romain Guyf6a11b82010-06-23 17:47:49 -0700229}
230
Romain Guy41030da2010-10-13 13:40:37 -0700231static const float* android_view_GLES20Canvas_getNativeMatrix(JNIEnv* env,
232 jobject canvas, OpenGLRenderer* renderer) {
233 return renderer->getMatrix();
234}
235
Romain Guyce0537b2010-06-29 21:05:21 -0700236static void android_view_GLES20Canvas_getMatrix(JNIEnv* env, jobject canvas,
Romain Guyf6a11b82010-06-23 17:47:49 -0700237 OpenGLRenderer* renderer, SkMatrix* matrix) {
Romain Guy7ae7ac42010-06-25 13:46:18 -0700238 renderer->getMatrix(matrix);
Romain Guyf6a11b82010-06-23 17:47:49 -0700239}
240
Romain Guyce0537b2010-06-29 21:05:21 -0700241static void android_view_GLES20Canvas_concatMatrix(JNIEnv* env, jobject canvas,
Romain Guyf6a11b82010-06-23 17:47:49 -0700242 OpenGLRenderer* renderer, SkMatrix* matrix) {
Romain Guy7ae7ac42010-06-25 13:46:18 -0700243 renderer->concatMatrix(matrix);
Romain Guybb9524b2010-06-22 18:56:38 -0700244}
245
246// ----------------------------------------------------------------------------
247// Drawing
Romain Guy85bf02f2010-06-22 13:11:24 -0700248// ----------------------------------------------------------------------------
249
Romain Guyce0537b2010-06-29 21:05:21 -0700250static void android_view_GLES20Canvas_drawBitmap(JNIEnv* env, jobject canvas,
Patrick Dubroye4ac2d62010-12-01 11:23:13 -0800251 OpenGLRenderer* renderer, SkBitmap* bitmap, jbyteArray buffer, float left,
252 float top, SkPaint* paint) {
253 // This object allows the renderer to allocate a global JNI ref to the buffer object.
254 JavaHeapBitmapRef bitmapRef(env, bitmap, buffer);
255
Romain Guydbd77cd2010-07-09 10:36:05 -0700256 renderer->drawBitmap(bitmap, left, top, paint);
Romain Guy85bf02f2010-06-22 13:11:24 -0700257}
258
Romain Guyce0537b2010-06-29 21:05:21 -0700259static void android_view_GLES20Canvas_drawBitmapRect(JNIEnv* env, jobject canvas,
Patrick Dubroye4ac2d62010-12-01 11:23:13 -0800260 OpenGLRenderer* renderer, SkBitmap* bitmap, jbyteArray buffer,
Romain Guyce0537b2010-06-29 21:05:21 -0700261 float srcLeft, float srcTop, float srcRight, float srcBottom,
Romain Guydbd77cd2010-07-09 10:36:05 -0700262 float dstLeft, float dstTop, float dstRight, float dstBottom, SkPaint* paint) {
Patrick Dubroye4ac2d62010-12-01 11:23:13 -0800263 // This object allows the renderer to allocate a global JNI ref to the buffer object.
264 JavaHeapBitmapRef bitmapRef(env, bitmap, buffer);
265
Romain Guydbd77cd2010-07-09 10:36:05 -0700266 renderer->drawBitmap(bitmap, srcLeft, srcTop, srcRight, srcBottom,
267 dstLeft, dstTop, dstRight, dstBottom, paint);
Romain Guyf86ef572010-07-01 11:05:42 -0700268}
Romain Guy8ba548f2010-06-30 19:21:21 -0700269
Romain Guyf86ef572010-07-01 11:05:42 -0700270static void android_view_GLES20Canvas_drawBitmapMatrix(JNIEnv* env, jobject canvas,
Patrick Dubroye4ac2d62010-12-01 11:23:13 -0800271 OpenGLRenderer* renderer, SkBitmap* bitmap, jbyteArray buffer, SkMatrix* matrix,
272 SkPaint* paint) {
273 // This object allows the renderer to allocate a global JNI ref to the buffer object.
274 JavaHeapBitmapRef bitmapRef(env, bitmap, buffer);
275
Romain Guydbd77cd2010-07-09 10:36:05 -0700276 renderer->drawBitmap(bitmap, matrix, paint);
Romain Guyce0537b2010-06-29 21:05:21 -0700277}
278
Romain Guy5a7b4662011-01-20 19:09:30 -0800279static void android_view_GLES20Canvas_drawBitmapMesh(JNIEnv* env, jobject canvas,
280 OpenGLRenderer* renderer, SkBitmap* bitmap, jbyteArray buffer,
281 jint meshWidth, jint meshHeight, jfloatArray vertices, jint offset,
282 jintArray colors, jint colorOffset, SkPaint* paint) {
283 // This object allows the renderer to allocate a global JNI ref to the buffer object.
284 JavaHeapBitmapRef bitmapRef(env, bitmap, buffer);
285
286 jfloat* verticesArray = vertices ? env->GetFloatArrayElements(vertices, NULL) + offset : NULL;
287 jint* colorsArray = colors ? env->GetIntArrayElements(colors, NULL) + colorOffset : NULL;
288
289 renderer->drawBitmapMesh(bitmap, meshWidth, meshHeight, verticesArray, colorsArray, paint);
290
291 if (vertices) env->ReleaseFloatArrayElements(vertices, verticesArray, 0);
292 if (colors) env->ReleaseIntArrayElements(colors, colorsArray, 0);
293}
294
Romain Guydeba7852010-07-07 17:54:48 -0700295static void android_view_GLES20Canvas_drawPatch(JNIEnv* env, jobject canvas,
Patrick Dubroye4ac2d62010-12-01 11:23:13 -0800296 OpenGLRenderer* renderer, SkBitmap* bitmap, jbyteArray buffer, jbyteArray chunks,
Romain Guydbd77cd2010-07-09 10:36:05 -0700297 float left, float top, float right, float bottom, SkPaint* paint) {
Patrick Dubroye4ac2d62010-12-01 11:23:13 -0800298 // This object allows the renderer to allocate a global JNI ref to the buffer object.
299 JavaHeapBitmapRef bitmapRef(env, bitmap, buffer);
300
Romain Guydeba7852010-07-07 17:54:48 -0700301 jbyte* storage = env->GetByteArrayElements(chunks, NULL);
302 Res_png_9patch* patch = reinterpret_cast<Res_png_9patch*>(storage);
303 Res_png_9patch::deserialize(patch);
304
Patrick Dubroye4ac2d62010-12-01 11:23:13 -0800305 renderer->drawPatch(bitmap, &patch->xDivs[0], &patch->yDivs[0],
306 &patch->colors[0], patch->numXDivs, patch->numYDivs, patch->numColors,
Romain Guy4bb94202010-10-12 15:59:26 -0700307 left, top, right, bottom, paint);
Romain Guydeba7852010-07-07 17:54:48 -0700308
Romain Guydeba7852010-07-07 17:54:48 -0700309 env->ReleaseByteArrayElements(chunks, storage, 0);
310}
311
Romain Guyce0537b2010-06-29 21:05:21 -0700312static void android_view_GLES20Canvas_drawColor(JNIEnv* env, jobject canvas,
313 OpenGLRenderer* renderer, jint color, SkXfermode::Mode mode) {
314 renderer->drawColor(color, mode);
315}
316
317static void android_view_GLES20Canvas_drawRect(JNIEnv* env, jobject canvas,
Romain Guyc7d53492010-06-25 13:41:57 -0700318 OpenGLRenderer* renderer, jfloat left, jfloat top, jfloat right, jfloat bottom,
319 SkPaint* paint) {
320 renderer->drawRect(left, top, right, bottom, paint);
321}
322
Romain Guy01d58e42011-01-19 21:54:02 -0800323static void android_view_GLES20Canvas_drawRoundRect(JNIEnv* env, jobject canvas,
324 OpenGLRenderer* renderer, jfloat left, jfloat top, jfloat right, jfloat bottom,
325 jfloat rx, jfloat ry, SkPaint* paint) {
326 renderer->drawRoundRect(left, top, right, bottom, rx, ry, paint);
327}
328
329static void android_view_GLES20Canvas_drawCircle(JNIEnv* env, jobject canvas,
330 OpenGLRenderer* renderer, jfloat x, jfloat y, jfloat radius, SkPaint* paint) {
331 renderer->drawCircle(x, y, radius, paint);
332}
333
Romain Guyc1cd9ba32011-01-23 14:18:41 -0800334static void android_view_GLES20Canvas_drawOval(JNIEnv* env, jobject canvas,
335 OpenGLRenderer* renderer, jfloat left, jfloat top, jfloat right, jfloat bottom,
336 SkPaint* paint) {
337 renderer->drawOval(left, top, right, bottom, paint);
338}
339
Romain Guy8b2f5262011-01-23 16:15:02 -0800340static void android_view_GLES20Canvas_drawArc(JNIEnv* env, jobject canvas,
341 OpenGLRenderer* renderer, jfloat left, jfloat top, jfloat right, jfloat bottom,
342 jfloat startAngle, jfloat sweepAngle, jboolean useCenter, SkPaint* paint) {
343 renderer->drawArc(left, top, right, bottom, startAngle, sweepAngle, useCenter, paint);
344}
345
Romain Guya48a1a82010-08-10 14:59:15 -0700346static void android_view_GLES20Canvas_drawRects(JNIEnv* env, jobject canvas,
347 OpenGLRenderer* renderer, SkRegion* region, SkPaint* paint) {
348 SkRegion::Iterator it(*region);
349 while (!it.done()) {
350 const SkIRect& r = it.rect();
351 renderer->drawRect(r.fLeft, r.fTop, r.fRight, r.fBottom, paint);
352 it.next();
353 }
354}
355
Romain Guy7fbcc042010-08-04 15:40:07 -0700356static void android_view_GLES20Canvas_drawPath(JNIEnv* env, jobject canvas,
357 OpenGLRenderer* renderer, SkPath* path, SkPaint* paint) {
358 renderer->drawPath(path, paint);
359}
360
Romain Guy759ea802010-09-16 20:49:46 -0700361static void android_view_GLES20Canvas_drawLines(JNIEnv* env, jobject canvas,
362 OpenGLRenderer* renderer, jfloatArray points, jint offset, jint count, SkPaint* paint) {
363 jfloat* storage = env->GetFloatArrayElements(points, NULL);
364
365 renderer->drawLines(storage + offset, count, paint);
366
367 env->ReleaseFloatArrayElements(points, storage, 0);
368}
369
Romain Guy85bf02f2010-06-22 13:11:24 -0700370// ----------------------------------------------------------------------------
Romain Guydb1938e2010-08-02 18:50:22 -0700371// Shaders and color filters
Romain Guyd27977d2010-07-14 19:18:51 -0700372// ----------------------------------------------------------------------------
373
Romain Guydb1938e2010-08-02 18:50:22 -0700374static void android_view_GLES20Canvas_resetModifiers(JNIEnv* env, jobject canvas,
Romain Guyd27977d2010-07-14 19:18:51 -0700375 OpenGLRenderer* renderer) {
376 renderer->resetShader();
Romain Guydb1938e2010-08-02 18:50:22 -0700377 renderer->resetColorFilter();
Romain Guy1e45aae2010-08-13 19:39:53 -0700378 renderer->resetShadow();
Romain Guyd27977d2010-07-14 19:18:51 -0700379}
380
Romain Guy06f96e22010-07-30 19:18:16 -0700381static void android_view_GLES20Canvas_setupShader(JNIEnv* env, jobject canvas,
382 OpenGLRenderer* renderer, SkiaShader* shader) {
383 renderer->setupShader(shader);
Romain Guy7fac2e12010-07-16 17:10:13 -0700384}
385
Romain Guydb1938e2010-08-02 18:50:22 -0700386static void android_view_GLES20Canvas_setupColorFilter(JNIEnv* env, jobject canvas,
387 OpenGLRenderer* renderer, SkiaColorFilter* filter) {
388 renderer->setupColorFilter(filter);
389}
390
Romain Guy1e45aae2010-08-13 19:39:53 -0700391static void android_view_GLES20Canvas_setupShadow(JNIEnv* env, jobject canvas,
392 OpenGLRenderer* renderer, jfloat radius, jfloat dx, jfloat dy, jint color) {
393 renderer->setupShadow(radius, dx, dy, color);
394}
395
Romain Guyd27977d2010-07-14 19:18:51 -0700396// ----------------------------------------------------------------------------
Romain Guya1db5742010-07-20 13:09:13 -0700397// Text
398// ----------------------------------------------------------------------------
399
Romain Guye8e62a42010-07-23 18:55:21 -0700400static void renderText(OpenGLRenderer* renderer, const jchar* text, int count,
401 jfloat x, jfloat y, int flags, SkPaint* paint) {
402 const jchar *workText;
Romain Guy92262982010-07-26 11:17:54 -0700403 jchar* buffer = NULL;
Romain Guye8e62a42010-07-23 18:55:21 -0700404 int32_t workBytes;
Romain Guy92262982010-07-26 11:17:54 -0700405 if (TextLayout::prepareText(paint, text, count, flags, &workText, &workBytes, &buffer)) {
Romain Guye8e62a42010-07-23 18:55:21 -0700406 renderer->drawText((const char*) workText, workBytes, count, x, y, paint);
Romain Guy92262982010-07-26 11:17:54 -0700407 free(buffer);
Romain Guye8e62a42010-07-23 18:55:21 -0700408 }
409}
410
Romain Guy61c8c9c2010-08-09 20:48:09 -0700411static void renderTextRun(OpenGLRenderer* renderer, const jchar* text,
412 jint start, jint count, jint contextCount, jfloat x, jfloat y,
413 int flags, SkPaint* paint) {
414 uint8_t rtl = flags & 0x1;
415 if (rtl) {
416 SkAutoSTMalloc<80, jchar> buffer(contextCount);
417 jchar* shaped = buffer.get();
418 if (TextLayout::prepareRtlTextRun(text, start, count, contextCount, shaped)) {
419 renderer->drawText((const char*) shaped, count << 1, count, x, y, paint);
420 } else {
421 LOGW("drawTextRun error");
422 }
423 } else {
424 renderer->drawText((const char*) (text + start), count << 1, count, x, y, paint);
425 }
426}
427
Romain Guya1db5742010-07-20 13:09:13 -0700428static void android_view_GLES20Canvas_drawTextArray(JNIEnv* env, jobject canvas,
Romain Guy5a7b4662011-01-20 19:09:30 -0800429 OpenGLRenderer* renderer, jcharArray text, jint index, jint count,
430 jfloat x, jfloat y, jint flags, SkPaint* paint) {
Romain Guya1db5742010-07-20 13:09:13 -0700431 jchar* textArray = env->GetCharArrayElements(text, NULL);
Romain Guye8e62a42010-07-23 18:55:21 -0700432 renderText(renderer, textArray + index, count, x, y, flags, paint);
Romain Guya1db5742010-07-20 13:09:13 -0700433 env->ReleaseCharArrayElements(text, textArray, JNI_ABORT);
434}
435
436static void android_view_GLES20Canvas_drawText(JNIEnv* env, jobject canvas,
Romain Guy5a7b4662011-01-20 19:09:30 -0800437 OpenGLRenderer* renderer, jstring text, jint start, jint end,
438 jfloat x, jfloat y, jint flags, SkPaint* paint) {
Romain Guya1db5742010-07-20 13:09:13 -0700439 const jchar* textArray = env->GetStringChars(text, NULL);
Romain Guye8e62a42010-07-23 18:55:21 -0700440 renderText(renderer, textArray + start, end - start, x, y, flags, paint);
Romain Guya1db5742010-07-20 13:09:13 -0700441 env->ReleaseStringChars(text, textArray);
442}
443
Romain Guy61c8c9c2010-08-09 20:48:09 -0700444static void android_view_GLES20Canvas_drawTextRunArray(JNIEnv* env, jobject canvas,
Romain Guy5a7b4662011-01-20 19:09:30 -0800445 OpenGLRenderer* renderer, jcharArray text, jint index, jint count,
446 jint contextIndex, jint contextCount, jfloat x, jfloat y, jint dirFlags,
Romain Guy61c8c9c2010-08-09 20:48:09 -0700447 SkPaint* paint) {
448 jchar* textArray = env->GetCharArrayElements(text, NULL);
449 renderTextRun(renderer, textArray + contextIndex, index - contextIndex,
450 count, contextCount, x, y, dirFlags, paint);
451 env->ReleaseCharArrayElements(text, textArray, JNI_ABORT);
452 }
453
454static void android_view_GLES20Canvas_drawTextRun(JNIEnv* env, jobject canvas,
Romain Guy5a7b4662011-01-20 19:09:30 -0800455 OpenGLRenderer* renderer, jstring text, jint start, jint end,
456 jint contextStart, int contextEnd, jfloat x, jfloat y, jint dirFlags,
Romain Guy61c8c9c2010-08-09 20:48:09 -0700457 SkPaint* paint) {
458 const jchar* textArray = env->GetStringChars(text, NULL);
459 jint count = end - start;
460 jint contextCount = contextEnd - contextStart;
461 renderTextRun(renderer, textArray + contextStart, start - contextStart,
462 count, contextCount, x, y, dirFlags, paint);
463 env->ReleaseStringChars(text, textArray);
464}
465
Romain Guyb051e892010-09-28 19:09:36 -0700466// ----------------------------------------------------------------------------
467// Display lists
468// ----------------------------------------------------------------------------
469
Chet Haase5977baa2011-01-05 18:01:22 -0800470static DisplayList* android_view_GLES20Canvas_getDisplayList(JNIEnv* env,
Romain Guyb051e892010-09-28 19:09:36 -0700471 jobject canvas, DisplayListRenderer* renderer) {
472 return renderer->getDisplayList();
473}
474
Chet Haase5977baa2011-01-05 18:01:22 -0800475static OpenGLRenderer* android_view_GLES20Canvas_getDisplayListRenderer(JNIEnv* env,
476 jobject clazz, DisplayListRenderer* renderer) {
477 if (renderer == NULL) {
478 renderer = new DisplayListRenderer;
479 } else {
480 renderer->reset();
481 }
482 return renderer;
483}
484
Romain Guyb051e892010-09-28 19:09:36 -0700485static void android_view_GLES20Canvas_destroyDisplayList(JNIEnv* env,
Chet Haase5c13d892010-10-08 08:37:55 -0700486 jobject clazz, DisplayList* displayList) {
Romain Guyb051e892010-09-28 19:09:36 -0700487 delete displayList;
488}
489
Chet Haasedaf98e92011-01-10 14:10:36 -0800490static bool android_view_GLES20Canvas_drawDisplayList(JNIEnv* env,
Romain Guyb051e892010-09-28 19:09:36 -0700491 jobject canvas, OpenGLRenderer* renderer, DisplayList* displayList) {
Chet Haasedaf98e92011-01-10 14:10:36 -0800492 return renderer->drawDisplayList(displayList);
Romain Guyb051e892010-09-28 19:09:36 -0700493}
494
Romain Guy6c319ca2011-01-11 14:29:25 -0800495// ----------------------------------------------------------------------------
496// Layers
497// ----------------------------------------------------------------------------
498
499static void android_view_GLES20Canvas_interrupt(JNIEnv* env, jobject canvas,
500 OpenGLRenderer* renderer) {
501 renderer->interrupt();
502}
503
504static void android_view_GLES20Canvas_resume(JNIEnv* env, jobject canvas,
505 OpenGLRenderer* renderer) {
506 renderer->resume();
507}
508
509static OpenGLRenderer* android_view_GLES20Canvas_createLayerRenderer(JNIEnv* env,
Romain Guyada830f2011-01-13 12:13:20 -0800510 jobject clazz, Layer* layer) {
511 if (layer) {
512 return new LayerRenderer(layer);
513 }
514 return NULL;
Romain Guy6c319ca2011-01-11 14:29:25 -0800515}
516
Romain Guyada830f2011-01-13 12:13:20 -0800517static Layer* android_view_GLES20Canvas_createLayer(JNIEnv* env, jobject clazz,
518 jint width, jint height, jboolean isOpaque, jintArray layerInfo) {
519 Layer* layer = LayerRenderer::createLayer(width, height, isOpaque);
Romain Guy6c319ca2011-01-11 14:29:25 -0800520
Romain Guyada830f2011-01-13 12:13:20 -0800521 if (layer) {
Romain Guy6c319ca2011-01-11 14:29:25 -0800522 jint* storage = env->GetIntArrayElements(layerInfo, NULL);
Romain Guyada830f2011-01-13 12:13:20 -0800523 storage[0] = layer->width;
524 storage[1] = layer->height;
Romain Guy6c319ca2011-01-11 14:29:25 -0800525 env->ReleaseIntArrayElements(layerInfo, storage, 0);
526 }
527
Romain Guyada830f2011-01-13 12:13:20 -0800528 return layer;
Romain Guy6c319ca2011-01-11 14:29:25 -0800529}
530
Romain Guyada830f2011-01-13 12:13:20 -0800531static void android_view_GLES20Canvas_resizeLayer(JNIEnv* env, jobject clazz,
532 Layer* layer, jint width, jint height, jintArray layerInfo) {
533 LayerRenderer::resizeLayer(layer, width, height);
Romain Guy6c319ca2011-01-11 14:29:25 -0800534
535 jint* storage = env->GetIntArrayElements(layerInfo, NULL);
Romain Guyada830f2011-01-13 12:13:20 -0800536 storage[0] = layer->width;
537 storage[1] = layer->height;
Romain Guy6c319ca2011-01-11 14:29:25 -0800538 env->ReleaseIntArrayElements(layerInfo, storage, 0);
539}
540
Romain Guyada830f2011-01-13 12:13:20 -0800541static void android_view_GLES20Canvas_destroyLayer(JNIEnv* env, jobject clazz, Layer* layer) {
542 LayerRenderer::destroyLayer(layer);
Romain Guy6c319ca2011-01-11 14:29:25 -0800543}
544
Romain Guy57066eb2011-01-12 12:53:32 -0800545static void android_view_GLES20Canvas_destroyLayerDeferred(JNIEnv* env,
Romain Guyada830f2011-01-13 12:13:20 -0800546 jobject clazz, Layer* layer) {
547 LayerRenderer::destroyLayerDeferred(layer);
Romain Guy57066eb2011-01-12 12:53:32 -0800548}
549
Romain Guyada830f2011-01-13 12:13:20 -0800550static void android_view_GLES20Canvas_drawLayer(JNIEnv* env, jobject canvas,
551 OpenGLRenderer* renderer, Layer* layer, jfloat x, jfloat y, SkPaint* paint) {
552 renderer->drawLayer(layer, x, y, paint);
Romain Guy6c319ca2011-01-11 14:29:25 -0800553}
554
Romain Guy16393512010-08-08 00:14:31 -0700555#endif // USE_OPENGL_RENDERER
556
557// ----------------------------------------------------------------------------
558// Common
559// ----------------------------------------------------------------------------
560
561static jboolean android_view_GLES20Canvas_isAvailable(JNIEnv* env, jobject clazz) {
562#ifdef USE_OPENGL_RENDERER
563 return JNI_TRUE;
564#else
565 return JNI_FALSE;
566#endif
567}
568
Romain Guya1db5742010-07-20 13:09:13 -0700569// ----------------------------------------------------------------------------
Romain Guye4d01122010-06-16 18:44:05 -0700570// JNI Glue
571// ----------------------------------------------------------------------------
572
573const char* const kClassPathName = "android/view/GLES20Canvas";
574
575static JNINativeMethod gMethods[] = {
Romain Guy61c8c9c2010-08-09 20:48:09 -0700576 { "nIsAvailable", "()Z", (void*) android_view_GLES20Canvas_isAvailable },
577
Romain Guy16393512010-08-08 00:14:31 -0700578#ifdef USE_OPENGL_RENDERER
Romain Guy61c8c9c2010-08-09 20:48:09 -0700579 { "nCreateRenderer", "()I", (void*) android_view_GLES20Canvas_createRenderer },
580 { "nDestroyRenderer", "(I)V", (void*) android_view_GLES20Canvas_destroyRenderer },
581 { "nSetViewport", "(III)V", (void*) android_view_GLES20Canvas_setViewport },
Romain Guy6b7bd242010-10-06 19:49:23 -0700582 { "nPrepare", "(IZ)V", (void*) android_view_GLES20Canvas_prepare },
Romain Guyb025b9c2010-09-16 14:16:48 -0700583 { "nFinish", "(I)V", (void*) android_view_GLES20Canvas_finish },
Romain Guyda8532c2010-08-31 11:50:35 -0700584 { "nAcquireContext", "(I)V", (void*) android_view_GLES20Canvas_acquireContext },
Chet Haasedaf98e92011-01-10 14:10:36 -0800585 { "nCallDrawGLFunction", "(II)Z",
586 (void*) android_view_GLES20Canvas_callDrawGLFunction },
Romain Guyda8532c2010-08-31 11:50:35 -0700587 { "nReleaseContext", "(I)V", (void*) android_view_GLES20Canvas_releaseContext },
Romain Guy16393512010-08-08 00:14:31 -0700588
Romain Guy61c8c9c2010-08-09 20:48:09 -0700589 { "nSave", "(II)I", (void*) android_view_GLES20Canvas_save },
590 { "nRestore", "(I)V", (void*) android_view_GLES20Canvas_restore },
591 { "nRestoreToCount", "(II)V", (void*) android_view_GLES20Canvas_restoreToCount },
592 { "nGetSaveCount", "(I)I", (void*) android_view_GLES20Canvas_getSaveCount },
Romain Guy85bf02f2010-06-22 13:11:24 -0700593
Romain Guy61c8c9c2010-08-09 20:48:09 -0700594 { "nSaveLayer", "(IFFFFII)I", (void*) android_view_GLES20Canvas_saveLayer },
595 { "nSaveLayerAlpha", "(IFFFFII)I", (void*) android_view_GLES20Canvas_saveLayerAlpha },
Romain Guybb9524b2010-06-22 18:56:38 -0700596
Romain Guy61c8c9c2010-08-09 20:48:09 -0700597 { "nQuickReject", "(IFFFFI)Z", (void*) android_view_GLES20Canvas_quickReject },
598 { "nClipRect", "(IFFFFI)Z", (void*) android_view_GLES20Canvas_clipRectF },
599 { "nClipRect", "(IIIIII)Z", (void*) android_view_GLES20Canvas_clipRect },
Romain Guyc7d53492010-06-25 13:41:57 -0700600
Romain Guy61c8c9c2010-08-09 20:48:09 -0700601 { "nTranslate", "(IFF)V", (void*) android_view_GLES20Canvas_translate },
602 { "nRotate", "(IF)V", (void*) android_view_GLES20Canvas_rotate },
603 { "nScale", "(IFF)V", (void*) android_view_GLES20Canvas_scale },
Romain Guy807daf72011-01-18 11:19:19 -0800604 { "nSkew", "(IFF)V", (void*) android_view_GLES20Canvas_skew },
Romain Guyc7d53492010-06-25 13:41:57 -0700605
Romain Guy61c8c9c2010-08-09 20:48:09 -0700606 { "nSetMatrix", "(II)V", (void*) android_view_GLES20Canvas_setMatrix },
Romain Guy41030da2010-10-13 13:40:37 -0700607 { "nGetMatrix", "(I)I", (void*) android_view_GLES20Canvas_getNativeMatrix },
Romain Guy61c8c9c2010-08-09 20:48:09 -0700608 { "nGetMatrix", "(II)V", (void*) android_view_GLES20Canvas_getMatrix },
609 { "nConcatMatrix", "(II)V", (void*) android_view_GLES20Canvas_concatMatrix },
Romain Guyc7d53492010-06-25 13:41:57 -0700610
Romain Guy5a7b4662011-01-20 19:09:30 -0800611 { "nDrawBitmap", "(II[BFFI)V", (void*) android_view_GLES20Canvas_drawBitmap },
612 { "nDrawBitmap", "(II[BFFFFFFFFI)V",(void*) android_view_GLES20Canvas_drawBitmapRect },
613 { "nDrawBitmap", "(II[BII)V", (void*) android_view_GLES20Canvas_drawBitmapMatrix },
614
615 { "nDrawBitmapMesh", "(II[BII[FI[III)V",(void*) android_view_GLES20Canvas_drawBitmapMesh },
616
617 { "nDrawPatch", "(II[B[BFFFFI)V", (void*) android_view_GLES20Canvas_drawPatch },
Patrick Dubroye4ac2d62010-12-01 11:23:13 -0800618
Romain Guy61c8c9c2010-08-09 20:48:09 -0700619 { "nDrawColor", "(III)V", (void*) android_view_GLES20Canvas_drawColor },
620 { "nDrawRect", "(IFFFFI)V", (void*) android_view_GLES20Canvas_drawRect },
Romain Guya48a1a82010-08-10 14:59:15 -0700621 { "nDrawRects", "(III)V", (void*) android_view_GLES20Canvas_drawRects },
Romain Guy01d58e42011-01-19 21:54:02 -0800622 { "nDrawRoundRect", "(IFFFFFFI)V", (void*) android_view_GLES20Canvas_drawRoundRect },
623 { "nDrawCircle", "(IFFFI)V", (void*) android_view_GLES20Canvas_drawCircle },
Romain Guyc1cd9ba32011-01-23 14:18:41 -0800624 { "nDrawOval", "(IFFFFI)V", (void*) android_view_GLES20Canvas_drawOval },
Romain Guy8b2f5262011-01-23 16:15:02 -0800625 { "nDrawArc", "(IFFFFFFZI)V", (void*) android_view_GLES20Canvas_drawArc },
626
Romain Guy61c8c9c2010-08-09 20:48:09 -0700627 { "nDrawPath", "(III)V", (void*) android_view_GLES20Canvas_drawPath },
Romain Guy759ea802010-09-16 20:49:46 -0700628 { "nDrawLines", "(I[FIII)V", (void*) android_view_GLES20Canvas_drawLines },
Romain Guybd6b79b2010-06-26 00:13:53 -0700629
Romain Guy61c8c9c2010-08-09 20:48:09 -0700630 { "nResetModifiers", "(I)V", (void*) android_view_GLES20Canvas_resetModifiers },
631 { "nSetupShader", "(II)V", (void*) android_view_GLES20Canvas_setupShader },
632 { "nSetupColorFilter", "(II)V", (void*) android_view_GLES20Canvas_setupColorFilter },
Romain Guy1e45aae2010-08-13 19:39:53 -0700633 { "nSetupShadow", "(IFFFI)V", (void*) android_view_GLES20Canvas_setupShadow },
Romain Guybb9524b2010-06-22 18:56:38 -0700634
Romain Guy61c8c9c2010-08-09 20:48:09 -0700635 { "nDrawText", "(I[CIIFFII)V", (void*) android_view_GLES20Canvas_drawTextArray },
636 { "nDrawText", "(ILjava/lang/String;IIFFII)V",
Romain Guya1db5742010-07-20 13:09:13 -0700637 (void*) android_view_GLES20Canvas_drawText },
638
Romain Guy61c8c9c2010-08-09 20:48:09 -0700639 { "nDrawTextRun", "(I[CIIIIFFII)V", (void*) android_view_GLES20Canvas_drawTextRunArray },
640 { "nDrawTextRun", "(ILjava/lang/String;IIIIFFII)V",
641 (void*) android_view_GLES20Canvas_drawTextRun },
642
Romain Guyfb8b7632010-08-23 21:05:08 -0700643 { "nGetClipBounds", "(ILandroid/graphics/Rect;)Z",
Romain Guyce0537b2010-06-29 21:05:21 -0700644 (void*) android_view_GLES20Canvas_getClipBounds },
Romain Guyb051e892010-09-28 19:09:36 -0700645
Romain Guy6c319ca2011-01-11 14:29:25 -0800646 { "nGetDisplayList", "(I)I", (void*) android_view_GLES20Canvas_getDisplayList },
647 { "nDestroyDisplayList", "(I)V", (void*) android_view_GLES20Canvas_destroyDisplayList },
648 { "nGetDisplayListRenderer", "(I)I", (void*) android_view_GLES20Canvas_getDisplayListRenderer },
Chet Haasedaf98e92011-01-10 14:10:36 -0800649 { "nDrawDisplayList", "(II)Z", (void*) android_view_GLES20Canvas_drawDisplayList },
Romain Guy6c319ca2011-01-11 14:29:25 -0800650
Romain Guy57066eb2011-01-12 12:53:32 -0800651 { "nInterrupt", "(I)V", (void*) android_view_GLES20Canvas_interrupt },
652 { "nResume", "(I)V", (void*) android_view_GLES20Canvas_resume },
Romain Guy6c319ca2011-01-11 14:29:25 -0800653
654 { "nCreateLayerRenderer", "(I)I", (void*) android_view_GLES20Canvas_createLayerRenderer },
Romain Guyada830f2011-01-13 12:13:20 -0800655 { "nCreateLayer", "(IIZ[I)I", (void*) android_view_GLES20Canvas_createLayer },
656 { "nResizeLayer", "(III[I)V" , (void*) android_view_GLES20Canvas_resizeLayer },
657 { "nDestroyLayer", "(I)V", (void*) android_view_GLES20Canvas_destroyLayer },
658 { "nDestroyLayerDeferred", "(I)V", (void*) android_view_GLES20Canvas_destroyLayerDeferred },
659 { "nDrawLayer", "(IIFFI)V", (void*) android_view_GLES20Canvas_drawLayer },
Romain Guyb051e892010-09-28 19:09:36 -0700660
Romain Guy16393512010-08-08 00:14:31 -0700661#endif
Romain Guye4d01122010-06-16 18:44:05 -0700662};
663
Romain Guy16393512010-08-08 00:14:31 -0700664#ifdef USE_OPENGL_RENDERER
665 #define FIND_CLASS(var, className) \
666 var = env->FindClass(className); \
667 LOG_FATAL_IF(! var, "Unable to find class " className); \
668 var = jclass(env->NewGlobalRef(var));
669
670 #define GET_METHOD_ID(var, clazz, methodName, methodDescriptor) \
671 var = env->GetMethodID(clazz, methodName, methodDescriptor); \
672 LOG_FATAL_IF(! var, "Unable to find method " methodName);
673#else
674 #define FIND_CLASS(var, className)
675 #define GET_METHOD_ID(var, clazz, methodName, methodDescriptor)
676#endif
Romain Guy9d5316e2010-06-24 19:30:36 -0700677
Romain Guye4d01122010-06-16 18:44:05 -0700678int register_android_view_GLES20Canvas(JNIEnv* env) {
Romain Guy7ae7ac42010-06-25 13:46:18 -0700679 FIND_CLASS(gRectClassInfo.clazz, "android/graphics/Rect");
680 GET_METHOD_ID(gRectClassInfo.set, gRectClassInfo.clazz, "set", "(IIII)V");
Romain Guy9d5316e2010-06-24 19:30:36 -0700681
Romain Guye4d01122010-06-16 18:44:05 -0700682 return AndroidRuntime::registerNativeMethods(env, kClassPathName, gMethods, NELEM(gMethods));
683}
684
685};