android_view_GLES20Canvas.cpp revision f6a11b8a9e25ff9861bbba19251bea84d8a5daf2
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 21f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy#include <SkMatrix.h> 2285bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy#include <SkXfermode.h> 23e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy 2485bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy#include <OpenGLRenderer.h> 2585bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy 26e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guynamespace android { 27e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy 28e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// ---------------------------------------------------------------------------- 29e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// Constructors 30e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// ---------------------------------------------------------------------------- 31e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy 3285bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guystatic OpenGLRenderer* android_view_GLES20Renderer_createRenderer(JNIEnv* env, jobject canvas) { 3385bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy return new OpenGLRenderer; 34e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy} 35e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy 36f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guystatic void android_view_GLES20Renderer_destroyRenderer(JNIEnv* env, jobject canvas, 37f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy OpenGLRenderer* renderer) { 38f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy delete renderer; 39e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy} 40e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy 41e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// ---------------------------------------------------------------------------- 42e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// Setup 43e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// ---------------------------------------------------------------------------- 44e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy 45f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guystatic void android_view_GLES20Renderer_setViewport(JNIEnv* env, jobject canvas, 46f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy OpenGLRenderer* renderer, jint width, jint height) { 47f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy renderer->setViewport(width, height); 48e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy} 49e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy 50f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guystatic void android_view_GLES20Renderer_prepare(JNIEnv* env, jobject canvas, 51f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy OpenGLRenderer* renderer) { 52f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy renderer->prepare(); 53e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy} 54e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy 55e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// ---------------------------------------------------------------------------- 56bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy// State 57bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy// ---------------------------------------------------------------------------- 58bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy 59f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guystatic jint android_view_GLES20Renderer_save(JNIEnv* env, jobject canvas, OpenGLRenderer* renderer, 60bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy jint flags) { 61f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy return renderer->save(flags); 62f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy} 63bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy 64f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guystatic jint android_view_GLES20Renderer_getSaveCount(JNIEnv* env, jobject canvas, 65f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy OpenGLRenderer* renderer) { 66f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy return renderer->getSaveCount(); 67bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy} 68bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy 69f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guystatic void android_view_GLES20Renderer_restore(JNIEnv* env, jobject canvas, 70f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy OpenGLRenderer* renderer) { 71f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy renderer->restore(); 72bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy} 73bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy 74f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guystatic void android_view_GLES20Renderer_restoreToCount(JNIEnv* env, jobject canvas, 75f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy OpenGLRenderer* renderer, jint saveCount) { 76f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy renderer->restoreToCount(saveCount); 77bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy} 78bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy 79f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy// ---------------------------------------------------------------------------- 80f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy// Clipping 81f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy// ---------------------------------------------------------------------------- 82f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy 83f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guystatic bool android_view_GLES20Renderer_clipRectF(JNIEnv* env, jobject canvas, 84f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy OpenGLRenderer* renderer, jfloat left, jfloat top, jfloat right, jfloat bottom) { 85f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy return renderer->clipRect(left, top, right, bottom); 86f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy} 87bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy 88f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guystatic bool android_view_GLES20Renderer_clipRect(JNIEnv* env, jobject canvas, 89f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy OpenGLRenderer* renderer, jint left, jint top, jint right, jint bottom) { 90f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy return renderer->clipRect(float(left), float(top), float(right), float(bottom)); 91bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy} 92bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy 93bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy// ---------------------------------------------------------------------------- 94f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy// Transforms 95bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy// ---------------------------------------------------------------------------- 96bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy 97f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guystatic void android_view_GLES20Renderer_translate(JNIEnv* env, jobject canvas, 98f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy OpenGLRenderer* renderer, jfloat dx, jfloat dy) { 99f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy renderer->translate(dx, dy); 100f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy} 101bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy 102f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guystatic void android_view_GLES20Renderer_rotate(JNIEnv* env, jobject canvas, 103f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy OpenGLRenderer* renderer, jfloat degrees) { 104f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy renderer->rotate(degrees); 105bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy} 106bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy 107f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guystatic void android_view_GLES20Renderer_scale(JNIEnv* env, jobject canvas, 108f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy OpenGLRenderer* renderer, jfloat sx, jfloat sy) { 109f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy renderer->scale(sx, sy); 110f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy} 111bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy 112f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guystatic void android_view_GLES20Renderer_setMatrix(JNIEnv* env, jobject canvas, 113f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy OpenGLRenderer* renderer, SkMatrix* matrix) { 114f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy renderer->setMatrix(matrix); 115f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy} 116f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy 117f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guystatic void android_view_GLES20Renderer_getMatrix(JNIEnv* env, jobject canvas, 118f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy OpenGLRenderer* renderer, SkMatrix* matrix) { 119f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy renderer->getMatrix(matrix); 120f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy} 121f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy 122f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guystatic void android_view_GLES20Renderer_concatMatrix(JNIEnv* env, jobject canvas, 123f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy OpenGLRenderer* renderer, SkMatrix* matrix) { 124f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy renderer->concatMatrix(matrix); 125bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy} 126bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy 127bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy// ---------------------------------------------------------------------------- 128bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy// Drawing 12985bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy// ---------------------------------------------------------------------------- 13085bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy 131f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guystatic void android_view_GLES20Renderer_drawColor(JNIEnv* env, jobject canvas, 132f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy OpenGLRenderer* renderer, jint color, jint mode) { 133f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy renderer->drawColor(color, (SkXfermode::Mode) mode); 13485bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy} 13585bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy 13685bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy// ---------------------------------------------------------------------------- 137e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// JNI Glue 138e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// ---------------------------------------------------------------------------- 139e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy 140e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guyconst char* const kClassPathName = "android/view/GLES20Canvas"; 141e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy 142e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guystatic JNINativeMethod gMethods[] = { 143bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy { "nCreateRenderer", "()I", (void*) android_view_GLES20Renderer_createRenderer }, 144bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy { "nDestroyRenderer", "(I)V", (void*) android_view_GLES20Renderer_destroyRenderer }, 145bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy { "nSetViewport", "(III)V", (void*) android_view_GLES20Renderer_setViewport }, 146bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy { "nPrepare", "(I)V", (void*) android_view_GLES20Renderer_prepare }, 147bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy 148bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy { "nSave", "(II)I", (void*) android_view_GLES20Renderer_save }, 149bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy { "nRestore", "(I)V", (void*) android_view_GLES20Renderer_restore }, 150bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy { "nRestoreToCount", "(II)V", (void*) android_view_GLES20Renderer_restoreToCount }, 151bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy { "nGetSaveCount", "(I)I", (void*) android_view_GLES20Renderer_getSaveCount }, 152bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy 153bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy { "nClipRect", "(IFFFF)Z", (void*) android_view_GLES20Renderer_clipRectF }, 154bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy { "nClipRect", "(IIIII)Z", (void*) android_view_GLES20Renderer_clipRect }, 15585bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy 156f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy { "nTranslate", "(IFF)V", (void*) android_view_GLES20Renderer_translate }, 157f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy { "nRotate", "(IF)V", (void*) android_view_GLES20Renderer_rotate }, 158f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy { "nScale", "(IFF)V", (void*) android_view_GLES20Renderer_scale }, 159f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy 160f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy { "nSetMatrix", "(II)V", (void*) android_view_GLES20Renderer_setMatrix }, 161f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy { "nGetMatrix", "(II)V", (void*) android_view_GLES20Renderer_getMatrix }, 162f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy { "nConcatMatrix", "(II)V", (void*) android_view_GLES20Renderer_concatMatrix }, 163f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy 164bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy { "nDrawColor", "(III)V", (void*) android_view_GLES20Renderer_drawColor }, 165e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy}; 166e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy 167e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guyint register_android_view_GLES20Canvas(JNIEnv* env) { 168e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy return AndroidRuntime::registerNativeMethods(env, kClassPathName, gMethods, NELEM(gMethods)); 169e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy} 170e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy 171e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy}; 172