android_view_GLES20Canvas.cpp revision 0e89e2b7bcb2c035e8cee77f93120e7c5617f8d2
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
17a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy#define LOG_TAG "OpenGLRenderer"
18a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy
19e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy#include "jni.h"
20e4ac2d6b5723c95e648c489b187ddde449452c13Patrick Dubroy#include "GraphicsJNI.h"
21e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy#include <nativehelper/JNIHelp.h>
226554943a1dd6854c0f4976900956e556767b49e1Romain Guy
23e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy#include <android_runtime/AndroidRuntime.h>
246554943a1dd6854c0f4976900956e556767b49e1Romain Guy
25b13b9bdad2baf6ad1ec2e56b6b7598fa20f55fc4Mathias Agopian#include <androidfw/ResourceTypes.h>
26e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
276554943a1dd6854c0f4976900956e556767b49e1Romain Guy#include <private/hwui/DrawGlInfo.h>
286554943a1dd6854c0f4976900956e556767b49e1Romain Guy
296554943a1dd6854c0f4976900956e556767b49e1Romain Guy#include <cutils/properties.h>
308f0095cd33558e9cc8a440047908e53b68906f5fRomain Guy
31ce0537b80087a6225273040a987414b1dd081aa0Romain Guy#include <SkBitmap.h>
32c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy#include <SkCanvas.h>
3357ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III#include <SkImageInfo.h>
34f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy#include <SkMatrix.h>
352ce932832e7caa1a6021539a9b7828ee5f49a610Chris Craik#include <SkPorterDuff.h>
36079ba2c85b15e882629b8d188f5fbdb42f7f8eeaRomain Guy#include <SkRegion.h>
37a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy#include <SkScalerContext.h>
3861c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy#include <SkTemplates.h>
3985bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy#include <SkXfermode.h>
40e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
41b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy#include <DisplayListRenderer.h>
429d5316e3f56d138504565ff311145ac01621dff4Romain Guy#include <Rect.h>
43113e0824d6bddf4376240681f9cf6a2deded9498John Reck#include <RenderNode.h>
4452244fff29042926e21fa897ef5ab11148e35299John Reck#include <CanvasProperty.h>
456ba30b85ddfbe37c338ee8dde3dd33322eb38d47Behdad Esfahbod#include <Paint.h>
460e89e2b7bcb2c035e8cee77f93120e7c5617f8d2John Reck#include <renderthread/RenderProxy.h>
4785bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy
481a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien#include "MinikinUtils.h"
49e8e62a4a032a80409114a37908b5f18ab0080848Romain Guy
50e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guynamespace android {
51e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
529d5316e3f56d138504565ff311145ac01621dff4Romain Guyusing namespace uirenderer;
539d5316e3f56d138504565ff311145ac01621dff4Romain Guy
54163935113919a184122b8b3bd672ef08c8df65dcRomain Guy/**
553b20251a355c88193c439f928a84ae69483fb488John Reck * Note: DisplayListRenderer JNI layer is generated and compiled only on supported
56163935113919a184122b8b3bd672ef08c8df65dcRomain Guy *       devices. This means all the logic must be compiled only when the
57163935113919a184122b8b3bd672ef08c8df65dcRomain Guy *       preprocessor variable USE_OPENGL_RENDERER is defined.
58163935113919a184122b8b3bd672ef08c8df65dcRomain Guy */
59163935113919a184122b8b3bd672ef08c8df65dcRomain Guy#ifdef USE_OPENGL_RENDERER
60163935113919a184122b8b3bd672ef08c8df65dcRomain Guy
61244ada1d35419b7be9de0fc833bb03955b725ffaRomain Guy// ----------------------------------------------------------------------------
62bdb801ca993bcccbf2a4c2401d1720c3fa523777Romain Guy// Defines
63244ada1d35419b7be9de0fc833bb03955b725ffaRomain Guy// ----------------------------------------------------------------------------
64bdb801ca993bcccbf2a4c2401d1720c3fa523777Romain Guy
65bdb801ca993bcccbf2a4c2401d1720c3fa523777Romain Guy// Debug
66e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy#define DEBUG_RENDERER 0
67bdb801ca993bcccbf2a4c2401d1720c3fa523777Romain Guy
68bdb801ca993bcccbf2a4c2401d1720c3fa523777Romain Guy// Debug
69bdb801ca993bcccbf2a4c2401d1720c3fa523777Romain Guy#if DEBUG_RENDERER
705baa3a62a97544669fba6d65a11c07f252e654ddSteve Block    #define RENDERER_LOGD(...) ALOGD(__VA_ARGS__)
71bdb801ca993bcccbf2a4c2401d1720c3fa523777Romain Guy#else
72bdb801ca993bcccbf2a4c2401d1720c3fa523777Romain Guy    #define RENDERER_LOGD(...)
73bdb801ca993bcccbf2a4c2401d1720c3fa523777Romain Guy#endif
74e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy
759d5316e3f56d138504565ff311145ac01621dff4Romain Guy// ----------------------------------------------------------------------------
769d5316e3f56d138504565ff311145ac01621dff4Romain Guy
779d5316e3f56d138504565ff311145ac01621dff4Romain Guystatic struct {
787ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    jmethodID set;
799d5316e3f56d138504565ff311145ac01621dff4Romain Guy} gRectClassInfo;
809d5316e3f56d138504565ff311145ac01621dff4Romain Guy
81e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// ----------------------------------------------------------------------------
82e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// Constructors
83e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// ----------------------------------------------------------------------------
84e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
855c13d89c1332fcc499379b9064b891187b75ca32Chet Haasestatic void android_view_GLES20Canvas_destroyRenderer(JNIEnv* env, jobject clazz,
8636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr) {
873b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
883b20251a355c88193c439f928a84ae69483fb488John Reck    RENDERER_LOGD("Destroy DisplayListRenderer");
89f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy    delete renderer;
90e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy}
91e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
92e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// ----------------------------------------------------------------------------
93e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// Setup
94e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// ----------------------------------------------------------------------------
95e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
967d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_setViewport(JNIEnv* env, jobject clazz,
9736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jint width, jint height) {
983b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
99f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy    renderer->setViewport(width, height);
100e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy}
101e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
102cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craikstatic void android_view_GLES20Canvas_setHighContrastText(JNIEnv* env, jobject clazz,
103cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik        jlong rendererPtr, jboolean highContrastText) {
104cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
105cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik    renderer->setHighContrastText(highContrastText);
106cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik}
107cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik
1088afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craikstatic void android_view_GLES20Canvas_insertReorderBarrier(JNIEnv* env, jobject clazz,
1098afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik        jlong rendererPtr, jboolean reorderEnable) {
1108afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
1118afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik    renderer->insertReorderBarrier(reorderEnable);
1128afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik}
1138afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik
11444b2fe3fc114ee5f7273c6b0fee2cc999bf244a2Chet Haasestatic int android_view_GLES20Canvas_prepare(JNIEnv* env, jobject clazz,
11536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jboolean opaque) {
1163b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
11744b2fe3fc114ee5f7273c6b0fee2cc999bf244a2Chet Haase    return renderer->prepare(opaque);
118e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy}
119e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
12044b2fe3fc114ee5f7273c6b0fee2cc999bf244a2Chet Haasestatic int android_view_GLES20Canvas_prepareDirty(JNIEnv* env, jobject clazz,
12136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jint left, jint top, jint right, jint bottom,
1227d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy        jboolean opaque) {
1233b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
12444b2fe3fc114ee5f7273c6b0fee2cc999bf244a2Chet Haase    return renderer->prepareDirty(left, top, right, bottom, opaque);
1257d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy}
1267d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy
1277d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_finish(JNIEnv* env, jobject clazz,
12836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr) {
1293b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
130b025b9c8b4efefadb01937db61a1f8ee7d2452bfRomain Guy    renderer->finish();
131b025b9c8b4efefadb01937db61a1f8ee7d2452bfRomain Guy}
132b025b9c8b4efefadb01937db61a1f8ee7d2452bfRomain Guy
133ba9b613437c34873fa95800a25fc51720638267cChris Craikstatic void android_view_GLES20Canvas_setProperty(JNIEnv* env,
134ba9b613437c34873fa95800a25fc51720638267cChris Craik        jobject clazz, jstring name, jstring value) {
135ba9b613437c34873fa95800a25fc51720638267cChris Craik    if (!Caches::hasInstance()) {
136ba9b613437c34873fa95800a25fc51720638267cChris Craik        ALOGW("can't set property, no Caches instance");
137ba9b613437c34873fa95800a25fc51720638267cChris Craik        return;
138ba9b613437c34873fa95800a25fc51720638267cChris Craik    }
139ba9b613437c34873fa95800a25fc51720638267cChris Craik
140ba9b613437c34873fa95800a25fc51720638267cChris Craik    if (name == NULL || value == NULL) {
141ba9b613437c34873fa95800a25fc51720638267cChris Craik        ALOGW("can't set prop, null passed");
142ba9b613437c34873fa95800a25fc51720638267cChris Craik    }
143ba9b613437c34873fa95800a25fc51720638267cChris Craik
144ba9b613437c34873fa95800a25fc51720638267cChris Craik    const char* nameCharArray = env->GetStringUTFChars(name, NULL);
145ba9b613437c34873fa95800a25fc51720638267cChris Craik    const char* valueCharArray = env->GetStringUTFChars(value, NULL);
146ba9b613437c34873fa95800a25fc51720638267cChris Craik    Caches::getInstance().setTempProperty(nameCharArray, valueCharArray);
147ba9b613437c34873fa95800a25fc51720638267cChris Craik    env->ReleaseStringUTFChars(name, nameCharArray);
148ba9b613437c34873fa95800a25fc51720638267cChris Craik    env->ReleaseStringUTFChars(name, valueCharArray);
149ba9b613437c34873fa95800a25fc51720638267cChris Craik}
150ba9b613437c34873fa95800a25fc51720638267cChris Craik
151530041d3191ce817832a0108514617768e43cda6Romain Guy// ----------------------------------------------------------------------------
152530041d3191ce817832a0108514617768e43cda6Romain Guy// Functor
153530041d3191ce817832a0108514617768e43cda6Romain Guy// ----------------------------------------------------------------------------
154530041d3191ce817832a0108514617768e43cda6Romain Guy
1556554943a1dd6854c0f4976900956e556767b49e1Romain Guystatic jint android_view_GLES20Canvas_callDrawGLFunction(JNIEnv* env, jobject clazz,
15636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jlong functorPtr) {
1573b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
1589f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    Functor* functor = reinterpret_cast<Functor*>(functorPtr);
159cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy    android::uirenderer::Rect dirty;
160cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy    return renderer->callDrawGLFunction(functor, dirty);
161daf98e941e140e8739458126640183b9f296a2abChet Haase}
162daf98e941e140e8739458126640183b9f296a2abChet Haase
1638f3b8e32993d190a26c70c839a63d8ce4c3b16d9Romain Guy// ----------------------------------------------------------------------------
1648f3b8e32993d190a26c70c839a63d8ce4c3b16d9Romain Guy// Misc
1658f3b8e32993d190a26c70c839a63d8ce4c3b16d9Romain Guy// ----------------------------------------------------------------------------
1668f3b8e32993d190a26c70c839a63d8ce4c3b16d9Romain Guy
167f61970fc79e9c5cf340fa942597628242361864aRomain Guystatic jint android_view_GLES20Canvas_getMaxTextureWidth(JNIEnv* env, jobject clazz) {
168f61970fc79e9c5cf340fa942597628242361864aRomain Guy    return Caches::getInstance().maxTextureSize;
169f61970fc79e9c5cf340fa942597628242361864aRomain Guy}
170f61970fc79e9c5cf340fa942597628242361864aRomain Guy
171f61970fc79e9c5cf340fa942597628242361864aRomain Guystatic jint android_view_GLES20Canvas_getMaxTextureHeight(JNIEnv* env, jobject clazz) {
172f61970fc79e9c5cf340fa942597628242361864aRomain Guy    return Caches::getInstance().maxTextureSize;
173f61970fc79e9c5cf340fa942597628242361864aRomain Guy}
174f61970fc79e9c5cf340fa942597628242361864aRomain Guy
175e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// ----------------------------------------------------------------------------
176bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy// State
177bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy// ----------------------------------------------------------------------------
178bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
17936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhatstatic jint android_view_GLES20Canvas_save(JNIEnv* env, jobject clazz, jlong rendererPtr,
180bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy        jint flags) {
1813b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
182f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy    return renderer->save(flags);
183f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy}
184bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
1857d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic jint android_view_GLES20Canvas_getSaveCount(JNIEnv* env, jobject clazz,
18636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr) {
1873b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
188f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy    return renderer->getSaveCount();
189bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy}
190bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
1917d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_restore(JNIEnv* env, jobject clazz,
19236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr) {
1933b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
194f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy    renderer->restore();
195bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy}
196bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
1977d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_restoreToCount(JNIEnv* env, jobject clazz,
19836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jint saveCount) {
1993b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
200f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy    renderer->restoreToCount(saveCount);
201bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy}
202bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
203f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy// ----------------------------------------------------------------------------
204bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy// Layers
205bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy// ----------------------------------------------------------------------------
206bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy
2077d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic jint android_view_GLES20Canvas_saveLayer(JNIEnv* env, jobject clazz,
20836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jfloat left, jfloat top, jfloat right, jfloat bottom,
20936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong paintPtr, jint saveFlags) {
2103b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
2116ba30b85ddfbe37c338ee8dde3dd33322eb38d47Behdad Esfahbod    Paint* paint = reinterpret_cast<Paint*>(paintPtr);
212bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy    return renderer->saveLayer(left, top, right, bottom, paint, saveFlags);
213bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy}
214bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy
215189887e0ae171c1b7601991442104a30e56c50abRomain Guystatic jint android_view_GLES20Canvas_saveLayerClip(JNIEnv* env, jobject clazz,
21636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jlong paintPtr, jint saveFlags) {
2173b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
2186ba30b85ddfbe37c338ee8dde3dd33322eb38d47Behdad Esfahbod    Paint* paint = reinterpret_cast<Paint*>(paintPtr);
2193f085429fd47ebd32ac2463b3eae2a5a6c17be25Chris Craik    const android::uirenderer::Rect& bounds(renderer->getLocalClipBounds());
220189887e0ae171c1b7601991442104a30e56c50abRomain Guy    return renderer->saveLayer(bounds.left, bounds.top, bounds.right, bounds.bottom,
221189887e0ae171c1b7601991442104a30e56c50abRomain Guy            paint, saveFlags);
222189887e0ae171c1b7601991442104a30e56c50abRomain Guy}
223189887e0ae171c1b7601991442104a30e56c50abRomain Guy
2247d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic jint android_view_GLES20Canvas_saveLayerAlpha(JNIEnv* env, jobject clazz,
22536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jfloat left, jfloat top, jfloat right, jfloat bottom,
226bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy        jint alpha, jint saveFlags) {
2273b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
228bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy    return renderer->saveLayerAlpha(left, top, right, bottom, alpha, saveFlags);
229bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy}
230bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy
231189887e0ae171c1b7601991442104a30e56c50abRomain Guystatic jint android_view_GLES20Canvas_saveLayerAlphaClip(JNIEnv* env, jobject clazz,
23236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jint alpha, jint saveFlags) {
2333b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
2343f085429fd47ebd32ac2463b3eae2a5a6c17be25Chris Craik    const android::uirenderer::Rect& bounds(renderer->getLocalClipBounds());
235189887e0ae171c1b7601991442104a30e56c50abRomain Guy    return renderer->saveLayerAlpha(bounds.left, bounds.top, bounds.right, bounds.bottom,
236189887e0ae171c1b7601991442104a30e56c50abRomain Guy            alpha, saveFlags);
237189887e0ae171c1b7601991442104a30e56c50abRomain Guy}
238189887e0ae171c1b7601991442104a30e56c50abRomain Guy
239bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy// ----------------------------------------------------------------------------
240f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy// Clipping
241f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy// ----------------------------------------------------------------------------
242f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy
24336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhatstatic jboolean android_view_GLES20Canvas_quickReject(JNIEnv* env, jobject clazz,
24436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jfloat left, jfloat top, jfloat right, jfloat bottom) {
2453b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
24636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    const bool result = renderer->quickRejectConservative(left, top, right, bottom);
24736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    return result ? JNI_TRUE : JNI_FALSE;
248c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy}
249c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy
25036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhatstatic jboolean android_view_GLES20Canvas_clipRectF(JNIEnv* env, jobject clazz,
25136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jfloat left, jfloat top, jfloat right, jfloat bottom,
25236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jint op) {
2533b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
25436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    const bool result = renderer->clipRect(left, top, right, bottom,
25536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat                                           static_cast<SkRegion::Op>(op));
25636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    return result ? JNI_TRUE : JNI_FALSE;
257f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy}
258bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
25936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhatstatic jboolean android_view_GLES20Canvas_clipRect(JNIEnv* env, jobject clazz,
26036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jint left, jint top, jint right, jint bottom,
26136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jint op) {
2623b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
26336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    const bool result = renderer->clipRect(float(left), float(top), float(right),
26436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat                                           float(bottom),
26536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat                                           static_cast<SkRegion::Op>(op));
26636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    return result ? JNI_TRUE : JNI_FALSE;
267bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy}
268bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
26936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhatstatic jboolean android_view_GLES20Canvas_clipPath(JNIEnv* env, jobject clazz,
27036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jlong pathPtr, jint op) {
2713b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
2729f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPath* path = reinterpret_cast<SkPath*>(pathPtr);
27336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    const bool result = renderer->clipPath(path, static_cast<SkRegion::Op>(op));
27436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    return result ? JNI_TRUE : JNI_FALSE;
275735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy}
276735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy
27736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhatstatic jboolean android_view_GLES20Canvas_clipRegion(JNIEnv* env, jobject clazz,
27836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jlong regionPtr, jint op) {
2793b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
2809f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkRegion* region = reinterpret_cast<SkRegion*>(regionPtr);
28136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    const bool result = renderer->clipRegion(region, static_cast<SkRegion::Op>(op));
28236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    return result ? JNI_TRUE : JNI_FALSE;
283735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy}
284735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy
28536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhatstatic jboolean android_view_GLES20Canvas_getClipBounds(JNIEnv* env, jobject clazz,
28636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jobject rect) {
2873b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
2883f085429fd47ebd32ac2463b3eae2a5a6c17be25Chris Craik    const android::uirenderer::Rect& bounds(renderer->getLocalClipBounds());
2899d5316e3f56d138504565ff311145ac01621dff4Romain Guy
2907ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    env->CallVoidMethod(rect, gRectClassInfo.set,
2917ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy            int(bounds.left), int(bounds.top), int(bounds.right), int(bounds.bottom));
2929d5316e3f56d138504565ff311145ac01621dff4Romain Guy
29336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    return !bounds.isEmpty() ? JNI_TRUE : JNI_FALSE;
2949d5316e3f56d138504565ff311145ac01621dff4Romain Guy}
2959d5316e3f56d138504565ff311145ac01621dff4Romain Guy
296bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy// ----------------------------------------------------------------------------
297f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy// Transforms
298bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy// ----------------------------------------------------------------------------
299bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
3007d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_translate(JNIEnv* env, jobject clazz,
30136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jfloat dx, jfloat dy) {
3023b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
3037ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    renderer->translate(dx, dy);
304f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy}
305bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
3067d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_rotate(JNIEnv* env, jobject clazz,
30736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jfloat degrees) {
3083b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
3097ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    renderer->rotate(degrees);
310bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy}
311bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
3127d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_scale(JNIEnv* env, jobject clazz,
31336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jfloat sx, jfloat sy) {
3143b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
3157ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    renderer->scale(sx, sy);
316f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy}
317bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
3187d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_skew(JNIEnv* env, jobject clazz,
31936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jfloat sx, jfloat sy) {
3203b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
321807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy    renderer->skew(sx, sy);
322807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy}
323807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy
3247d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_setMatrix(JNIEnv* env, jobject clazz,
32536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jlong matrixPtr) {
3263b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
3279f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixPtr);
328139088228faa7f3c446af7387e017933998a5570Derek Sollenberger    renderer->setMatrix(matrix ? *matrix : SkMatrix::I());
329f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy}
330f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy
3317d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_getMatrix(JNIEnv* env, jobject clazz,
33236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jlong matrixPtr) {
3333b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
3349f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixPtr);
3357ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    renderer->getMatrix(matrix);
336f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy}
337f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy
3387d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_concatMatrix(JNIEnv* env, jobject clazz,
33936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jlong matrixPtr) {
3403b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
3419f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixPtr);
342139088228faa7f3c446af7387e017933998a5570Derek Sollenberger    renderer->concatMatrix(*matrix);
343bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy}
344bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
345bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy// ----------------------------------------------------------------------------
346bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy// Drawing
34785bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy// ----------------------------------------------------------------------------
34885bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy
3497d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawBitmap(JNIEnv* env, jobject clazz,
35036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jlong bitmapPtr, jbyteArray buffer,
35136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jfloat left, jfloat top, jlong paintPtr) {
3529f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapPtr);
3530c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik    // This object allows the renderer to allocate a global JNI ref to the buffer object.
3540c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik    JavaHeapBitmapRef bitmapRef(env, bitmap, buffer);
3550c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik
3563b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
3576ba30b85ddfbe37c338ee8dde3dd33322eb38d47Behdad Esfahbod    Paint* paint = reinterpret_cast<Paint*>(paintPtr);
358796475006f5d670e8383a2050f11719522437a43Chris Craik
359796475006f5d670e8383a2050f11719522437a43Chris Craik    // apply transform directly to canvas, so it affects shaders correctly
360796475006f5d670e8383a2050f11719522437a43Chris Craik    renderer->save(SkCanvas::kMatrix_SaveFlag);
361796475006f5d670e8383a2050f11719522437a43Chris Craik    renderer->translate(left, top);
362796475006f5d670e8383a2050f11719522437a43Chris Craik    renderer->drawBitmap(bitmap, paint);
363796475006f5d670e8383a2050f11719522437a43Chris Craik    renderer->restore();
364ce0537b80087a6225273040a987414b1dd081aa0Romain Guy}
365ce0537b80087a6225273040a987414b1dd081aa0Romain Guy
3667d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawBitmapRect(JNIEnv* env, jobject clazz,
36736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jlong bitmapPtr, jbyteArray buffer,
368ce0537b80087a6225273040a987414b1dd081aa0Romain Guy        float srcLeft, float srcTop, float srcRight, float srcBottom,
36936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        float dstLeft, float dstTop, float dstRight, float dstBottom, jlong paintPtr) {
3709f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapPtr);
3710c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik    // This object allows the renderer to allocate a global JNI ref to the buffer object.
3720c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik    JavaHeapBitmapRef bitmapRef(env, bitmap, buffer);
3730c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik
3743b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
3756ba30b85ddfbe37c338ee8dde3dd33322eb38d47Behdad Esfahbod    Paint* paint = reinterpret_cast<Paint*>(paintPtr);
376dbd77cd444f89d94ec5333223c1bc17dbe0c90cdRomain Guy    renderer->drawBitmap(bitmap, srcLeft, srcTop, srcRight, srcBottom,
377dbd77cd444f89d94ec5333223c1bc17dbe0c90cdRomain Guy            dstLeft, dstTop, dstRight, dstBottom, paint);
378f86ef57f8bcd8ba43ce222ec6a8b4f67d3600640Romain Guy}
3798ba548f81d1ab5f1750cbf86098c4a14e0b8beadRomain Guy
3807d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawBitmapMatrix(JNIEnv* env, jobject clazz,
38136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jlong bitmapPtr, jbyteArray buffer,
38236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong matrixPtr, jlong paintPtr) {
3839f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapPtr);
3840c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik    // This object allows the renderer to allocate a global JNI ref to the buffer object.
3850c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik    JavaHeapBitmapRef bitmapRef(env, bitmap, buffer);
3860c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik
3873b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
3889f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixPtr);
3896ba30b85ddfbe37c338ee8dde3dd33322eb38d47Behdad Esfahbod    Paint* paint = reinterpret_cast<Paint*>(paintPtr);
390796475006f5d670e8383a2050f11719522437a43Chris Craik
391796475006f5d670e8383a2050f11719522437a43Chris Craik    // apply transform directly to canvas, so it affects shaders correctly
392796475006f5d670e8383a2050f11719522437a43Chris Craik    renderer->save(SkCanvas::kMatrix_SaveFlag);
393796475006f5d670e8383a2050f11719522437a43Chris Craik    renderer->concatMatrix(*matrix);
394796475006f5d670e8383a2050f11719522437a43Chris Craik    renderer->drawBitmap(bitmap, paint);
395796475006f5d670e8383a2050f11719522437a43Chris Craik    renderer->restore();
396ce0537b80087a6225273040a987414b1dd081aa0Romain Guy}
397ce0537b80087a6225273040a987414b1dd081aa0Romain Guy
398e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guystatic void android_view_GLES20Canvas_drawBitmapData(JNIEnv* env, jobject clazz,
39936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jintArray colors, jint offset, jint stride,
40036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jfloat left, jfloat top, jint width, jint height, jboolean hasAlpha, jlong paintPtr) {
40157ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III    // Note: If hasAlpha is false, kRGB_565_SkColorType will be used, which will
40257ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III    // correct the alphaType to kOpaque_SkAlphaType.
403b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed    const SkImageInfo info = SkImageInfo::Make(width, height,
404b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed                               hasAlpha ? kN32_SkColorType : kRGB_565_SkColorType,
405b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed                               kPremul_SkAlphaType);
40649c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    SkBitmap* bitmap = new SkBitmap;
407b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed    if (!bitmap->allocPixels(info)) {
40849c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy        delete bitmap;
409e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy        return;
410e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy    }
411e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy
41257ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III    if (!GraphicsJNI::SetPixels(env, colors, offset, stride, 0, 0, width, height, *bitmap)) {
41349c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy        delete bitmap;
414e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy        return;
415e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy    }
416e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy
4173b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
4186ba30b85ddfbe37c338ee8dde3dd33322eb38d47Behdad Esfahbod    Paint* paint = reinterpret_cast<Paint*>(paintPtr);
419796475006f5d670e8383a2050f11719522437a43Chris Craik
420796475006f5d670e8383a2050f11719522437a43Chris Craik    // apply transform directly to canvas, so it affects shaders correctly
421796475006f5d670e8383a2050f11719522437a43Chris Craik    renderer->save(SkCanvas::kMatrix_SaveFlag);
422796475006f5d670e8383a2050f11719522437a43Chris Craik    renderer->translate(left, top);
423796475006f5d670e8383a2050f11719522437a43Chris Craik    renderer->drawBitmapData(bitmap, paint);
424796475006f5d670e8383a2050f11719522437a43Chris Craik    renderer->restore();
42549c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy
426f23b25abfb76e75f63103abc882bc91b8327a957Chris Craik    // Note - bitmap isn't deleted as DisplayListRenderer owns it now
427e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy}
428e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy
4297d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawBitmapMesh(JNIEnv* env, jobject clazz,
43036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jlong bitmapPtr, jbyteArray buffer,
4310c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik        jint meshWidth, jint meshHeight, jfloatArray vertices, jint offset, jintArray colors,
43236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jint colorOffset, jlong paintPtr) {
4339f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapPtr);
4340c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik    // This object allows the renderer to allocate a global JNI ref to the buffer object.
4350c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik    JavaHeapBitmapRef bitmapRef(env, bitmap, buffer);
4360c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik
4375a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    jfloat* verticesArray = vertices ? env->GetFloatArrayElements(vertices, NULL) + offset : NULL;
4385a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    jint* colorsArray = colors ? env->GetIntArrayElements(colors, NULL) + colorOffset : NULL;
4395a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy
4403b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
4416ba30b85ddfbe37c338ee8dde3dd33322eb38d47Behdad Esfahbod    Paint* paint = reinterpret_cast<Paint*>(paintPtr);
4425a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    renderer->drawBitmapMesh(bitmap, meshWidth, meshHeight, verticesArray, colorsArray, paint);
4435a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy
4445a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    if (vertices) env->ReleaseFloatArrayElements(vertices, verticesArray, 0);
4455a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    if (colors) env->ReleaseIntArrayElements(colors, colorsArray, 0);
4465a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy}
4475a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy
4487d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawPatch(JNIEnv* env, jobject clazz,
44936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jlong bitmapPtr, jbyteArray buffer, jlong patchPtr,
45036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        float left, float top, float right, float bottom, jlong paintPtr) {
4519f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapPtr);
4520c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik    // This object allows the renderer to allocate a global JNI ref to the buffer object.
4530c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik    JavaHeapBitmapRef bitmapRef(env, bitmap, buffer);
4540c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik
4553b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
4569f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    Res_png_9patch* patch = reinterpret_cast<Res_png_9patch*>(patchPtr);
4576ba30b85ddfbe37c338ee8dde3dd33322eb38d47Behdad Esfahbod    Paint* paint = reinterpret_cast<Paint*>(paintPtr);
4583b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    renderer->drawPatch(bitmap, patch, left, top, right, bottom, paint);
459deba785f122a47915756ffd991f5540d952cf937Romain Guy}
460deba785f122a47915756ffd991f5540d952cf937Romain Guy
4617d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawColor(JNIEnv* env, jobject clazz,
4622ce932832e7caa1a6021539a9b7828ee5f49a610Chris Craik        jlong rendererPtr, jint color, jint modeHandle) {
4633b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
4642ce932832e7caa1a6021539a9b7828ee5f49a610Chris Craik    SkPorterDuff::Mode mode = static_cast<SkPorterDuff::Mode>(modeHandle);
4652ce932832e7caa1a6021539a9b7828ee5f49a610Chris Craik    renderer->drawColor(color, SkPorterDuff::ToXfermodeMode(mode));
46685bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy}
46785bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy
4687d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawRect(JNIEnv* env, jobject clazz,
46936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jfloat left, jfloat top, jfloat right, jfloat bottom,
47036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong paintPtr) {
4713b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
4726ba30b85ddfbe37c338ee8dde3dd33322eb38d47Behdad Esfahbod    Paint* paint = reinterpret_cast<Paint*>(paintPtr);
473c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy    renderer->drawRect(left, top, right, bottom, paint);
474c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy}
475c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy
4767d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawRoundRect(JNIEnv* env, jobject clazz,
47736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jfloat left, jfloat top, jfloat right, jfloat bottom,
47836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jfloat rx, jfloat ry, jlong paintPtr) {
4793b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
4806ba30b85ddfbe37c338ee8dde3dd33322eb38d47Behdad Esfahbod    Paint* paint = reinterpret_cast<Paint*>(paintPtr);
48101d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    renderer->drawRoundRect(left, top, right, bottom, rx, ry, paint);
48201d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy}
48301d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy
484072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggistatic void android_view_GLES20Canvas_drawRoundRectProps(JNIEnv* env, jobject clazz,
485072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggi        jlong rendererPtr, jlong leftPropPtr, jlong topPropPtr, jlong rightPropPtr,
486072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggi        jlong bottomPropPtr, jlong rxPropPtr, jlong ryPropPtr, jlong paintPropPtr) {
487072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggi    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
488072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggi    CanvasPropertyPrimitive* leftProp = reinterpret_cast<CanvasPropertyPrimitive*>(leftPropPtr);
489072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggi    CanvasPropertyPrimitive* topProp = reinterpret_cast<CanvasPropertyPrimitive*>(topPropPtr);
490072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggi    CanvasPropertyPrimitive* rightProp = reinterpret_cast<CanvasPropertyPrimitive*>(rightPropPtr);
491072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggi    CanvasPropertyPrimitive* bottomProp = reinterpret_cast<CanvasPropertyPrimitive*>(bottomPropPtr);
492072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggi    CanvasPropertyPrimitive* rxProp = reinterpret_cast<CanvasPropertyPrimitive*>(rxPropPtr);
493072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggi    CanvasPropertyPrimitive* ryProp = reinterpret_cast<CanvasPropertyPrimitive*>(ryPropPtr);
494072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggi    CanvasPropertyPaint* paintProp = reinterpret_cast<CanvasPropertyPaint*>(paintPropPtr);
495072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggi    renderer->drawRoundRect(leftProp, topProp, rightProp, bottomProp, rxProp, ryProp, paintProp);
496072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggi}
497072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggi
4987d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawCircle(JNIEnv* env, jobject clazz,
49936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jfloat x, jfloat y, jfloat radius, jlong paintPtr) {
5003b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
5016ba30b85ddfbe37c338ee8dde3dd33322eb38d47Behdad Esfahbod    Paint* paint = reinterpret_cast<Paint*>(paintPtr);
50201d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    renderer->drawCircle(x, y, radius, paint);
50301d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy}
50401d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy
50552244fff29042926e21fa897ef5ab11148e35299John Reckstatic void android_view_GLES20Canvas_drawCircleProps(JNIEnv* env, jobject clazz,
50652244fff29042926e21fa897ef5ab11148e35299John Reck        jlong rendererPtr, jlong xPropPtr, jlong yPropPtr, jlong radiusPropPtr, jlong paintPropPtr) {
5073b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
50852244fff29042926e21fa897ef5ab11148e35299John Reck    CanvasPropertyPrimitive* xProp = reinterpret_cast<CanvasPropertyPrimitive*>(xPropPtr);
50952244fff29042926e21fa897ef5ab11148e35299John Reck    CanvasPropertyPrimitive* yProp = reinterpret_cast<CanvasPropertyPrimitive*>(yPropPtr);
51052244fff29042926e21fa897ef5ab11148e35299John Reck    CanvasPropertyPrimitive* radiusProp = reinterpret_cast<CanvasPropertyPrimitive*>(radiusPropPtr);
51152244fff29042926e21fa897ef5ab11148e35299John Reck    CanvasPropertyPaint* paintProp = reinterpret_cast<CanvasPropertyPaint*>(paintPropPtr);
51252244fff29042926e21fa897ef5ab11148e35299John Reck    renderer->drawCircle(xProp, yProp, radiusProp, paintProp);
51352244fff29042926e21fa897ef5ab11148e35299John Reck}
51452244fff29042926e21fa897ef5ab11148e35299John Reck
5157d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawOval(JNIEnv* env, jobject clazz,
51636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jfloat left, jfloat top, jfloat right, jfloat bottom,
51736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong paintPtr) {
5183b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
5196ba30b85ddfbe37c338ee8dde3dd33322eb38d47Behdad Esfahbod    Paint* paint = reinterpret_cast<Paint*>(paintPtr);
520c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy    renderer->drawOval(left, top, right, bottom, paint);
521c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy}
522c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy
5237d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawArc(JNIEnv* env, jobject clazz,
52436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jfloat left, jfloat top, jfloat right, jfloat bottom,
52536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jfloat startAngle, jfloat sweepAngle, jboolean useCenter, jlong paintPtr) {
5263b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
5276ba30b85ddfbe37c338ee8dde3dd33322eb38d47Behdad Esfahbod    Paint* paint = reinterpret_cast<Paint*>(paintPtr);
5288b2f5267f16c295f12faab810527cd6311997e34Romain Guy    renderer->drawArc(left, top, right, bottom, startAngle, sweepAngle, useCenter, paint);
5298b2f5267f16c295f12faab810527cd6311997e34Romain Guy}
5308b2f5267f16c295f12faab810527cd6311997e34Romain Guy
531672433d90fab7383cd28beac9d4485b566a90940Romain Guystatic void android_view_GLES20Canvas_drawRegionAsRects(JNIEnv* env, jobject clazz,
53236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jlong regionPtr, jlong paintPtr) {
5333b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
5349f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkRegion* region = reinterpret_cast<SkRegion*>(regionPtr);
5356ba30b85ddfbe37c338ee8dde3dd33322eb38d47Behdad Esfahbod    Paint* paint = reinterpret_cast<Paint*>(paintPtr);
5366ba30b85ddfbe37c338ee8dde3dd33322eb38d47Behdad Esfahbod    if (paint->getStyle() != Paint::kFill_Style ||
537672433d90fab7383cd28beac9d4485b566a90940Romain Guy            (paint->isAntiAlias() && !renderer->isCurrentTransformSimple())) {
538672433d90fab7383cd28beac9d4485b566a90940Romain Guy        SkRegion::Iterator it(*region);
539672433d90fab7383cd28beac9d4485b566a90940Romain Guy        while (!it.done()) {
540672433d90fab7383cd28beac9d4485b566a90940Romain Guy            const SkIRect& r = it.rect();
541672433d90fab7383cd28beac9d4485b566a90940Romain Guy            renderer->drawRect(r.fLeft, r.fTop, r.fRight, r.fBottom, paint);
542672433d90fab7383cd28beac9d4485b566a90940Romain Guy            it.next();
543672433d90fab7383cd28beac9d4485b566a90940Romain Guy        }
544672433d90fab7383cd28beac9d4485b566a90940Romain Guy    } else {
545672433d90fab7383cd28beac9d4485b566a90940Romain Guy        int count = 0;
546672433d90fab7383cd28beac9d4485b566a90940Romain Guy        Vector<float> rects;
547672433d90fab7383cd28beac9d4485b566a90940Romain Guy        SkRegion::Iterator it(*region);
548672433d90fab7383cd28beac9d4485b566a90940Romain Guy        while (!it.done()) {
549672433d90fab7383cd28beac9d4485b566a90940Romain Guy            const SkIRect& r = it.rect();
550672433d90fab7383cd28beac9d4485b566a90940Romain Guy            rects.push(r.fLeft);
551672433d90fab7383cd28beac9d4485b566a90940Romain Guy            rects.push(r.fTop);
552672433d90fab7383cd28beac9d4485b566a90940Romain Guy            rects.push(r.fRight);
553672433d90fab7383cd28beac9d4485b566a90940Romain Guy            rects.push(r.fBottom);
5542af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik            count += 4;
555672433d90fab7383cd28beac9d4485b566a90940Romain Guy            it.next();
556672433d90fab7383cd28beac9d4485b566a90940Romain Guy        }
557672433d90fab7383cd28beac9d4485b566a90940Romain Guy        renderer->drawRects(rects.array(), count, paint);
558a48a1a87ba17f20f7006eaab21dcedf86c015c13Romain Guy    }
559a48a1a87ba17f20f7006eaab21dcedf86c015c13Romain Guy}
560a48a1a87ba17f20f7006eaab21dcedf86c015c13Romain Guy
561ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guystatic void android_view_GLES20Canvas_drawPoints(JNIEnv* env, jobject clazz,
56236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jfloatArray points, jint offset, jint count, jlong paintPtr) {
5633b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
564ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy    jfloat* storage = env->GetFloatArrayElements(points, NULL);
5656ba30b85ddfbe37c338ee8dde3dd33322eb38d47Behdad Esfahbod    Paint* paint = reinterpret_cast<Paint*>(paintPtr);
566ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy    renderer->drawPoints(storage + offset, count, paint);
567ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy    env->ReleaseFloatArrayElements(points, storage, 0);
568ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy}
569ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy
5707d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawPath(JNIEnv* env, jobject clazz,
57136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jlong pathPtr, jlong paintPtr) {
5723b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
5739f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPath* path = reinterpret_cast<SkPath*>(pathPtr);
5746ba30b85ddfbe37c338ee8dde3dd33322eb38d47Behdad Esfahbod    Paint* paint = reinterpret_cast<Paint*>(paintPtr);
5757fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy    renderer->drawPath(path, paint);
5767fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy}
5777fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy
5787d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawLines(JNIEnv* env, jobject clazz,
57936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jfloatArray points, jint offset, jint count, jlong paintPtr) {
5803b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
581759ea80dca64ad652110a129e0d8bf93fea79f61Romain Guy    jfloat* storage = env->GetFloatArrayElements(points, NULL);
5826ba30b85ddfbe37c338ee8dde3dd33322eb38d47Behdad Esfahbod    Paint* paint = reinterpret_cast<Paint*>(paintPtr);
583759ea80dca64ad652110a129e0d8bf93fea79f61Romain Guy    renderer->drawLines(storage + offset, count, paint);
584759ea80dca64ad652110a129e0d8bf93fea79f61Romain Guy    env->ReleaseFloatArrayElements(points, storage, 0);
585759ea80dca64ad652110a129e0d8bf93fea79f61Romain Guy}
586759ea80dca64ad652110a129e0d8bf93fea79f61Romain Guy
58785bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy// ----------------------------------------------------------------------------
5885ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy// Draw filters
5895ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy// ----------------------------------------------------------------------------
5905ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy
5915ff9df658230d49e42c43586997a02d8e4dd417eRomain Guystatic void android_view_GLES20Canvas_setupPaintFilter(JNIEnv* env, jobject clazz,
59236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jint clearBits, jint setBits) {
5933b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
5945ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    renderer->setupPaintFilter(clearBits, setBits);
5955ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy}
5965ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy
5975ff9df658230d49e42c43586997a02d8e4dd417eRomain Guystatic void android_view_GLES20Canvas_resetPaintFilter(JNIEnv* env, jobject clazz,
59836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr) {
5993b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
6005ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    renderer->resetPaintFilter();
6015ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy}
6025ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy
6035ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy// ----------------------------------------------------------------------------
604a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy// Text
605a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy// ----------------------------------------------------------------------------
606a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy
607f2114d5646194100242206b267ddd6e7194b7da9Raph Levienclass RenderTextFunctor {
608f2114d5646194100242206b267ddd6e7194b7da9Raph Levienpublic:
6093b20251a355c88193c439f928a84ae69483fb488John Reck    RenderTextFunctor(const Layout& layout, DisplayListRenderer* renderer, jfloat x, jfloat y,
6106ba30b85ddfbe37c338ee8dde3dd33322eb38d47Behdad Esfahbod                Paint* paint, uint16_t* glyphs, float* pos, float totalAdvance,
611f2114d5646194100242206b267ddd6e7194b7da9Raph Levien                uirenderer::Rect& bounds)
612f2114d5646194100242206b267ddd6e7194b7da9Raph Levien            : layout(layout), renderer(renderer), x(x), y(y), paint(paint), glyphs(glyphs),
613f2114d5646194100242206b267ddd6e7194b7da9Raph Levien            pos(pos), totalAdvance(totalAdvance), bounds(bounds) { }
6141fc0fa87d42ce9268ece76b85b9edc834593e53aRaph Levien    void operator()(size_t start, size_t end) {
615f2114d5646194100242206b267ddd6e7194b7da9Raph Levien        for (size_t i = start; i < end; i++) {
616f2114d5646194100242206b267ddd6e7194b7da9Raph Levien            glyphs[i] = layout.getGlyphId(i);
617f2114d5646194100242206b267ddd6e7194b7da9Raph Levien            pos[2 * i] = layout.getX(i);
618f2114d5646194100242206b267ddd6e7194b7da9Raph Levien            pos[2 * i + 1] = layout.getY(i);
619f2114d5646194100242206b267ddd6e7194b7da9Raph Levien        }
620f2114d5646194100242206b267ddd6e7194b7da9Raph Levien        size_t glyphsCount = end - start;
621f2114d5646194100242206b267ddd6e7194b7da9Raph Levien        int bytesCount = glyphsCount * sizeof(jchar);
622f2114d5646194100242206b267ddd6e7194b7da9Raph Levien        renderer->drawText((const char*) (glyphs + start), bytesCount, glyphsCount,
623f2114d5646194100242206b267ddd6e7194b7da9Raph Levien            x, y, pos + 2 * start, paint, totalAdvance, bounds);
624f2114d5646194100242206b267ddd6e7194b7da9Raph Levien    }
625f2114d5646194100242206b267ddd6e7194b7da9Raph Levienprivate:
626f2114d5646194100242206b267ddd6e7194b7da9Raph Levien    const Layout& layout;
6273b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer;
628f2114d5646194100242206b267ddd6e7194b7da9Raph Levien    jfloat x;
629f2114d5646194100242206b267ddd6e7194b7da9Raph Levien    jfloat y;
6306ba30b85ddfbe37c338ee8dde3dd33322eb38d47Behdad Esfahbod    Paint* paint;
631f2114d5646194100242206b267ddd6e7194b7da9Raph Levien    uint16_t* glyphs;
632f2114d5646194100242206b267ddd6e7194b7da9Raph Levien    float* pos;
633f2114d5646194100242206b267ddd6e7194b7da9Raph Levien    float totalAdvance;
634f2114d5646194100242206b267ddd6e7194b7da9Raph Levien    uirenderer::Rect& bounds;
635f2114d5646194100242206b267ddd6e7194b7da9Raph Levien};
636f2114d5646194100242206b267ddd6e7194b7da9Raph Levien
6373b20251a355c88193c439f928a84ae69483fb488John Reckstatic void renderTextLayout(DisplayListRenderer* renderer, Layout* layout,
6386ba30b85ddfbe37c338ee8dde3dd33322eb38d47Behdad Esfahbod    jfloat x, jfloat y, Paint* paint) {
6391a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien    size_t nGlyphs = layout->nGlyphs();
6401a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien    float* pos = new float[nGlyphs * 2];
6411a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien    uint16_t* glyphs = new uint16_t[nGlyphs];
6421a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien    MinikinRect b;
6431a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien    layout->getBounds(&b);
6441a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien    android::uirenderer::Rect bounds(b.mLeft, b.mTop, b.mRight, b.mBottom);
6451a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien    bounds.translate(x, y);
6461a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien    float totalAdvance = layout->getAdvance();
6471a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien
648f2114d5646194100242206b267ddd6e7194b7da9Raph Levien    RenderTextFunctor f(*layout, renderer, x, y, paint, glyphs, pos, totalAdvance, bounds);
6491fc0fa87d42ce9268ece76b85b9edc834593e53aRaph Levien    MinikinUtils::forFontRun(*layout, paint, f);
6501a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien    delete[] glyphs;
6511a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien    delete[] pos;
6521a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien}
6531a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien
6543b20251a355c88193c439f928a84ae69483fb488John Reckstatic void renderText(DisplayListRenderer* renderer, const jchar* text, int count,
6556ba30b85ddfbe37c338ee8dde3dd33322eb38d47Behdad Esfahbod        jfloat x, jfloat y, int bidiFlags, Paint* paint, TypefaceImpl* typeface) {
6561a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien    Layout layout;
65763c5c78a72a21d57913e8601cc2a1ab72a424a02Behdad Esfahbod    MinikinUtils::doLayout(&layout, paint, bidiFlags, typeface, text, 0, count, count);
6583660789f06c5fbcb81e6c7c79612048bff8f0f66Raph Levien    x += MinikinUtils::xOffsetForTextAlign(paint, layout);
6591a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien    renderTextLayout(renderer, &layout, x, y, paint);
660e8e62a4a032a80409114a37908b5f18ab0080848Romain Guy}
661e8e62a4a032a80409114a37908b5f18ab0080848Romain Guy
6629d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levienclass RenderTextOnPathFunctor {
6639d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levienpublic:
6643b20251a355c88193c439f928a84ae69483fb488John Reck    RenderTextOnPathFunctor(const Layout& layout, DisplayListRenderer* renderer, float hOffset,
6656ba30b85ddfbe37c338ee8dde3dd33322eb38d47Behdad Esfahbod                float vOffset, Paint* paint, SkPath* path)
6669d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien            : layout(layout), renderer(renderer), hOffset(hOffset), vOffset(vOffset),
6679d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien                paint(paint), path(path) {
6689d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien    }
6699d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien    void operator()(size_t start, size_t end) {
6709d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien        uint16_t glyphs[1];
6719d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien        for (size_t i = start; i < end; i++) {
6729d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien            glyphs[0] = layout.getGlyphId(i);
6739d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien            float x = hOffset + layout.getX(i);
6749d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien            float y = vOffset + layout.getY(i);
6759d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien            renderer->drawTextOnPath((const char*) glyphs, sizeof(glyphs), 1, path, x, y, paint);
6769d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien        }
6779d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien    }
6789d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levienprivate:
6799d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien    const Layout& layout;
6803b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer;
6819d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien    float hOffset;
6829d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien    float vOffset;
6836ba30b85ddfbe37c338ee8dde3dd33322eb38d47Behdad Esfahbod    Paint* paint;
6849d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien    SkPath* path;
6859d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien};
6869d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien
6873b20251a355c88193c439f928a84ae69483fb488John Reckstatic void renderTextOnPath(DisplayListRenderer* renderer, const jchar* text, int count,
6886ba30b85ddfbe37c338ee8dde3dd33322eb38d47Behdad Esfahbod        SkPath* path, jfloat hOffset, jfloat vOffset, int bidiFlags, Paint* paint,
6899d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien        TypefaceImpl* typeface) {
6909d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien    Layout layout;
69163c5c78a72a21d57913e8601cc2a1ab72a424a02Behdad Esfahbod    MinikinUtils::doLayout(&layout, paint, bidiFlags, typeface, text, 0, count, count);
6929d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien    hOffset += MinikinUtils::hOffsetForTextAlign(paint, layout, *path);
6936ba30b85ddfbe37c338ee8dde3dd33322eb38d47Behdad Esfahbod    Paint::Align align = paint->getTextAlign();
6946ba30b85ddfbe37c338ee8dde3dd33322eb38d47Behdad Esfahbod    paint->setTextAlign(Paint::kLeft_Align);
6959d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien
6969d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien    RenderTextOnPathFunctor f(layout, renderer, hOffset, vOffset, paint, path);
6979d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien    MinikinUtils::forFontRun(layout, paint, f);
6989d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien    paint->setTextAlign(align);
699325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy}
700325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy
7013b20251a355c88193c439f928a84ae69483fb488John Reckstatic void renderTextRun(DisplayListRenderer* renderer, const jchar* text,
70261c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy        jint start, jint count, jint contextCount, jfloat x, jfloat y,
7036ba30b85ddfbe37c338ee8dde3dd33322eb38d47Behdad Esfahbod        int bidiFlags, Paint* paint, TypefaceImpl* typeface) {
7041a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien    Layout layout;
70563c5c78a72a21d57913e8601cc2a1ab72a424a02Behdad Esfahbod    MinikinUtils::doLayout(&layout, paint, bidiFlags, typeface, text, start, count, contextCount);
7063660789f06c5fbcb81e6c7c79612048bff8f0f66Raph Levien    x += MinikinUtils::xOffsetForTextAlign(paint, layout);
7071a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien    renderTextLayout(renderer, &layout, x, y, paint);
70861c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy}
70961c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy
7107d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawTextArray(JNIEnv* env, jobject clazz,
71136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jcharArray text, jint index, jint count,
712051910b9f998030dacb8a0722588cc715813fde1Raph Levien        jfloat x, jfloat y, jint bidiFlags, jlong paintPtr, jlong typefacePtr) {
7133b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
714a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy    jchar* textArray = env->GetCharArrayElements(text, NULL);
7156ba30b85ddfbe37c338ee8dde3dd33322eb38d47Behdad Esfahbod    Paint* paint = reinterpret_cast<Paint*>(paintPtr);
7161a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien    TypefaceImpl* typeface = reinterpret_cast<TypefaceImpl*>(typefacePtr);
7179f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik
718051910b9f998030dacb8a0722588cc715813fde1Raph Levien    renderText(renderer, textArray + index, count, x, y, bidiFlags, paint, typeface);
719a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy    env->ReleaseCharArrayElements(text, textArray, JNI_ABORT);
720a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy}
721a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy
7227d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawText(JNIEnv* env, jobject clazz,
72336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jstring text, jint start, jint end,
724051910b9f998030dacb8a0722588cc715813fde1Raph Levien        jfloat x, jfloat y, jint bidiFlags, jlong paintPtr, jlong typefacePtr) {
7253b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
726a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy    const jchar* textArray = env->GetStringChars(text, NULL);
7276ba30b85ddfbe37c338ee8dde3dd33322eb38d47Behdad Esfahbod    Paint* paint = reinterpret_cast<Paint*>(paintPtr);
7281a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien    TypefaceImpl* typeface = reinterpret_cast<TypefaceImpl*>(typefacePtr);
7299f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik
730051910b9f998030dacb8a0722588cc715813fde1Raph Levien    renderText(renderer, textArray + start, end - start, x, y, bidiFlags, paint, typeface);
731a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy    env->ReleaseStringChars(text, textArray);
732a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy}
733a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy
734325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guystatic void android_view_GLES20Canvas_drawTextArrayOnPath(JNIEnv* env, jobject clazz,
73536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jcharArray text, jint index, jint count,
7369d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien        jlong pathPtr, jfloat hOffset, jfloat vOffset, jint bidiFlags, jlong paintPtr,
7379d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien        jlong typefacePtr) {
7383b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
739325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    jchar* textArray = env->GetCharArrayElements(text, NULL);
7409f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPath* path = reinterpret_cast<SkPath*>(pathPtr);
7416ba30b85ddfbe37c338ee8dde3dd33322eb38d47Behdad Esfahbod    Paint* paint = reinterpret_cast<Paint*>(paintPtr);
7429d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien    TypefaceImpl* typeface = reinterpret_cast<TypefaceImpl*>(typefacePtr);
7439f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik
744325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    renderTextOnPath(renderer, textArray + index, count, path,
7459d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien            hOffset, vOffset, bidiFlags, paint, typeface);
746325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    env->ReleaseCharArrayElements(text, textArray, JNI_ABORT);
747325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy}
748325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy
749325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guystatic void android_view_GLES20Canvas_drawTextOnPath(JNIEnv* env, jobject clazz,
75036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jstring text, jint start, jint end,
7519d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien        jlong pathPtr, jfloat hOffset, jfloat vOffset, jint bidiFlags, jlong paintPtr,
7529d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien        jlong typefacePtr) {
7533b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
754325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    const jchar* textArray = env->GetStringChars(text, NULL);
7559f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPath* path = reinterpret_cast<SkPath*>(pathPtr);
7566ba30b85ddfbe37c338ee8dde3dd33322eb38d47Behdad Esfahbod    Paint* paint = reinterpret_cast<Paint*>(paintPtr);
7579d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien    TypefaceImpl* typeface = reinterpret_cast<TypefaceImpl*>(typefacePtr);
7589f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik
759325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    renderTextOnPath(renderer, textArray + start, end - start, path,
7609d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien            hOffset, vOffset, bidiFlags, paint, typeface);
761325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    env->ReleaseStringChars(text, textArray);
762325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy}
763325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy
7647d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawTextRunArray(JNIEnv* env, jobject clazz,
76536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jcharArray text, jint index, jint count,
766051910b9f998030dacb8a0722588cc715813fde1Raph Levien        jint contextIndex, jint contextCount, jfloat x, jfloat y, jboolean isRtl,
7671a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien        jlong paintPtr, jlong typefacePtr) {
7683b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
76961c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy    jchar* textArray = env->GetCharArrayElements(text, NULL);
7706ba30b85ddfbe37c338ee8dde3dd33322eb38d47Behdad Esfahbod    Paint* paint = reinterpret_cast<Paint*>(paintPtr);
7711a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien    TypefaceImpl* typeface = reinterpret_cast<TypefaceImpl*>(typefacePtr);
7729f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik
773051910b9f998030dacb8a0722588cc715813fde1Raph Levien    int bidiFlags = isRtl ? kBidi_Force_RTL : kBidi_Force_LTR;
77461c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy    renderTextRun(renderer, textArray + contextIndex, index - contextIndex,
775051910b9f998030dacb8a0722588cc715813fde1Raph Levien            count, contextCount, x, y, bidiFlags, paint, typeface);
77661c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy    env->ReleaseCharArrayElements(text, textArray, JNI_ABORT);
77761c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy }
77861c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy
7797d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawTextRun(JNIEnv* env, jobject clazz,
78036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jstring text, jint start, jint end,
781051910b9f998030dacb8a0722588cc715813fde1Raph Levien        jint contextStart, int contextEnd, jfloat x, jfloat y, jboolean isRtl,
7821a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien        jlong paintPtr, jlong typefacePtr) {
7833b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
78461c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy    const jchar* textArray = env->GetStringChars(text, NULL);
78561c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy    jint count = end - start;
78661c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy    jint contextCount = contextEnd - contextStart;
7876ba30b85ddfbe37c338ee8dde3dd33322eb38d47Behdad Esfahbod    Paint* paint = reinterpret_cast<Paint*>(paintPtr);
7881a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien    TypefaceImpl* typeface = reinterpret_cast<TypefaceImpl*>(typefacePtr);
7899f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik
790051910b9f998030dacb8a0722588cc715813fde1Raph Levien    int bidiFlags = isRtl ? kBidi_Force_RTL : kBidi_Force_LTR;
79161c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy    renderTextRun(renderer, textArray + contextStart, start - contextStart,
792051910b9f998030dacb8a0722588cc715813fde1Raph Levien            count, contextCount, x, y, bidiFlags, paint, typeface);
79361c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy    env->ReleaseStringChars(text, textArray);
79461c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy}
79561c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy
796b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy// ----------------------------------------------------------------------------
797b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy// Display lists
798b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy// ----------------------------------------------------------------------------
799b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
80044fd8d24f761f82d21e9b00932648a1b6bf91449John Reckstatic jlong android_view_GLES20Canvas_finishRecording(JNIEnv* env,
80144fd8d24f761f82d21e9b00932648a1b6bf91449John Reck        jobject clazz, jlong rendererPtr) {
8029f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
80344fd8d24f761f82d21e9b00932648a1b6bf91449John Reck    return reinterpret_cast<jlong>(renderer->finishRecording());
804162a0217563f4665da6eb183dfce0fef740f641fJeff Brown}
805162a0217563f4665da6eb183dfce0fef740f641fJeff Brown
8063f085429fd47ebd32ac2463b3eae2a5a6c17be25Chris Craikstatic jlong android_view_GLES20Canvas_createDisplayListRenderer(JNIEnv* env, jobject clazz) {
80744fd8d24f761f82d21e9b00932648a1b6bf91449John Reck    return reinterpret_cast<jlong>(new DisplayListRenderer);
8085977baa1fa24125c148a72699b53e62abaf08960Chet Haase}
8095977baa1fa24125c148a72699b53e62abaf08960Chet Haase
810a7090e0cfd7c719a6d4c03aae34f5db98754cbddChris Craikstatic jint android_view_GLES20Canvas_drawRenderNode(JNIEnv* env,
811a7090e0cfd7c719a6d4c03aae34f5db98754cbddChris Craik        jobject clazz, jlong rendererPtr, jlong renderNodePtr,
8121271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        jobject dirty, jint flags) {
8133b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
814a7090e0cfd7c719a6d4c03aae34f5db98754cbddChris Craik    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
815cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy    android::uirenderer::Rect bounds;
816a7090e0cfd7c719a6d4c03aae34f5db98754cbddChris Craik    status_t status = renderer->drawRenderNode(renderNode, bounds, flags);
8176554943a1dd6854c0f4976900956e556767b49e1Romain Guy    if (status != DrawGlInfo::kStatusDone && dirty != NULL) {
818cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy        env->CallVoidMethod(dirty, gRectClassInfo.set,
819cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy                int(bounds.left), int(bounds.top), int(bounds.right), int(bounds.bottom));
820cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy    }
8216554943a1dd6854c0f4976900956e556767b49e1Romain Guy    return status;
822b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
823b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
8246c319ca1275c8db892c39b48fc54864c949f9171Romain Guy// ----------------------------------------------------------------------------
8256c319ca1275c8db892c39b48fc54864c949f9171Romain Guy// Layers
8266c319ca1275c8db892c39b48fc54864c949f9171Romain Guy// ----------------------------------------------------------------------------
8276c319ca1275c8db892c39b48fc54864c949f9171Romain Guy
8287d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawLayer(JNIEnv* env, jobject clazz,
82936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jlong layerPtr, jfloat x, jfloat y) {
8303b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
8319f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    Layer* layer = reinterpret_cast<Layer*>(layerPtr);
832a08f95cfeca7217f9c533b03663bf0dceedd259aChris Craik    renderer->drawLayer(layer, x, y);
8336c319ca1275c8db892c39b48fc54864c949f9171Romain Guy}
8346c319ca1275c8db892c39b48fc54864c949f9171Romain Guy
835163935113919a184122b8b3bd672ef08c8df65dcRomain Guy#endif // USE_OPENGL_RENDERER
836163935113919a184122b8b3bd672ef08c8df65dcRomain Guy
837163935113919a184122b8b3bd672ef08c8df65dcRomain Guy// ----------------------------------------------------------------------------
838163935113919a184122b8b3bd672ef08c8df65dcRomain Guy// Common
839163935113919a184122b8b3bd672ef08c8df65dcRomain Guy// ----------------------------------------------------------------------------
840163935113919a184122b8b3bd672ef08c8df65dcRomain Guy
841163935113919a184122b8b3bd672ef08c8df65dcRomain Guystatic jboolean android_view_GLES20Canvas_isAvailable(JNIEnv* env, jobject clazz) {
842163935113919a184122b8b3bd672ef08c8df65dcRomain Guy#ifdef USE_OPENGL_RENDERER
8434406345cd62d3687ce590c357854472f7f906e6cJesse Hall    char prop[PROPERTY_VALUE_MAX];
8444406345cd62d3687ce590c357854472f7f906e6cJesse Hall    if (property_get("ro.kernel.qemu", prop, NULL) == 0) {
8454406345cd62d3687ce590c357854472f7f906e6cJesse Hall        // not in the emulator
8464406345cd62d3687ce590c357854472f7f906e6cJesse Hall        return JNI_TRUE;
8474406345cd62d3687ce590c357854472f7f906e6cJesse Hall    }
8484406345cd62d3687ce590c357854472f7f906e6cJesse Hall    // In the emulator this property will be set to 1 when hardware GLES is
8494406345cd62d3687ce590c357854472f7f906e6cJesse Hall    // enabled, 0 otherwise. On old emulator versions it will be undefined.
8504406345cd62d3687ce590c357854472f7f906e6cJesse Hall    property_get("ro.kernel.qemu.gles", prop, "0");
8514406345cd62d3687ce590c357854472f7f906e6cJesse Hall    return atoi(prop) == 1 ? JNI_TRUE : JNI_FALSE;
852163935113919a184122b8b3bd672ef08c8df65dcRomain Guy#else
853163935113919a184122b8b3bd672ef08c8df65dcRomain Guy    return JNI_FALSE;
854163935113919a184122b8b3bd672ef08c8df65dcRomain Guy#endif
855163935113919a184122b8b3bd672ef08c8df65dcRomain Guy}
856163935113919a184122b8b3bd672ef08c8df65dcRomain Guy
857a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy// ----------------------------------------------------------------------------
8589c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase// Logging
8599c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase// ----------------------------------------------------------------------------
8609c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase
8619c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haasestatic void
86265b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guyandroid_app_ActivityThread_dumpGraphics(JNIEnv* env, jobject clazz, jobject javaFileDescriptor) {
863905787a7c91d23daa4efc3d16bd8cbf1a683e779Chet Haase#ifdef USE_OPENGL_RENDERER
864a3804cf77f0edd93f6247a055cdafb856b117eecElliott Hughes    int fd = jniGetFDFromFileDescriptor(env, javaFileDescriptor);
8650e89e2b7bcb2c035e8cee77f93120e7c5617f8d2John Reck    android::uirenderer::renderthread::RenderProxy::outputLogBuffer(fd);
866905787a7c91d23daa4efc3d16bd8cbf1a683e779Chet Haase#endif // USE_OPENGL_RENDERER
8679c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase}
8689c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase
8699c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase// ----------------------------------------------------------------------------
870e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// JNI Glue
871e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// ----------------------------------------------------------------------------
872e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
873e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guyconst char* const kClassPathName = "android/view/GLES20Canvas";
874e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
875e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guystatic JNINativeMethod gMethods[] = {
87661c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy    { "nIsAvailable",       "()Z",             (void*) android_view_GLES20Canvas_isAvailable },
877163935113919a184122b8b3bd672ef08c8df65dcRomain Guy
87861c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy#ifdef USE_OPENGL_RENDERER
8797d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy
88036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDestroyRenderer",   "(J)V",            (void*) android_view_GLES20Canvas_destroyRenderer },
88136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nSetViewport",       "(JII)V",          (void*) android_view_GLES20Canvas_setViewport },
882cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik    { "nSetHighContrastText","(JZ)V",          (void*) android_view_GLES20Canvas_setHighContrastText },
8838afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik    { "nInsertReorderBarrier","(JZ)V",         (void*) android_view_GLES20Canvas_insertReorderBarrier },
88436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nPrepare",           "(JZ)I",           (void*) android_view_GLES20Canvas_prepare },
88536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nPrepareDirty",      "(JIIIIZ)I",       (void*) android_view_GLES20Canvas_prepareDirty },
88636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nFinish",            "(J)V",            (void*) android_view_GLES20Canvas_finish },
887ba9b613437c34873fa95800a25fc51720638267cChris Craik    { "nSetProperty",           "(Ljava/lang/String;Ljava/lang/String;)V",
888ba9b613437c34873fa95800a25fc51720638267cChris Craik            (void*) android_view_GLES20Canvas_setProperty },
88961c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy
89036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nCallDrawGLFunction", "(JJ)I",          (void*) android_view_GLES20Canvas_callDrawGLFunction },
8917d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy
89236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nSave",              "(JI)I",           (void*) android_view_GLES20Canvas_save },
89336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nRestore",           "(J)V",            (void*) android_view_GLES20Canvas_restore },
89436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nRestoreToCount",    "(JI)V",           (void*) android_view_GLES20Canvas_restoreToCount },
89536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nGetSaveCount",      "(J)I",            (void*) android_view_GLES20Canvas_getSaveCount },
89636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat
89736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nSaveLayer",         "(JFFFFJI)I",      (void*) android_view_GLES20Canvas_saveLayer },
89836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nSaveLayer",         "(JJI)I",          (void*) android_view_GLES20Canvas_saveLayerClip },
89936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nSaveLayerAlpha",    "(JFFFFII)I",      (void*) android_view_GLES20Canvas_saveLayerAlpha },
90036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nSaveLayerAlpha",    "(JII)I",          (void*) android_view_GLES20Canvas_saveLayerAlphaClip },
90136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat
90236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nQuickReject",       "(JFFFF)Z",        (void*) android_view_GLES20Canvas_quickReject },
90336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nClipRect",          "(JFFFFI)Z",       (void*) android_view_GLES20Canvas_clipRectF },
90436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nClipRect",          "(JIIIII)Z",       (void*) android_view_GLES20Canvas_clipRect },
90536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nClipPath",          "(JJI)Z",          (void*) android_view_GLES20Canvas_clipPath },
90636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nClipRegion",        "(JJI)Z",          (void*) android_view_GLES20Canvas_clipRegion },
90736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat
90836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nTranslate",         "(JFF)V",          (void*) android_view_GLES20Canvas_translate },
90936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nRotate",            "(JF)V",           (void*) android_view_GLES20Canvas_rotate },
91036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nScale",             "(JFF)V",          (void*) android_view_GLES20Canvas_scale },
91136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nSkew",              "(JFF)V",          (void*) android_view_GLES20Canvas_skew },
91236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat
91336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nSetMatrix",         "(JJ)V",           (void*) android_view_GLES20Canvas_setMatrix },
91436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nGetMatrix",         "(JJ)V",           (void*) android_view_GLES20Canvas_getMatrix },
91536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nConcatMatrix",      "(JJ)V",           (void*) android_view_GLES20Canvas_concatMatrix },
91636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat
91736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawBitmap",        "(JJ[BFFJ)V",      (void*) android_view_GLES20Canvas_drawBitmap },
91836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawBitmap",        "(JJ[BFFFFFFFFJ)V",(void*) android_view_GLES20Canvas_drawBitmapRect },
91936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawBitmap",        "(JJ[BJJ)V",       (void*) android_view_GLES20Canvas_drawBitmapMatrix },
92036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawBitmap",        "(J[IIIFFIIZJ)V",  (void*) android_view_GLES20Canvas_drawBitmapData },
92136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat
92236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawBitmapMesh",    "(JJ[BII[FI[IIJ)V",(void*) android_view_GLES20Canvas_drawBitmapMesh },
92336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat
92436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawPatch",         "(JJ[BJFFFFJ)V",   (void*) android_view_GLES20Canvas_drawPatch },
92536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat
92636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawColor",         "(JII)V",          (void*) android_view_GLES20Canvas_drawColor },
92736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawRect",          "(JFFFFJ)V",       (void*) android_view_GLES20Canvas_drawRect },
92836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawRects",         "(JJJ)V",          (void*) android_view_GLES20Canvas_drawRegionAsRects },
92936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawRoundRect",     "(JFFFFFFJ)V",     (void*) android_view_GLES20Canvas_drawRoundRect },
930072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggi    { "nDrawRoundRect",     "(JJJJJJJJ)V",     (void*) android_view_GLES20Canvas_drawRoundRectProps },
93136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawCircle",        "(JFFFJ)V",        (void*) android_view_GLES20Canvas_drawCircle },
93252244fff29042926e21fa897ef5ab11148e35299John Reck    { "nDrawCircle",        "(JJJJJ)V",        (void*) android_view_GLES20Canvas_drawCircleProps },
93336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawOval",          "(JFFFFJ)V",       (void*) android_view_GLES20Canvas_drawOval },
93436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawArc",           "(JFFFFFFZJ)V",    (void*) android_view_GLES20Canvas_drawArc },
93536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawPoints",        "(J[FIIJ)V",       (void*) android_view_GLES20Canvas_drawPoints },
93636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat
93736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawPath",          "(JJJ)V",          (void*) android_view_GLES20Canvas_drawPath },
93836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawLines",         "(J[FIIJ)V",       (void*) android_view_GLES20Canvas_drawLines },
93936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat
94036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nSetupPaintFilter",  "(JII)V",          (void*) android_view_GLES20Canvas_setupPaintFilter },
94136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nResetPaintFilter",  "(J)V",            (void*) android_view_GLES20Canvas_resetPaintFilter },
94236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat
9431a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien    { "nDrawText",          "(J[CIIFFIJJ)V",   (void*) android_view_GLES20Canvas_drawTextArray },
9441a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien    { "nDrawText",          "(JLjava/lang/String;IIFFIJJ)V",
945a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy            (void*) android_view_GLES20Canvas_drawText },
946a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy
9479d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien    { "nDrawTextOnPath",    "(J[CIIJFFIJJ)V",  (void*) android_view_GLES20Canvas_drawTextArrayOnPath },
9489d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien    { "nDrawTextOnPath",    "(JLjava/lang/String;IIJFFIJJ)V",
949325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy            (void*) android_view_GLES20Canvas_drawTextOnPath },
950325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy
951051910b9f998030dacb8a0722588cc715813fde1Raph Levien    { "nDrawTextRun",       "(J[CIIIIFFZJJ)V",  (void*) android_view_GLES20Canvas_drawTextRunArray },
952051910b9f998030dacb8a0722588cc715813fde1Raph Levien    { "nDrawTextRun",       "(JLjava/lang/String;IIIIFFZJJ)V",
95361c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy            (void*) android_view_GLES20Canvas_drawTextRun },
95461c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy
955a7090e0cfd7c719a6d4c03aae34f5db98754cbddChris Craik    { "nGetClipBounds",     "(JLandroid/graphics/Rect;)Z", (void*) android_view_GLES20Canvas_getClipBounds },
956b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
957a7090e0cfd7c719a6d4c03aae34f5db98754cbddChris Craik    { "nFinishRecording",   "(J)J",      (void*) android_view_GLES20Canvas_finishRecording },
958a7090e0cfd7c719a6d4c03aae34f5db98754cbddChris Craik    { "nDrawRenderNode",    "(JJLandroid/graphics/Rect;I)I", (void*) android_view_GLES20Canvas_drawRenderNode },
95913631f3da855f200a151e7837ed9f6b079622b58Romain Guy
96036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nCreateDisplayListRenderer", "()J",     (void*) android_view_GLES20Canvas_createDisplayListRenderer },
96113631f3da855f200a151e7837ed9f6b079622b58Romain Guy
96236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawLayer",              "(JJFF)V",    (void*) android_view_GLES20Canvas_drawLayer },
96336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat
964f61970fc79e9c5cf340fa942597628242361864aRomain Guy    { "nGetMaximumTextureWidth",  "()I",       (void*) android_view_GLES20Canvas_getMaxTextureWidth },
965f61970fc79e9c5cf340fa942597628242361864aRomain Guy    { "nGetMaximumTextureHeight", "()I",       (void*) android_view_GLES20Canvas_getMaxTextureHeight },
966f61970fc79e9c5cf340fa942597628242361864aRomain Guy
967163935113919a184122b8b3bd672ef08c8df65dcRomain Guy#endif
968e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy};
969e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
9709c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haasestatic JNINativeMethod gActivityThreadMethods[] = {
9719c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    { "dumpGraphicsInfo",        "(Ljava/io/FileDescriptor;)V",
9729c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase                                               (void*) android_app_ActivityThread_dumpGraphics }
9739c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase};
9749c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase
9759c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase
976163935113919a184122b8b3bd672ef08c8df65dcRomain Guy#ifdef USE_OPENGL_RENDERER
977163935113919a184122b8b3bd672ef08c8df65dcRomain Guy    #define FIND_CLASS(var, className) \
978163935113919a184122b8b3bd672ef08c8df65dcRomain Guy            var = env->FindClass(className); \
97917cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro            LOG_FATAL_IF(! var, "Unable to find class " className);
98017cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro
981163935113919a184122b8b3bd672ef08c8df65dcRomain Guy    #define GET_METHOD_ID(var, clazz, methodName, methodDescriptor) \
982163935113919a184122b8b3bd672ef08c8df65dcRomain Guy            var = env->GetMethodID(clazz, methodName, methodDescriptor); \
983163935113919a184122b8b3bd672ef08c8df65dcRomain Guy            LOG_FATAL_IF(! var, "Unable to find method " methodName);
984163935113919a184122b8b3bd672ef08c8df65dcRomain Guy#else
985163935113919a184122b8b3bd672ef08c8df65dcRomain Guy    #define FIND_CLASS(var, className)
986163935113919a184122b8b3bd672ef08c8df65dcRomain Guy    #define GET_METHOD_ID(var, clazz, methodName, methodDescriptor)
987163935113919a184122b8b3bd672ef08c8df65dcRomain Guy#endif
9889d5316e3f56d138504565ff311145ac01621dff4Romain Guy
989e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guyint register_android_view_GLES20Canvas(JNIEnv* env) {
99017cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro    jclass clazz;
99117cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro    FIND_CLASS(clazz, "android/graphics/Rect");
99217cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro    GET_METHOD_ID(gRectClassInfo.set, clazz, "set", "(IIII)V");
9939d5316e3f56d138504565ff311145ac01621dff4Romain Guy
994e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    return AndroidRuntime::registerNativeMethods(env, kClassPathName, gMethods, NELEM(gMethods));
995e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy}
996e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
9979c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haaseconst char* const kActivityThreadPathName = "android/app/ActivityThread";
9989c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase
9996be3d5561cbeccf0a8257a4acb155657f868e548Romain Guyint register_android_app_ActivityThread(JNIEnv* env) {
10006be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy    return AndroidRuntime::registerNativeMethods(env, kActivityThreadPathName,
10019c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase            gActivityThreadMethods, NELEM(gActivityThreadMethods));
10029c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase}
10039c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase
1004e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy};
1005