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