android_view_GLES20Canvas.cpp revision bd6b79b40247aea7bfe13d0831c6c0472df6c636
1e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy/*
2e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy * Copyright (C) 2010 The Android Open Source Project
3e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy *
4e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy * Licensed under the Apache License, Version 2.0 (the "License");
5e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy * you may not use this file except in compliance with the License.
6e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy * You may obtain a copy of the License at
7e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy *
8e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy *      http://www.apache.org/licenses/LICENSE-2.0
9e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy *
10e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy * Unless required by applicable law or agreed to in writing, software
11e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy * distributed under the License is distributed on an "AS IS" BASIS,
12e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy * See the License for the specific language governing permissions and
14e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy * limitations under the License.
15e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy */
16e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
17e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy#include "jni.h"
18e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy#include <nativehelper/JNIHelp.h>
19e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy#include <android_runtime/AndroidRuntime.h>
20e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
21c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy#include <SkCanvas.h>
22f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy#include <SkMatrix.h>
23c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy#include <SkPaint.h>
2485bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy#include <SkXfermode.h>
25e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
2685bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy#include <OpenGLRenderer.h>
279d5316e3f56d138504565ff311145ac01621dff4Romain Guy#include <Rect.h>
289d5316e3f56d138504565ff311145ac01621dff4Romain Guy#include <ui/Rect.h>
2985bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy
30e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guynamespace android {
31e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
329d5316e3f56d138504565ff311145ac01621dff4Romain Guyusing namespace uirenderer;
339d5316e3f56d138504565ff311145ac01621dff4Romain Guy
349d5316e3f56d138504565ff311145ac01621dff4Romain Guy// ----------------------------------------------------------------------------
359d5316e3f56d138504565ff311145ac01621dff4Romain Guy// Java APIs
369d5316e3f56d138504565ff311145ac01621dff4Romain Guy// ----------------------------------------------------------------------------
379d5316e3f56d138504565ff311145ac01621dff4Romain Guy
389d5316e3f56d138504565ff311145ac01621dff4Romain Guystatic struct {
397ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    jclass clazz;
407ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    jmethodID set;
419d5316e3f56d138504565ff311145ac01621dff4Romain Guy} gRectClassInfo;
429d5316e3f56d138504565ff311145ac01621dff4Romain Guy
43e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// ----------------------------------------------------------------------------
44e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// Constructors
45e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// ----------------------------------------------------------------------------
46e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
4785bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guystatic OpenGLRenderer* android_view_GLES20Renderer_createRenderer(JNIEnv* env, jobject canvas) {
4885bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy    return new OpenGLRenderer;
49e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy}
50e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
51f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guystatic void android_view_GLES20Renderer_destroyRenderer(JNIEnv* env, jobject canvas,
52f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy        OpenGLRenderer* renderer) {
53f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy    delete renderer;
54e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy}
55e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
56e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// ----------------------------------------------------------------------------
57e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// Setup
58e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// ----------------------------------------------------------------------------
59e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
60f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guystatic void android_view_GLES20Renderer_setViewport(JNIEnv* env, jobject canvas,
61f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy        OpenGLRenderer* renderer, jint width, jint height) {
62f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy    renderer->setViewport(width, height);
63e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy}
64e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
65f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guystatic void android_view_GLES20Renderer_prepare(JNIEnv* env, jobject canvas,
66f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy        OpenGLRenderer* renderer) {
67f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy    renderer->prepare();
68e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy}
69e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
70e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// ----------------------------------------------------------------------------
71bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy// State
72bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy// ----------------------------------------------------------------------------
73bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
74f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guystatic jint android_view_GLES20Renderer_save(JNIEnv* env, jobject canvas, OpenGLRenderer* renderer,
75bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy        jint flags) {
76f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy    return renderer->save(flags);
77f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy}
78bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
79f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guystatic jint android_view_GLES20Renderer_getSaveCount(JNIEnv* env, jobject canvas,
80f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy        OpenGLRenderer* renderer) {
81f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy    return renderer->getSaveCount();
82bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy}
83bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
84f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guystatic void android_view_GLES20Renderer_restore(JNIEnv* env, jobject canvas,
85f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy        OpenGLRenderer* renderer) {
86f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy    renderer->restore();
87bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy}
88bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
89f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guystatic void android_view_GLES20Renderer_restoreToCount(JNIEnv* env, jobject canvas,
90f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy        OpenGLRenderer* renderer, jint saveCount) {
91f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy    renderer->restoreToCount(saveCount);
92bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy}
93bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
94f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy// ----------------------------------------------------------------------------
95bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy// Layers
96bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy// ----------------------------------------------------------------------------
97bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy
98bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guystatic jint android_view_GLES20Renderer_saveLayer(JNIEnv* env, jobject canvas,
99bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy        OpenGLRenderer* renderer, jfloat left, jfloat top, jfloat right, jfloat bottom,
100bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy        SkPaint* paint, jint saveFlags) {
101bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy    return renderer->saveLayer(left, top, right, bottom, paint, saveFlags);
102bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy}
103bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy
104bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guystatic jint android_view_GLES20Renderer_saveLayerAlpha(JNIEnv* env, jobject canvas,
105bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy        OpenGLRenderer* renderer, jfloat left, jfloat top, jfloat right, jfloat bottom,
106bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy        jint alpha, jint saveFlags) {
107bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy    return renderer->saveLayerAlpha(left, top, right, bottom, alpha, saveFlags);
108bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy}
109bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy
110bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy// ----------------------------------------------------------------------------
111f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy// Clipping
112f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy// ----------------------------------------------------------------------------
113f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy
114c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guystatic bool android_view_GLES20Renderer_quickReject(JNIEnv* env, jobject canvas,
115c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy        OpenGLRenderer* renderer, jfloat left, jfloat top, jfloat right, jfloat bottom,
116c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy        SkCanvas::EdgeType edge) {
117c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy    return renderer->quickReject(left, top, right, bottom);
118c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy}
119c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy
120f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guystatic bool android_view_GLES20Renderer_clipRectF(JNIEnv* env, jobject canvas,
121f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy        OpenGLRenderer* renderer, jfloat left, jfloat top, jfloat right, jfloat bottom) {
122f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy    return renderer->clipRect(left, top, right, bottom);
123f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy}
124bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
125f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guystatic bool android_view_GLES20Renderer_clipRect(JNIEnv* env, jobject canvas,
126f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy        OpenGLRenderer* renderer, jint left, jint top, jint right, jint bottom) {
127f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy    return renderer->clipRect(float(left), float(top), float(right), float(bottom));
128bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy}
129bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
1309d5316e3f56d138504565ff311145ac01621dff4Romain Guystatic bool android_view_GLES20Renderer_getClipBounds(JNIEnv* env, jobject canvas,
1319d5316e3f56d138504565ff311145ac01621dff4Romain Guy        OpenGLRenderer* renderer, jobject rect) {
1329d5316e3f56d138504565ff311145ac01621dff4Romain Guy
1337ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    const android::uirenderer::Rect& bounds(renderer->getClipBounds());
1349d5316e3f56d138504565ff311145ac01621dff4Romain Guy
1357ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    env->CallVoidMethod(rect, gRectClassInfo.set,
1367ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy            int(bounds.left), int(bounds.top), int(bounds.right), int(bounds.bottom));
1379d5316e3f56d138504565ff311145ac01621dff4Romain Guy
1387ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    return !bounds.isEmpty();
1399d5316e3f56d138504565ff311145ac01621dff4Romain Guy}
1409d5316e3f56d138504565ff311145ac01621dff4Romain Guy
141bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy// ----------------------------------------------------------------------------
142f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy// Transforms
143bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy// ----------------------------------------------------------------------------
144bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
145f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guystatic void android_view_GLES20Renderer_translate(JNIEnv* env, jobject canvas,
146f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy        OpenGLRenderer* renderer, jfloat dx, jfloat dy) {
1477ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    renderer->translate(dx, dy);
148f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy}
149bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
150f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guystatic void android_view_GLES20Renderer_rotate(JNIEnv* env, jobject canvas,
151f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy        OpenGLRenderer* renderer, jfloat degrees) {
1527ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    renderer->rotate(degrees);
153bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy}
154bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
155f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guystatic void android_view_GLES20Renderer_scale(JNIEnv* env, jobject canvas,
156f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy        OpenGLRenderer* renderer, jfloat sx, jfloat sy) {
1577ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    renderer->scale(sx, sy);
158f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy}
159bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
160f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guystatic void android_view_GLES20Renderer_setMatrix(JNIEnv* env, jobject canvas,
161f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy        OpenGLRenderer* renderer, SkMatrix* matrix) {
1627ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    renderer->setMatrix(matrix);
163f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy}
164f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy
165f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guystatic void android_view_GLES20Renderer_getMatrix(JNIEnv* env, jobject canvas,
166f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy        OpenGLRenderer* renderer, SkMatrix* matrix) {
1677ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    renderer->getMatrix(matrix);
168f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy}
169f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy
170f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guystatic void android_view_GLES20Renderer_concatMatrix(JNIEnv* env, jobject canvas,
171f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy        OpenGLRenderer* renderer, SkMatrix* matrix) {
1727ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    renderer->concatMatrix(matrix);
173bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy}
174bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
175bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy// ----------------------------------------------------------------------------
176bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy// Drawing
17785bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy// ----------------------------------------------------------------------------
17885bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy
179f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guystatic void android_view_GLES20Renderer_drawColor(JNIEnv* env, jobject canvas,
180f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy        OpenGLRenderer* renderer, jint color, jint mode) {
181f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy    renderer->drawColor(color, (SkXfermode::Mode) mode);
18285bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy}
18385bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy
184c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guystatic void android_view_GLES20Renderer_drawRect(JNIEnv* env, jobject canvas,
185c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy        OpenGLRenderer* renderer, jfloat left, jfloat top, jfloat right, jfloat bottom,
186c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy        SkPaint* paint) {
187c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy    renderer->drawRect(left, top, right, bottom, paint);
188c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy}
189c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy
19085bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy// ----------------------------------------------------------------------------
191e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// JNI Glue
192e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// ----------------------------------------------------------------------------
193e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
194e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guyconst char* const kClassPathName = "android/view/GLES20Canvas";
195e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
196e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guystatic JNINativeMethod gMethods[] = {
197bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy    {   "nCreateRenderer",    "()I",        (void*) android_view_GLES20Renderer_createRenderer },
198bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy    {   "nDestroyRenderer",   "(I)V",       (void*) android_view_GLES20Renderer_destroyRenderer },
199bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy    {   "nSetViewport",       "(III)V",     (void*) android_view_GLES20Renderer_setViewport },
200bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy    {   "nPrepare",           "(I)V",       (void*) android_view_GLES20Renderer_prepare },
201bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy
202bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy    {   "nSave",              "(II)I",      (void*) android_view_GLES20Renderer_save },
203bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy    {   "nRestore",           "(I)V",       (void*) android_view_GLES20Renderer_restore },
204bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy    {   "nRestoreToCount",    "(II)V",      (void*) android_view_GLES20Renderer_restoreToCount },
205bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy    {   "nGetSaveCount",      "(I)I",       (void*) android_view_GLES20Renderer_getSaveCount },
206bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy
207bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy    {   "nSaveLayer",         "(IFFFFII)I", (void*) android_view_GLES20Renderer_saveLayer },
208bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy    {   "nSaveLayerAlpha",    "(IFFFFII)I", (void*) android_view_GLES20Renderer_saveLayerAlpha },
209bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy
210bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy    {   "nQuickReject",       "(IFFFFI)Z",  (void*) android_view_GLES20Renderer_quickReject },
211bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy    {   "nClipRect",          "(IFFFF)Z",   (void*) android_view_GLES20Renderer_clipRectF },
212bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy    {   "nClipRect",          "(IIIII)Z",   (void*) android_view_GLES20Renderer_clipRect },
213bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy
214bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy    {   "nTranslate",         "(IFF)V",     (void*) android_view_GLES20Renderer_translate },
215bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy    {   "nRotate",            "(IF)V",      (void*) android_view_GLES20Renderer_rotate },
216bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy    {   "nScale",             "(IFF)V",     (void*) android_view_GLES20Renderer_scale },
217bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy
218bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy    {   "nSetMatrix",         "(II)V",      (void*) android_view_GLES20Renderer_setMatrix },
219bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy    {   "nGetMatrix",         "(II)V",      (void*) android_view_GLES20Renderer_getMatrix },
220bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy    {   "nConcatMatrix",      "(II)V",      (void*) android_view_GLES20Renderer_concatMatrix },
221bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy
222bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy    {   "nDrawColor",         "(III)V",     (void*) android_view_GLES20Renderer_drawColor },
223bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy    {   "nDrawRect",          "(IFFFFI)V",  (void*) android_view_GLES20Renderer_drawRect },
224f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy
225c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy    {   "nGetClipBounds",     "(ILandroid/graphics/Rect;)Z",
226c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy            (void*) android_view_GLES20Renderer_getClipBounds },
227e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy};
228e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
2299d5316e3f56d138504565ff311145ac01621dff4Romain Guy#define FIND_CLASS(var, className) \
2309d5316e3f56d138504565ff311145ac01621dff4Romain Guy        var = env->FindClass(className); \
2319d5316e3f56d138504565ff311145ac01621dff4Romain Guy        LOG_FATAL_IF(! var, "Unable to find class " className); \
2329d5316e3f56d138504565ff311145ac01621dff4Romain Guy        var = jclass(env->NewGlobalRef(var));
2339d5316e3f56d138504565ff311145ac01621dff4Romain Guy
2349d5316e3f56d138504565ff311145ac01621dff4Romain Guy#define GET_METHOD_ID(var, clazz, methodName, methodDescriptor) \
2359d5316e3f56d138504565ff311145ac01621dff4Romain Guy        var = env->GetMethodID(clazz, methodName, methodDescriptor); \
2369d5316e3f56d138504565ff311145ac01621dff4Romain Guy        LOG_FATAL_IF(! var, "Unable to find method " methodName);
2379d5316e3f56d138504565ff311145ac01621dff4Romain Guy
238e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guyint register_android_view_GLES20Canvas(JNIEnv* env) {
2397ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    FIND_CLASS(gRectClassInfo.clazz, "android/graphics/Rect");
2407ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    GET_METHOD_ID(gRectClassInfo.set, gRectClassInfo.clazz, "set", "(IIII)V");
2419d5316e3f56d138504565ff311145ac01621dff4Romain Guy
242e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    return AndroidRuntime::registerNativeMethods(env, kClassPathName, gMethods, NELEM(gMethods));
243e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy}
244e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
245e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy};
246