android_view_GLES20Canvas.cpp revision ce0537b80087a6225273040a987414b1dd081aa0
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
21ce0537b80087a6225273040a987414b1dd081aa0Romain Guy#include <SkBitmap.h>
22c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy#include <SkCanvas.h>
23f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy#include <SkMatrix.h>
24c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy#include <SkPaint.h>
2585bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy#include <SkXfermode.h>
26e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
2785bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy#include <OpenGLRenderer.h>
289d5316e3f56d138504565ff311145ac01621dff4Romain Guy#include <Rect.h>
299d5316e3f56d138504565ff311145ac01621dff4Romain Guy#include <ui/Rect.h>
3085bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy
31e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guynamespace android {
32e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
339d5316e3f56d138504565ff311145ac01621dff4Romain Guyusing namespace uirenderer;
349d5316e3f56d138504565ff311145ac01621dff4Romain Guy
359d5316e3f56d138504565ff311145ac01621dff4Romain Guy// ----------------------------------------------------------------------------
369d5316e3f56d138504565ff311145ac01621dff4Romain Guy// Java APIs
379d5316e3f56d138504565ff311145ac01621dff4Romain Guy// ----------------------------------------------------------------------------
389d5316e3f56d138504565ff311145ac01621dff4Romain Guy
399d5316e3f56d138504565ff311145ac01621dff4Romain Guystatic struct {
407ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    jclass clazz;
417ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    jmethodID set;
429d5316e3f56d138504565ff311145ac01621dff4Romain Guy} gRectClassInfo;
439d5316e3f56d138504565ff311145ac01621dff4Romain Guy
44e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// ----------------------------------------------------------------------------
45e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// Constructors
46e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// ----------------------------------------------------------------------------
47e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
48ce0537b80087a6225273040a987414b1dd081aa0Romain Guystatic OpenGLRenderer* android_view_GLES20Canvas_createRenderer(JNIEnv* env, jobject canvas) {
4985bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy    return new OpenGLRenderer;
50e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy}
51e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
52ce0537b80087a6225273040a987414b1dd081aa0Romain Guystatic void android_view_GLES20Canvas_destroyRenderer(JNIEnv* env, jobject canvas,
53f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy        OpenGLRenderer* renderer) {
54f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy    delete renderer;
55e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy}
56e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
57e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// ----------------------------------------------------------------------------
58e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// Setup
59e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// ----------------------------------------------------------------------------
60e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
61ce0537b80087a6225273040a987414b1dd081aa0Romain Guystatic void android_view_GLES20Canvas_setViewport(JNIEnv* env, jobject canvas,
62f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy        OpenGLRenderer* renderer, jint width, jint height) {
63f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy    renderer->setViewport(width, height);
64e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy}
65e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
66ce0537b80087a6225273040a987414b1dd081aa0Romain Guystatic void android_view_GLES20Canvas_prepare(JNIEnv* env, jobject canvas,
67f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy        OpenGLRenderer* renderer) {
68f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy    renderer->prepare();
69e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy}
70e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
71e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// ----------------------------------------------------------------------------
72bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy// State
73bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy// ----------------------------------------------------------------------------
74bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
75ce0537b80087a6225273040a987414b1dd081aa0Romain Guystatic jint android_view_GLES20Canvas_save(JNIEnv* env, jobject canvas, OpenGLRenderer* renderer,
76bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy        jint flags) {
77f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy    return renderer->save(flags);
78f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy}
79bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
80ce0537b80087a6225273040a987414b1dd081aa0Romain Guystatic jint android_view_GLES20Canvas_getSaveCount(JNIEnv* env, jobject canvas,
81f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy        OpenGLRenderer* renderer) {
82f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy    return renderer->getSaveCount();
83bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy}
84bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
85ce0537b80087a6225273040a987414b1dd081aa0Romain Guystatic void android_view_GLES20Canvas_restore(JNIEnv* env, jobject canvas,
86f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy        OpenGLRenderer* renderer) {
87f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy    renderer->restore();
88bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy}
89bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
90ce0537b80087a6225273040a987414b1dd081aa0Romain Guystatic void android_view_GLES20Canvas_restoreToCount(JNIEnv* env, jobject canvas,
91f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy        OpenGLRenderer* renderer, jint saveCount) {
92f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy    renderer->restoreToCount(saveCount);
93bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy}
94bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
95f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy// ----------------------------------------------------------------------------
96bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy// Layers
97bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy// ----------------------------------------------------------------------------
98bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy
99ce0537b80087a6225273040a987414b1dd081aa0Romain Guystatic jint android_view_GLES20Canvas_saveLayer(JNIEnv* env, jobject canvas,
100bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy        OpenGLRenderer* renderer, jfloat left, jfloat top, jfloat right, jfloat bottom,
101bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy        SkPaint* paint, jint saveFlags) {
102bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy    return renderer->saveLayer(left, top, right, bottom, paint, saveFlags);
103bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy}
104bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy
105ce0537b80087a6225273040a987414b1dd081aa0Romain Guystatic jint android_view_GLES20Canvas_saveLayerAlpha(JNIEnv* env, jobject canvas,
106bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy        OpenGLRenderer* renderer, jfloat left, jfloat top, jfloat right, jfloat bottom,
107bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy        jint alpha, jint saveFlags) {
108bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy    return renderer->saveLayerAlpha(left, top, right, bottom, alpha, saveFlags);
109bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy}
110bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy
111bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy// ----------------------------------------------------------------------------
112f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy// Clipping
113f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy// ----------------------------------------------------------------------------
114f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy
115ce0537b80087a6225273040a987414b1dd081aa0Romain Guystatic bool android_view_GLES20Canvas_quickReject(JNIEnv* env, jobject canvas,
116c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy        OpenGLRenderer* renderer, jfloat left, jfloat top, jfloat right, jfloat bottom,
117c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy        SkCanvas::EdgeType edge) {
118c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy    return renderer->quickReject(left, top, right, bottom);
119c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy}
120c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy
121ce0537b80087a6225273040a987414b1dd081aa0Romain Guystatic bool android_view_GLES20Canvas_clipRectF(JNIEnv* env, jobject canvas,
122f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy        OpenGLRenderer* renderer, jfloat left, jfloat top, jfloat right, jfloat bottom) {
123f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy    return renderer->clipRect(left, top, right, bottom);
124f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy}
125bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
126ce0537b80087a6225273040a987414b1dd081aa0Romain Guystatic bool android_view_GLES20Canvas_clipRect(JNIEnv* env, jobject canvas,
127f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy        OpenGLRenderer* renderer, jint left, jint top, jint right, jint bottom) {
128f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy    return renderer->clipRect(float(left), float(top), float(right), float(bottom));
129bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy}
130bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
131ce0537b80087a6225273040a987414b1dd081aa0Romain Guystatic bool android_view_GLES20Canvas_getClipBounds(JNIEnv* env, jobject canvas,
1329d5316e3f56d138504565ff311145ac01621dff4Romain Guy        OpenGLRenderer* renderer, jobject rect) {
1337ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    const android::uirenderer::Rect& bounds(renderer->getClipBounds());
1349d5316e3f56d138504565ff311145ac01621dff4Romain Guy
1357ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    env->CallVoidMethod(rect, gRectClassInfo.set,
1367ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy            int(bounds.left), int(bounds.top), int(bounds.right), int(bounds.bottom));
1379d5316e3f56d138504565ff311145ac01621dff4Romain Guy
1387ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    return !bounds.isEmpty();
1399d5316e3f56d138504565ff311145ac01621dff4Romain Guy}
1409d5316e3f56d138504565ff311145ac01621dff4Romain Guy
141bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy// ----------------------------------------------------------------------------
142f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy// Transforms
143bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy// ----------------------------------------------------------------------------
144bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
145ce0537b80087a6225273040a987414b1dd081aa0Romain Guystatic void android_view_GLES20Canvas_translate(JNIEnv* env, jobject canvas,
146f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy        OpenGLRenderer* renderer, jfloat dx, jfloat dy) {
1477ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    renderer->translate(dx, dy);
148f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy}
149bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
150ce0537b80087a6225273040a987414b1dd081aa0Romain Guystatic void android_view_GLES20Canvas_rotate(JNIEnv* env, jobject canvas,
151f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy        OpenGLRenderer* renderer, jfloat degrees) {
1527ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    renderer->rotate(degrees);
153bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy}
154bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
155ce0537b80087a6225273040a987414b1dd081aa0Romain Guystatic void android_view_GLES20Canvas_scale(JNIEnv* env, jobject canvas,
156f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy        OpenGLRenderer* renderer, jfloat sx, jfloat sy) {
1577ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    renderer->scale(sx, sy);
158f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy}
159bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
160ce0537b80087a6225273040a987414b1dd081aa0Romain Guystatic void android_view_GLES20Canvas_setMatrix(JNIEnv* env, jobject canvas,
161f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy        OpenGLRenderer* renderer, SkMatrix* matrix) {
1627ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    renderer->setMatrix(matrix);
163f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy}
164f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy
165ce0537b80087a6225273040a987414b1dd081aa0Romain Guystatic void android_view_GLES20Canvas_getMatrix(JNIEnv* env, jobject canvas,
166f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy        OpenGLRenderer* renderer, SkMatrix* matrix) {
1677ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    renderer->getMatrix(matrix);
168f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy}
169f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy
170ce0537b80087a6225273040a987414b1dd081aa0Romain Guystatic void android_view_GLES20Canvas_concatMatrix(JNIEnv* env, jobject canvas,
171f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy        OpenGLRenderer* renderer, SkMatrix* matrix) {
1727ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    renderer->concatMatrix(matrix);
173bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy}
174bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
175bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy// ----------------------------------------------------------------------------
176bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy// Drawing
17785bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy// ----------------------------------------------------------------------------
17885bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy
179ce0537b80087a6225273040a987414b1dd081aa0Romain Guystatic void android_view_GLES20Canvas_drawBitmap(JNIEnv* env, jobject canvas,
180ce0537b80087a6225273040a987414b1dd081aa0Romain Guy        OpenGLRenderer* renderer, SkBitmap* bitmap, float left, float top,
181ce0537b80087a6225273040a987414b1dd081aa0Romain Guy        SkPaint* paint, jint bitmapDensity, jint canvasDensity,jint screenDensity) {
182ce0537b80087a6225273040a987414b1dd081aa0Romain Guy    if (canvasDensity == bitmapDensity || canvasDensity == 0 || bitmapDensity == 0) {
183ce0537b80087a6225273040a987414b1dd081aa0Romain Guy        renderer->drawBitmap(bitmap, left, top, paint);
184ce0537b80087a6225273040a987414b1dd081aa0Romain Guy    } else {
185ce0537b80087a6225273040a987414b1dd081aa0Romain Guy        renderer->save(0);
186ce0537b80087a6225273040a987414b1dd081aa0Romain Guy        const float scale = canvasDensity / float(bitmapDensity);
187ce0537b80087a6225273040a987414b1dd081aa0Romain Guy        renderer->translate(left, top);
188ce0537b80087a6225273040a987414b1dd081aa0Romain Guy        renderer->scale(scale, scale);
189ce0537b80087a6225273040a987414b1dd081aa0Romain Guy        renderer->drawBitmap(bitmap, left, top, paint);
190ce0537b80087a6225273040a987414b1dd081aa0Romain Guy        renderer->restore();
191ce0537b80087a6225273040a987414b1dd081aa0Romain Guy    }
192ce0537b80087a6225273040a987414b1dd081aa0Romain Guy}
193ce0537b80087a6225273040a987414b1dd081aa0Romain Guy
194ce0537b80087a6225273040a987414b1dd081aa0Romain Guystatic void android_view_GLES20Canvas_drawBitmapRect(JNIEnv* env, jobject canvas,
195ce0537b80087a6225273040a987414b1dd081aa0Romain Guy        OpenGLRenderer* renderer, SkBitmap* bitmap,
196ce0537b80087a6225273040a987414b1dd081aa0Romain Guy        float srcLeft, float srcTop, float srcRight, float srcBottom,
197ce0537b80087a6225273040a987414b1dd081aa0Romain Guy        float dstLeft, float dstTop, float dstRight, float dstBottom,
198ce0537b80087a6225273040a987414b1dd081aa0Romain Guy        SkMatrix* matrix, SkPaint* paint,
199ce0537b80087a6225273040a987414b1dd081aa0Romain Guy        jint bitmapDenstiy, jint canvasDensity, jint screenDensity) {
200ce0537b80087a6225273040a987414b1dd081aa0Romain Guy    // TODO: Implement!
201ce0537b80087a6225273040a987414b1dd081aa0Romain Guy    LOGE("Not implemented: drawBitmap(IIFFFFFFFFIIIII)V");
202ce0537b80087a6225273040a987414b1dd081aa0Romain Guy}
203ce0537b80087a6225273040a987414b1dd081aa0Romain Guy
204ce0537b80087a6225273040a987414b1dd081aa0Romain Guystatic void android_view_GLES20Canvas_drawColor(JNIEnv* env, jobject canvas,
205ce0537b80087a6225273040a987414b1dd081aa0Romain Guy        OpenGLRenderer* renderer, jint color, SkXfermode::Mode mode) {
206ce0537b80087a6225273040a987414b1dd081aa0Romain Guy    renderer->drawColor(color, mode);
20785bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy}
20885bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy
209ce0537b80087a6225273040a987414b1dd081aa0Romain Guystatic void android_view_GLES20Canvas_drawRect(JNIEnv* env, jobject canvas,
210c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy        OpenGLRenderer* renderer, jfloat left, jfloat top, jfloat right, jfloat bottom,
211c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy        SkPaint* paint) {
212c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy    renderer->drawRect(left, top, right, bottom, paint);
213c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy}
214c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy
21585bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy// ----------------------------------------------------------------------------
216e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// JNI Glue
217e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// ----------------------------------------------------------------------------
218e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
219e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guyconst char* const kClassPathName = "android/view/GLES20Canvas";
220e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
221e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guystatic JNINativeMethod gMethods[] = {
222ce0537b80087a6225273040a987414b1dd081aa0Romain Guy    {   "nCreateRenderer",    "()I",                (void*) android_view_GLES20Canvas_createRenderer },
223ce0537b80087a6225273040a987414b1dd081aa0Romain Guy    {   "nDestroyRenderer",   "(I)V",               (void*) android_view_GLES20Canvas_destroyRenderer },
224ce0537b80087a6225273040a987414b1dd081aa0Romain Guy    {   "nSetViewport",       "(III)V",             (void*) android_view_GLES20Canvas_setViewport },
225ce0537b80087a6225273040a987414b1dd081aa0Romain Guy    {   "nPrepare",           "(I)V",               (void*) android_view_GLES20Canvas_prepare },
226bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy
227ce0537b80087a6225273040a987414b1dd081aa0Romain Guy    {   "nSave",              "(II)I",              (void*) android_view_GLES20Canvas_save },
228ce0537b80087a6225273040a987414b1dd081aa0Romain Guy    {   "nRestore",           "(I)V",               (void*) android_view_GLES20Canvas_restore },
229ce0537b80087a6225273040a987414b1dd081aa0Romain Guy    {   "nRestoreToCount",    "(II)V",              (void*) android_view_GLES20Canvas_restoreToCount },
230ce0537b80087a6225273040a987414b1dd081aa0Romain Guy    {   "nGetSaveCount",      "(I)I",               (void*) android_view_GLES20Canvas_getSaveCount },
231bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy
232ce0537b80087a6225273040a987414b1dd081aa0Romain Guy    {   "nSaveLayer",         "(IFFFFII)I",         (void*) android_view_GLES20Canvas_saveLayer },
233ce0537b80087a6225273040a987414b1dd081aa0Romain Guy    {   "nSaveLayerAlpha",    "(IFFFFII)I",         (void*) android_view_GLES20Canvas_saveLayerAlpha },
234bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy
235ce0537b80087a6225273040a987414b1dd081aa0Romain Guy    {   "nQuickReject",       "(IFFFFI)Z",          (void*) android_view_GLES20Canvas_quickReject },
236ce0537b80087a6225273040a987414b1dd081aa0Romain Guy    {   "nClipRect",          "(IFFFF)Z",           (void*) android_view_GLES20Canvas_clipRectF },
237ce0537b80087a6225273040a987414b1dd081aa0Romain Guy    {   "nClipRect",          "(IIIII)Z",           (void*) android_view_GLES20Canvas_clipRect },
238bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy
239ce0537b80087a6225273040a987414b1dd081aa0Romain Guy    {   "nTranslate",         "(IFF)V",             (void*) android_view_GLES20Canvas_translate },
240ce0537b80087a6225273040a987414b1dd081aa0Romain Guy    {   "nRotate",            "(IF)V",              (void*) android_view_GLES20Canvas_rotate },
241ce0537b80087a6225273040a987414b1dd081aa0Romain Guy    {   "nScale",             "(IFF)V",             (void*) android_view_GLES20Canvas_scale },
242bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy
243ce0537b80087a6225273040a987414b1dd081aa0Romain Guy    {   "nSetMatrix",         "(II)V",              (void*) android_view_GLES20Canvas_setMatrix },
244ce0537b80087a6225273040a987414b1dd081aa0Romain Guy    {   "nGetMatrix",         "(II)V",              (void*) android_view_GLES20Canvas_getMatrix },
245ce0537b80087a6225273040a987414b1dd081aa0Romain Guy    {   "nConcatMatrix",      "(II)V",              (void*) android_view_GLES20Canvas_concatMatrix },
246bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy
247ce0537b80087a6225273040a987414b1dd081aa0Romain Guy    {   "nDrawBitmap",        "(IIFFIIII)V",        (void*) android_view_GLES20Canvas_drawBitmap },
248ce0537b80087a6225273040a987414b1dd081aa0Romain Guy    {   "nDrawBitmap",        "(IIFFFFFFFFIIIII)V", (void*) android_view_GLES20Canvas_drawBitmapRect },
249ce0537b80087a6225273040a987414b1dd081aa0Romain Guy    {   "nDrawColor",         "(III)V",             (void*) android_view_GLES20Canvas_drawColor },
250ce0537b80087a6225273040a987414b1dd081aa0Romain Guy    {   "nDrawRect",          "(IFFFFI)V",          (void*) android_view_GLES20Canvas_drawRect },
251f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy
252c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy    {   "nGetClipBounds",     "(ILandroid/graphics/Rect;)Z",
253ce0537b80087a6225273040a987414b1dd081aa0Romain Guy            (void*) android_view_GLES20Canvas_getClipBounds },
254e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy};
255e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
2569d5316e3f56d138504565ff311145ac01621dff4Romain Guy#define FIND_CLASS(var, className) \
2579d5316e3f56d138504565ff311145ac01621dff4Romain Guy        var = env->FindClass(className); \
2589d5316e3f56d138504565ff311145ac01621dff4Romain Guy        LOG_FATAL_IF(! var, "Unable to find class " className); \
2599d5316e3f56d138504565ff311145ac01621dff4Romain Guy        var = jclass(env->NewGlobalRef(var));
2609d5316e3f56d138504565ff311145ac01621dff4Romain Guy
2619d5316e3f56d138504565ff311145ac01621dff4Romain Guy#define GET_METHOD_ID(var, clazz, methodName, methodDescriptor) \
2629d5316e3f56d138504565ff311145ac01621dff4Romain Guy        var = env->GetMethodID(clazz, methodName, methodDescriptor); \
2639d5316e3f56d138504565ff311145ac01621dff4Romain Guy        LOG_FATAL_IF(! var, "Unable to find method " methodName);
2649d5316e3f56d138504565ff311145ac01621dff4Romain Guy
265e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guyint register_android_view_GLES20Canvas(JNIEnv* env) {
2667ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    FIND_CLASS(gRectClassInfo.clazz, "android/graphics/Rect");
2677ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    GET_METHOD_ID(gRectClassInfo.set, gRectClassInfo.clazz, "set", "(IIII)V");
2689d5316e3f56d138504565ff311145ac01621dff4Romain Guy
269e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    return AndroidRuntime::registerNativeMethods(env, kClassPathName, gMethods, NELEM(gMethods));
270e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy}
271e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
272e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy};
273