blob: 95476eb603701f4a2ba1f1eaa0ee09d05573479c [file] [log] [blame]
Romain Guye4d01122010-06-16 18:44:05 -07001/*
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
Romain Guyf6a11b82010-06-23 17:47:49 -070021#include <SkMatrix.h>
Romain Guy85bf02f2010-06-22 13:11:24 -070022#include <SkXfermode.h>
Romain Guye4d01122010-06-16 18:44:05 -070023
Romain Guy85bf02f2010-06-22 13:11:24 -070024#include <OpenGLRenderer.h>
Romain Guy9d5316e2010-06-24 19:30:36 -070025#include <Rect.h>
26#include <ui/Rect.h>
Romain Guy85bf02f2010-06-22 13:11:24 -070027
Romain Guye4d01122010-06-16 18:44:05 -070028namespace android {
29
Romain Guy9d5316e2010-06-24 19:30:36 -070030using namespace uirenderer;
31
32// ----------------------------------------------------------------------------
33// Java APIs
34// ----------------------------------------------------------------------------
35
36static struct {
37 jclass clazz;
38 jmethodID set;
39} gRectClassInfo;
40
Romain Guye4d01122010-06-16 18:44:05 -070041// ----------------------------------------------------------------------------
42// Constructors
43// ----------------------------------------------------------------------------
44
Romain Guy85bf02f2010-06-22 13:11:24 -070045static OpenGLRenderer* android_view_GLES20Renderer_createRenderer(JNIEnv* env, jobject canvas) {
46 return new OpenGLRenderer;
Romain Guye4d01122010-06-16 18:44:05 -070047}
48
Romain Guyf6a11b82010-06-23 17:47:49 -070049static void android_view_GLES20Renderer_destroyRenderer(JNIEnv* env, jobject canvas,
50 OpenGLRenderer* renderer) {
51 delete renderer;
Romain Guye4d01122010-06-16 18:44:05 -070052}
53
54// ----------------------------------------------------------------------------
55// Setup
56// ----------------------------------------------------------------------------
57
Romain Guyf6a11b82010-06-23 17:47:49 -070058static void android_view_GLES20Renderer_setViewport(JNIEnv* env, jobject canvas,
59 OpenGLRenderer* renderer, jint width, jint height) {
60 renderer->setViewport(width, height);
Romain Guye4d01122010-06-16 18:44:05 -070061}
62
Romain Guyf6a11b82010-06-23 17:47:49 -070063static void android_view_GLES20Renderer_prepare(JNIEnv* env, jobject canvas,
64 OpenGLRenderer* renderer) {
65 renderer->prepare();
Romain Guye4d01122010-06-16 18:44:05 -070066}
67
68// ----------------------------------------------------------------------------
Romain Guybb9524b2010-06-22 18:56:38 -070069// State
70// ----------------------------------------------------------------------------
71
Romain Guyf6a11b82010-06-23 17:47:49 -070072static jint android_view_GLES20Renderer_save(JNIEnv* env, jobject canvas, OpenGLRenderer* renderer,
Romain Guybb9524b2010-06-22 18:56:38 -070073 jint flags) {
Romain Guyf6a11b82010-06-23 17:47:49 -070074 return renderer->save(flags);
Romain Guybb9524b2010-06-22 18:56:38 -070075}
76
Romain Guyf6a11b82010-06-23 17:47:49 -070077static jint android_view_GLES20Renderer_getSaveCount(JNIEnv* env, jobject canvas,
78 OpenGLRenderer* renderer) {
79 return renderer->getSaveCount();
Romain Guybb9524b2010-06-22 18:56:38 -070080}
81
Romain Guyf6a11b82010-06-23 17:47:49 -070082static void android_view_GLES20Renderer_restore(JNIEnv* env, jobject canvas,
83 OpenGLRenderer* renderer) {
84 renderer->restore();
Romain Guybb9524b2010-06-22 18:56:38 -070085}
86
Romain Guyf6a11b82010-06-23 17:47:49 -070087static void android_view_GLES20Renderer_restoreToCount(JNIEnv* env, jobject canvas,
88 OpenGLRenderer* renderer, jint saveCount) {
89 renderer->restoreToCount(saveCount);
Romain Guybb9524b2010-06-22 18:56:38 -070090}
91
92// ----------------------------------------------------------------------------
93// Clipping
94// ----------------------------------------------------------------------------
95
Romain Guyf6a11b82010-06-23 17:47:49 -070096static 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);
Romain Guybb9524b2010-06-22 18:56:38 -070099}
100
Romain Guyf6a11b82010-06-23 17:47:49 -0700101static 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}
Romain Guybb9524b2010-06-22 18:56:38 -0700105
Romain Guy9d5316e2010-06-24 19:30:36 -0700106static 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
Romain Guyf6a11b82010-06-23 17:47:49 -0700117// ----------------------------------------------------------------------------
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);
Romain Guybb9524b2010-06-22 18:56:38 -0700149}
150
151// ----------------------------------------------------------------------------
152// Drawing
Romain Guy85bf02f2010-06-22 13:11:24 -0700153// ----------------------------------------------------------------------------
154
Romain Guyf6a11b82010-06-23 17:47:49 -0700155static void android_view_GLES20Renderer_drawColor(JNIEnv* env, jobject canvas,
156 OpenGLRenderer* renderer, jint color, jint mode) {
157 renderer->drawColor(color, (SkXfermode::Mode) mode);
Romain Guy85bf02f2010-06-22 13:11:24 -0700158}
159
160// ----------------------------------------------------------------------------
Romain Guye4d01122010-06-16 18:44:05 -0700161// JNI Glue
162// ----------------------------------------------------------------------------
163
164const char* const kClassPathName = "android/view/GLES20Canvas";
165
166static JNINativeMethod gMethods[] = {
Romain Guybb9524b2010-06-22 18:56:38 -0700167 { "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 },
Romain Guy85bf02f2010-06-22 13:11:24 -0700171
Romain Guybb9524b2010-06-22 18:56:38 -0700172 { "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
Romain Guy9d5316e2010-06-24 19:30:36 -0700180 { "nGetClipBounds", "(ILandroid/graphics/Rect;)Z",
181 (void*) android_view_GLES20Renderer_getClipBounds },
182
Romain Guyf6a11b82010-06-23 17:47:49 -0700183 { "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
Romain Guybb9524b2010-06-22 18:56:38 -0700191 { "nDrawColor", "(III)V", (void*) android_view_GLES20Renderer_drawColor },
Romain Guye4d01122010-06-16 18:44:05 -0700192};
193
Romain Guy9d5316e2010-06-24 19:30:36 -0700194#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
Romain Guye4d01122010-06-16 18:44:05 -0700203int register_android_view_GLES20Canvas(JNIEnv* env) {
Romain Guy9d5316e2010-06-24 19:30:36 -0700204 FIND_CLASS(gRectClassInfo.clazz, "android/graphics/Rect");
205 GET_METHOD_ID(gRectClassInfo.set, gRectClassInfo.clazz, "set", "(IIII)V");
206
Romain Guye4d01122010-06-16 18:44:05 -0700207 return AndroidRuntime::registerNativeMethods(env, kClassPathName, gMethods, NELEM(gMethods));
208}
209
210};