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