android_view_GLES20Canvas.cpp revision 9d5316e3f56d138504565ff311145ac01621dff4
1/* 2 * Copyright (C) 2010 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17#include "jni.h" 18#include <nativehelper/JNIHelp.h> 19#include <android_runtime/AndroidRuntime.h> 20 21#include <SkMatrix.h> 22#include <SkXfermode.h> 23 24#include <OpenGLRenderer.h> 25#include <Rect.h> 26#include <ui/Rect.h> 27 28namespace android { 29 30using namespace uirenderer; 31 32// ---------------------------------------------------------------------------- 33// Java APIs 34// ---------------------------------------------------------------------------- 35 36static struct { 37 jclass clazz; 38 jmethodID set; 39} gRectClassInfo; 40 41// ---------------------------------------------------------------------------- 42// Constructors 43// ---------------------------------------------------------------------------- 44 45static OpenGLRenderer* android_view_GLES20Renderer_createRenderer(JNIEnv* env, jobject canvas) { 46 return new OpenGLRenderer; 47} 48 49static void android_view_GLES20Renderer_destroyRenderer(JNIEnv* env, jobject canvas, 50 OpenGLRenderer* renderer) { 51 delete renderer; 52} 53 54// ---------------------------------------------------------------------------- 55// Setup 56// ---------------------------------------------------------------------------- 57 58static void android_view_GLES20Renderer_setViewport(JNIEnv* env, jobject canvas, 59 OpenGLRenderer* renderer, jint width, jint height) { 60 renderer->setViewport(width, height); 61} 62 63static void android_view_GLES20Renderer_prepare(JNIEnv* env, jobject canvas, 64 OpenGLRenderer* renderer) { 65 renderer->prepare(); 66} 67 68// ---------------------------------------------------------------------------- 69// State 70// ---------------------------------------------------------------------------- 71 72static jint android_view_GLES20Renderer_save(JNIEnv* env, jobject canvas, OpenGLRenderer* renderer, 73 jint flags) { 74 return renderer->save(flags); 75} 76 77static jint android_view_GLES20Renderer_getSaveCount(JNIEnv* env, jobject canvas, 78 OpenGLRenderer* renderer) { 79 return renderer->getSaveCount(); 80} 81 82static void android_view_GLES20Renderer_restore(JNIEnv* env, jobject canvas, 83 OpenGLRenderer* renderer) { 84 renderer->restore(); 85} 86 87static void android_view_GLES20Renderer_restoreToCount(JNIEnv* env, jobject canvas, 88 OpenGLRenderer* renderer, jint saveCount) { 89 renderer->restoreToCount(saveCount); 90} 91 92// ---------------------------------------------------------------------------- 93// Clipping 94// ---------------------------------------------------------------------------- 95 96static bool android_view_GLES20Renderer_clipRectF(JNIEnv* env, jobject canvas, 97 OpenGLRenderer* renderer, jfloat left, jfloat top, jfloat right, jfloat bottom) { 98 return renderer->clipRect(left, top, right, bottom); 99} 100 101static bool android_view_GLES20Renderer_clipRect(JNIEnv* env, jobject canvas, 102 OpenGLRenderer* renderer, jint left, jint top, jint right, jint bottom) { 103 return renderer->clipRect(float(left), float(top), float(right), float(bottom)); 104} 105 106static bool android_view_GLES20Renderer_getClipBounds(JNIEnv* env, jobject canvas, 107 OpenGLRenderer* renderer, jobject rect) { 108 109 const android::uirenderer::Rect& bounds(renderer->getClipBounds()); 110 111 env->CallVoidMethod(rect, gRectClassInfo.set, 112 int(bounds.left), int(bounds.top), int(bounds.right), int(bounds.bottom)); 113 114 return !bounds.isEmpty(); 115} 116 117// ---------------------------------------------------------------------------- 118// Transforms 119// ---------------------------------------------------------------------------- 120 121static void android_view_GLES20Renderer_translate(JNIEnv* env, jobject canvas, 122 OpenGLRenderer* renderer, jfloat dx, jfloat dy) { 123 renderer->translate(dx, dy); 124} 125 126static void android_view_GLES20Renderer_rotate(JNIEnv* env, jobject canvas, 127 OpenGLRenderer* renderer, jfloat degrees) { 128 renderer->rotate(degrees); 129} 130 131static void android_view_GLES20Renderer_scale(JNIEnv* env, jobject canvas, 132 OpenGLRenderer* renderer, jfloat sx, jfloat sy) { 133 renderer->scale(sx, sy); 134} 135 136static void android_view_GLES20Renderer_setMatrix(JNIEnv* env, jobject canvas, 137 OpenGLRenderer* renderer, SkMatrix* matrix) { 138 renderer->setMatrix(matrix); 139} 140 141static void android_view_GLES20Renderer_getMatrix(JNIEnv* env, jobject canvas, 142 OpenGLRenderer* renderer, SkMatrix* matrix) { 143 renderer->getMatrix(matrix); 144} 145 146static void android_view_GLES20Renderer_concatMatrix(JNIEnv* env, jobject canvas, 147 OpenGLRenderer* renderer, SkMatrix* matrix) { 148 renderer->concatMatrix(matrix); 149} 150 151// ---------------------------------------------------------------------------- 152// Drawing 153// ---------------------------------------------------------------------------- 154 155static void android_view_GLES20Renderer_drawColor(JNIEnv* env, jobject canvas, 156 OpenGLRenderer* renderer, jint color, jint mode) { 157 renderer->drawColor(color, (SkXfermode::Mode) mode); 158} 159 160// ---------------------------------------------------------------------------- 161// JNI Glue 162// ---------------------------------------------------------------------------- 163 164const char* const kClassPathName = "android/view/GLES20Canvas"; 165 166static JNINativeMethod gMethods[] = { 167 { "nCreateRenderer", "()I", (void*) android_view_GLES20Renderer_createRenderer }, 168 { "nDestroyRenderer", "(I)V", (void*) android_view_GLES20Renderer_destroyRenderer }, 169 { "nSetViewport", "(III)V", (void*) android_view_GLES20Renderer_setViewport }, 170 { "nPrepare", "(I)V", (void*) android_view_GLES20Renderer_prepare }, 171 172 { "nSave", "(II)I", (void*) android_view_GLES20Renderer_save }, 173 { "nRestore", "(I)V", (void*) android_view_GLES20Renderer_restore }, 174 { "nRestoreToCount", "(II)V", (void*) android_view_GLES20Renderer_restoreToCount }, 175 { "nGetSaveCount", "(I)I", (void*) android_view_GLES20Renderer_getSaveCount }, 176 177 { "nClipRect", "(IFFFF)Z", (void*) android_view_GLES20Renderer_clipRectF }, 178 { "nClipRect", "(IIIII)Z", (void*) android_view_GLES20Renderer_clipRect }, 179 180 { "nGetClipBounds", "(ILandroid/graphics/Rect;)Z", 181 (void*) android_view_GLES20Renderer_getClipBounds }, 182 183 { "nTranslate", "(IFF)V", (void*) android_view_GLES20Renderer_translate }, 184 { "nRotate", "(IF)V", (void*) android_view_GLES20Renderer_rotate }, 185 { "nScale", "(IFF)V", (void*) android_view_GLES20Renderer_scale }, 186 187 { "nSetMatrix", "(II)V", (void*) android_view_GLES20Renderer_setMatrix }, 188 { "nGetMatrix", "(II)V", (void*) android_view_GLES20Renderer_getMatrix }, 189 { "nConcatMatrix", "(II)V", (void*) android_view_GLES20Renderer_concatMatrix }, 190 191 { "nDrawColor", "(III)V", (void*) android_view_GLES20Renderer_drawColor }, 192}; 193 194#define FIND_CLASS(var, className) \ 195 var = env->FindClass(className); \ 196 LOG_FATAL_IF(! var, "Unable to find class " className); \ 197 var = jclass(env->NewGlobalRef(var)); 198 199#define GET_METHOD_ID(var, clazz, methodName, methodDescriptor) \ 200 var = env->GetMethodID(clazz, methodName, methodDescriptor); \ 201 LOG_FATAL_IF(! var, "Unable to find method " methodName); 202 203int register_android_view_GLES20Canvas(JNIEnv* env) { 204 FIND_CLASS(gRectClassInfo.clazz, "android/graphics/Rect"); 205 GET_METHOD_ID(gRectClassInfo.set, gRectClassInfo.clazz, "set", "(IIII)V"); 206 207 return AndroidRuntime::registerNativeMethods(env, kClassPathName, gMethods, NELEM(gMethods)); 208} 209 210}; 211