android_view_GLES20Canvas.cpp revision c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6c
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 { 399d5316e3f56d138504565ff311145ac01621dff4Romain Guy jclass clazz; 409d5316e3f56d138504565ff311145ac01621dff4Romain 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// ---------------------------------------------------------------------------- 95f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy// Clipping 96f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy// ---------------------------------------------------------------------------- 97f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy 98c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guystatic bool android_view_GLES20Renderer_quickReject(JNIEnv* env, jobject canvas, 99c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy OpenGLRenderer* renderer, jfloat left, jfloat top, jfloat right, jfloat bottom, 100c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy SkCanvas::EdgeType edge) { 101c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy return renderer->quickReject(left, top, right, bottom); 102c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy} 103c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy 104f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guystatic bool android_view_GLES20Renderer_clipRectF(JNIEnv* env, jobject canvas, 105f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy OpenGLRenderer* renderer, jfloat left, jfloat top, jfloat right, jfloat bottom) { 106f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy return renderer->clipRect(left, top, right, bottom); 107f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy} 108bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy 109f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guystatic bool android_view_GLES20Renderer_clipRect(JNIEnv* env, jobject canvas, 110f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy OpenGLRenderer* renderer, jint left, jint top, jint right, jint bottom) { 111f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy return renderer->clipRect(float(left), float(top), float(right), float(bottom)); 112bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy} 113bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy 1149d5316e3f56d138504565ff311145ac01621dff4Romain Guystatic bool android_view_GLES20Renderer_getClipBounds(JNIEnv* env, jobject canvas, 1159d5316e3f56d138504565ff311145ac01621dff4Romain Guy OpenGLRenderer* renderer, jobject rect) { 1169d5316e3f56d138504565ff311145ac01621dff4Romain Guy 1179d5316e3f56d138504565ff311145ac01621dff4Romain Guy const android::uirenderer::Rect& bounds(renderer->getClipBounds()); 1189d5316e3f56d138504565ff311145ac01621dff4Romain Guy 1199d5316e3f56d138504565ff311145ac01621dff4Romain Guy env->CallVoidMethod(rect, gRectClassInfo.set, 1209d5316e3f56d138504565ff311145ac01621dff4Romain Guy int(bounds.left), int(bounds.top), int(bounds.right), int(bounds.bottom)); 1219d5316e3f56d138504565ff311145ac01621dff4Romain Guy 1229d5316e3f56d138504565ff311145ac01621dff4Romain Guy return !bounds.isEmpty(); 1239d5316e3f56d138504565ff311145ac01621dff4Romain Guy} 1249d5316e3f56d138504565ff311145ac01621dff4Romain Guy 125bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy// ---------------------------------------------------------------------------- 126f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy// Transforms 127bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy// ---------------------------------------------------------------------------- 128bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy 129f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guystatic void android_view_GLES20Renderer_translate(JNIEnv* env, jobject canvas, 130f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy OpenGLRenderer* renderer, jfloat dx, jfloat dy) { 131f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy renderer->translate(dx, dy); 132f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy} 133bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy 134f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guystatic void android_view_GLES20Renderer_rotate(JNIEnv* env, jobject canvas, 135f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy OpenGLRenderer* renderer, jfloat degrees) { 136f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy renderer->rotate(degrees); 137bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy} 138bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy 139f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guystatic void android_view_GLES20Renderer_scale(JNIEnv* env, jobject canvas, 140f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy OpenGLRenderer* renderer, jfloat sx, jfloat sy) { 141f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy renderer->scale(sx, sy); 142f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy} 143bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy 144f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guystatic void android_view_GLES20Renderer_setMatrix(JNIEnv* env, jobject canvas, 145f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy OpenGLRenderer* renderer, SkMatrix* matrix) { 146f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy renderer->setMatrix(matrix); 147f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy} 148f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy 149f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guystatic void android_view_GLES20Renderer_getMatrix(JNIEnv* env, jobject canvas, 150f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy OpenGLRenderer* renderer, SkMatrix* matrix) { 151f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy renderer->getMatrix(matrix); 152f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy} 153f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy 154f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guystatic void android_view_GLES20Renderer_concatMatrix(JNIEnv* env, jobject canvas, 155f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy OpenGLRenderer* renderer, SkMatrix* matrix) { 156f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy renderer->concatMatrix(matrix); 157bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy} 158bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy 159bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy// ---------------------------------------------------------------------------- 160bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy// Drawing 16185bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy// ---------------------------------------------------------------------------- 16285bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy 163f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guystatic void android_view_GLES20Renderer_drawColor(JNIEnv* env, jobject canvas, 164f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy OpenGLRenderer* renderer, jint color, jint mode) { 165f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy renderer->drawColor(color, (SkXfermode::Mode) mode); 16685bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy} 16785bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy 168c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guystatic void android_view_GLES20Renderer_drawRect(JNIEnv* env, jobject canvas, 169c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy OpenGLRenderer* renderer, jfloat left, jfloat top, jfloat right, jfloat bottom, 170c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy SkPaint* paint) { 171c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy renderer->drawRect(left, top, right, bottom, paint); 172c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy} 173c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy 17485bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy// ---------------------------------------------------------------------------- 175e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// JNI Glue 176e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// ---------------------------------------------------------------------------- 177e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy 178e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guyconst char* const kClassPathName = "android/view/GLES20Canvas"; 179e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy 180e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guystatic JNINativeMethod gMethods[] = { 181c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy { "nCreateRenderer", "()I", (void*) android_view_GLES20Renderer_createRenderer }, 182c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy { "nDestroyRenderer", "(I)V", (void*) android_view_GLES20Renderer_destroyRenderer }, 183c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy { "nSetViewport", "(III)V", (void*) android_view_GLES20Renderer_setViewport }, 184c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy { "nPrepare", "(I)V", (void*) android_view_GLES20Renderer_prepare }, 185bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy 186c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy { "nSave", "(II)I", (void*) android_view_GLES20Renderer_save }, 187c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy { "nRestore", "(I)V", (void*) android_view_GLES20Renderer_restore }, 188c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy { "nRestoreToCount", "(II)V", (void*) android_view_GLES20Renderer_restoreToCount }, 189c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy { "nGetSaveCount", "(I)I", (void*) android_view_GLES20Renderer_getSaveCount }, 190bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy 191c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy { "nQuickReject", "(IFFFFI)Z", (void*) android_view_GLES20Renderer_quickReject }, 192c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy { "nClipRect", "(IFFFF)Z", (void*) android_view_GLES20Renderer_clipRectF }, 193c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy { "nClipRect", "(IIIII)Z", (void*) android_view_GLES20Renderer_clipRect }, 19485bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy 195c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy { "nTranslate", "(IFF)V", (void*) android_view_GLES20Renderer_translate }, 196c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy { "nRotate", "(IF)V", (void*) android_view_GLES20Renderer_rotate }, 197c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy { "nScale", "(IFF)V", (void*) android_view_GLES20Renderer_scale }, 1989d5316e3f56d138504565ff311145ac01621dff4Romain Guy 199c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy { "nSetMatrix", "(II)V", (void*) android_view_GLES20Renderer_setMatrix }, 200c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy { "nGetMatrix", "(II)V", (void*) android_view_GLES20Renderer_getMatrix }, 201c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy { "nConcatMatrix", "(II)V", (void*) android_view_GLES20Renderer_concatMatrix }, 202f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy 203c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy { "nDrawColor", "(III)V", (void*) android_view_GLES20Renderer_drawColor }, 204c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy { "nDrawRect", "(IFFFFI)V", (void*) android_view_GLES20Renderer_drawRect }, 205f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy 206c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy { "nGetClipBounds", "(ILandroid/graphics/Rect;)Z", 207c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy (void*) android_view_GLES20Renderer_getClipBounds }, 208e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy}; 209e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy 2109d5316e3f56d138504565ff311145ac01621dff4Romain Guy#define FIND_CLASS(var, className) \ 2119d5316e3f56d138504565ff311145ac01621dff4Romain Guy var = env->FindClass(className); \ 2129d5316e3f56d138504565ff311145ac01621dff4Romain Guy LOG_FATAL_IF(! var, "Unable to find class " className); \ 2139d5316e3f56d138504565ff311145ac01621dff4Romain Guy var = jclass(env->NewGlobalRef(var)); 2149d5316e3f56d138504565ff311145ac01621dff4Romain Guy 2159d5316e3f56d138504565ff311145ac01621dff4Romain Guy#define GET_METHOD_ID(var, clazz, methodName, methodDescriptor) \ 2169d5316e3f56d138504565ff311145ac01621dff4Romain Guy var = env->GetMethodID(clazz, methodName, methodDescriptor); \ 2179d5316e3f56d138504565ff311145ac01621dff4Romain Guy LOG_FATAL_IF(! var, "Unable to find method " methodName); 2189d5316e3f56d138504565ff311145ac01621dff4Romain Guy 219e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guyint register_android_view_GLES20Canvas(JNIEnv* env) { 2209d5316e3f56d138504565ff311145ac01621dff4Romain Guy FIND_CLASS(gRectClassInfo.clazz, "android/graphics/Rect"); 2219d5316e3f56d138504565ff311145ac01621dff4Romain Guy GET_METHOD_ID(gRectClassInfo.set, gRectClassInfo.clazz, "set", "(IIII)V"); 2229d5316e3f56d138504565ff311145ac01621dff4Romain Guy 223e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy return AndroidRuntime::registerNativeMethods(env, kClassPathName, gMethods, NELEM(gMethods)); 224e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy} 225e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy 226e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy}; 227