android_view_GLES20Canvas.cpp revision 8ba548f81d1ab5f1750cbf86098c4a14e0b8bead
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,
1998ba548f81d1ab5f1750cbf86098c4a14e0b8beadRomain Guy        jint bitmapDensity, jint canvasDensity, jint screenDensity) {
2008ba548f81d1ab5f1750cbf86098c4a14e0b8beadRomain Guy    if (canvasDensity == bitmapDensity || canvasDensity == 0 || bitmapDensity == 0) {
2018ba548f81d1ab5f1750cbf86098c4a14e0b8beadRomain Guy        renderer->drawBitmap(bitmap, srcLeft, srcTop, srcRight, srcBottom,
2028ba548f81d1ab5f1750cbf86098c4a14e0b8beadRomain Guy                dstLeft, dstTop, dstRight, dstBottom, matrix, paint);
2038ba548f81d1ab5f1750cbf86098c4a14e0b8beadRomain Guy    } else {
2048ba548f81d1ab5f1750cbf86098c4a14e0b8beadRomain Guy
2058ba548f81d1ab5f1750cbf86098c4a14e0b8beadRomain Guy    }
206ce0537b80087a6225273040a987414b1dd081aa0Romain Guy}
207ce0537b80087a6225273040a987414b1dd081aa0Romain Guy
208ce0537b80087a6225273040a987414b1dd081aa0Romain Guystatic void android_view_GLES20Canvas_drawColor(JNIEnv* env, jobject canvas,
209ce0537b80087a6225273040a987414b1dd081aa0Romain Guy        OpenGLRenderer* renderer, jint color, SkXfermode::Mode mode) {
210ce0537b80087a6225273040a987414b1dd081aa0Romain Guy    renderer->drawColor(color, mode);
21185bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy}
21285bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy
213ce0537b80087a6225273040a987414b1dd081aa0Romain Guystatic void android_view_GLES20Canvas_drawRect(JNIEnv* env, jobject canvas,
214c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy        OpenGLRenderer* renderer, jfloat left, jfloat top, jfloat right, jfloat bottom,
215c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy        SkPaint* paint) {
216c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy    renderer->drawRect(left, top, right, bottom, paint);
217c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy}
218c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy
21985bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy// ----------------------------------------------------------------------------
220e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// JNI Glue
221e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// ----------------------------------------------------------------------------
222e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
223e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guyconst char* const kClassPathName = "android/view/GLES20Canvas";
224e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
225e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guystatic JNINativeMethod gMethods[] = {
226ce0537b80087a6225273040a987414b1dd081aa0Romain Guy    {   "nCreateRenderer",    "()I",                (void*) android_view_GLES20Canvas_createRenderer },
227ce0537b80087a6225273040a987414b1dd081aa0Romain Guy    {   "nDestroyRenderer",   "(I)V",               (void*) android_view_GLES20Canvas_destroyRenderer },
228ce0537b80087a6225273040a987414b1dd081aa0Romain Guy    {   "nSetViewport",       "(III)V",             (void*) android_view_GLES20Canvas_setViewport },
229ce0537b80087a6225273040a987414b1dd081aa0Romain Guy    {   "nPrepare",           "(I)V",               (void*) android_view_GLES20Canvas_prepare },
230bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy
231ce0537b80087a6225273040a987414b1dd081aa0Romain Guy    {   "nSave",              "(II)I",              (void*) android_view_GLES20Canvas_save },
232ce0537b80087a6225273040a987414b1dd081aa0Romain Guy    {   "nRestore",           "(I)V",               (void*) android_view_GLES20Canvas_restore },
233ce0537b80087a6225273040a987414b1dd081aa0Romain Guy    {   "nRestoreToCount",    "(II)V",              (void*) android_view_GLES20Canvas_restoreToCount },
234ce0537b80087a6225273040a987414b1dd081aa0Romain Guy    {   "nGetSaveCount",      "(I)I",               (void*) android_view_GLES20Canvas_getSaveCount },
235bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy
236ce0537b80087a6225273040a987414b1dd081aa0Romain Guy    {   "nSaveLayer",         "(IFFFFII)I",         (void*) android_view_GLES20Canvas_saveLayer },
237ce0537b80087a6225273040a987414b1dd081aa0Romain Guy    {   "nSaveLayerAlpha",    "(IFFFFII)I",         (void*) android_view_GLES20Canvas_saveLayerAlpha },
238bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy
239ce0537b80087a6225273040a987414b1dd081aa0Romain Guy    {   "nQuickReject",       "(IFFFFI)Z",          (void*) android_view_GLES20Canvas_quickReject },
240ce0537b80087a6225273040a987414b1dd081aa0Romain Guy    {   "nClipRect",          "(IFFFF)Z",           (void*) android_view_GLES20Canvas_clipRectF },
241ce0537b80087a6225273040a987414b1dd081aa0Romain Guy    {   "nClipRect",          "(IIIII)Z",           (void*) android_view_GLES20Canvas_clipRect },
242bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy
243ce0537b80087a6225273040a987414b1dd081aa0Romain Guy    {   "nTranslate",         "(IFF)V",             (void*) android_view_GLES20Canvas_translate },
244ce0537b80087a6225273040a987414b1dd081aa0Romain Guy    {   "nRotate",            "(IF)V",              (void*) android_view_GLES20Canvas_rotate },
245ce0537b80087a6225273040a987414b1dd081aa0Romain Guy    {   "nScale",             "(IFF)V",             (void*) android_view_GLES20Canvas_scale },
246bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy
247ce0537b80087a6225273040a987414b1dd081aa0Romain Guy    {   "nSetMatrix",         "(II)V",              (void*) android_view_GLES20Canvas_setMatrix },
248ce0537b80087a6225273040a987414b1dd081aa0Romain Guy    {   "nGetMatrix",         "(II)V",              (void*) android_view_GLES20Canvas_getMatrix },
249ce0537b80087a6225273040a987414b1dd081aa0Romain Guy    {   "nConcatMatrix",      "(II)V",              (void*) android_view_GLES20Canvas_concatMatrix },
250bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy
251ce0537b80087a6225273040a987414b1dd081aa0Romain Guy    {   "nDrawBitmap",        "(IIFFIIII)V",        (void*) android_view_GLES20Canvas_drawBitmap },
252ce0537b80087a6225273040a987414b1dd081aa0Romain Guy    {   "nDrawBitmap",        "(IIFFFFFFFFIIIII)V", (void*) android_view_GLES20Canvas_drawBitmapRect },
253ce0537b80087a6225273040a987414b1dd081aa0Romain Guy    {   "nDrawColor",         "(III)V",             (void*) android_view_GLES20Canvas_drawColor },
254ce0537b80087a6225273040a987414b1dd081aa0Romain Guy    {   "nDrawRect",          "(IFFFFI)V",          (void*) android_view_GLES20Canvas_drawRect },
255f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy
256c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy    {   "nGetClipBounds",     "(ILandroid/graphics/Rect;)Z",
257ce0537b80087a6225273040a987414b1dd081aa0Romain Guy            (void*) android_view_GLES20Canvas_getClipBounds },
258e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy};
259e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
2609d5316e3f56d138504565ff311145ac01621dff4Romain Guy#define FIND_CLASS(var, className) \
2619d5316e3f56d138504565ff311145ac01621dff4Romain Guy        var = env->FindClass(className); \
2629d5316e3f56d138504565ff311145ac01621dff4Romain Guy        LOG_FATAL_IF(! var, "Unable to find class " className); \
2639d5316e3f56d138504565ff311145ac01621dff4Romain Guy        var = jclass(env->NewGlobalRef(var));
2649d5316e3f56d138504565ff311145ac01621dff4Romain Guy
2659d5316e3f56d138504565ff311145ac01621dff4Romain Guy#define GET_METHOD_ID(var, clazz, methodName, methodDescriptor) \
2669d5316e3f56d138504565ff311145ac01621dff4Romain Guy        var = env->GetMethodID(clazz, methodName, methodDescriptor); \
2679d5316e3f56d138504565ff311145ac01621dff4Romain Guy        LOG_FATAL_IF(! var, "Unable to find method " methodName);
2689d5316e3f56d138504565ff311145ac01621dff4Romain Guy
269e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guyint register_android_view_GLES20Canvas(JNIEnv* env) {
2707ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    FIND_CLASS(gRectClassInfo.clazz, "android/graphics/Rect");
2717ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    GET_METHOD_ID(gRectClassInfo.set, gRectClassInfo.clazz, "set", "(IIII)V");
2729d5316e3f56d138504565ff311145ac01621dff4Romain Guy
273e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    return AndroidRuntime::registerNativeMethods(env, kClassPathName, gMethods, NELEM(gMethods));
274e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy}
275e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
276e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy};
277