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