android_view_GLES20Canvas.cpp revision bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4
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 2185bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy#include <SkXfermode.h> 22e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy 2385bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy#include <OpenGLRenderer.h> 2485bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy 2585bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy#define UI ((OpenGLRenderer*) renderer) 26e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy 27e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guynamespace android { 28e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy 29e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// ---------------------------------------------------------------------------- 30e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// Constructors 31e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// ---------------------------------------------------------------------------- 32e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy 3385bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guystatic OpenGLRenderer* android_view_GLES20Renderer_createRenderer(JNIEnv* env, jobject canvas) { 3485bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy return new OpenGLRenderer; 35e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy} 36e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy 37e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guystatic void android_view_GLES20Renderer_destroyRenderer(JNIEnv* env, jobject canvas, jint renderer) { 38e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy delete UI; 39e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy} 40e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy 41e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// ---------------------------------------------------------------------------- 42e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// Setup 43e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// ---------------------------------------------------------------------------- 44e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy 45e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guystatic void android_view_GLES20Renderer_setViewport(JNIEnv* env, jobject canvas, jint renderer, 46e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy jint width, jint height) { 47e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy 48e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy UI->setViewport(width, height); 49e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy} 50e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy 51e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guystatic void android_view_GLES20Renderer_prepare(JNIEnv* env, jobject canvas, jint renderer) { 52e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy 53e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy UI->prepare(); 54e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy} 55e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy 56e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// ---------------------------------------------------------------------------- 57bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy// State 58bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy// ---------------------------------------------------------------------------- 59bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy 60bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guystatic jint android_view_GLES20Renderer_save(JNIEnv* env, jobject canvas, jint renderer, 61bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy jint flags) { 62bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy 63bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy return UI->save(flags); 64bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy} 65bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy 66bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guystatic jint android_view_GLES20Renderer_getSaveCount(JNIEnv* env, jobject canvas, jint renderer) { 67bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy return UI->getSaveCount(); 68bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy} 69bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy 70bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guystatic void android_view_GLES20Renderer_restore(JNIEnv* env, jobject canvas, jint renderer) { 71bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy UI->restore(); 72bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy} 73bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy 74bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guystatic void android_view_GLES20Renderer_restoreToCount(JNIEnv* env, jobject canvas, jint renderer, 75bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy jint saveCount) { 76bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy 77bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy UI->restoreToCount(saveCount); 78bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy} 79bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy 80bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy// ---------------------------------------------------------------------------- 81bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy// Clipping 82bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy// ---------------------------------------------------------------------------- 83bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy 84bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guystatic bool android_view_GLES20Renderer_clipRectF(JNIEnv* env, jobject canvas, jint renderer, 85bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy jfloat left, jfloat top, jfloat right, jfloat bottom) { 86bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy 87bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy return UI->clipRect(left, top, right, bottom); 88bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy} 89bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy 90bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guystatic bool android_view_GLES20Renderer_clipRect(JNIEnv* env, jobject canvas, jint renderer, 91bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy jint left, jint top, jint right, jint bottom) { 92bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy 93bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy return UI->clipRect(float(left), float(top), float(right), float(bottom)); 94bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy} 95bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy 96bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy// ---------------------------------------------------------------------------- 97bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy// Drawing 9885bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy// ---------------------------------------------------------------------------- 9985bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy 10085bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guystatic void android_view_GLES20Renderer_drawColor(JNIEnv* env, jobject canvas, jint renderer, 10185bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy jint color, jint mode) { 10285bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy 10385bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy UI->drawColor(color, (SkXfermode::Mode) mode); 10485bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy} 10585bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy 10685bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy// ---------------------------------------------------------------------------- 107e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// JNI Glue 108e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// ---------------------------------------------------------------------------- 109e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy 110e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guyconst char* const kClassPathName = "android/view/GLES20Canvas"; 111e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy 112e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guystatic JNINativeMethod gMethods[] = { 113bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy { "nCreateRenderer", "()I", (void*) android_view_GLES20Renderer_createRenderer }, 114bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy { "nDestroyRenderer", "(I)V", (void*) android_view_GLES20Renderer_destroyRenderer }, 115bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy { "nSetViewport", "(III)V", (void*) android_view_GLES20Renderer_setViewport }, 116bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy { "nPrepare", "(I)V", (void*) android_view_GLES20Renderer_prepare }, 117bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy 118bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy { "nSave", "(II)I", (void*) android_view_GLES20Renderer_save }, 119bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy { "nRestore", "(I)V", (void*) android_view_GLES20Renderer_restore }, 120bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy { "nRestoreToCount", "(II)V", (void*) android_view_GLES20Renderer_restoreToCount }, 121bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy { "nGetSaveCount", "(I)I", (void*) android_view_GLES20Renderer_getSaveCount }, 122bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy 123bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy { "nClipRect", "(IFFFF)Z", (void*) android_view_GLES20Renderer_clipRectF }, 124bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy { "nClipRect", "(IIIII)Z", (void*) android_view_GLES20Renderer_clipRect }, 12585bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy 126bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy { "nDrawColor", "(III)V", (void*) android_view_GLES20Renderer_drawColor }, 127e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy}; 128e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy 129e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guyint register_android_view_GLES20Canvas(JNIEnv* env) { 130e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy return AndroidRuntime::registerNativeMethods(env, kClassPathName, gMethods, NELEM(gMethods)); 131e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy} 132e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy 133e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy}; 134