blob: bb1a9e3c9eb8b2fe40d6fd695fd33198fa4154a3 [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"
20#include <nativehelper/JNIHelp.h>
21#include <android_runtime/AndroidRuntime.h>
Romain Guydeba7852010-07-07 17:54:48 -070022#include <utils/ResourceTypes.h>
Romain Guye4d01122010-06-16 18:44:05 -070023
Romain Guyce0537b2010-06-29 21:05:21 -070024#include <SkBitmap.h>
Romain Guyc7d53492010-06-25 13:41:57 -070025#include <SkCanvas.h>
Romain Guyf6a11b82010-06-23 17:47:49 -070026#include <SkMatrix.h>
Romain Guyc7d53492010-06-25 13:41:57 -070027#include <SkPaint.h>
Romain Guy079ba2c2010-07-16 14:12:24 -070028#include <SkRegion.h>
Romain Guya1db5742010-07-20 13:09:13 -070029#include <SkScalerContext.h>
Romain Guy85bf02f2010-06-22 13:11:24 -070030#include <SkXfermode.h>
Romain Guye4d01122010-06-16 18:44:05 -070031
Romain Guy85bf02f2010-06-22 13:11:24 -070032#include <OpenGLRenderer.h>
Romain Guy06f96e22010-07-30 19:18:16 -070033#include <SkiaShader.h>
Romain Guydb1938e2010-08-02 18:50:22 -070034#include <SkiaColorFilter.h>
Romain Guy9d5316e2010-06-24 19:30:36 -070035#include <Rect.h>
36#include <ui/Rect.h>
Romain Guy85bf02f2010-06-22 13:11:24 -070037
Romain Guye8e62a42010-07-23 18:55:21 -070038#include "TextLayout.h"
39
Romain Guye4d01122010-06-16 18:44:05 -070040namespace android {
41
Romain Guy9d5316e2010-06-24 19:30:36 -070042using namespace uirenderer;
43
Romain Guy16393512010-08-08 00:14:31 -070044/**
45 * Note: OpenGLRenderer JNI layer is generated and compiled only on supported
46 * devices. This means all the logic must be compiled only when the
47 * preprocessor variable USE_OPENGL_RENDERER is defined.
48 */
49#ifdef USE_OPENGL_RENDERER
50
Romain Guy9d5316e2010-06-24 19:30:36 -070051// ----------------------------------------------------------------------------
52// Java APIs
53// ----------------------------------------------------------------------------
54
55static struct {
Romain Guy7ae7ac42010-06-25 13:46:18 -070056 jclass clazz;
57 jmethodID set;
Romain Guy9d5316e2010-06-24 19:30:36 -070058} gRectClassInfo;
59
Romain Guye4d01122010-06-16 18:44:05 -070060// ----------------------------------------------------------------------------
61// Constructors
62// ----------------------------------------------------------------------------
63
Romain Guyce0537b2010-06-29 21:05:21 -070064static OpenGLRenderer* android_view_GLES20Canvas_createRenderer(JNIEnv* env, jobject canvas) {
Romain Guy85bf02f2010-06-22 13:11:24 -070065 return new OpenGLRenderer;
Romain Guye4d01122010-06-16 18:44:05 -070066}
67
Romain Guyce0537b2010-06-29 21:05:21 -070068static void android_view_GLES20Canvas_destroyRenderer(JNIEnv* env, jobject canvas,
Romain Guyf6a11b82010-06-23 17:47:49 -070069 OpenGLRenderer* renderer) {
70 delete renderer;
Romain Guye4d01122010-06-16 18:44:05 -070071}
72
73// ----------------------------------------------------------------------------
74// Setup
75// ----------------------------------------------------------------------------
76
Romain Guyce0537b2010-06-29 21:05:21 -070077static void android_view_GLES20Canvas_setViewport(JNIEnv* env, jobject canvas,
Romain Guyf6a11b82010-06-23 17:47:49 -070078 OpenGLRenderer* renderer, jint width, jint height) {
79 renderer->setViewport(width, height);
Romain Guye4d01122010-06-16 18:44:05 -070080}
81
Romain Guyce0537b2010-06-29 21:05:21 -070082static void android_view_GLES20Canvas_prepare(JNIEnv* env, jobject canvas,
Romain Guyf6a11b82010-06-23 17:47:49 -070083 OpenGLRenderer* renderer) {
84 renderer->prepare();
Romain Guye4d01122010-06-16 18:44:05 -070085}
86
87// ----------------------------------------------------------------------------
Romain Guybb9524b2010-06-22 18:56:38 -070088// State
89// ----------------------------------------------------------------------------
90
Romain Guyce0537b2010-06-29 21:05:21 -070091static jint android_view_GLES20Canvas_save(JNIEnv* env, jobject canvas, OpenGLRenderer* renderer,
Romain Guybb9524b2010-06-22 18:56:38 -070092 jint flags) {
Romain Guyf6a11b82010-06-23 17:47:49 -070093 return renderer->save(flags);
Romain Guybb9524b2010-06-22 18:56:38 -070094}
95
Romain Guyce0537b2010-06-29 21:05:21 -070096static jint android_view_GLES20Canvas_getSaveCount(JNIEnv* env, jobject canvas,
Romain Guyf6a11b82010-06-23 17:47:49 -070097 OpenGLRenderer* renderer) {
98 return renderer->getSaveCount();
Romain Guybb9524b2010-06-22 18:56:38 -070099}
100
Romain Guyce0537b2010-06-29 21:05:21 -0700101static void android_view_GLES20Canvas_restore(JNIEnv* env, jobject canvas,
Romain Guyf6a11b82010-06-23 17:47:49 -0700102 OpenGLRenderer* renderer) {
103 renderer->restore();
Romain Guybb9524b2010-06-22 18:56:38 -0700104}
105
Romain Guyce0537b2010-06-29 21:05:21 -0700106static void android_view_GLES20Canvas_restoreToCount(JNIEnv* env, jobject canvas,
Romain Guyf6a11b82010-06-23 17:47:49 -0700107 OpenGLRenderer* renderer, jint saveCount) {
108 renderer->restoreToCount(saveCount);
Romain Guybb9524b2010-06-22 18:56:38 -0700109}
110
111// ----------------------------------------------------------------------------
Romain Guybd6b79b2010-06-26 00:13:53 -0700112// Layers
113// ----------------------------------------------------------------------------
114
Romain Guyce0537b2010-06-29 21:05:21 -0700115static jint android_view_GLES20Canvas_saveLayer(JNIEnv* env, jobject canvas,
Romain Guybd6b79b2010-06-26 00:13:53 -0700116 OpenGLRenderer* renderer, jfloat left, jfloat top, jfloat right, jfloat bottom,
117 SkPaint* paint, jint saveFlags) {
118 return renderer->saveLayer(left, top, right, bottom, paint, saveFlags);
119}
120
Romain Guyce0537b2010-06-29 21:05:21 -0700121static jint android_view_GLES20Canvas_saveLayerAlpha(JNIEnv* env, jobject canvas,
Romain Guybd6b79b2010-06-26 00:13:53 -0700122 OpenGLRenderer* renderer, jfloat left, jfloat top, jfloat right, jfloat bottom,
123 jint alpha, jint saveFlags) {
124 return renderer->saveLayerAlpha(left, top, right, bottom, alpha, saveFlags);
125}
126
127// ----------------------------------------------------------------------------
Romain Guybb9524b2010-06-22 18:56:38 -0700128// Clipping
129// ----------------------------------------------------------------------------
130
Romain Guyce0537b2010-06-29 21:05:21 -0700131static bool android_view_GLES20Canvas_quickReject(JNIEnv* env, jobject canvas,
Romain Guyc7d53492010-06-25 13:41:57 -0700132 OpenGLRenderer* renderer, jfloat left, jfloat top, jfloat right, jfloat bottom,
133 SkCanvas::EdgeType edge) {
134 return renderer->quickReject(left, top, right, bottom);
135}
136
Romain Guyce0537b2010-06-29 21:05:21 -0700137static bool android_view_GLES20Canvas_clipRectF(JNIEnv* env, jobject canvas,
Romain Guy079ba2c2010-07-16 14:12:24 -0700138 OpenGLRenderer* renderer, jfloat left, jfloat top, jfloat right, jfloat bottom,
139 SkRegion::Op op) {
140 return renderer->clipRect(left, top, right, bottom, op);
Romain Guybb9524b2010-06-22 18:56:38 -0700141}
142
Romain Guyce0537b2010-06-29 21:05:21 -0700143static bool android_view_GLES20Canvas_clipRect(JNIEnv* env, jobject canvas,
Romain Guy079ba2c2010-07-16 14:12:24 -0700144 OpenGLRenderer* renderer, jint left, jint top, jint right, jint bottom,
145 SkRegion::Op op) {
146 return renderer->clipRect(float(left), float(top), float(right), float(bottom), op);
Romain Guyf6a11b82010-06-23 17:47:49 -0700147}
Romain Guybb9524b2010-06-22 18:56:38 -0700148
Romain Guyce0537b2010-06-29 21:05:21 -0700149static bool android_view_GLES20Canvas_getClipBounds(JNIEnv* env, jobject canvas,
Romain Guy9d5316e2010-06-24 19:30:36 -0700150 OpenGLRenderer* renderer, jobject rect) {
Romain Guy7ae7ac42010-06-25 13:46:18 -0700151 const android::uirenderer::Rect& bounds(renderer->getClipBounds());
Romain Guy9d5316e2010-06-24 19:30:36 -0700152
Romain Guy7ae7ac42010-06-25 13:46:18 -0700153 env->CallVoidMethod(rect, gRectClassInfo.set,
154 int(bounds.left), int(bounds.top), int(bounds.right), int(bounds.bottom));
Romain Guy9d5316e2010-06-24 19:30:36 -0700155
Romain Guy7ae7ac42010-06-25 13:46:18 -0700156 return !bounds.isEmpty();
Romain Guy9d5316e2010-06-24 19:30:36 -0700157}
158
Romain Guyf6a11b82010-06-23 17:47:49 -0700159// ----------------------------------------------------------------------------
160// Transforms
161// ----------------------------------------------------------------------------
162
Romain Guyce0537b2010-06-29 21:05:21 -0700163static void android_view_GLES20Canvas_translate(JNIEnv* env, jobject canvas,
Romain Guyf6a11b82010-06-23 17:47:49 -0700164 OpenGLRenderer* renderer, jfloat dx, jfloat dy) {
Romain Guy7ae7ac42010-06-25 13:46:18 -0700165 renderer->translate(dx, dy);
Romain Guyf6a11b82010-06-23 17:47:49 -0700166}
167
Romain Guyce0537b2010-06-29 21:05:21 -0700168static void android_view_GLES20Canvas_rotate(JNIEnv* env, jobject canvas,
Romain Guyf6a11b82010-06-23 17:47:49 -0700169 OpenGLRenderer* renderer, jfloat degrees) {
Romain Guy7ae7ac42010-06-25 13:46:18 -0700170 renderer->rotate(degrees);
Romain Guyf6a11b82010-06-23 17:47:49 -0700171}
172
Romain Guyce0537b2010-06-29 21:05:21 -0700173static void android_view_GLES20Canvas_scale(JNIEnv* env, jobject canvas,
Romain Guyf6a11b82010-06-23 17:47:49 -0700174 OpenGLRenderer* renderer, jfloat sx, jfloat sy) {
Romain Guy7ae7ac42010-06-25 13:46:18 -0700175 renderer->scale(sx, sy);
Romain Guyf6a11b82010-06-23 17:47:49 -0700176}
177
Romain Guyce0537b2010-06-29 21:05:21 -0700178static void android_view_GLES20Canvas_setMatrix(JNIEnv* env, jobject canvas,
Romain Guyf6a11b82010-06-23 17:47:49 -0700179 OpenGLRenderer* renderer, SkMatrix* matrix) {
Romain Guy7ae7ac42010-06-25 13:46:18 -0700180 renderer->setMatrix(matrix);
Romain Guyf6a11b82010-06-23 17:47:49 -0700181}
182
Romain Guyce0537b2010-06-29 21:05:21 -0700183static void android_view_GLES20Canvas_getMatrix(JNIEnv* env, jobject canvas,
Romain Guyf6a11b82010-06-23 17:47:49 -0700184 OpenGLRenderer* renderer, SkMatrix* matrix) {
Romain Guy7ae7ac42010-06-25 13:46:18 -0700185 renderer->getMatrix(matrix);
Romain Guyf6a11b82010-06-23 17:47:49 -0700186}
187
Romain Guyce0537b2010-06-29 21:05:21 -0700188static void android_view_GLES20Canvas_concatMatrix(JNIEnv* env, jobject canvas,
Romain Guyf6a11b82010-06-23 17:47:49 -0700189 OpenGLRenderer* renderer, SkMatrix* matrix) {
Romain Guy7ae7ac42010-06-25 13:46:18 -0700190 renderer->concatMatrix(matrix);
Romain Guybb9524b2010-06-22 18:56:38 -0700191}
192
193// ----------------------------------------------------------------------------
194// Drawing
Romain Guy85bf02f2010-06-22 13:11:24 -0700195// ----------------------------------------------------------------------------
196
Romain Guyce0537b2010-06-29 21:05:21 -0700197static void android_view_GLES20Canvas_drawBitmap(JNIEnv* env, jobject canvas,
Romain Guydbd77cd2010-07-09 10:36:05 -0700198 OpenGLRenderer* renderer, SkBitmap* bitmap, float left, float top, SkPaint* paint) {
199 renderer->drawBitmap(bitmap, left, top, paint);
Romain Guy85bf02f2010-06-22 13:11:24 -0700200}
201
Romain Guyce0537b2010-06-29 21:05:21 -0700202static void android_view_GLES20Canvas_drawBitmapRect(JNIEnv* env, jobject canvas,
203 OpenGLRenderer* renderer, SkBitmap* bitmap,
204 float srcLeft, float srcTop, float srcRight, float srcBottom,
Romain Guydbd77cd2010-07-09 10:36:05 -0700205 float dstLeft, float dstTop, float dstRight, float dstBottom, SkPaint* paint) {
206 renderer->drawBitmap(bitmap, srcLeft, srcTop, srcRight, srcBottom,
207 dstLeft, dstTop, dstRight, dstBottom, paint);
Romain Guyf86ef572010-07-01 11:05:42 -0700208}
Romain Guy8ba548f2010-06-30 19:21:21 -0700209
Romain Guyf86ef572010-07-01 11:05:42 -0700210static void android_view_GLES20Canvas_drawBitmapMatrix(JNIEnv* env, jobject canvas,
Romain Guydbd77cd2010-07-09 10:36:05 -0700211 OpenGLRenderer* renderer, SkBitmap* bitmap, SkMatrix* matrix, SkPaint* paint) {
212 renderer->drawBitmap(bitmap, matrix, paint);
Romain Guyce0537b2010-06-29 21:05:21 -0700213}
214
Romain Guydeba7852010-07-07 17:54:48 -0700215static void android_view_GLES20Canvas_drawPatch(JNIEnv* env, jobject canvas,
216 OpenGLRenderer* renderer, SkBitmap* bitmap, jbyteArray chunks,
Romain Guydbd77cd2010-07-09 10:36:05 -0700217 float left, float top, float right, float bottom, SkPaint* paint) {
Romain Guydeba7852010-07-07 17:54:48 -0700218 jbyte* storage = env->GetByteArrayElements(chunks, NULL);
219 Res_png_9patch* patch = reinterpret_cast<Res_png_9patch*>(storage);
220 Res_png_9patch::deserialize(patch);
221
Romain Guydbd77cd2010-07-09 10:36:05 -0700222 renderer->drawPatch(bitmap, patch, left, top, right, bottom, paint);
Romain Guydeba7852010-07-07 17:54:48 -0700223
Romain Guydeba7852010-07-07 17:54:48 -0700224 env->ReleaseByteArrayElements(chunks, storage, 0);
225}
226
Romain Guyce0537b2010-06-29 21:05:21 -0700227static void android_view_GLES20Canvas_drawColor(JNIEnv* env, jobject canvas,
228 OpenGLRenderer* renderer, jint color, SkXfermode::Mode mode) {
229 renderer->drawColor(color, mode);
230}
231
232static void android_view_GLES20Canvas_drawRect(JNIEnv* env, jobject canvas,
Romain Guyc7d53492010-06-25 13:41:57 -0700233 OpenGLRenderer* renderer, jfloat left, jfloat top, jfloat right, jfloat bottom,
234 SkPaint* paint) {
235 renderer->drawRect(left, top, right, bottom, paint);
236}
237
Romain Guy7fbcc042010-08-04 15:40:07 -0700238static void android_view_GLES20Canvas_drawPath(JNIEnv* env, jobject canvas,
239 OpenGLRenderer* renderer, SkPath* path, SkPaint* paint) {
240 renderer->drawPath(path, paint);
241}
242
Romain Guy85bf02f2010-06-22 13:11:24 -0700243// ----------------------------------------------------------------------------
Romain Guydb1938e2010-08-02 18:50:22 -0700244// Shaders and color filters
Romain Guyd27977d2010-07-14 19:18:51 -0700245// ----------------------------------------------------------------------------
246
Romain Guydb1938e2010-08-02 18:50:22 -0700247static void android_view_GLES20Canvas_resetModifiers(JNIEnv* env, jobject canvas,
Romain Guyd27977d2010-07-14 19:18:51 -0700248 OpenGLRenderer* renderer) {
249 renderer->resetShader();
Romain Guydb1938e2010-08-02 18:50:22 -0700250 renderer->resetColorFilter();
Romain Guyd27977d2010-07-14 19:18:51 -0700251}
252
Romain Guy06f96e22010-07-30 19:18:16 -0700253static void android_view_GLES20Canvas_setupShader(JNIEnv* env, jobject canvas,
254 OpenGLRenderer* renderer, SkiaShader* shader) {
255 renderer->setupShader(shader);
Romain Guy7fac2e12010-07-16 17:10:13 -0700256}
257
Romain Guydb1938e2010-08-02 18:50:22 -0700258static void android_view_GLES20Canvas_setupColorFilter(JNIEnv* env, jobject canvas,
259 OpenGLRenderer* renderer, SkiaColorFilter* filter) {
260 renderer->setupColorFilter(filter);
261}
262
Romain Guyd27977d2010-07-14 19:18:51 -0700263// ----------------------------------------------------------------------------
Romain Guya1db5742010-07-20 13:09:13 -0700264// Text
265// ----------------------------------------------------------------------------
266
Romain Guye8e62a42010-07-23 18:55:21 -0700267static void renderText(OpenGLRenderer* renderer, const jchar* text, int count,
268 jfloat x, jfloat y, int flags, SkPaint* paint) {
269 const jchar *workText;
Romain Guy92262982010-07-26 11:17:54 -0700270 jchar* buffer = NULL;
Romain Guye8e62a42010-07-23 18:55:21 -0700271 int32_t workBytes;
Romain Guy92262982010-07-26 11:17:54 -0700272 if (TextLayout::prepareText(paint, text, count, flags, &workText, &workBytes, &buffer)) {
Romain Guye8e62a42010-07-23 18:55:21 -0700273 renderer->drawText((const char*) workText, workBytes, count, x, y, paint);
Romain Guy92262982010-07-26 11:17:54 -0700274 free(buffer);
Romain Guye8e62a42010-07-23 18:55:21 -0700275 }
276}
277
Romain Guya1db5742010-07-20 13:09:13 -0700278static void android_view_GLES20Canvas_drawTextArray(JNIEnv* env, jobject canvas,
279 OpenGLRenderer* renderer, jcharArray text, int index, int count,
280 jfloat x, jfloat y, int flags, SkPaint* paint) {
281 jchar* textArray = env->GetCharArrayElements(text, NULL);
Romain Guye8e62a42010-07-23 18:55:21 -0700282 renderText(renderer, textArray + index, count, x, y, flags, paint);
Romain Guya1db5742010-07-20 13:09:13 -0700283 env->ReleaseCharArrayElements(text, textArray, JNI_ABORT);
284}
285
286static void android_view_GLES20Canvas_drawText(JNIEnv* env, jobject canvas,
287 OpenGLRenderer* renderer, jstring text, int start, int end,
288 jfloat x, jfloat y, int flags, SkPaint* paint) {
289 const jchar* textArray = env->GetStringChars(text, NULL);
Romain Guye8e62a42010-07-23 18:55:21 -0700290 renderText(renderer, textArray + start, end - start, x, y, flags, paint);
Romain Guya1db5742010-07-20 13:09:13 -0700291 env->ReleaseStringChars(text, textArray);
292}
293
Romain Guy16393512010-08-08 00:14:31 -0700294#endif // USE_OPENGL_RENDERER
295
296// ----------------------------------------------------------------------------
297// Common
298// ----------------------------------------------------------------------------
299
300static jboolean android_view_GLES20Canvas_isAvailable(JNIEnv* env, jobject clazz) {
301#ifdef USE_OPENGL_RENDERER
302 return JNI_TRUE;
303#else
304 return JNI_FALSE;
305#endif
306}
307
Romain Guya1db5742010-07-20 13:09:13 -0700308// ----------------------------------------------------------------------------
Romain Guye4d01122010-06-16 18:44:05 -0700309// JNI Glue
310// ----------------------------------------------------------------------------
311
312const char* const kClassPathName = "android/view/GLES20Canvas";
313
314static JNINativeMethod gMethods[] = {
Romain Guy16393512010-08-08 00:14:31 -0700315 { "nIsAvailable", "()Z", (void*) android_view_GLES20Canvas_isAvailable },
316#ifdef USE_OPENGL_RENDERER
317
Romain Guydbd77cd2010-07-09 10:36:05 -0700318 { "nCreateRenderer", "()I", (void*) android_view_GLES20Canvas_createRenderer },
319 { "nDestroyRenderer", "(I)V", (void*) android_view_GLES20Canvas_destroyRenderer },
320 { "nSetViewport", "(III)V", (void*) android_view_GLES20Canvas_setViewport },
321 { "nPrepare", "(I)V", (void*) android_view_GLES20Canvas_prepare },
Romain Guy85bf02f2010-06-22 13:11:24 -0700322
Romain Guydbd77cd2010-07-09 10:36:05 -0700323 { "nSave", "(II)I", (void*) android_view_GLES20Canvas_save },
324 { "nRestore", "(I)V", (void*) android_view_GLES20Canvas_restore },
325 { "nRestoreToCount", "(II)V", (void*) android_view_GLES20Canvas_restoreToCount },
326 { "nGetSaveCount", "(I)I", (void*) android_view_GLES20Canvas_getSaveCount },
Romain Guybb9524b2010-06-22 18:56:38 -0700327
Romain Guydbd77cd2010-07-09 10:36:05 -0700328 { "nSaveLayer", "(IFFFFII)I", (void*) android_view_GLES20Canvas_saveLayer },
329 { "nSaveLayerAlpha", "(IFFFFII)I", (void*) android_view_GLES20Canvas_saveLayerAlpha },
Romain Guyc7d53492010-06-25 13:41:57 -0700330
Romain Guydbd77cd2010-07-09 10:36:05 -0700331 { "nQuickReject", "(IFFFFI)Z", (void*) android_view_GLES20Canvas_quickReject },
Romain Guy079ba2c2010-07-16 14:12:24 -0700332 { "nClipRect", "(IFFFFI)Z", (void*) android_view_GLES20Canvas_clipRectF },
333 { "nClipRect", "(IIIIII)Z", (void*) android_view_GLES20Canvas_clipRect },
Romain Guyc7d53492010-06-25 13:41:57 -0700334
Romain Guydbd77cd2010-07-09 10:36:05 -0700335 { "nTranslate", "(IFF)V", (void*) android_view_GLES20Canvas_translate },
336 { "nRotate", "(IF)V", (void*) android_view_GLES20Canvas_rotate },
337 { "nScale", "(IFF)V", (void*) android_view_GLES20Canvas_scale },
Romain Guyc7d53492010-06-25 13:41:57 -0700338
Romain Guydbd77cd2010-07-09 10:36:05 -0700339 { "nSetMatrix", "(II)V", (void*) android_view_GLES20Canvas_setMatrix },
340 { "nGetMatrix", "(II)V", (void*) android_view_GLES20Canvas_getMatrix },
341 { "nConcatMatrix", "(II)V", (void*) android_view_GLES20Canvas_concatMatrix },
Romain Guybd6b79b2010-06-26 00:13:53 -0700342
Romain Guydbd77cd2010-07-09 10:36:05 -0700343 { "nDrawBitmap", "(IIFFI)V", (void*) android_view_GLES20Canvas_drawBitmap },
344 { "nDrawBitmap", "(IIFFFFFFFFI)V", (void*) android_view_GLES20Canvas_drawBitmapRect },
345 { "nDrawBitmap", "(IIII)V", (void*) android_view_GLES20Canvas_drawBitmapMatrix },
346 { "nDrawPatch", "(II[BFFFFI)V", (void*) android_view_GLES20Canvas_drawPatch },
347 { "nDrawColor", "(III)V", (void*) android_view_GLES20Canvas_drawColor },
348 { "nDrawRect", "(IFFFFI)V", (void*) android_view_GLES20Canvas_drawRect },
Romain Guy7fbcc042010-08-04 15:40:07 -0700349 { "nDrawPath", "(III)V", (void*) android_view_GLES20Canvas_drawPath },
Romain Guybb9524b2010-06-22 18:56:38 -0700350
Romain Guydb1938e2010-08-02 18:50:22 -0700351 { "nResetModifiers", "(I)V", (void*) android_view_GLES20Canvas_resetModifiers },
Romain Guy06f96e22010-07-30 19:18:16 -0700352 { "nSetupShader", "(II)V", (void*) android_view_GLES20Canvas_setupShader },
Romain Guydb1938e2010-08-02 18:50:22 -0700353 { "nSetupColorFilter", "(II)V", (void*) android_view_GLES20Canvas_setupColorFilter },
Romain Guyd27977d2010-07-14 19:18:51 -0700354
Romain Guya1db5742010-07-20 13:09:13 -0700355 { "nDrawText", "(I[CIIFFII)V", (void*) android_view_GLES20Canvas_drawTextArray },
356 { "nDrawText", "(ILjava/lang/String;IIFFII)V",
357 (void*) android_view_GLES20Canvas_drawText },
358
Romain Guy9d5316e2010-06-24 19:30:36 -0700359 { "nGetClipBounds", "(ILandroid/graphics/Rect;)Z",
Romain Guyce0537b2010-06-29 21:05:21 -0700360 (void*) android_view_GLES20Canvas_getClipBounds },
Romain Guy16393512010-08-08 00:14:31 -0700361#endif
Romain Guye4d01122010-06-16 18:44:05 -0700362};
363
Romain Guy16393512010-08-08 00:14:31 -0700364#ifdef USE_OPENGL_RENDERER
365 #define FIND_CLASS(var, className) \
366 var = env->FindClass(className); \
367 LOG_FATAL_IF(! var, "Unable to find class " className); \
368 var = jclass(env->NewGlobalRef(var));
369
370 #define GET_METHOD_ID(var, clazz, methodName, methodDescriptor) \
371 var = env->GetMethodID(clazz, methodName, methodDescriptor); \
372 LOG_FATAL_IF(! var, "Unable to find method " methodName);
373#else
374 #define FIND_CLASS(var, className)
375 #define GET_METHOD_ID(var, clazz, methodName, methodDescriptor)
376#endif
Romain Guy9d5316e2010-06-24 19:30:36 -0700377
Romain Guye4d01122010-06-16 18:44:05 -0700378int register_android_view_GLES20Canvas(JNIEnv* env) {
Romain Guy7ae7ac42010-06-25 13:46:18 -0700379 FIND_CLASS(gRectClassInfo.clazz, "android/graphics/Rect");
380 GET_METHOD_ID(gRectClassInfo.set, gRectClassInfo.clazz, "set", "(IIII)V");
Romain Guy9d5316e2010-06-24 19:30:36 -0700381
Romain Guye4d01122010-06-16 18:44:05 -0700382 return AndroidRuntime::registerNativeMethods(env, kClassPathName, gMethods, NELEM(gMethods));
383}
384
385};