android_view_GLES20Canvas.cpp revision bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4
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
2185bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy#include <SkXfermode.h>
22e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
2385bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy#include <OpenGLRenderer.h>
2485bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy
2585bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy#define UI ((OpenGLRenderer*) renderer)
26e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
27e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guynamespace android {
28e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
29e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// ----------------------------------------------------------------------------
30e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// Constructors
31e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// ----------------------------------------------------------------------------
32e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
3385bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guystatic OpenGLRenderer* android_view_GLES20Renderer_createRenderer(JNIEnv* env, jobject canvas) {
3485bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy    return new OpenGLRenderer;
35e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy}
36e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
37e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guystatic void android_view_GLES20Renderer_destroyRenderer(JNIEnv* env, jobject canvas, jint renderer) {
38e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    delete UI;
39e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy}
40e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
41e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// ----------------------------------------------------------------------------
42e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// Setup
43e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// ----------------------------------------------------------------------------
44e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
45e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guystatic void android_view_GLES20Renderer_setViewport(JNIEnv* env, jobject canvas, jint renderer,
46e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy        jint width, jint height) {
47e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
48e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    UI->setViewport(width, height);
49e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy}
50e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
51e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guystatic void android_view_GLES20Renderer_prepare(JNIEnv* env, jobject canvas, jint renderer) {
52e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
53e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    UI->prepare();
54e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy}
55e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
56e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// ----------------------------------------------------------------------------
57bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy// State
58bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy// ----------------------------------------------------------------------------
59bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
60bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guystatic jint android_view_GLES20Renderer_save(JNIEnv* env, jobject canvas, jint renderer,
61bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy        jint flags) {
62bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
63bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy    return UI->save(flags);
64bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy}
65bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
66bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guystatic jint android_view_GLES20Renderer_getSaveCount(JNIEnv* env, jobject canvas, jint renderer) {
67bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy    return UI->getSaveCount();
68bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy}
69bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
70bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guystatic void android_view_GLES20Renderer_restore(JNIEnv* env, jobject canvas, jint renderer) {
71bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy    UI->restore();
72bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy}
73bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
74bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guystatic void android_view_GLES20Renderer_restoreToCount(JNIEnv* env, jobject canvas, jint renderer,
75bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy        jint saveCount) {
76bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
77bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy    UI->restoreToCount(saveCount);
78bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy}
79bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
80bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy// ----------------------------------------------------------------------------
81bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy// Clipping
82bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy// ----------------------------------------------------------------------------
83bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
84bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guystatic bool android_view_GLES20Renderer_clipRectF(JNIEnv* env, jobject canvas, jint renderer,
85bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy        jfloat left, jfloat top, jfloat right, jfloat bottom) {
86bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
87bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy    return UI->clipRect(left, top, right, bottom);
88bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy}
89bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
90bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guystatic bool android_view_GLES20Renderer_clipRect(JNIEnv* env, jobject canvas, jint renderer,
91bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy        jint left, jint top, jint right, jint bottom) {
92bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
93bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy    return UI->clipRect(float(left), float(top), float(right), float(bottom));
94bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy}
95bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
96bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy// ----------------------------------------------------------------------------
97bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy// Drawing
9885bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy// ----------------------------------------------------------------------------
9985bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy
10085bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guystatic void android_view_GLES20Renderer_drawColor(JNIEnv* env, jobject canvas, jint renderer,
10185bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy        jint color, jint mode) {
10285bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy
10385bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy    UI->drawColor(color, (SkXfermode::Mode) mode);
10485bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy}
10585bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy
10685bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy// ----------------------------------------------------------------------------
107e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// JNI Glue
108e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// ----------------------------------------------------------------------------
109e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
110e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guyconst char* const kClassPathName = "android/view/GLES20Canvas";
111e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
112e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guystatic JNINativeMethod gMethods[] = {
113bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy    {   "nCreateRenderer",    "()I",      (void*) android_view_GLES20Renderer_createRenderer },
114bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy    {   "nDestroyRenderer",   "(I)V",     (void*) android_view_GLES20Renderer_destroyRenderer },
115bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy    {   "nSetViewport",       "(III)V",   (void*) android_view_GLES20Renderer_setViewport },
116bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy    {   "nPrepare",           "(I)V",     (void*) android_view_GLES20Renderer_prepare },
117bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
118bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy    {   "nSave",              "(II)I",    (void*) android_view_GLES20Renderer_save },
119bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy    {   "nRestore",           "(I)V",     (void*) android_view_GLES20Renderer_restore },
120bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy    {   "nRestoreToCount",    "(II)V",    (void*) android_view_GLES20Renderer_restoreToCount },
121bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy    {   "nGetSaveCount",      "(I)I",     (void*) android_view_GLES20Renderer_getSaveCount },
122bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
123bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy    {   "nClipRect",          "(IFFFF)Z", (void*) android_view_GLES20Renderer_clipRectF },
124bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy    {   "nClipRect",          "(IIIII)Z", (void*) android_view_GLES20Renderer_clipRect },
12585bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy
126bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy    {   "nDrawColor",         "(III)V",   (void*) android_view_GLES20Renderer_drawColor },
127e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy};
128e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
129e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guyint register_android_view_GLES20Canvas(JNIEnv* env) {
130e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    return AndroidRuntime::registerNativeMethods(env, kClassPathName, gMethods, NELEM(gMethods));
131e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy}
132e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
133e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy};
134