android_view_GLES20Canvas.cpp revision cce47eb580d666ead1f6095d1e3b65233592bbaa
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>
35c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy#include <SkPaint.h>
362ce932832e7caa1a6021539a9b7828ee5f49a610Chris Craik#include <SkPorterDuff.h>
37079ba2c85b15e882629b8d188f5fbdb42f7f8eeaRomain Guy#include <SkRegion.h>
38a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy#include <SkScalerContext.h>
3961c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy#include <SkTemplates.h>
4085bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy#include <SkXfermode.h>
41e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
42b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy#include <DisplayListRenderer.h>
439d5316e3f56d138504565ff311145ac01621dff4Romain Guy#include <Rect.h>
44113e0824d6bddf4376240681f9cf6a2deded9498John Reck#include <RenderNode.h>
4552244fff29042926e21fa897ef5ab11148e35299John Reck#include <CanvasProperty.h>
4685bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy
471a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien#include <minikin/Layout.h>
481a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien#include "MinikinSkia.h"
491a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien#include "MinikinUtils.h"
50e8e62a4a032a80409114a37908b5f18ab0080848Romain Guy
51e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guynamespace android {
52e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
539d5316e3f56d138504565ff311145ac01621dff4Romain Guyusing namespace uirenderer;
549d5316e3f56d138504565ff311145ac01621dff4Romain Guy
55163935113919a184122b8b3bd672ef08c8df65dcRomain Guy/**
563b20251a355c88193c439f928a84ae69483fb488John Reck * Note: DisplayListRenderer JNI layer is generated and compiled only on supported
57163935113919a184122b8b3bd672ef08c8df65dcRomain Guy *       devices. This means all the logic must be compiled only when the
58163935113919a184122b8b3bd672ef08c8df65dcRomain Guy *       preprocessor variable USE_OPENGL_RENDERER is defined.
59163935113919a184122b8b3bd672ef08c8df65dcRomain Guy */
60163935113919a184122b8b3bd672ef08c8df65dcRomain Guy#ifdef USE_OPENGL_RENDERER
61163935113919a184122b8b3bd672ef08c8df65dcRomain Guy
62244ada1d35419b7be9de0fc833bb03955b725ffaRomain Guy// ----------------------------------------------------------------------------
63bdb801ca993bcccbf2a4c2401d1720c3fa523777Romain Guy// Defines
64244ada1d35419b7be9de0fc833bb03955b725ffaRomain Guy// ----------------------------------------------------------------------------
65bdb801ca993bcccbf2a4c2401d1720c3fa523777Romain Guy
66bdb801ca993bcccbf2a4c2401d1720c3fa523777Romain Guy// Debug
67e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy#define DEBUG_RENDERER 0
68bdb801ca993bcccbf2a4c2401d1720c3fa523777Romain Guy
69bdb801ca993bcccbf2a4c2401d1720c3fa523777Romain Guy// Debug
70bdb801ca993bcccbf2a4c2401d1720c3fa523777Romain Guy#if DEBUG_RENDERER
715baa3a62a97544669fba6d65a11c07f252e654ddSteve Block    #define RENDERER_LOGD(...) ALOGD(__VA_ARGS__)
72bdb801ca993bcccbf2a4c2401d1720c3fa523777Romain Guy#else
73bdb801ca993bcccbf2a4c2401d1720c3fa523777Romain Guy    #define RENDERER_LOGD(...)
74bdb801ca993bcccbf2a4c2401d1720c3fa523777Romain Guy#endif
75e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy
769d5316e3f56d138504565ff311145ac01621dff4Romain Guy// ----------------------------------------------------------------------------
779d5316e3f56d138504565ff311145ac01621dff4Romain Guy
789d5316e3f56d138504565ff311145ac01621dff4Romain Guystatic struct {
797ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    jmethodID set;
809d5316e3f56d138504565ff311145ac01621dff4Romain Guy} gRectClassInfo;
819d5316e3f56d138504565ff311145ac01621dff4Romain Guy
82e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// ----------------------------------------------------------------------------
83e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// Constructors
84e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// ----------------------------------------------------------------------------
85e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
865c13d89c1332fcc499379b9064b891187b75ca32Chet Haasestatic void android_view_GLES20Canvas_destroyRenderer(JNIEnv* env, jobject clazz,
8736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr) {
883b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
893b20251a355c88193c439f928a84ae69483fb488John Reck    RENDERER_LOGD("Destroy DisplayListRenderer");
90f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy    delete renderer;
91e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy}
92e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
93e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// ----------------------------------------------------------------------------
94e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// Setup
95e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// ----------------------------------------------------------------------------
96e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
977d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_setViewport(JNIEnv* env, jobject clazz,
9836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jint width, jint height) {
993b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
100f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy    renderer->setViewport(width, height);
101e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy}
102e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
103cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craikstatic void android_view_GLES20Canvas_setHighContrastText(JNIEnv* env, jobject clazz,
104cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik        jlong rendererPtr, jboolean highContrastText) {
105cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
106cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik    renderer->setHighContrastText(highContrastText);
107cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik}
108cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik
10944b2fe3fc114ee5f7273c6b0fee2cc999bf244a2Chet Haasestatic int android_view_GLES20Canvas_prepare(JNIEnv* env, jobject clazz,
11036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jboolean opaque) {
1113b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
11244b2fe3fc114ee5f7273c6b0fee2cc999bf244a2Chet Haase    return renderer->prepare(opaque);
113e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy}
114e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
11544b2fe3fc114ee5f7273c6b0fee2cc999bf244a2Chet Haasestatic int android_view_GLES20Canvas_prepareDirty(JNIEnv* env, jobject clazz,
11636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jint left, jint top, jint right, jint bottom,
1177d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy        jboolean opaque) {
1183b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
11944b2fe3fc114ee5f7273c6b0fee2cc999bf244a2Chet Haase    return renderer->prepareDirty(left, top, right, bottom, opaque);
1207d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy}
1217d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy
1227d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_finish(JNIEnv* env, jobject clazz,
12336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr) {
1243b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
125b025b9c8b4efefadb01937db61a1f8ee7d2452bfRomain Guy    renderer->finish();
126b025b9c8b4efefadb01937db61a1f8ee7d2452bfRomain Guy}
127b025b9c8b4efefadb01937db61a1f8ee7d2452bfRomain Guy
128ba9b613437c34873fa95800a25fc51720638267cChris Craikstatic void android_view_GLES20Canvas_setProperty(JNIEnv* env,
129ba9b613437c34873fa95800a25fc51720638267cChris Craik        jobject clazz, jstring name, jstring value) {
130ba9b613437c34873fa95800a25fc51720638267cChris Craik    if (!Caches::hasInstance()) {
131ba9b613437c34873fa95800a25fc51720638267cChris Craik        ALOGW("can't set property, no Caches instance");
132ba9b613437c34873fa95800a25fc51720638267cChris Craik        return;
133ba9b613437c34873fa95800a25fc51720638267cChris Craik    }
134ba9b613437c34873fa95800a25fc51720638267cChris Craik
135ba9b613437c34873fa95800a25fc51720638267cChris Craik    if (name == NULL || value == NULL) {
136ba9b613437c34873fa95800a25fc51720638267cChris Craik        ALOGW("can't set prop, null passed");
137ba9b613437c34873fa95800a25fc51720638267cChris Craik    }
138ba9b613437c34873fa95800a25fc51720638267cChris Craik
139ba9b613437c34873fa95800a25fc51720638267cChris Craik    const char* nameCharArray = env->GetStringUTFChars(name, NULL);
140ba9b613437c34873fa95800a25fc51720638267cChris Craik    const char* valueCharArray = env->GetStringUTFChars(value, NULL);
141ba9b613437c34873fa95800a25fc51720638267cChris Craik    Caches::getInstance().setTempProperty(nameCharArray, valueCharArray);
142ba9b613437c34873fa95800a25fc51720638267cChris Craik    env->ReleaseStringUTFChars(name, nameCharArray);
143ba9b613437c34873fa95800a25fc51720638267cChris Craik    env->ReleaseStringUTFChars(name, valueCharArray);
144ba9b613437c34873fa95800a25fc51720638267cChris Craik}
145ba9b613437c34873fa95800a25fc51720638267cChris Craik
146530041d3191ce817832a0108514617768e43cda6Romain Guy// ----------------------------------------------------------------------------
147530041d3191ce817832a0108514617768e43cda6Romain Guy// Functor
148530041d3191ce817832a0108514617768e43cda6Romain Guy// ----------------------------------------------------------------------------
149530041d3191ce817832a0108514617768e43cda6Romain Guy
1506554943a1dd6854c0f4976900956e556767b49e1Romain Guystatic jint android_view_GLES20Canvas_callDrawGLFunction(JNIEnv* env, jobject clazz,
15136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jlong functorPtr) {
1523b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
1539f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    Functor* functor = reinterpret_cast<Functor*>(functorPtr);
154cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy    android::uirenderer::Rect dirty;
155cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy    return renderer->callDrawGLFunction(functor, dirty);
156daf98e941e140e8739458126640183b9f296a2abChet Haase}
157daf98e941e140e8739458126640183b9f296a2abChet Haase
1588f3b8e32993d190a26c70c839a63d8ce4c3b16d9Romain Guy// ----------------------------------------------------------------------------
1598f3b8e32993d190a26c70c839a63d8ce4c3b16d9Romain Guy// Misc
1608f3b8e32993d190a26c70c839a63d8ce4c3b16d9Romain Guy// ----------------------------------------------------------------------------
1618f3b8e32993d190a26c70c839a63d8ce4c3b16d9Romain Guy
162f61970fc79e9c5cf340fa942597628242361864aRomain Guystatic jint android_view_GLES20Canvas_getMaxTextureWidth(JNIEnv* env, jobject clazz) {
163f61970fc79e9c5cf340fa942597628242361864aRomain Guy    return Caches::getInstance().maxTextureSize;
164f61970fc79e9c5cf340fa942597628242361864aRomain Guy}
165f61970fc79e9c5cf340fa942597628242361864aRomain Guy
166f61970fc79e9c5cf340fa942597628242361864aRomain Guystatic jint android_view_GLES20Canvas_getMaxTextureHeight(JNIEnv* env, jobject clazz) {
167f61970fc79e9c5cf340fa942597628242361864aRomain Guy    return Caches::getInstance().maxTextureSize;
168f61970fc79e9c5cf340fa942597628242361864aRomain Guy}
169f61970fc79e9c5cf340fa942597628242361864aRomain Guy
170e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// ----------------------------------------------------------------------------
171bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy// State
172bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy// ----------------------------------------------------------------------------
173bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
17436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhatstatic jint android_view_GLES20Canvas_save(JNIEnv* env, jobject clazz, jlong rendererPtr,
175bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy        jint flags) {
1763b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
177f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy    return renderer->save(flags);
178f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy}
179bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
1807d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic jint android_view_GLES20Canvas_getSaveCount(JNIEnv* env, jobject clazz,
18136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr) {
1823b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
183f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy    return renderer->getSaveCount();
184bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy}
185bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
1867d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_restore(JNIEnv* env, jobject clazz,
18736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr) {
1883b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
189f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy    renderer->restore();
190bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy}
191bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
1927d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_restoreToCount(JNIEnv* env, jobject clazz,
19336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jint saveCount) {
1943b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
195f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy    renderer->restoreToCount(saveCount);
196bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy}
197bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
198f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy// ----------------------------------------------------------------------------
199bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy// Layers
200bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy// ----------------------------------------------------------------------------
201bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy
2027d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic jint android_view_GLES20Canvas_saveLayer(JNIEnv* env, jobject clazz,
20336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jfloat left, jfloat top, jfloat right, jfloat bottom,
20436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong paintPtr, jint saveFlags) {
2053b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
2069f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
207bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy    return renderer->saveLayer(left, top, right, bottom, paint, saveFlags);
208bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy}
209bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy
210189887e0ae171c1b7601991442104a30e56c50abRomain Guystatic jint android_view_GLES20Canvas_saveLayerClip(JNIEnv* env, jobject clazz,
21136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jlong paintPtr, jint saveFlags) {
2123b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
2139f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
2143f085429fd47ebd32ac2463b3eae2a5a6c17be25Chris Craik    const android::uirenderer::Rect& bounds(renderer->getLocalClipBounds());
215189887e0ae171c1b7601991442104a30e56c50abRomain Guy    return renderer->saveLayer(bounds.left, bounds.top, bounds.right, bounds.bottom,
216189887e0ae171c1b7601991442104a30e56c50abRomain Guy            paint, saveFlags);
217189887e0ae171c1b7601991442104a30e56c50abRomain Guy}
218189887e0ae171c1b7601991442104a30e56c50abRomain Guy
2197d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic jint android_view_GLES20Canvas_saveLayerAlpha(JNIEnv* env, jobject clazz,
22036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jfloat left, jfloat top, jfloat right, jfloat bottom,
221bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy        jint alpha, jint saveFlags) {
2223b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
223bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy    return renderer->saveLayerAlpha(left, top, right, bottom, alpha, saveFlags);
224bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy}
225bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy
226189887e0ae171c1b7601991442104a30e56c50abRomain Guystatic jint android_view_GLES20Canvas_saveLayerAlphaClip(JNIEnv* env, jobject clazz,
22736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jint alpha, jint saveFlags) {
2283b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
2293f085429fd47ebd32ac2463b3eae2a5a6c17be25Chris Craik    const android::uirenderer::Rect& bounds(renderer->getLocalClipBounds());
230189887e0ae171c1b7601991442104a30e56c50abRomain Guy    return renderer->saveLayerAlpha(bounds.left, bounds.top, bounds.right, bounds.bottom,
231189887e0ae171c1b7601991442104a30e56c50abRomain Guy            alpha, saveFlags);
232189887e0ae171c1b7601991442104a30e56c50abRomain Guy}
233189887e0ae171c1b7601991442104a30e56c50abRomain Guy
234bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy// ----------------------------------------------------------------------------
235f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy// Clipping
236f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy// ----------------------------------------------------------------------------
237f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy
23836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhatstatic jboolean android_view_GLES20Canvas_quickReject(JNIEnv* env, jobject clazz,
23936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jfloat left, jfloat top, jfloat right, jfloat bottom) {
2403b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
24136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    const bool result = renderer->quickRejectConservative(left, top, right, bottom);
24236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    return result ? JNI_TRUE : JNI_FALSE;
243c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy}
244c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy
24536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhatstatic jboolean android_view_GLES20Canvas_clipRectF(JNIEnv* env, jobject clazz,
24636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jfloat left, jfloat top, jfloat right, jfloat bottom,
24736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jint op) {
2483b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
24936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    const bool result = renderer->clipRect(left, top, right, bottom,
25036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat                                           static_cast<SkRegion::Op>(op));
25136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    return result ? JNI_TRUE : JNI_FALSE;
252f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy}
253bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
25436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhatstatic jboolean android_view_GLES20Canvas_clipRect(JNIEnv* env, jobject clazz,
25536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jint left, jint top, jint right, jint bottom,
25636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jint op) {
2573b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
25836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    const bool result = renderer->clipRect(float(left), float(top), float(right),
25936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat                                           float(bottom),
26036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat                                           static_cast<SkRegion::Op>(op));
26136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    return result ? JNI_TRUE : JNI_FALSE;
262bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy}
263bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
26436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhatstatic jboolean android_view_GLES20Canvas_clipPath(JNIEnv* env, jobject clazz,
26536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jlong pathPtr, jint op) {
2663b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
2679f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPath* path = reinterpret_cast<SkPath*>(pathPtr);
26836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    const bool result = renderer->clipPath(path, static_cast<SkRegion::Op>(op));
26936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    return result ? JNI_TRUE : JNI_FALSE;
270735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy}
271735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy
27236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhatstatic jboolean android_view_GLES20Canvas_clipRegion(JNIEnv* env, jobject clazz,
27336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jlong regionPtr, jint op) {
2743b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
2759f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkRegion* region = reinterpret_cast<SkRegion*>(regionPtr);
27636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    const bool result = renderer->clipRegion(region, static_cast<SkRegion::Op>(op));
27736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    return result ? JNI_TRUE : JNI_FALSE;
278735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy}
279735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy
28036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhatstatic jboolean android_view_GLES20Canvas_getClipBounds(JNIEnv* env, jobject clazz,
28136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jobject rect) {
2823b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
2833f085429fd47ebd32ac2463b3eae2a5a6c17be25Chris Craik    const android::uirenderer::Rect& bounds(renderer->getLocalClipBounds());
2849d5316e3f56d138504565ff311145ac01621dff4Romain Guy
2857ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    env->CallVoidMethod(rect, gRectClassInfo.set,
2867ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy            int(bounds.left), int(bounds.top), int(bounds.right), int(bounds.bottom));
2879d5316e3f56d138504565ff311145ac01621dff4Romain Guy
28836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    return !bounds.isEmpty() ? JNI_TRUE : JNI_FALSE;
2899d5316e3f56d138504565ff311145ac01621dff4Romain Guy}
2909d5316e3f56d138504565ff311145ac01621dff4Romain Guy
291bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy// ----------------------------------------------------------------------------
292f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy// Transforms
293bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy// ----------------------------------------------------------------------------
294bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
2957d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_translate(JNIEnv* env, jobject clazz,
29636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jfloat dx, jfloat dy) {
2973b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
2987ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    renderer->translate(dx, dy);
299f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy}
300bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
3017d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_rotate(JNIEnv* env, jobject clazz,
30236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jfloat degrees) {
3033b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
3047ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    renderer->rotate(degrees);
305bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy}
306bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
3077d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_scale(JNIEnv* env, jobject clazz,
30836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jfloat sx, jfloat sy) {
3093b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
3107ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    renderer->scale(sx, sy);
311f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy}
312bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
3137d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_skew(JNIEnv* env, jobject clazz,
31436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jfloat sx, jfloat sy) {
3153b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
316807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy    renderer->skew(sx, sy);
317807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy}
318807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy
3197d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_setMatrix(JNIEnv* env, jobject clazz,
32036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jlong matrixPtr) {
3213b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
3229f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixPtr);
323139088228faa7f3c446af7387e017933998a5570Derek Sollenberger    renderer->setMatrix(matrix ? *matrix : SkMatrix::I());
324f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy}
325f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy
3267d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_getMatrix(JNIEnv* env, jobject clazz,
32736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jlong matrixPtr) {
3283b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
3299f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixPtr);
3307ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    renderer->getMatrix(matrix);
331f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy}
332f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy
3337d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_concatMatrix(JNIEnv* env, jobject clazz,
33436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jlong matrixPtr) {
3353b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
3369f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixPtr);
337139088228faa7f3c446af7387e017933998a5570Derek Sollenberger    renderer->concatMatrix(*matrix);
338bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy}
339bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
340bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy// ----------------------------------------------------------------------------
341bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy// Drawing
34285bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy// ----------------------------------------------------------------------------
34385bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy
3447d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawBitmap(JNIEnv* env, jobject clazz,
34536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jlong bitmapPtr, jbyteArray buffer,
34636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jfloat left, jfloat top, jlong paintPtr) {
3479f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapPtr);
3480c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik    // This object allows the renderer to allocate a global JNI ref to the buffer object.
3490c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik    JavaHeapBitmapRef bitmapRef(env, bitmap, buffer);
3500c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik
3513b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
3529f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
353dbd77cd444f89d94ec5333223c1bc17dbe0c90cdRomain Guy    renderer->drawBitmap(bitmap, left, top, paint);
354ce0537b80087a6225273040a987414b1dd081aa0Romain Guy}
355ce0537b80087a6225273040a987414b1dd081aa0Romain Guy
3567d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawBitmapRect(JNIEnv* env, jobject clazz,
35736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jlong bitmapPtr, jbyteArray buffer,
358ce0537b80087a6225273040a987414b1dd081aa0Romain Guy        float srcLeft, float srcTop, float srcRight, float srcBottom,
35936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        float dstLeft, float dstTop, float dstRight, float dstBottom, jlong paintPtr) {
3609f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapPtr);
3610c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik    // This object allows the renderer to allocate a global JNI ref to the buffer object.
3620c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik    JavaHeapBitmapRef bitmapRef(env, bitmap, buffer);
3630c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik
3643b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
3659f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
366dbd77cd444f89d94ec5333223c1bc17dbe0c90cdRomain Guy    renderer->drawBitmap(bitmap, srcLeft, srcTop, srcRight, srcBottom,
367dbd77cd444f89d94ec5333223c1bc17dbe0c90cdRomain Guy            dstLeft, dstTop, dstRight, dstBottom, paint);
368f86ef57f8bcd8ba43ce222ec6a8b4f67d3600640Romain Guy}
3698ba548f81d1ab5f1750cbf86098c4a14e0b8beadRomain Guy
3707d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawBitmapMatrix(JNIEnv* env, jobject clazz,
37136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jlong bitmapPtr, jbyteArray buffer,
37236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong matrixPtr, jlong paintPtr) {
3739f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapPtr);
3740c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik    // This object allows the renderer to allocate a global JNI ref to the buffer object.
3750c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik    JavaHeapBitmapRef bitmapRef(env, bitmap, buffer);
3760c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik
3773b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
3789f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixPtr);
3799f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
380139088228faa7f3c446af7387e017933998a5570Derek Sollenberger    renderer->drawBitmap(bitmap, *matrix, paint);
381ce0537b80087a6225273040a987414b1dd081aa0Romain Guy}
382ce0537b80087a6225273040a987414b1dd081aa0Romain Guy
383e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guystatic void android_view_GLES20Canvas_drawBitmapData(JNIEnv* env, jobject clazz,
38436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jintArray colors, jint offset, jint stride,
38536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jfloat left, jfloat top, jint width, jint height, jboolean hasAlpha, jlong paintPtr) {
38657ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III    // Note: If hasAlpha is false, kRGB_565_SkColorType will be used, which will
38757ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III    // correct the alphaType to kOpaque_SkAlphaType.
388b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed    const SkImageInfo info = SkImageInfo::Make(width, height,
389b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed                               hasAlpha ? kN32_SkColorType : kRGB_565_SkColorType,
390b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed                               kPremul_SkAlphaType);
39149c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    SkBitmap* bitmap = new SkBitmap;
392b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed    if (!bitmap->allocPixels(info)) {
39349c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy        delete bitmap;
394e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy        return;
395e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy    }
396e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy
39757ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III    if (!GraphicsJNI::SetPixels(env, colors, offset, stride, 0, 0, width, height, *bitmap)) {
39849c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy        delete bitmap;
399e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy        return;
400e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy    }
401e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy
4023b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
4039f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
40449c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    renderer->drawBitmapData(bitmap, left, top, paint);
40549c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy
406f23b25abfb76e75f63103abc882bc91b8327a957Chris Craik    // Note - bitmap isn't deleted as DisplayListRenderer owns it now
407e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy}
408e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy
4097d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawBitmapMesh(JNIEnv* env, jobject clazz,
41036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jlong bitmapPtr, jbyteArray buffer,
4110c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik        jint meshWidth, jint meshHeight, jfloatArray vertices, jint offset, jintArray colors,
41236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jint colorOffset, jlong paintPtr) {
4139f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapPtr);
4140c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik    // This object allows the renderer to allocate a global JNI ref to the buffer object.
4150c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik    JavaHeapBitmapRef bitmapRef(env, bitmap, buffer);
4160c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik
4175a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    jfloat* verticesArray = vertices ? env->GetFloatArrayElements(vertices, NULL) + offset : NULL;
4185a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    jint* colorsArray = colors ? env->GetIntArrayElements(colors, NULL) + colorOffset : NULL;
4195a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy
4203b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
4219f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
4225a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    renderer->drawBitmapMesh(bitmap, meshWidth, meshHeight, verticesArray, colorsArray, paint);
4235a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy
4245a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    if (vertices) env->ReleaseFloatArrayElements(vertices, verticesArray, 0);
4255a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    if (colors) env->ReleaseIntArrayElements(colors, colorsArray, 0);
4265a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy}
4275a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy
4287d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawPatch(JNIEnv* env, jobject clazz,
42936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jlong bitmapPtr, jbyteArray buffer, jlong patchPtr,
43036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        float left, float top, float right, float bottom, jlong paintPtr) {
4319f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapPtr);
4320c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik    // This object allows the renderer to allocate a global JNI ref to the buffer object.
4330c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik    JavaHeapBitmapRef bitmapRef(env, bitmap, buffer);
4340c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik
4353b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
4369f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    Res_png_9patch* patch = reinterpret_cast<Res_png_9patch*>(patchPtr);
4379f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
4383b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    renderer->drawPatch(bitmap, patch, left, top, right, bottom, paint);
439deba785f122a47915756ffd991f5540d952cf937Romain Guy}
440deba785f122a47915756ffd991f5540d952cf937Romain Guy
4417d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawColor(JNIEnv* env, jobject clazz,
4422ce932832e7caa1a6021539a9b7828ee5f49a610Chris Craik        jlong rendererPtr, jint color, jint modeHandle) {
4433b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
4442ce932832e7caa1a6021539a9b7828ee5f49a610Chris Craik    SkPorterDuff::Mode mode = static_cast<SkPorterDuff::Mode>(modeHandle);
4452ce932832e7caa1a6021539a9b7828ee5f49a610Chris Craik    renderer->drawColor(color, SkPorterDuff::ToXfermodeMode(mode));
44685bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy}
44785bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy
4487d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawRect(JNIEnv* env, jobject clazz,
44936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jfloat left, jfloat top, jfloat right, jfloat bottom,
45036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong paintPtr) {
4513b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
4529f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
453c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy    renderer->drawRect(left, top, right, bottom, paint);
454c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy}
455c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy
4567d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawRoundRect(JNIEnv* env, jobject clazz,
45736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jfloat left, jfloat top, jfloat right, jfloat bottom,
45836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jfloat rx, jfloat ry, jlong paintPtr) {
4593b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
4609f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
46101d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    renderer->drawRoundRect(left, top, right, bottom, rx, ry, paint);
46201d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy}
46301d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy
4647d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawCircle(JNIEnv* env, jobject clazz,
46536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jfloat x, jfloat y, jfloat radius, jlong paintPtr) {
4663b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
4679f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
46801d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    renderer->drawCircle(x, y, radius, paint);
46901d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy}
47001d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy
47152244fff29042926e21fa897ef5ab11148e35299John Reckstatic void android_view_GLES20Canvas_drawCircleProps(JNIEnv* env, jobject clazz,
47252244fff29042926e21fa897ef5ab11148e35299John Reck        jlong rendererPtr, jlong xPropPtr, jlong yPropPtr, jlong radiusPropPtr, jlong paintPropPtr) {
4733b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
47452244fff29042926e21fa897ef5ab11148e35299John Reck    CanvasPropertyPrimitive* xProp = reinterpret_cast<CanvasPropertyPrimitive*>(xPropPtr);
47552244fff29042926e21fa897ef5ab11148e35299John Reck    CanvasPropertyPrimitive* yProp = reinterpret_cast<CanvasPropertyPrimitive*>(yPropPtr);
47652244fff29042926e21fa897ef5ab11148e35299John Reck    CanvasPropertyPrimitive* radiusProp = reinterpret_cast<CanvasPropertyPrimitive*>(radiusPropPtr);
47752244fff29042926e21fa897ef5ab11148e35299John Reck    CanvasPropertyPaint* paintProp = reinterpret_cast<CanvasPropertyPaint*>(paintPropPtr);
47852244fff29042926e21fa897ef5ab11148e35299John Reck    renderer->drawCircle(xProp, yProp, radiusProp, paintProp);
47952244fff29042926e21fa897ef5ab11148e35299John Reck}
48052244fff29042926e21fa897ef5ab11148e35299John Reck
4817d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawOval(JNIEnv* env, jobject clazz,
48236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jfloat left, jfloat top, jfloat right, jfloat bottom,
48336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong paintPtr) {
4843b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
4859f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
486c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy    renderer->drawOval(left, top, right, bottom, paint);
487c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy}
488c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy
4897d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawArc(JNIEnv* env, jobject clazz,
49036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jfloat left, jfloat top, jfloat right, jfloat bottom,
49136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jfloat startAngle, jfloat sweepAngle, jboolean useCenter, jlong paintPtr) {
4923b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
4939f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
4948b2f5267f16c295f12faab810527cd6311997e34Romain Guy    renderer->drawArc(left, top, right, bottom, startAngle, sweepAngle, useCenter, paint);
4958b2f5267f16c295f12faab810527cd6311997e34Romain Guy}
4968b2f5267f16c295f12faab810527cd6311997e34Romain Guy
497672433d90fab7383cd28beac9d4485b566a90940Romain Guystatic void android_view_GLES20Canvas_drawRegionAsRects(JNIEnv* env, jobject clazz,
49836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jlong regionPtr, jlong paintPtr) {
4993b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
5009f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkRegion* region = reinterpret_cast<SkRegion*>(regionPtr);
5019f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
502672433d90fab7383cd28beac9d4485b566a90940Romain Guy    if (paint->getStyle() != SkPaint::kFill_Style ||
503672433d90fab7383cd28beac9d4485b566a90940Romain Guy            (paint->isAntiAlias() && !renderer->isCurrentTransformSimple())) {
504672433d90fab7383cd28beac9d4485b566a90940Romain Guy        SkRegion::Iterator it(*region);
505672433d90fab7383cd28beac9d4485b566a90940Romain Guy        while (!it.done()) {
506672433d90fab7383cd28beac9d4485b566a90940Romain Guy            const SkIRect& r = it.rect();
507672433d90fab7383cd28beac9d4485b566a90940Romain Guy            renderer->drawRect(r.fLeft, r.fTop, r.fRight, r.fBottom, paint);
508672433d90fab7383cd28beac9d4485b566a90940Romain Guy            it.next();
509672433d90fab7383cd28beac9d4485b566a90940Romain Guy        }
510672433d90fab7383cd28beac9d4485b566a90940Romain Guy    } else {
511672433d90fab7383cd28beac9d4485b566a90940Romain Guy        int count = 0;
512672433d90fab7383cd28beac9d4485b566a90940Romain Guy        Vector<float> rects;
513672433d90fab7383cd28beac9d4485b566a90940Romain Guy        SkRegion::Iterator it(*region);
514672433d90fab7383cd28beac9d4485b566a90940Romain Guy        while (!it.done()) {
515672433d90fab7383cd28beac9d4485b566a90940Romain Guy            const SkIRect& r = it.rect();
516672433d90fab7383cd28beac9d4485b566a90940Romain Guy            rects.push(r.fLeft);
517672433d90fab7383cd28beac9d4485b566a90940Romain Guy            rects.push(r.fTop);
518672433d90fab7383cd28beac9d4485b566a90940Romain Guy            rects.push(r.fRight);
519672433d90fab7383cd28beac9d4485b566a90940Romain Guy            rects.push(r.fBottom);
5202af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik            count += 4;
521672433d90fab7383cd28beac9d4485b566a90940Romain Guy            it.next();
522672433d90fab7383cd28beac9d4485b566a90940Romain Guy        }
523672433d90fab7383cd28beac9d4485b566a90940Romain Guy        renderer->drawRects(rects.array(), count, paint);
524a48a1a87ba17f20f7006eaab21dcedf86c015c13Romain Guy    }
525a48a1a87ba17f20f7006eaab21dcedf86c015c13Romain Guy}
526a48a1a87ba17f20f7006eaab21dcedf86c015c13Romain Guy
527ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guystatic void android_view_GLES20Canvas_drawPoints(JNIEnv* env, jobject clazz,
52836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jfloatArray points, jint offset, jint count, jlong paintPtr) {
5293b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
530ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy    jfloat* storage = env->GetFloatArrayElements(points, NULL);
5319f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
532ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy    renderer->drawPoints(storage + offset, count, paint);
533ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy    env->ReleaseFloatArrayElements(points, storage, 0);
534ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy}
535ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy
5367d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawPath(JNIEnv* env, jobject clazz,
53736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jlong pathPtr, jlong paintPtr) {
5383b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
5399f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPath* path = reinterpret_cast<SkPath*>(pathPtr);
5409f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
5417fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy    renderer->drawPath(path, paint);
5427fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy}
5437fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy
5447d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawLines(JNIEnv* env, jobject clazz,
54536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jfloatArray points, jint offset, jint count, jlong paintPtr) {
5463b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
547759ea80dca64ad652110a129e0d8bf93fea79f61Romain Guy    jfloat* storage = env->GetFloatArrayElements(points, NULL);
5489f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
549759ea80dca64ad652110a129e0d8bf93fea79f61Romain Guy    renderer->drawLines(storage + offset, count, paint);
550759ea80dca64ad652110a129e0d8bf93fea79f61Romain Guy    env->ReleaseFloatArrayElements(points, storage, 0);
551759ea80dca64ad652110a129e0d8bf93fea79f61Romain Guy}
552759ea80dca64ad652110a129e0d8bf93fea79f61Romain Guy
55385bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy// ----------------------------------------------------------------------------
5545ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy// Draw filters
5555ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy// ----------------------------------------------------------------------------
5565ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy
5575ff9df658230d49e42c43586997a02d8e4dd417eRomain Guystatic void android_view_GLES20Canvas_setupPaintFilter(JNIEnv* env, jobject clazz,
55836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jint clearBits, jint setBits) {
5593b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
5605ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    renderer->setupPaintFilter(clearBits, setBits);
5615ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy}
5625ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy
5635ff9df658230d49e42c43586997a02d8e4dd417eRomain Guystatic void android_view_GLES20Canvas_resetPaintFilter(JNIEnv* env, jobject clazz,
56436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr) {
5653b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
5665ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    renderer->resetPaintFilter();
5675ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy}
5685ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy
5695ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy// ----------------------------------------------------------------------------
570a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy// Text
571a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy// ----------------------------------------------------------------------------
572a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy
573f2114d5646194100242206b267ddd6e7194b7da9Raph Levienclass RenderTextFunctor {
574f2114d5646194100242206b267ddd6e7194b7da9Raph Levienpublic:
5753b20251a355c88193c439f928a84ae69483fb488John Reck    RenderTextFunctor(const Layout& layout, DisplayListRenderer* renderer, jfloat x, jfloat y,
576f2114d5646194100242206b267ddd6e7194b7da9Raph Levien                SkPaint* paint, uint16_t* glyphs, float* pos, float totalAdvance,
577f2114d5646194100242206b267ddd6e7194b7da9Raph Levien                uirenderer::Rect& bounds)
578f2114d5646194100242206b267ddd6e7194b7da9Raph Levien            : layout(layout), renderer(renderer), x(x), y(y), paint(paint), glyphs(glyphs),
579f2114d5646194100242206b267ddd6e7194b7da9Raph Levien            pos(pos), totalAdvance(totalAdvance), bounds(bounds) { }
5801fc0fa87d42ce9268ece76b85b9edc834593e53aRaph Levien    void operator()(size_t start, size_t end) {
581f2114d5646194100242206b267ddd6e7194b7da9Raph Levien        for (size_t i = start; i < end; i++) {
582f2114d5646194100242206b267ddd6e7194b7da9Raph Levien            glyphs[i] = layout.getGlyphId(i);
583f2114d5646194100242206b267ddd6e7194b7da9Raph Levien            pos[2 * i] = layout.getX(i);
584f2114d5646194100242206b267ddd6e7194b7da9Raph Levien            pos[2 * i + 1] = layout.getY(i);
585f2114d5646194100242206b267ddd6e7194b7da9Raph Levien        }
586f2114d5646194100242206b267ddd6e7194b7da9Raph Levien        size_t glyphsCount = end - start;
587f2114d5646194100242206b267ddd6e7194b7da9Raph Levien        int bytesCount = glyphsCount * sizeof(jchar);
588f2114d5646194100242206b267ddd6e7194b7da9Raph Levien        renderer->drawText((const char*) (glyphs + start), bytesCount, glyphsCount,
589f2114d5646194100242206b267ddd6e7194b7da9Raph Levien            x, y, pos + 2 * start, paint, totalAdvance, bounds);
590f2114d5646194100242206b267ddd6e7194b7da9Raph Levien    }
591f2114d5646194100242206b267ddd6e7194b7da9Raph Levienprivate:
592f2114d5646194100242206b267ddd6e7194b7da9Raph Levien    const Layout& layout;
5933b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer;
594f2114d5646194100242206b267ddd6e7194b7da9Raph Levien    jfloat x;
595f2114d5646194100242206b267ddd6e7194b7da9Raph Levien    jfloat y;
596f2114d5646194100242206b267ddd6e7194b7da9Raph Levien    SkPaint* paint;
597f2114d5646194100242206b267ddd6e7194b7da9Raph Levien    uint16_t* glyphs;
598f2114d5646194100242206b267ddd6e7194b7da9Raph Levien    float* pos;
599f2114d5646194100242206b267ddd6e7194b7da9Raph Levien    float totalAdvance;
600f2114d5646194100242206b267ddd6e7194b7da9Raph Levien    uirenderer::Rect& bounds;
601f2114d5646194100242206b267ddd6e7194b7da9Raph Levien};
602f2114d5646194100242206b267ddd6e7194b7da9Raph Levien
6033b20251a355c88193c439f928a84ae69483fb488John Reckstatic void renderTextLayout(DisplayListRenderer* renderer, Layout* layout,
6041a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien    jfloat x, jfloat y, SkPaint* paint) {
6051a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien    size_t nGlyphs = layout->nGlyphs();
6061a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien    float* pos = new float[nGlyphs * 2];
6071a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien    uint16_t* glyphs = new uint16_t[nGlyphs];
6081a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien    MinikinRect b;
6091a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien    layout->getBounds(&b);
6101a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien    android::uirenderer::Rect bounds(b.mLeft, b.mTop, b.mRight, b.mBottom);
6111a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien    bounds.translate(x, y);
6121a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien    float totalAdvance = layout->getAdvance();
6131a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien
614f2114d5646194100242206b267ddd6e7194b7da9Raph Levien    RenderTextFunctor f(*layout, renderer, x, y, paint, glyphs, pos, totalAdvance, bounds);
6151fc0fa87d42ce9268ece76b85b9edc834593e53aRaph Levien    MinikinUtils::forFontRun(*layout, paint, f);
6161a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien    delete[] glyphs;
6171a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien    delete[] pos;
6181a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien}
6191a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien
6203b20251a355c88193c439f928a84ae69483fb488John Reckstatic void renderText(DisplayListRenderer* renderer, const jchar* text, int count,
621051910b9f998030dacb8a0722588cc715813fde1Raph Levien        jfloat x, jfloat y, int bidiFlags, SkPaint* paint, TypefaceImpl* typeface) {
6221a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien    Layout layout;
623051910b9f998030dacb8a0722588cc715813fde1Raph Levien    std::string css = MinikinUtils::setLayoutProperties(&layout, paint, bidiFlags, typeface);
6246bfd7e7df3a9f9ea2f9e57a3552eed7f518be711Raph Levien    layout.doLayout(text, 0, count, count, css);
6253660789f06c5fbcb81e6c7c79612048bff8f0f66Raph Levien    x += MinikinUtils::xOffsetForTextAlign(paint, layout);
6261a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien    renderTextLayout(renderer, &layout, x, y, paint);
627e8e62a4a032a80409114a37908b5f18ab0080848Romain Guy}
628e8e62a4a032a80409114a37908b5f18ab0080848Romain Guy
6299d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levienclass RenderTextOnPathFunctor {
6309d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levienpublic:
6313b20251a355c88193c439f928a84ae69483fb488John Reck    RenderTextOnPathFunctor(const Layout& layout, DisplayListRenderer* renderer, float hOffset,
6329d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien                float vOffset, SkPaint* paint, SkPath* path)
6339d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien            : layout(layout), renderer(renderer), hOffset(hOffset), vOffset(vOffset),
6349d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien                paint(paint), path(path) {
6359d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien    }
6369d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien    void operator()(size_t start, size_t end) {
6379d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien        uint16_t glyphs[1];
6389d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien        for (size_t i = start; i < end; i++) {
6399d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien            glyphs[0] = layout.getGlyphId(i);
6409d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien            float x = hOffset + layout.getX(i);
6419d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien            float y = vOffset + layout.getY(i);
6429d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien            renderer->drawTextOnPath((const char*) glyphs, sizeof(glyphs), 1, path, x, y, paint);
6439d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien        }
6449d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien    }
6459d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levienprivate:
6469d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien    const Layout& layout;
6473b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer;
6489d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien    float hOffset;
6499d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien    float vOffset;
6509d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien    SkPaint* paint;
6519d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien    SkPath* path;
6529d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien};
6539d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien
6543b20251a355c88193c439f928a84ae69483fb488John Reckstatic void renderTextOnPath(DisplayListRenderer* renderer, const jchar* text, int count,
6559d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien        SkPath* path, jfloat hOffset, jfloat vOffset, int bidiFlags, SkPaint* paint,
6569d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien        TypefaceImpl* typeface) {
6579d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien    Layout layout;
6589d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien    std::string css = MinikinUtils::setLayoutProperties(&layout, paint, bidiFlags, typeface);
6599d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien    layout.doLayout(text, 0, count, count, css);
6609d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien    hOffset += MinikinUtils::hOffsetForTextAlign(paint, layout, *path);
6619d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien    SkPaint::Align align = paint->getTextAlign();
6629d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien    paint->setTextAlign(SkPaint::kLeft_Align);
6639d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien
6649d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien    RenderTextOnPathFunctor f(layout, renderer, hOffset, vOffset, paint, path);
6659d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien    MinikinUtils::forFontRun(layout, paint, f);
6669d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien    paint->setTextAlign(align);
667325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy}
668325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy
6693b20251a355c88193c439f928a84ae69483fb488John Reckstatic void renderTextRun(DisplayListRenderer* renderer, const jchar* text,
67061c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy        jint start, jint count, jint contextCount, jfloat x, jfloat y,
671051910b9f998030dacb8a0722588cc715813fde1Raph Levien        int bidiFlags, SkPaint* paint, TypefaceImpl* typeface) {
6721a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien    Layout layout;
673051910b9f998030dacb8a0722588cc715813fde1Raph Levien    std::string css = MinikinUtils::setLayoutProperties(&layout, paint, bidiFlags, typeface);
6746bfd7e7df3a9f9ea2f9e57a3552eed7f518be711Raph Levien    layout.doLayout(text, start, count, contextCount, css);
6753660789f06c5fbcb81e6c7c79612048bff8f0f66Raph Levien    x += MinikinUtils::xOffsetForTextAlign(paint, layout);
6761a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien    renderTextLayout(renderer, &layout, x, y, paint);
67761c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy}
67861c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy
6797d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawTextArray(JNIEnv* env, jobject clazz,
68036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jcharArray text, jint index, jint count,
681051910b9f998030dacb8a0722588cc715813fde1Raph Levien        jfloat x, jfloat y, jint bidiFlags, jlong paintPtr, jlong typefacePtr) {
6823b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
683a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy    jchar* textArray = env->GetCharArrayElements(text, NULL);
6849f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
6851a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien    TypefaceImpl* typeface = reinterpret_cast<TypefaceImpl*>(typefacePtr);
6869f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik
687051910b9f998030dacb8a0722588cc715813fde1Raph Levien    renderText(renderer, textArray + index, count, x, y, bidiFlags, paint, typeface);
688a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy    env->ReleaseCharArrayElements(text, textArray, JNI_ABORT);
689a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy}
690a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy
6917d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawText(JNIEnv* env, jobject clazz,
69236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jstring text, jint start, jint end,
693051910b9f998030dacb8a0722588cc715813fde1Raph Levien        jfloat x, jfloat y, jint bidiFlags, jlong paintPtr, jlong typefacePtr) {
6943b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
695a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy    const jchar* textArray = env->GetStringChars(text, NULL);
6969f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
6971a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien    TypefaceImpl* typeface = reinterpret_cast<TypefaceImpl*>(typefacePtr);
6989f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik
699051910b9f998030dacb8a0722588cc715813fde1Raph Levien    renderText(renderer, textArray + start, end - start, x, y, bidiFlags, paint, typeface);
700a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy    env->ReleaseStringChars(text, textArray);
701a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy}
702a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy
703325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guystatic void android_view_GLES20Canvas_drawTextArrayOnPath(JNIEnv* env, jobject clazz,
70436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jcharArray text, jint index, jint count,
7059d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien        jlong pathPtr, jfloat hOffset, jfloat vOffset, jint bidiFlags, jlong paintPtr,
7069d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien        jlong typefacePtr) {
7073b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
708325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    jchar* textArray = env->GetCharArrayElements(text, NULL);
7099f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPath* path = reinterpret_cast<SkPath*>(pathPtr);
7109f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
7119d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien    TypefaceImpl* typeface = reinterpret_cast<TypefaceImpl*>(typefacePtr);
7129f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik
713325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    renderTextOnPath(renderer, textArray + index, count, path,
7149d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien            hOffset, vOffset, bidiFlags, paint, typeface);
715325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    env->ReleaseCharArrayElements(text, textArray, JNI_ABORT);
716325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy}
717325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy
718325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guystatic void android_view_GLES20Canvas_drawTextOnPath(JNIEnv* env, jobject clazz,
71936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jstring text, jint start, jint end,
7209d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien        jlong pathPtr, jfloat hOffset, jfloat vOffset, jint bidiFlags, jlong paintPtr,
7219d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien        jlong typefacePtr) {
7223b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
723325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    const jchar* textArray = env->GetStringChars(text, NULL);
7249f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPath* path = reinterpret_cast<SkPath*>(pathPtr);
7259f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
7269d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien    TypefaceImpl* typeface = reinterpret_cast<TypefaceImpl*>(typefacePtr);
7279f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik
728325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    renderTextOnPath(renderer, textArray + start, end - start, path,
7299d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien            hOffset, vOffset, bidiFlags, paint, typeface);
730325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    env->ReleaseStringChars(text, textArray);
731325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy}
732325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy
7337d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawTextRunArray(JNIEnv* env, jobject clazz,
73436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jcharArray text, jint index, jint count,
735051910b9f998030dacb8a0722588cc715813fde1Raph Levien        jint contextIndex, jint contextCount, jfloat x, jfloat y, jboolean isRtl,
7361a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien        jlong paintPtr, jlong typefacePtr) {
7373b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
73861c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy    jchar* textArray = env->GetCharArrayElements(text, NULL);
7399f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
7401a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien    TypefaceImpl* typeface = reinterpret_cast<TypefaceImpl*>(typefacePtr);
7419f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik
742051910b9f998030dacb8a0722588cc715813fde1Raph Levien    int bidiFlags = isRtl ? kBidi_Force_RTL : kBidi_Force_LTR;
74361c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy    renderTextRun(renderer, textArray + contextIndex, index - contextIndex,
744051910b9f998030dacb8a0722588cc715813fde1Raph Levien            count, contextCount, x, y, bidiFlags, paint, typeface);
74561c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy    env->ReleaseCharArrayElements(text, textArray, JNI_ABORT);
74661c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy }
74761c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy
7487d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawTextRun(JNIEnv* env, jobject clazz,
74936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jstring text, jint start, jint end,
750051910b9f998030dacb8a0722588cc715813fde1Raph Levien        jint contextStart, int contextEnd, jfloat x, jfloat y, jboolean isRtl,
7511a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien        jlong paintPtr, jlong typefacePtr) {
7523b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
75361c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy    const jchar* textArray = env->GetStringChars(text, NULL);
75461c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy    jint count = end - start;
75561c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy    jint contextCount = contextEnd - contextStart;
7569f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
7571a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien    TypefaceImpl* typeface = reinterpret_cast<TypefaceImpl*>(typefacePtr);
7589f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik
759051910b9f998030dacb8a0722588cc715813fde1Raph Levien    int bidiFlags = isRtl ? kBidi_Force_RTL : kBidi_Force_LTR;
76061c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy    renderTextRun(renderer, textArray + contextStart, start - contextStart,
761051910b9f998030dacb8a0722588cc715813fde1Raph Levien            count, contextCount, x, y, bidiFlags, paint, typeface);
76261c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy    env->ReleaseStringChars(text, textArray);
76361c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy}
76461c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy
765b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy// ----------------------------------------------------------------------------
766b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy// Display lists
767b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy// ----------------------------------------------------------------------------
768b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
76944fd8d24f761f82d21e9b00932648a1b6bf91449John Reckstatic jlong android_view_GLES20Canvas_finishRecording(JNIEnv* env,
77044fd8d24f761f82d21e9b00932648a1b6bf91449John Reck        jobject clazz, jlong rendererPtr) {
7719f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
77244fd8d24f761f82d21e9b00932648a1b6bf91449John Reck    return reinterpret_cast<jlong>(renderer->finishRecording());
773162a0217563f4665da6eb183dfce0fef740f641fJeff Brown}
774162a0217563f4665da6eb183dfce0fef740f641fJeff Brown
7753f085429fd47ebd32ac2463b3eae2a5a6c17be25Chris Craikstatic jlong android_view_GLES20Canvas_createDisplayListRenderer(JNIEnv* env, jobject clazz) {
77644fd8d24f761f82d21e9b00932648a1b6bf91449John Reck    return reinterpret_cast<jlong>(new DisplayListRenderer);
7775977baa1fa24125c148a72699b53e62abaf08960Chet Haase}
7785977baa1fa24125c148a72699b53e62abaf08960Chet Haase
779a7090e0cfd7c719a6d4c03aae34f5db98754cbddChris Craikstatic jint android_view_GLES20Canvas_drawRenderNode(JNIEnv* env,
780a7090e0cfd7c719a6d4c03aae34f5db98754cbddChris Craik        jobject clazz, jlong rendererPtr, jlong renderNodePtr,
7811271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        jobject dirty, jint flags) {
7823b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
783a7090e0cfd7c719a6d4c03aae34f5db98754cbddChris Craik    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
784cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy    android::uirenderer::Rect bounds;
785a7090e0cfd7c719a6d4c03aae34f5db98754cbddChris Craik    status_t status = renderer->drawRenderNode(renderNode, bounds, flags);
7866554943a1dd6854c0f4976900956e556767b49e1Romain Guy    if (status != DrawGlInfo::kStatusDone && dirty != NULL) {
787cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy        env->CallVoidMethod(dirty, gRectClassInfo.set,
788cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy                int(bounds.left), int(bounds.top), int(bounds.right), int(bounds.bottom));
789cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy    }
7906554943a1dd6854c0f4976900956e556767b49e1Romain Guy    return status;
791b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
792b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
7936c319ca1275c8db892c39b48fc54864c949f9171Romain Guy// ----------------------------------------------------------------------------
7946c319ca1275c8db892c39b48fc54864c949f9171Romain Guy// Layers
7956c319ca1275c8db892c39b48fc54864c949f9171Romain Guy// ----------------------------------------------------------------------------
7966c319ca1275c8db892c39b48fc54864c949f9171Romain Guy
7977d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawLayer(JNIEnv* env, jobject clazz,
79836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jlong layerPtr, jfloat x, jfloat y) {
7993b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
8009f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    Layer* layer = reinterpret_cast<Layer*>(layerPtr);
801a08f95cfeca7217f9c533b03663bf0dceedd259aChris Craik    renderer->drawLayer(layer, x, y);
8026c319ca1275c8db892c39b48fc54864c949f9171Romain Guy}
8036c319ca1275c8db892c39b48fc54864c949f9171Romain Guy
804163935113919a184122b8b3bd672ef08c8df65dcRomain Guy#endif // USE_OPENGL_RENDERER
805163935113919a184122b8b3bd672ef08c8df65dcRomain Guy
806163935113919a184122b8b3bd672ef08c8df65dcRomain Guy// ----------------------------------------------------------------------------
807163935113919a184122b8b3bd672ef08c8df65dcRomain Guy// Common
808163935113919a184122b8b3bd672ef08c8df65dcRomain Guy// ----------------------------------------------------------------------------
809163935113919a184122b8b3bd672ef08c8df65dcRomain Guy
810163935113919a184122b8b3bd672ef08c8df65dcRomain Guystatic jboolean android_view_GLES20Canvas_isAvailable(JNIEnv* env, jobject clazz) {
811163935113919a184122b8b3bd672ef08c8df65dcRomain Guy#ifdef USE_OPENGL_RENDERER
8124406345cd62d3687ce590c357854472f7f906e6cJesse Hall    char prop[PROPERTY_VALUE_MAX];
8134406345cd62d3687ce590c357854472f7f906e6cJesse Hall    if (property_get("ro.kernel.qemu", prop, NULL) == 0) {
8144406345cd62d3687ce590c357854472f7f906e6cJesse Hall        // not in the emulator
8154406345cd62d3687ce590c357854472f7f906e6cJesse Hall        return JNI_TRUE;
8164406345cd62d3687ce590c357854472f7f906e6cJesse Hall    }
8174406345cd62d3687ce590c357854472f7f906e6cJesse Hall    // In the emulator this property will be set to 1 when hardware GLES is
8184406345cd62d3687ce590c357854472f7f906e6cJesse Hall    // enabled, 0 otherwise. On old emulator versions it will be undefined.
8194406345cd62d3687ce590c357854472f7f906e6cJesse Hall    property_get("ro.kernel.qemu.gles", prop, "0");
8204406345cd62d3687ce590c357854472f7f906e6cJesse Hall    return atoi(prop) == 1 ? JNI_TRUE : JNI_FALSE;
821163935113919a184122b8b3bd672ef08c8df65dcRomain Guy#else
822163935113919a184122b8b3bd672ef08c8df65dcRomain Guy    return JNI_FALSE;
823163935113919a184122b8b3bd672ef08c8df65dcRomain Guy#endif
824163935113919a184122b8b3bd672ef08c8df65dcRomain Guy}
825163935113919a184122b8b3bd672ef08c8df65dcRomain Guy
826a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy// ----------------------------------------------------------------------------
8279c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase// Logging
8289c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase// ----------------------------------------------------------------------------
8299c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase
8309c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haasestatic void
83165b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guyandroid_app_ActivityThread_dumpGraphics(JNIEnv* env, jobject clazz, jobject javaFileDescriptor) {
832905787a7c91d23daa4efc3d16bd8cbf1a683e779Chet Haase#ifdef USE_OPENGL_RENDERER
833a3804cf77f0edd93f6247a055cdafb856b117eecElliott Hughes    int fd = jniGetFDFromFileDescriptor(env, javaFileDescriptor);
834e18264b079481a244b30e3f71012c53bbd861f92John Reck    android::uirenderer::RenderNode::outputLogBuffer(fd);
835905787a7c91d23daa4efc3d16bd8cbf1a683e779Chet Haase#endif // USE_OPENGL_RENDERER
8369c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase}
8379c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase
8389c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase// ----------------------------------------------------------------------------
839e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// JNI Glue
840e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// ----------------------------------------------------------------------------
841e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
842e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guyconst char* const kClassPathName = "android/view/GLES20Canvas";
843e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
844e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guystatic JNINativeMethod gMethods[] = {
84561c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy    { "nIsAvailable",       "()Z",             (void*) android_view_GLES20Canvas_isAvailable },
846163935113919a184122b8b3bd672ef08c8df65dcRomain Guy
84761c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy#ifdef USE_OPENGL_RENDERER
8487d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy
84936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDestroyRenderer",   "(J)V",            (void*) android_view_GLES20Canvas_destroyRenderer },
85036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nSetViewport",       "(JII)V",          (void*) android_view_GLES20Canvas_setViewport },
851cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik    { "nSetHighContrastText","(JZ)V",          (void*) android_view_GLES20Canvas_setHighContrastText },
85236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nPrepare",           "(JZ)I",           (void*) android_view_GLES20Canvas_prepare },
85336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nPrepareDirty",      "(JIIIIZ)I",       (void*) android_view_GLES20Canvas_prepareDirty },
85436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nFinish",            "(J)V",            (void*) android_view_GLES20Canvas_finish },
855ba9b613437c34873fa95800a25fc51720638267cChris Craik    { "nSetProperty",           "(Ljava/lang/String;Ljava/lang/String;)V",
856ba9b613437c34873fa95800a25fc51720638267cChris Craik            (void*) android_view_GLES20Canvas_setProperty },
85761c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy
85836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nCallDrawGLFunction", "(JJ)I",          (void*) android_view_GLES20Canvas_callDrawGLFunction },
8597d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy
86036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nSave",              "(JI)I",           (void*) android_view_GLES20Canvas_save },
86136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nRestore",           "(J)V",            (void*) android_view_GLES20Canvas_restore },
86236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nRestoreToCount",    "(JI)V",           (void*) android_view_GLES20Canvas_restoreToCount },
86336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nGetSaveCount",      "(J)I",            (void*) android_view_GLES20Canvas_getSaveCount },
86436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat
86536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nSaveLayer",         "(JFFFFJI)I",      (void*) android_view_GLES20Canvas_saveLayer },
86636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nSaveLayer",         "(JJI)I",          (void*) android_view_GLES20Canvas_saveLayerClip },
86736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nSaveLayerAlpha",    "(JFFFFII)I",      (void*) android_view_GLES20Canvas_saveLayerAlpha },
86836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nSaveLayerAlpha",    "(JII)I",          (void*) android_view_GLES20Canvas_saveLayerAlphaClip },
86936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat
87036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nQuickReject",       "(JFFFF)Z",        (void*) android_view_GLES20Canvas_quickReject },
87136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nClipRect",          "(JFFFFI)Z",       (void*) android_view_GLES20Canvas_clipRectF },
87236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nClipRect",          "(JIIIII)Z",       (void*) android_view_GLES20Canvas_clipRect },
87336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nClipPath",          "(JJI)Z",          (void*) android_view_GLES20Canvas_clipPath },
87436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nClipRegion",        "(JJI)Z",          (void*) android_view_GLES20Canvas_clipRegion },
87536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat
87636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nTranslate",         "(JFF)V",          (void*) android_view_GLES20Canvas_translate },
87736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nRotate",            "(JF)V",           (void*) android_view_GLES20Canvas_rotate },
87836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nScale",             "(JFF)V",          (void*) android_view_GLES20Canvas_scale },
87936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nSkew",              "(JFF)V",          (void*) android_view_GLES20Canvas_skew },
88036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat
88136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nSetMatrix",         "(JJ)V",           (void*) android_view_GLES20Canvas_setMatrix },
88236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nGetMatrix",         "(JJ)V",           (void*) android_view_GLES20Canvas_getMatrix },
88336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nConcatMatrix",      "(JJ)V",           (void*) android_view_GLES20Canvas_concatMatrix },
88436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat
88536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawBitmap",        "(JJ[BFFJ)V",      (void*) android_view_GLES20Canvas_drawBitmap },
88636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawBitmap",        "(JJ[BFFFFFFFFJ)V",(void*) android_view_GLES20Canvas_drawBitmapRect },
88736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawBitmap",        "(JJ[BJJ)V",       (void*) android_view_GLES20Canvas_drawBitmapMatrix },
88836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawBitmap",        "(J[IIIFFIIZJ)V",  (void*) android_view_GLES20Canvas_drawBitmapData },
88936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat
89036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawBitmapMesh",    "(JJ[BII[FI[IIJ)V",(void*) android_view_GLES20Canvas_drawBitmapMesh },
89136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat
89236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawPatch",         "(JJ[BJFFFFJ)V",   (void*) android_view_GLES20Canvas_drawPatch },
89336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat
89436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawColor",         "(JII)V",          (void*) android_view_GLES20Canvas_drawColor },
89536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawRect",          "(JFFFFJ)V",       (void*) android_view_GLES20Canvas_drawRect },
89636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawRects",         "(JJJ)V",          (void*) android_view_GLES20Canvas_drawRegionAsRects },
89736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawRoundRect",     "(JFFFFFFJ)V",     (void*) android_view_GLES20Canvas_drawRoundRect },
89836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawCircle",        "(JFFFJ)V",        (void*) android_view_GLES20Canvas_drawCircle },
89952244fff29042926e21fa897ef5ab11148e35299John Reck    { "nDrawCircle",        "(JJJJJ)V",        (void*) android_view_GLES20Canvas_drawCircleProps },
90036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawOval",          "(JFFFFJ)V",       (void*) android_view_GLES20Canvas_drawOval },
90136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawArc",           "(JFFFFFFZJ)V",    (void*) android_view_GLES20Canvas_drawArc },
90236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawPoints",        "(J[FIIJ)V",       (void*) android_view_GLES20Canvas_drawPoints },
90336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat
90436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawPath",          "(JJJ)V",          (void*) android_view_GLES20Canvas_drawPath },
90536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawLines",         "(J[FIIJ)V",       (void*) android_view_GLES20Canvas_drawLines },
90636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat
90736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nSetupPaintFilter",  "(JII)V",          (void*) android_view_GLES20Canvas_setupPaintFilter },
90836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nResetPaintFilter",  "(J)V",            (void*) android_view_GLES20Canvas_resetPaintFilter },
90936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat
9101a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien    { "nDrawText",          "(J[CIIFFIJJ)V",   (void*) android_view_GLES20Canvas_drawTextArray },
9111a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien    { "nDrawText",          "(JLjava/lang/String;IIFFIJJ)V",
912a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy            (void*) android_view_GLES20Canvas_drawText },
913a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy
9149d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien    { "nDrawTextOnPath",    "(J[CIIJFFIJJ)V",  (void*) android_view_GLES20Canvas_drawTextArrayOnPath },
9159d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien    { "nDrawTextOnPath",    "(JLjava/lang/String;IIJFFIJJ)V",
916325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy            (void*) android_view_GLES20Canvas_drawTextOnPath },
917325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy
918051910b9f998030dacb8a0722588cc715813fde1Raph Levien    { "nDrawTextRun",       "(J[CIIIIFFZJJ)V",  (void*) android_view_GLES20Canvas_drawTextRunArray },
919051910b9f998030dacb8a0722588cc715813fde1Raph Levien    { "nDrawTextRun",       "(JLjava/lang/String;IIIIFFZJJ)V",
92061c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy            (void*) android_view_GLES20Canvas_drawTextRun },
92161c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy
922a7090e0cfd7c719a6d4c03aae34f5db98754cbddChris Craik    { "nGetClipBounds",     "(JLandroid/graphics/Rect;)Z", (void*) android_view_GLES20Canvas_getClipBounds },
923b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
924a7090e0cfd7c719a6d4c03aae34f5db98754cbddChris Craik    { "nFinishRecording",   "(J)J",      (void*) android_view_GLES20Canvas_finishRecording },
925a7090e0cfd7c719a6d4c03aae34f5db98754cbddChris Craik    { "nDrawRenderNode",    "(JJLandroid/graphics/Rect;I)I", (void*) android_view_GLES20Canvas_drawRenderNode },
92613631f3da855f200a151e7837ed9f6b079622b58Romain Guy
92736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nCreateDisplayListRenderer", "()J",     (void*) android_view_GLES20Canvas_createDisplayListRenderer },
92813631f3da855f200a151e7837ed9f6b079622b58Romain Guy
92936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawLayer",              "(JJFF)V",    (void*) android_view_GLES20Canvas_drawLayer },
93036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat
931f61970fc79e9c5cf340fa942597628242361864aRomain Guy    { "nGetMaximumTextureWidth",  "()I",       (void*) android_view_GLES20Canvas_getMaxTextureWidth },
932f61970fc79e9c5cf340fa942597628242361864aRomain Guy    { "nGetMaximumTextureHeight", "()I",       (void*) android_view_GLES20Canvas_getMaxTextureHeight },
933f61970fc79e9c5cf340fa942597628242361864aRomain Guy
934163935113919a184122b8b3bd672ef08c8df65dcRomain Guy#endif
935e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy};
936e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
9379c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haasestatic JNINativeMethod gActivityThreadMethods[] = {
9389c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    { "dumpGraphicsInfo",        "(Ljava/io/FileDescriptor;)V",
9399c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase                                               (void*) android_app_ActivityThread_dumpGraphics }
9409c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase};
9419c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase
9429c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase
943163935113919a184122b8b3bd672ef08c8df65dcRomain Guy#ifdef USE_OPENGL_RENDERER
944163935113919a184122b8b3bd672ef08c8df65dcRomain Guy    #define FIND_CLASS(var, className) \
945163935113919a184122b8b3bd672ef08c8df65dcRomain Guy            var = env->FindClass(className); \
94617cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro            LOG_FATAL_IF(! var, "Unable to find class " className);
94717cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro
948163935113919a184122b8b3bd672ef08c8df65dcRomain Guy    #define GET_METHOD_ID(var, clazz, methodName, methodDescriptor) \
949163935113919a184122b8b3bd672ef08c8df65dcRomain Guy            var = env->GetMethodID(clazz, methodName, methodDescriptor); \
950163935113919a184122b8b3bd672ef08c8df65dcRomain Guy            LOG_FATAL_IF(! var, "Unable to find method " methodName);
951163935113919a184122b8b3bd672ef08c8df65dcRomain Guy#else
952163935113919a184122b8b3bd672ef08c8df65dcRomain Guy    #define FIND_CLASS(var, className)
953163935113919a184122b8b3bd672ef08c8df65dcRomain Guy    #define GET_METHOD_ID(var, clazz, methodName, methodDescriptor)
954163935113919a184122b8b3bd672ef08c8df65dcRomain Guy#endif
9559d5316e3f56d138504565ff311145ac01621dff4Romain Guy
956e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guyint register_android_view_GLES20Canvas(JNIEnv* env) {
95717cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro    jclass clazz;
95817cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro    FIND_CLASS(clazz, "android/graphics/Rect");
95917cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro    GET_METHOD_ID(gRectClassInfo.set, clazz, "set", "(IIII)V");
9609d5316e3f56d138504565ff311145ac01621dff4Romain Guy
961e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    return AndroidRuntime::registerNativeMethods(env, kClassPathName, gMethods, NELEM(gMethods));
962e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy}
963e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
9649c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haaseconst char* const kActivityThreadPathName = "android/app/ActivityThread";
9659c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase
9666be3d5561cbeccf0a8257a4acb155657f868e548Romain Guyint register_android_app_ActivityThread(JNIEnv* env) {
9676be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy    return AndroidRuntime::registerNativeMethods(env, kActivityThreadPathName,
9689c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase            gActivityThreadMethods, NELEM(gActivityThreadMethods));
9699c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase}
9709c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase
971e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy};
972