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