android_view_GLES20Canvas.cpp revision 52244fff29042926e21fa897ef5ab11148e35299
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
233b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy#include "android_view_GraphicBuffer.h"
243b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy
25e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy#include <android_runtime/AndroidRuntime.h>
26e5e0c50f7dfaccc220725c5595080e921ffda1e4Romain Guy#include <android_runtime/android_graphics_SurfaceTexture.h>
276554943a1dd6854c0f4976900956e556767b49e1Romain Guy
28b13b9bdad2baf6ad1ec2e56b6b7598fa20f55fc4Mathias Agopian#include <androidfw/ResourceTypes.h>
29e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
303b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy#include <gui/GLConsumer.h>
313b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy
326554943a1dd6854c0f4976900956e556767b49e1Romain Guy#include <private/hwui/DrawGlInfo.h>
336554943a1dd6854c0f4976900956e556767b49e1Romain Guy
346554943a1dd6854c0f4976900956e556767b49e1Romain Guy#include <cutils/properties.h>
358f0095cd33558e9cc8a440047908e53b68906f5fRomain Guy
36ce0537b80087a6225273040a987414b1dd081aa0Romain Guy#include <SkBitmap.h>
37c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy#include <SkCanvas.h>
38f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy#include <SkMatrix.h>
39c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy#include <SkPaint.h>
40079ba2c85b15e882629b8d188f5fbdb42f7f8eeaRomain Guy#include <SkRegion.h>
41a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy#include <SkScalerContext.h>
4261c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy#include <SkTemplates.h>
4385bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy#include <SkXfermode.h>
44e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
45b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy#include <DisplayListRenderer.h>
466c319ca1275c8db892c39b48fc54864c949f9171Romain Guy#include <LayerRenderer.h>
4785bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy#include <OpenGLRenderer.h>
4806f96e2652e4855b6520ad9dd70583677605b79aRomain Guy#include <SkiaShader.h>
490baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy#include <Stencil.h>
509d5316e3f56d138504565ff311145ac01621dff4Romain Guy#include <Rect.h>
51113e0824d6bddf4376240681f9cf6a2deded9498John Reck#include <RenderNode.h>
5252244fff29042926e21fa897ef5ab11148e35299John Reck#include <CanvasProperty.h>
5385bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy
54d1d4bb70704e8f37d0823837eacdae21ebe0ed05Romain Guy#include <TextLayout.h>
55b02d0ca5553300063e4332192632312600caf4b9Fabrice Di Meglio#include <TextLayoutCache.h>
56e8e62a4a032a80409114a37908b5f18ab0080848Romain Guy
57e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guynamespace android {
58e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
599d5316e3f56d138504565ff311145ac01621dff4Romain Guyusing namespace uirenderer;
609d5316e3f56d138504565ff311145ac01621dff4Romain Guy
61163935113919a184122b8b3bd672ef08c8df65dcRomain Guy/**
62163935113919a184122b8b3bd672ef08c8df65dcRomain Guy * Note: OpenGLRenderer JNI layer is generated and compiled only on supported
63163935113919a184122b8b3bd672ef08c8df65dcRomain Guy *       devices. This means all the logic must be compiled only when the
64163935113919a184122b8b3bd672ef08c8df65dcRomain Guy *       preprocessor variable USE_OPENGL_RENDERER is defined.
65163935113919a184122b8b3bd672ef08c8df65dcRomain Guy */
66163935113919a184122b8b3bd672ef08c8df65dcRomain Guy#ifdef USE_OPENGL_RENDERER
67163935113919a184122b8b3bd672ef08c8df65dcRomain Guy
68244ada1d35419b7be9de0fc833bb03955b725ffaRomain Guy// ----------------------------------------------------------------------------
69bdb801ca993bcccbf2a4c2401d1720c3fa523777Romain Guy// Defines
70244ada1d35419b7be9de0fc833bb03955b725ffaRomain Guy// ----------------------------------------------------------------------------
71bdb801ca993bcccbf2a4c2401d1720c3fa523777Romain Guy
72bdb801ca993bcccbf2a4c2401d1720c3fa523777Romain Guy// Debug
73e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy#define DEBUG_RENDERER 0
74bdb801ca993bcccbf2a4c2401d1720c3fa523777Romain Guy
75bdb801ca993bcccbf2a4c2401d1720c3fa523777Romain Guy// Debug
76bdb801ca993bcccbf2a4c2401d1720c3fa523777Romain Guy#if DEBUG_RENDERER
775baa3a62a97544669fba6d65a11c07f252e654ddSteve Block    #define RENDERER_LOGD(...) ALOGD(__VA_ARGS__)
78bdb801ca993bcccbf2a4c2401d1720c3fa523777Romain Guy#else
79bdb801ca993bcccbf2a4c2401d1720c3fa523777Romain Guy    #define RENDERER_LOGD(...)
80bdb801ca993bcccbf2a4c2401d1720c3fa523777Romain Guy#endif
81e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy
82a168d7372132d6c87835878794b6ed43d0d282fdRomain Guy#define MODIFIER_SHADOW 1
83a168d7372132d6c87835878794b6ed43d0d282fdRomain Guy#define MODIFIER_SHADER 2
84a168d7372132d6c87835878794b6ed43d0d282fdRomain Guy
859d5316e3f56d138504565ff311145ac01621dff4Romain Guy// ----------------------------------------------------------------------------
869d5316e3f56d138504565ff311145ac01621dff4Romain Guy
879d5316e3f56d138504565ff311145ac01621dff4Romain Guystatic struct {
887ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    jmethodID set;
899d5316e3f56d138504565ff311145ac01621dff4Romain Guy} gRectClassInfo;
909d5316e3f56d138504565ff311145ac01621dff4Romain Guy
91e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// ----------------------------------------------------------------------------
92244ada1d35419b7be9de0fc833bb03955b725ffaRomain Guy// Caching
937d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy// ----------------------------------------------------------------------------
947d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy
95bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guystatic void android_view_GLES20Canvas_flushCaches(JNIEnv* env, jobject clazz,
9636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jint mode) {
97bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy    if (Caches::hasInstance()) {
9836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        Caches::getInstance().flush(static_cast<Caches::FlushMode>(mode));
99bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy    }
100bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy}
101bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy
10236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhatstatic jboolean android_view_GLES20Canvas_initCaches(JNIEnv* env, jobject clazz) {
1038ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy    if (Caches::hasInstance()) {
10436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        return Caches::getInstance().init() ? JNI_TRUE : JNI_FALSE;
1058ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy    }
10636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    return JNI_FALSE;
1078ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy}
1088ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy
1098ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guystatic void android_view_GLES20Canvas_terminateCaches(JNIEnv* env, jobject clazz) {
1108ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy    if (Caches::hasInstance()) {
1118ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy        Caches::getInstance().terminate();
1128ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy    }
1138ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy}
1148ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy
1157d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy// ----------------------------------------------------------------------------
1163b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy// Caching
1173b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy// ----------------------------------------------------------------------------
1183b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy
1193b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guystatic void android_view_GLES20Canvas_initAtlas(JNIEnv* env, jobject clazz,
12017ab38f8a87bc90eab11373f878f220ce3031de6Ashok Bhat        jobject graphicBuffer, jlongArray atlasMapArray, jint count) {
1213b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy
1223b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    sp<GraphicBuffer> buffer = graphicBufferForJavaObject(env, graphicBuffer);
12317ab38f8a87bc90eab11373f878f220ce3031de6Ashok Bhat    jlong* jAtlasMap = env->GetLongArrayElements(atlasMapArray, NULL);
12417ab38f8a87bc90eab11373f878f220ce3031de6Ashok Bhat    Caches::getInstance().assetAtlas.init(buffer, jAtlasMap, count);
12517ab38f8a87bc90eab11373f878f220ce3031de6Ashok Bhat    env->ReleaseLongArrayElements(atlasMapArray, jAtlasMap, 0);
1263b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy}
1273b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy
1283b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy// ----------------------------------------------------------------------------
129e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// Constructors
130e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// ----------------------------------------------------------------------------
131e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
13236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhatstatic jlong android_view_GLES20Canvas_createRenderer(JNIEnv* env, jobject clazz) {
133bdb801ca993bcccbf2a4c2401d1720c3fa523777Romain Guy    RENDERER_LOGD("Create OpenGLRenderer");
13487e2f757be9b24d369bab354e37c276e851b1fc7Romain Guy    OpenGLRenderer* renderer = new OpenGLRenderer();
13587e2f757be9b24d369bab354e37c276e851b1fc7Romain Guy    renderer->initProperties();
13636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    return reinterpret_cast<jlong>(renderer);
137e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy}
138e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
1395c13d89c1332fcc499379b9064b891187b75ca32Chet Haasestatic void android_view_GLES20Canvas_destroyRenderer(JNIEnv* env, jobject clazz,
14036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr) {
1419f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
142bdb801ca993bcccbf2a4c2401d1720c3fa523777Romain Guy    RENDERER_LOGD("Destroy OpenGLRenderer");
143f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy    delete renderer;
144e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy}
145e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
146e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// ----------------------------------------------------------------------------
147e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// Setup
148e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// ----------------------------------------------------------------------------
149e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
1507d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_setViewport(JNIEnv* env, jobject clazz,
15136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jint width, jint height) {
1529f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
153f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy    renderer->setViewport(width, height);
154e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy}
155e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
15644b2fe3fc114ee5f7273c6b0fee2cc999bf244a2Chet Haasestatic int android_view_GLES20Canvas_prepare(JNIEnv* env, jobject clazz,
15736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jboolean opaque) {
1589f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
15944b2fe3fc114ee5f7273c6b0fee2cc999bf244a2Chet Haase    return renderer->prepare(opaque);
160e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy}
161e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
16244b2fe3fc114ee5f7273c6b0fee2cc999bf244a2Chet Haasestatic int android_view_GLES20Canvas_prepareDirty(JNIEnv* env, jobject clazz,
16336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jint left, jint top, jint right, jint bottom,
1647d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy        jboolean opaque) {
1659f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
16644b2fe3fc114ee5f7273c6b0fee2cc999bf244a2Chet Haase    return renderer->prepareDirty(left, top, right, bottom, opaque);
1677d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy}
1687d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy
1697d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_finish(JNIEnv* env, jobject clazz,
17036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr) {
1719f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
172b025b9c8b4efefadb01937db61a1f8ee7d2452bfRomain Guy    renderer->finish();
173b025b9c8b4efefadb01937db61a1f8ee7d2452bfRomain Guy}
174b025b9c8b4efefadb01937db61a1f8ee7d2452bfRomain Guy
175530041d3191ce817832a0108514617768e43cda6Romain Guystatic jint android_view_GLES20Canvas_getStencilSize(JNIEnv* env, jobject clazz) {
1760baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy    return Stencil::getStencilSize();
177530041d3191ce817832a0108514617768e43cda6Romain Guy}
178530041d3191ce817832a0108514617768e43cda6Romain Guy
179ba9b613437c34873fa95800a25fc51720638267cChris Craikstatic void android_view_GLES20Canvas_setProperty(JNIEnv* env,
180ba9b613437c34873fa95800a25fc51720638267cChris Craik        jobject clazz, jstring name, jstring value) {
181ba9b613437c34873fa95800a25fc51720638267cChris Craik    if (!Caches::hasInstance()) {
182ba9b613437c34873fa95800a25fc51720638267cChris Craik        ALOGW("can't set property, no Caches instance");
183ba9b613437c34873fa95800a25fc51720638267cChris Craik        return;
184ba9b613437c34873fa95800a25fc51720638267cChris Craik    }
185ba9b613437c34873fa95800a25fc51720638267cChris Craik
186ba9b613437c34873fa95800a25fc51720638267cChris Craik    if (name == NULL || value == NULL) {
187ba9b613437c34873fa95800a25fc51720638267cChris Craik        ALOGW("can't set prop, null passed");
188ba9b613437c34873fa95800a25fc51720638267cChris Craik    }
189ba9b613437c34873fa95800a25fc51720638267cChris Craik
190ba9b613437c34873fa95800a25fc51720638267cChris Craik    const char* nameCharArray = env->GetStringUTFChars(name, NULL);
191ba9b613437c34873fa95800a25fc51720638267cChris Craik    const char* valueCharArray = env->GetStringUTFChars(value, NULL);
192ba9b613437c34873fa95800a25fc51720638267cChris Craik    Caches::getInstance().setTempProperty(nameCharArray, valueCharArray);
193ba9b613437c34873fa95800a25fc51720638267cChris Craik    env->ReleaseStringUTFChars(name, nameCharArray);
194ba9b613437c34873fa95800a25fc51720638267cChris Craik    env->ReleaseStringUTFChars(name, valueCharArray);
195ba9b613437c34873fa95800a25fc51720638267cChris Craik}
196ba9b613437c34873fa95800a25fc51720638267cChris Craik
197530041d3191ce817832a0108514617768e43cda6Romain Guy// ----------------------------------------------------------------------------
198530041d3191ce817832a0108514617768e43cda6Romain Guy// Functor
199530041d3191ce817832a0108514617768e43cda6Romain Guy// ----------------------------------------------------------------------------
200530041d3191ce817832a0108514617768e43cda6Romain Guy
2016554943a1dd6854c0f4976900956e556767b49e1Romain Guystatic jint android_view_GLES20Canvas_callDrawGLFunction(JNIEnv* env, jobject clazz,
20236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jlong functorPtr) {
2039f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
2049f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    Functor* functor = reinterpret_cast<Functor*>(functorPtr);
205cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy    android::uirenderer::Rect dirty;
206cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy    return renderer->callDrawGLFunction(functor, dirty);
207daf98e941e140e8739458126640183b9f296a2abChet Haase}
208daf98e941e140e8739458126640183b9f296a2abChet Haase
209ba6be8a62dcdb3ffd210cd36b9af4e3a658eac47Romain Guystatic void android_view_GLES20Canvas_detachFunctor(JNIEnv* env,
210017546e65280a3389b6167f5fc3b5d1c3001154aNarayan Kamath        jobject clazz, jlong rendererPtr, jlong functorPtr) {
2119f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
2129f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    Functor* functor = reinterpret_cast<Functor*>(functorPtr);
213ba6be8a62dcdb3ffd210cd36b9af4e3a658eac47Romain Guy    renderer->detachFunctor(functor);
214ba6be8a62dcdb3ffd210cd36b9af4e3a658eac47Romain Guy}
215ba6be8a62dcdb3ffd210cd36b9af4e3a658eac47Romain Guy
216ba6be8a62dcdb3ffd210cd36b9af4e3a658eac47Romain Guystatic void android_view_GLES20Canvas_attachFunctor(JNIEnv* env,
21736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jobject clazz, jlong rendererPtr, jlong functorPtr) {
2189f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
2199f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    Functor* functor = reinterpret_cast<Functor*>(functorPtr);
220ba6be8a62dcdb3ffd210cd36b9af4e3a658eac47Romain Guy    renderer->attachFunctor(functor);
221ba6be8a62dcdb3ffd210cd36b9af4e3a658eac47Romain Guy}
222ba6be8a62dcdb3ffd210cd36b9af4e3a658eac47Romain Guy
2238f3b8e32993d190a26c70c839a63d8ce4c3b16d9Romain Guystatic jint android_view_GLES20Canvas_invokeFunctors(JNIEnv* env,
22436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jobject clazz, jlong rendererPtr, jobject dirty) {
2259f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
2268f3b8e32993d190a26c70c839a63d8ce4c3b16d9Romain Guy    android::uirenderer::Rect bounds;
2278f3b8e32993d190a26c70c839a63d8ce4c3b16d9Romain Guy    status_t status = renderer->invokeFunctors(bounds);
2288f3b8e32993d190a26c70c839a63d8ce4c3b16d9Romain Guy    if (status != DrawGlInfo::kStatusDone && dirty != NULL) {
2298f3b8e32993d190a26c70c839a63d8ce4c3b16d9Romain Guy        env->CallVoidMethod(dirty, gRectClassInfo.set,
2308f3b8e32993d190a26c70c839a63d8ce4c3b16d9Romain Guy                int(bounds.left), int(bounds.top), int(bounds.right), int(bounds.bottom));
2318f3b8e32993d190a26c70c839a63d8ce4c3b16d9Romain Guy    }
2328f3b8e32993d190a26c70c839a63d8ce4c3b16d9Romain Guy    return status;
2338f3b8e32993d190a26c70c839a63d8ce4c3b16d9Romain Guy}
2348f3b8e32993d190a26c70c839a63d8ce4c3b16d9Romain Guy
2358f3b8e32993d190a26c70c839a63d8ce4c3b16d9Romain Guy// ----------------------------------------------------------------------------
2368f3b8e32993d190a26c70c839a63d8ce4c3b16d9Romain Guy// Misc
2378f3b8e32993d190a26c70c839a63d8ce4c3b16d9Romain Guy// ----------------------------------------------------------------------------
2388f3b8e32993d190a26c70c839a63d8ce4c3b16d9Romain Guy
239f61970fc79e9c5cf340fa942597628242361864aRomain Guystatic jint android_view_GLES20Canvas_getMaxTextureWidth(JNIEnv* env, jobject clazz) {
240f61970fc79e9c5cf340fa942597628242361864aRomain Guy    return Caches::getInstance().maxTextureSize;
241f61970fc79e9c5cf340fa942597628242361864aRomain Guy}
242f61970fc79e9c5cf340fa942597628242361864aRomain Guy
243f61970fc79e9c5cf340fa942597628242361864aRomain Guystatic jint android_view_GLES20Canvas_getMaxTextureHeight(JNIEnv* env, jobject clazz) {
244f61970fc79e9c5cf340fa942597628242361864aRomain Guy    return Caches::getInstance().maxTextureSize;
245f61970fc79e9c5cf340fa942597628242361864aRomain Guy}
246f61970fc79e9c5cf340fa942597628242361864aRomain Guy
247e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// ----------------------------------------------------------------------------
248bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy// State
249bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy// ----------------------------------------------------------------------------
250bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
25136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhatstatic jint android_view_GLES20Canvas_save(JNIEnv* env, jobject clazz, jlong rendererPtr,
252bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy        jint flags) {
2539f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
254f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy    return renderer->save(flags);
255f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy}
256bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
2577d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic jint android_view_GLES20Canvas_getSaveCount(JNIEnv* env, jobject clazz,
25836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr) {
2599f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
260f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy    return renderer->getSaveCount();
261bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy}
262bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
2637d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_restore(JNIEnv* env, jobject clazz,
26436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr) {
2659f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
266f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy    renderer->restore();
267bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy}
268bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
2697d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_restoreToCount(JNIEnv* env, jobject clazz,
27036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jint saveCount) {
2719f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
272f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy    renderer->restoreToCount(saveCount);
273bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy}
274bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
275f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy// ----------------------------------------------------------------------------
276bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy// Layers
277bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy// ----------------------------------------------------------------------------
278bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy
2797d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic jint android_view_GLES20Canvas_saveLayer(JNIEnv* env, jobject clazz,
28036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jfloat left, jfloat top, jfloat right, jfloat bottom,
28136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong paintPtr, jint saveFlags) {
2829f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
2839f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
284bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy    return renderer->saveLayer(left, top, right, bottom, paint, saveFlags);
285bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy}
286bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy
287189887e0ae171c1b7601991442104a30e56c50abRomain Guystatic jint android_view_GLES20Canvas_saveLayerClip(JNIEnv* env, jobject clazz,
28836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jlong paintPtr, jint saveFlags) {
2899f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
2909f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
2913f085429fd47ebd32ac2463b3eae2a5a6c17be25Chris Craik    const android::uirenderer::Rect& bounds(renderer->getLocalClipBounds());
292189887e0ae171c1b7601991442104a30e56c50abRomain Guy    return renderer->saveLayer(bounds.left, bounds.top, bounds.right, bounds.bottom,
293189887e0ae171c1b7601991442104a30e56c50abRomain Guy            paint, saveFlags);
294189887e0ae171c1b7601991442104a30e56c50abRomain Guy}
295189887e0ae171c1b7601991442104a30e56c50abRomain Guy
2967d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic jint android_view_GLES20Canvas_saveLayerAlpha(JNIEnv* env, jobject clazz,
29736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jfloat left, jfloat top, jfloat right, jfloat bottom,
298bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy        jint alpha, jint saveFlags) {
2999f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
300bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy    return renderer->saveLayerAlpha(left, top, right, bottom, alpha, saveFlags);
301bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy}
302bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy
303189887e0ae171c1b7601991442104a30e56c50abRomain Guystatic jint android_view_GLES20Canvas_saveLayerAlphaClip(JNIEnv* env, jobject clazz,
30436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jint alpha, jint saveFlags) {
3059f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
3063f085429fd47ebd32ac2463b3eae2a5a6c17be25Chris Craik    const android::uirenderer::Rect& bounds(renderer->getLocalClipBounds());
307189887e0ae171c1b7601991442104a30e56c50abRomain Guy    return renderer->saveLayerAlpha(bounds.left, bounds.top, bounds.right, bounds.bottom,
308189887e0ae171c1b7601991442104a30e56c50abRomain Guy            alpha, saveFlags);
309189887e0ae171c1b7601991442104a30e56c50abRomain Guy}
310189887e0ae171c1b7601991442104a30e56c50abRomain Guy
311bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy// ----------------------------------------------------------------------------
312f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy// Clipping
313f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy// ----------------------------------------------------------------------------
314f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy
31536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhatstatic jboolean android_view_GLES20Canvas_quickReject(JNIEnv* env, jobject clazz,
31636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jfloat left, jfloat top, jfloat right, jfloat bottom) {
3179f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
31836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    const bool result = renderer->quickRejectConservative(left, top, right, bottom);
31936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    return result ? JNI_TRUE : JNI_FALSE;
320c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy}
321c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy
32236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhatstatic jboolean android_view_GLES20Canvas_clipRectF(JNIEnv* env, jobject clazz,
32336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jfloat left, jfloat top, jfloat right, jfloat bottom,
32436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jint op) {
3259f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
32636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    const bool result = renderer->clipRect(left, top, right, bottom,
32736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat                                           static_cast<SkRegion::Op>(op));
32836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    return result ? JNI_TRUE : JNI_FALSE;
329f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy}
330bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
33136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhatstatic jboolean android_view_GLES20Canvas_clipRect(JNIEnv* env, jobject clazz,
33236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jint left, jint top, jint right, jint bottom,
33336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jint op) {
3349f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
33536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    const bool result = renderer->clipRect(float(left), float(top), float(right),
33636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat                                           float(bottom),
33736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat                                           static_cast<SkRegion::Op>(op));
33836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    return result ? JNI_TRUE : JNI_FALSE;
339bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy}
340bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
34136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhatstatic jboolean android_view_GLES20Canvas_clipPath(JNIEnv* env, jobject clazz,
34236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jlong pathPtr, jint op) {
3439f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
3449f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPath* path = reinterpret_cast<SkPath*>(pathPtr);
34536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    const bool result = renderer->clipPath(path, static_cast<SkRegion::Op>(op));
34636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    return result ? JNI_TRUE : JNI_FALSE;
347735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy}
348735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy
34936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhatstatic jboolean android_view_GLES20Canvas_clipRegion(JNIEnv* env, jobject clazz,
35036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jlong regionPtr, jint op) {
3519f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
3529f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkRegion* region = reinterpret_cast<SkRegion*>(regionPtr);
35336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    const bool result = renderer->clipRegion(region, static_cast<SkRegion::Op>(op));
35436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    return result ? JNI_TRUE : JNI_FALSE;
355735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy}
356735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy
35736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhatstatic jboolean android_view_GLES20Canvas_getClipBounds(JNIEnv* env, jobject clazz,
35836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jobject rect) {
3599f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
3603f085429fd47ebd32ac2463b3eae2a5a6c17be25Chris Craik    const android::uirenderer::Rect& bounds(renderer->getLocalClipBounds());
3619d5316e3f56d138504565ff311145ac01621dff4Romain Guy
3627ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    env->CallVoidMethod(rect, gRectClassInfo.set,
3637ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy            int(bounds.left), int(bounds.top), int(bounds.right), int(bounds.bottom));
3649d5316e3f56d138504565ff311145ac01621dff4Romain Guy
36536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    return !bounds.isEmpty() ? JNI_TRUE : JNI_FALSE;
3669d5316e3f56d138504565ff311145ac01621dff4Romain Guy}
3679d5316e3f56d138504565ff311145ac01621dff4Romain Guy
368bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy// ----------------------------------------------------------------------------
369f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy// Transforms
370bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy// ----------------------------------------------------------------------------
371bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
3727d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_translate(JNIEnv* env, jobject clazz,
37336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jfloat dx, jfloat dy) {
3749f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
3757ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    renderer->translate(dx, dy);
376f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy}
377bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
3787d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_rotate(JNIEnv* env, jobject clazz,
37936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jfloat degrees) {
3809f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
3817ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    renderer->rotate(degrees);
382bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy}
383bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
3847d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_scale(JNIEnv* env, jobject clazz,
38536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jfloat sx, jfloat sy) {
3869f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
3877ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    renderer->scale(sx, sy);
388f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy}
389bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
3907d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_skew(JNIEnv* env, jobject clazz,
39136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jfloat sx, jfloat sy) {
3929f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
393807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy    renderer->skew(sx, sy);
394807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy}
395807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy
3967d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_setMatrix(JNIEnv* env, jobject clazz,
39736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jlong matrixPtr) {
3989f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
3999f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixPtr);
4007ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    renderer->setMatrix(matrix);
401f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy}
402f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy
4037d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_getMatrix(JNIEnv* env, jobject clazz,
40436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jlong matrixPtr) {
4059f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
4069f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixPtr);
4077ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    renderer->getMatrix(matrix);
408f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy}
409f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy
4107d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_concatMatrix(JNIEnv* env, jobject clazz,
41136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jlong matrixPtr) {
4129f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
4139f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixPtr);
4147ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    renderer->concatMatrix(matrix);
415bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy}
416bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
417bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy// ----------------------------------------------------------------------------
418bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy// Drawing
41985bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy// ----------------------------------------------------------------------------
42085bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy
4217d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawBitmap(JNIEnv* env, jobject clazz,
42236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jlong bitmapPtr, jbyteArray buffer,
42336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jfloat left, jfloat top, jlong paintPtr) {
4249f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapPtr);
4250c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik    // This object allows the renderer to allocate a global JNI ref to the buffer object.
4260c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik    JavaHeapBitmapRef bitmapRef(env, bitmap, buffer);
4270c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik
4289f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
4299f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
430dbd77cd444f89d94ec5333223c1bc17dbe0c90cdRomain Guy    renderer->drawBitmap(bitmap, left, top, paint);
431ce0537b80087a6225273040a987414b1dd081aa0Romain Guy}
432ce0537b80087a6225273040a987414b1dd081aa0Romain Guy
4337d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawBitmapRect(JNIEnv* env, jobject clazz,
43436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jlong bitmapPtr, jbyteArray buffer,
435ce0537b80087a6225273040a987414b1dd081aa0Romain Guy        float srcLeft, float srcTop, float srcRight, float srcBottom,
43636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        float dstLeft, float dstTop, float dstRight, float dstBottom, jlong paintPtr) {
4379f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapPtr);
4380c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik    // This object allows the renderer to allocate a global JNI ref to the buffer object.
4390c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik    JavaHeapBitmapRef bitmapRef(env, bitmap, buffer);
4400c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik
4419f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
4429f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
443dbd77cd444f89d94ec5333223c1bc17dbe0c90cdRomain Guy    renderer->drawBitmap(bitmap, srcLeft, srcTop, srcRight, srcBottom,
444dbd77cd444f89d94ec5333223c1bc17dbe0c90cdRomain Guy            dstLeft, dstTop, dstRight, dstBottom, paint);
445f86ef57f8bcd8ba43ce222ec6a8b4f67d3600640Romain Guy}
4468ba548f81d1ab5f1750cbf86098c4a14e0b8beadRomain Guy
4477d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawBitmapMatrix(JNIEnv* env, jobject clazz,
44836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jlong bitmapPtr, jbyteArray buffer,
44936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong matrixPtr, jlong paintPtr) {
4509f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapPtr);
4510c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik    // This object allows the renderer to allocate a global JNI ref to the buffer object.
4520c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik    JavaHeapBitmapRef bitmapRef(env, bitmap, buffer);
4530c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik
4549f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
4559f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixPtr);
4569f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
457dbd77cd444f89d94ec5333223c1bc17dbe0c90cdRomain Guy    renderer->drawBitmap(bitmap, matrix, paint);
458ce0537b80087a6225273040a987414b1dd081aa0Romain Guy}
459ce0537b80087a6225273040a987414b1dd081aa0Romain Guy
460e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guystatic void android_view_GLES20Canvas_drawBitmapData(JNIEnv* env, jobject clazz,
46136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jintArray colors, jint offset, jint stride,
46236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jfloat left, jfloat top, jint width, jint height, jboolean hasAlpha, jlong paintPtr) {
46349c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    SkBitmap* bitmap = new SkBitmap;
46449c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    bitmap->setConfig(hasAlpha ? SkBitmap::kARGB_8888_Config : SkBitmap::kRGB_565_Config,
46549c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy            width, height);
466e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy
46749c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    if (!bitmap->allocPixels()) {
46849c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy        delete bitmap;
469e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy        return;
470e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy    }
471e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy
4721abf5d62429e5a9329520b2f7c2b5a5e7a8e72ecChris Craik    if (!GraphicsJNI::SetPixels(env, colors, offset, stride, 0, 0, width, height, *bitmap, true)) {
47349c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy        delete bitmap;
474e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy        return;
475e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy    }
476e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy
4779f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
4789f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
47949c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    renderer->drawBitmapData(bitmap, left, top, paint);
48049c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy
48149c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    // If the renderer is a deferred renderer it will own the bitmap
482b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik    if (!renderer->isRecording()) {
48349c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy        delete bitmap;
48449c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    }
485e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy}
486e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy
4877d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawBitmapMesh(JNIEnv* env, jobject clazz,
48836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jlong bitmapPtr, jbyteArray buffer,
4890c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik        jint meshWidth, jint meshHeight, jfloatArray vertices, jint offset, jintArray colors,
49036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jint colorOffset, jlong paintPtr) {
4919f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapPtr);
4920c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik    // This object allows the renderer to allocate a global JNI ref to the buffer object.
4930c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik    JavaHeapBitmapRef bitmapRef(env, bitmap, buffer);
4940c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik
4955a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    jfloat* verticesArray = vertices ? env->GetFloatArrayElements(vertices, NULL) + offset : NULL;
4965a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    jint* colorsArray = colors ? env->GetIntArrayElements(colors, NULL) + colorOffset : NULL;
4975a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy
4989f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
4999f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
5005a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    renderer->drawBitmapMesh(bitmap, meshWidth, meshHeight, verticesArray, colorsArray, paint);
5015a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy
5025a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    if (vertices) env->ReleaseFloatArrayElements(vertices, verticesArray, 0);
5035a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    if (colors) env->ReleaseIntArrayElements(colors, colorsArray, 0);
5045a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy}
5055a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy
5067d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawPatch(JNIEnv* env, jobject clazz,
50736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jlong bitmapPtr, jbyteArray buffer, jlong patchPtr,
50836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        float left, float top, float right, float bottom, jlong paintPtr) {
5099f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapPtr);
5100c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik    // This object allows the renderer to allocate a global JNI ref to the buffer object.
5110c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik    JavaHeapBitmapRef bitmapRef(env, bitmap, buffer);
5120c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik
5139f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
5149f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    Res_png_9patch* patch = reinterpret_cast<Res_png_9patch*>(patchPtr);
5159f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
5163b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    renderer->drawPatch(bitmap, patch, left, top, right, bottom, paint);
517deba785f122a47915756ffd991f5540d952cf937Romain Guy}
518deba785f122a47915756ffd991f5540d952cf937Romain Guy
5197d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawColor(JNIEnv* env, jobject clazz,
52036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jint color, jint mode) {
5219f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
52236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    renderer->drawColor(color, static_cast<SkXfermode::Mode>(mode));
52385bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy}
52485bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy
5257d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawRect(JNIEnv* env, jobject clazz,
52636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jfloat left, jfloat top, jfloat right, jfloat bottom,
52736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong paintPtr) {
5289f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
5299f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
530c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy    renderer->drawRect(left, top, right, bottom, paint);
531c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy}
532c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy
5337d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawRoundRect(JNIEnv* env, jobject clazz,
53436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jfloat left, jfloat top, jfloat right, jfloat bottom,
53536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jfloat rx, jfloat ry, jlong paintPtr) {
5369f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
5379f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
53801d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    renderer->drawRoundRect(left, top, right, bottom, rx, ry, paint);
53901d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy}
54001d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy
5417d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawCircle(JNIEnv* env, jobject clazz,
54236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jfloat x, jfloat y, jfloat radius, jlong paintPtr) {
5439f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
5449f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
54501d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    renderer->drawCircle(x, y, radius, paint);
54601d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy}
54701d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy
54852244fff29042926e21fa897ef5ab11148e35299John Reckstatic void android_view_GLES20Canvas_drawCircleProps(JNIEnv* env, jobject clazz,
54952244fff29042926e21fa897ef5ab11148e35299John Reck        jlong rendererPtr, jlong xPropPtr, jlong yPropPtr, jlong radiusPropPtr, jlong paintPropPtr) {
55052244fff29042926e21fa897ef5ab11148e35299John Reck    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
55152244fff29042926e21fa897ef5ab11148e35299John Reck    CanvasPropertyPrimitive* xProp = reinterpret_cast<CanvasPropertyPrimitive*>(xPropPtr);
55252244fff29042926e21fa897ef5ab11148e35299John Reck    CanvasPropertyPrimitive* yProp = reinterpret_cast<CanvasPropertyPrimitive*>(yPropPtr);
55352244fff29042926e21fa897ef5ab11148e35299John Reck    CanvasPropertyPrimitive* radiusProp = reinterpret_cast<CanvasPropertyPrimitive*>(radiusPropPtr);
55452244fff29042926e21fa897ef5ab11148e35299John Reck    CanvasPropertyPaint* paintProp = reinterpret_cast<CanvasPropertyPaint*>(paintPropPtr);
55552244fff29042926e21fa897ef5ab11148e35299John Reck    renderer->drawCircle(xProp, yProp, radiusProp, paintProp);
55652244fff29042926e21fa897ef5ab11148e35299John Reck}
55752244fff29042926e21fa897ef5ab11148e35299John Reck
5587d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawOval(JNIEnv* env, jobject clazz,
55936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jfloat left, jfloat top, jfloat right, jfloat bottom,
56036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong paintPtr) {
5619f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
5629f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
563c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy    renderer->drawOval(left, top, right, bottom, paint);
564c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy}
565c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy
5667d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawArc(JNIEnv* env, jobject clazz,
56736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jfloat left, jfloat top, jfloat right, jfloat bottom,
56836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jfloat startAngle, jfloat sweepAngle, jboolean useCenter, jlong paintPtr) {
5699f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
5709f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
5718b2f5267f16c295f12faab810527cd6311997e34Romain Guy    renderer->drawArc(left, top, right, bottom, startAngle, sweepAngle, useCenter, paint);
5728b2f5267f16c295f12faab810527cd6311997e34Romain Guy}
5738b2f5267f16c295f12faab810527cd6311997e34Romain Guy
574672433d90fab7383cd28beac9d4485b566a90940Romain Guystatic void android_view_GLES20Canvas_drawRegionAsRects(JNIEnv* env, jobject clazz,
57536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jlong regionPtr, jlong paintPtr) {
5769f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
5779f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkRegion* region = reinterpret_cast<SkRegion*>(regionPtr);
5789f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
579672433d90fab7383cd28beac9d4485b566a90940Romain Guy    if (paint->getStyle() != SkPaint::kFill_Style ||
580672433d90fab7383cd28beac9d4485b566a90940Romain Guy            (paint->isAntiAlias() && !renderer->isCurrentTransformSimple())) {
581672433d90fab7383cd28beac9d4485b566a90940Romain Guy        SkRegion::Iterator it(*region);
582672433d90fab7383cd28beac9d4485b566a90940Romain Guy        while (!it.done()) {
583672433d90fab7383cd28beac9d4485b566a90940Romain Guy            const SkIRect& r = it.rect();
584672433d90fab7383cd28beac9d4485b566a90940Romain Guy            renderer->drawRect(r.fLeft, r.fTop, r.fRight, r.fBottom, paint);
585672433d90fab7383cd28beac9d4485b566a90940Romain Guy            it.next();
586672433d90fab7383cd28beac9d4485b566a90940Romain Guy        }
587672433d90fab7383cd28beac9d4485b566a90940Romain Guy    } else {
588672433d90fab7383cd28beac9d4485b566a90940Romain Guy        int count = 0;
589672433d90fab7383cd28beac9d4485b566a90940Romain Guy        Vector<float> rects;
590672433d90fab7383cd28beac9d4485b566a90940Romain Guy        SkRegion::Iterator it(*region);
591672433d90fab7383cd28beac9d4485b566a90940Romain Guy        while (!it.done()) {
592672433d90fab7383cd28beac9d4485b566a90940Romain Guy            const SkIRect& r = it.rect();
593672433d90fab7383cd28beac9d4485b566a90940Romain Guy            rects.push(r.fLeft);
594672433d90fab7383cd28beac9d4485b566a90940Romain Guy            rects.push(r.fTop);
595672433d90fab7383cd28beac9d4485b566a90940Romain Guy            rects.push(r.fRight);
596672433d90fab7383cd28beac9d4485b566a90940Romain Guy            rects.push(r.fBottom);
5972af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik            count += 4;
598672433d90fab7383cd28beac9d4485b566a90940Romain Guy            it.next();
599672433d90fab7383cd28beac9d4485b566a90940Romain Guy        }
600672433d90fab7383cd28beac9d4485b566a90940Romain Guy        renderer->drawRects(rects.array(), count, paint);
601a48a1a87ba17f20f7006eaab21dcedf86c015c13Romain Guy    }
602a48a1a87ba17f20f7006eaab21dcedf86c015c13Romain Guy}
603a48a1a87ba17f20f7006eaab21dcedf86c015c13Romain Guy
604672433d90fab7383cd28beac9d4485b566a90940Romain Guystatic void android_view_GLES20Canvas_drawRects(JNIEnv* env, jobject clazz,
60536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jfloatArray rects, jint count, jlong paintPtr) {
6069f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
607672433d90fab7383cd28beac9d4485b566a90940Romain Guy    jfloat* storage = env->GetFloatArrayElements(rects, NULL);
6089f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
609672433d90fab7383cd28beac9d4485b566a90940Romain Guy    renderer->drawRects(storage, count, paint);
610672433d90fab7383cd28beac9d4485b566a90940Romain Guy    env->ReleaseFloatArrayElements(rects, storage, 0);
611672433d90fab7383cd28beac9d4485b566a90940Romain Guy}
612672433d90fab7383cd28beac9d4485b566a90940Romain Guy
613ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guystatic void android_view_GLES20Canvas_drawPoints(JNIEnv* env, jobject clazz,
61436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jfloatArray points, jint offset, jint count, jlong paintPtr) {
6159f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
616ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy    jfloat* storage = env->GetFloatArrayElements(points, NULL);
6179f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
618ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy    renderer->drawPoints(storage + offset, count, paint);
619ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy    env->ReleaseFloatArrayElements(points, storage, 0);
620ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy}
621ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy
6227d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawPath(JNIEnv* env, jobject clazz,
62336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jlong pathPtr, jlong paintPtr) {
6249f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
6259f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPath* path = reinterpret_cast<SkPath*>(pathPtr);
6269f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
6277fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy    renderer->drawPath(path, paint);
6287fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy}
6297fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy
6307d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawLines(JNIEnv* env, jobject clazz,
63136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jfloatArray points, jint offset, jint count, jlong paintPtr) {
6329f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
633759ea80dca64ad652110a129e0d8bf93fea79f61Romain Guy    jfloat* storage = env->GetFloatArrayElements(points, NULL);
6349f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
635759ea80dca64ad652110a129e0d8bf93fea79f61Romain Guy    renderer->drawLines(storage + offset, count, paint);
636759ea80dca64ad652110a129e0d8bf93fea79f61Romain Guy    env->ReleaseFloatArrayElements(points, storage, 0);
637759ea80dca64ad652110a129e0d8bf93fea79f61Romain Guy}
638759ea80dca64ad652110a129e0d8bf93fea79f61Romain Guy
63985bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy// ----------------------------------------------------------------------------
640db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy// Shaders and color filters
641d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy// ----------------------------------------------------------------------------
642d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy
6437d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_resetModifiers(JNIEnv* env, jobject clazz,
64436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jint modifiers) {
6459f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
646a168d7372132d6c87835878794b6ed43d0d282fdRomain Guy    if (modifiers & MODIFIER_SHADOW) renderer->resetShadow();
647a168d7372132d6c87835878794b6ed43d0d282fdRomain Guy    if (modifiers & MODIFIER_SHADER) renderer->resetShader();
648d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy}
649d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy
6507d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_setupShader(JNIEnv* env, jobject clazz,
65136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jlong shaderPtr) {
6529f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
6539f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkiaShader* shader = reinterpret_cast<SkiaShader*>(shaderPtr);
65406f96e2652e4855b6520ad9dd70583677605b79aRomain Guy    renderer->setupShader(shader);
6557fac2e18339f765320d759e8d4c090f92431959eRomain Guy}
6567fac2e18339f765320d759e8d4c090f92431959eRomain Guy
657db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy
6587d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_setupShadow(JNIEnv* env, jobject clazz,
65936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jfloat radius, jfloat dx, jfloat dy, jint color) {
6609f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
6611e45aae5de003657e5d18f74d34998f5de5db5b7Romain Guy    renderer->setupShadow(radius, dx, dy, color);
6621e45aae5de003657e5d18f74d34998f5de5db5b7Romain Guy}
6631e45aae5de003657e5d18f74d34998f5de5db5b7Romain Guy
664d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy// ----------------------------------------------------------------------------
6655ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy// Draw filters
6665ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy// ----------------------------------------------------------------------------
6675ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy
6685ff9df658230d49e42c43586997a02d8e4dd417eRomain Guystatic void android_view_GLES20Canvas_setupPaintFilter(JNIEnv* env, jobject clazz,
66936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jint clearBits, jint setBits) {
6709f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
6715ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    renderer->setupPaintFilter(clearBits, setBits);
6725ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy}
6735ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy
6745ff9df658230d49e42c43586997a02d8e4dd417eRomain Guystatic void android_view_GLES20Canvas_resetPaintFilter(JNIEnv* env, jobject clazz,
67536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr) {
6769f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
6775ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    renderer->resetPaintFilter();
6785ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy}
6795ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy
6805ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy// ----------------------------------------------------------------------------
681a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy// Text
682a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy// ----------------------------------------------------------------------------
683a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy
68441541825bc90dac740e424cdd41a8c997e15cdb7Chris Craikstatic float xOffsetForTextAlign(SkPaint* paint, float totalAdvance) {
68541541825bc90dac740e424cdd41a8c997e15cdb7Chris Craik    switch (paint->getTextAlign()) {
68641541825bc90dac740e424cdd41a8c997e15cdb7Chris Craik        case SkPaint::kCenter_Align:
68741541825bc90dac740e424cdd41a8c997e15cdb7Chris Craik            return -totalAdvance / 2.0f;
68841541825bc90dac740e424cdd41a8c997e15cdb7Chris Craik            break;
68941541825bc90dac740e424cdd41a8c997e15cdb7Chris Craik        case SkPaint::kRight_Align:
69041541825bc90dac740e424cdd41a8c997e15cdb7Chris Craik            return -totalAdvance;
69141541825bc90dac740e424cdd41a8c997e15cdb7Chris Craik            break;
69241541825bc90dac740e424cdd41a8c997e15cdb7Chris Craik        default:
69341541825bc90dac740e424cdd41a8c997e15cdb7Chris Craik            break;
69441541825bc90dac740e424cdd41a8c997e15cdb7Chris Craik    }
69541541825bc90dac740e424cdd41a8c997e15cdb7Chris Craik    return 0;
69641541825bc90dac740e424cdd41a8c997e15cdb7Chris Craik}
69741541825bc90dac740e424cdd41a8c997e15cdb7Chris Craik
698e8e62a4a032a80409114a37908b5f18ab0080848Romain Guystatic void renderText(OpenGLRenderer* renderer, const jchar* text, int count,
699da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio        jfloat x, jfloat y, int flags, SkPaint* paint) {
700a731b082b2c43204e6e9f927ab82fb732934a83bFabrice Di Meglio    sp<TextLayoutValue> value = TextLayoutEngine::getInstance().getValue(paint,
701da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio            text, 0, count, count, flags);
7022ea75880142152b3a9993cb245754d73c05749a7Fabrice Di Meglio    if (value == NULL) {
703b02d0ca5553300063e4332192632312600caf4b9Fabrice Di Meglio        return;
7042ea75880142152b3a9993cb245754d73c05749a7Fabrice Di Meglio    }
7055c863f741e8e484bb39decd516c9fa4c6322e671Fabrice Di Meglio    const jchar* glyphs = value->getGlyphs();
7065c863f741e8e484bb39decd516c9fa4c6322e671Fabrice Di Meglio    size_t glyphsCount = value->getGlyphsCount();
707996e57c84368058be793897ebc355b917a59abc2Raph Levien    jfloat totalAdvance = value->getTotalAdvance();
708b15b446f420b3ec69424dabcbcbc8cf019d6c8d6Romain Guy    x += xOffsetForTextAlign(paint, totalAdvance);
709996e57c84368058be793897ebc355b917a59abc2Raph Levien    const float* positions = value->getPos();
71079df5323e7ed541b854cea5684a89e8be8c2dfc9Fabrice Di Meglio    int bytesCount = glyphsCount * sizeof(jchar);
71141541825bc90dac740e424cdd41a8c997e15cdb7Chris Craik    const SkRect& r = value->getBounds();
71241541825bc90dac740e424cdd41a8c997e15cdb7Chris Craik    android::uirenderer::Rect bounds(r.fLeft, r.fTop, r.fRight, r.fBottom);
713f09b746acb266a849f3421df1604ebec161bb93dChris Craik    bounds.translate(x, y);
71441541825bc90dac740e424cdd41a8c997e15cdb7Chris Craik
71541541825bc90dac740e424cdd41a8c997e15cdb7Chris Craik    renderer->drawText((const char*) glyphs, bytesCount, glyphsCount,
716b15b446f420b3ec69424dabcbcbc8cf019d6c8d6Romain Guy            x, y, positions, paint, totalAdvance, bounds);
717e8e62a4a032a80409114a37908b5f18ab0080848Romain Guy}
718e8e62a4a032a80409114a37908b5f18ab0080848Romain Guy
719325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guystatic void renderTextOnPath(OpenGLRenderer* renderer, const jchar* text, int count,
720da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio        SkPath* path, jfloat hOffset, jfloat vOffset, int flags, SkPaint* paint) {
721325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    sp<TextLayoutValue> value = TextLayoutEngine::getInstance().getValue(paint,
722da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio            text, 0, count, count, flags);
723325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    if (value == NULL) {
724325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy        return;
725325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    }
726325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    const jchar* glyphs = value->getGlyphs();
727325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    size_t glyphsCount = value->getGlyphsCount();
728325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    int bytesCount = glyphsCount * sizeof(jchar);
729325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    renderer->drawTextOnPath((const char*) glyphs, bytesCount, glyphsCount, path,
730325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy            hOffset, vOffset, paint);
731325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy}
732325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy
73361c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guystatic void renderTextRun(OpenGLRenderer* renderer, const jchar* text,
73461c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy        jint start, jint count, jint contextCount, jfloat x, jfloat y,
735da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio        int flags, SkPaint* paint) {
736a731b082b2c43204e6e9f927ab82fb732934a83bFabrice Di Meglio    sp<TextLayoutValue> value = TextLayoutEngine::getInstance().getValue(paint,
737da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio            text, start, count, contextCount, flags);
7382ea75880142152b3a9993cb245754d73c05749a7Fabrice Di Meglio    if (value == NULL) {
739b02d0ca5553300063e4332192632312600caf4b9Fabrice Di Meglio        return;
7402ea75880142152b3a9993cb245754d73c05749a7Fabrice Di Meglio    }
7415c863f741e8e484bb39decd516c9fa4c6322e671Fabrice Di Meglio    const jchar* glyphs = value->getGlyphs();
7425c863f741e8e484bb39decd516c9fa4c6322e671Fabrice Di Meglio    size_t glyphsCount = value->getGlyphsCount();
743996e57c84368058be793897ebc355b917a59abc2Raph Levien    jfloat totalAdvance = value->getTotalAdvance();
744b15b446f420b3ec69424dabcbcbc8cf019d6c8d6Romain Guy    x += xOffsetForTextAlign(paint, totalAdvance);
745996e57c84368058be793897ebc355b917a59abc2Raph Levien    const float* positions = value->getPos();
74679df5323e7ed541b854cea5684a89e8be8c2dfc9Fabrice Di Meglio    int bytesCount = glyphsCount * sizeof(jchar);
74741541825bc90dac740e424cdd41a8c997e15cdb7Chris Craik    const SkRect& r = value->getBounds();
74841541825bc90dac740e424cdd41a8c997e15cdb7Chris Craik    android::uirenderer::Rect bounds(r.fLeft, r.fTop, r.fRight, r.fBottom);
749f09b746acb266a849f3421df1604ebec161bb93dChris Craik    bounds.translate(x, y);
75041541825bc90dac740e424cdd41a8c997e15cdb7Chris Craik
75141541825bc90dac740e424cdd41a8c997e15cdb7Chris Craik    renderer->drawText((const char*) glyphs, bytesCount, glyphsCount,
752b15b446f420b3ec69424dabcbcbc8cf019d6c8d6Romain Guy            x, y, positions, paint, totalAdvance, bounds);
75361c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy}
75461c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy
7557d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawTextArray(JNIEnv* env, jobject clazz,
75636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jcharArray text, jint index, jint count,
75736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jfloat x, jfloat y, jint flags, jlong paintPtr) {
7589f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
759a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy    jchar* textArray = env->GetCharArrayElements(text, NULL);
7609f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
7619f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik
762da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio    renderText(renderer, textArray + index, count, x, y, flags, paint);
763a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy    env->ReleaseCharArrayElements(text, textArray, JNI_ABORT);
764a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy}
765a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy
7667d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawText(JNIEnv* env, jobject clazz,
76736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jstring text, jint start, jint end,
76836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jfloat x, jfloat y, jint flags, jlong paintPtr) {
7699f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
770a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy    const jchar* textArray = env->GetStringChars(text, NULL);
7719f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
7729f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik
773da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio    renderText(renderer, textArray + start, end - start, x, y, flags, paint);
774a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy    env->ReleaseStringChars(text, textArray);
775a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy}
776a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy
777325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guystatic void android_view_GLES20Canvas_drawTextArrayOnPath(JNIEnv* env, jobject clazz,
77836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jcharArray text, jint index, jint count,
77936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong pathPtr, jfloat hOffset, jfloat vOffset, jint flags, jlong paintPtr) {
7809f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
781325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    jchar* textArray = env->GetCharArrayElements(text, NULL);
7829f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPath* path = reinterpret_cast<SkPath*>(pathPtr);
7839f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
7849f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik
785325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    renderTextOnPath(renderer, textArray + index, count, path,
786da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio            hOffset, vOffset, flags, paint);
787325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    env->ReleaseCharArrayElements(text, textArray, JNI_ABORT);
788325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy}
789325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy
790325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guystatic void android_view_GLES20Canvas_drawTextOnPath(JNIEnv* env, jobject clazz,
79136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jstring text, jint start, jint end,
79236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong pathPtr, jfloat hOffset, jfloat vOffset, jint flags, jlong paintPtr) {
7939f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
794325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    const jchar* textArray = env->GetStringChars(text, NULL);
7959f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPath* path = reinterpret_cast<SkPath*>(pathPtr);
7969f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
7979f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik
798325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    renderTextOnPath(renderer, textArray + start, end - start, path,
799da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio            hOffset, vOffset, flags, paint);
800325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    env->ReleaseStringChars(text, textArray);
801325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy}
802325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy
8037d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawTextRunArray(JNIEnv* env, jobject clazz,
80436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jcharArray text, jint index, jint count,
805da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio        jint contextIndex, jint contextCount, jfloat x, jfloat y, jint dirFlags,
80636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong paintPtr) {
8079f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
80861c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy    jchar* textArray = env->GetCharArrayElements(text, NULL);
8099f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
8109f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik
81161c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy    renderTextRun(renderer, textArray + contextIndex, index - contextIndex,
812da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio            count, contextCount, x, y, dirFlags, paint);
81361c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy    env->ReleaseCharArrayElements(text, textArray, JNI_ABORT);
81461c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy }
81561c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy
8167d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawTextRun(JNIEnv* env, jobject clazz,
81736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jstring text, jint start, jint end,
818da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio        jint contextStart, int contextEnd, jfloat x, jfloat y, jint dirFlags,
81936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong paintPtr) {
8209f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
82161c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy    const jchar* textArray = env->GetStringChars(text, NULL);
82261c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy    jint count = end - start;
82361c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy    jint contextCount = contextEnd - contextStart;
8249f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
8259f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik
82661c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy    renderTextRun(renderer, textArray + contextStart, start - contextStart,
827da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio            count, contextCount, x, y, dirFlags, paint);
82861c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy    env->ReleaseStringChars(text, textArray);
82961c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy}
83061c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy
831eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guystatic void renderPosText(OpenGLRenderer* renderer, const jchar* text, int count,
832da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio        const jfloat* positions, jint dirFlags, SkPaint* paint) {
833a731b082b2c43204e6e9f927ab82fb732934a83bFabrice Di Meglio    sp<TextLayoutValue> value = TextLayoutEngine::getInstance().getValue(paint,
834da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio            text, 0, count, count, dirFlags);
835eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    if (value == NULL) {
836eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy        return;
837eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    }
838eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    const jchar* glyphs = value->getGlyphs();
839eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    size_t glyphsCount = value->getGlyphsCount();
840671d6cf460531825a321edb200523d0faa7792c9Romain Guy    if (count < int(glyphsCount)) glyphsCount = count;
841eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    int bytesCount = glyphsCount * sizeof(jchar);
842eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy
843671d6cf460531825a321edb200523d0faa7792c9Romain Guy    renderer->drawPosText((const char*) glyphs, bytesCount, glyphsCount, positions, paint);
844eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy}
845eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy
846eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guystatic void android_view_GLES20Canvas_drawPosTextArray(JNIEnv* env, jobject clazz,
84736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jcharArray text, jint index, jint count,
84836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jfloatArray pos, jlong paintPtr) {
8499f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
850eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    jchar* textArray = env->GetCharArrayElements(text, NULL);
851eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    jfloat* positions = env->GetFloatArrayElements(pos, NULL);
8529f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
853eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy
854da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio    renderPosText(renderer, textArray + index, count, positions, kBidi_LTR, paint);
855eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy
856eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    env->ReleaseFloatArrayElements(pos, positions, JNI_ABORT);
857eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    env->ReleaseCharArrayElements(text, textArray, JNI_ABORT);
858eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy}
859eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy
860eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guystatic void android_view_GLES20Canvas_drawPosText(JNIEnv* env, jobject clazz,
86136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jstring text, jint start, jint end,
86236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jfloatArray pos, jlong paintPtr) {
8639f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
864eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    const jchar* textArray = env->GetStringChars(text, NULL);
865eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    jfloat* positions = env->GetFloatArrayElements(pos, NULL);
8669f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
867eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy
868da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio    renderPosText(renderer, textArray + start, end - start, positions, kBidi_LTR, paint);
869eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy
870eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    env->ReleaseFloatArrayElements(pos, positions, JNI_ABORT);
871eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    env->ReleaseStringChars(text, textArray);
872eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy}
873eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy
874b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy// ----------------------------------------------------------------------------
875b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy// Display lists
876b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy// ----------------------------------------------------------------------------
877b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
87844fd8d24f761f82d21e9b00932648a1b6bf91449John Reckstatic jlong android_view_GLES20Canvas_finishRecording(JNIEnv* env,
87944fd8d24f761f82d21e9b00932648a1b6bf91449John Reck        jobject clazz, jlong rendererPtr) {
8809f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
88144fd8d24f761f82d21e9b00932648a1b6bf91449John Reck    return reinterpret_cast<jlong>(renderer->finishRecording());
882162a0217563f4665da6eb183dfce0fef740f641fJeff Brown}
883162a0217563f4665da6eb183dfce0fef740f641fJeff Brown
8843f085429fd47ebd32ac2463b3eae2a5a6c17be25Chris Craikstatic jlong android_view_GLES20Canvas_createDisplayListRenderer(JNIEnv* env, jobject clazz) {
88544fd8d24f761f82d21e9b00932648a1b6bf91449John Reck    return reinterpret_cast<jlong>(new DisplayListRenderer);
8865977baa1fa24125c148a72699b53e62abaf08960Chet Haase}
8875977baa1fa24125c148a72699b53e62abaf08960Chet Haase
8886554943a1dd6854c0f4976900956e556767b49e1Romain Guystatic jint android_view_GLES20Canvas_drawDisplayList(JNIEnv* env,
88936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jobject clazz, jlong rendererPtr, jlong displayListPtr,
8901271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        jobject dirty, jint flags) {
8919f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
892e18264b079481a244b30e3f71012c53bbd861f92John Reck    RenderNode* displayList = reinterpret_cast<RenderNode*>(displayListPtr);
893cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy    android::uirenderer::Rect bounds;
8941271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    status_t status = renderer->drawDisplayList(displayList, bounds, flags);
8956554943a1dd6854c0f4976900956e556767b49e1Romain Guy    if (status != DrawGlInfo::kStatusDone && dirty != NULL) {
896cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy        env->CallVoidMethod(dirty, gRectClassInfo.set,
897cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy                int(bounds.left), int(bounds.top), int(bounds.right), int(bounds.bottom));
898cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy    }
8996554943a1dd6854c0f4976900956e556767b49e1Romain Guy    return status;
900b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
901b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
9026c319ca1275c8db892c39b48fc54864c949f9171Romain Guy// ----------------------------------------------------------------------------
9036c319ca1275c8db892c39b48fc54864c949f9171Romain Guy// Layers
9046c319ca1275c8db892c39b48fc54864c949f9171Romain Guy// ----------------------------------------------------------------------------
9056c319ca1275c8db892c39b48fc54864c949f9171Romain Guy
9067d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawLayer(JNIEnv* env, jobject clazz,
90736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jlong layerPtr, jfloat x, jfloat y) {
9089f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
9099f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    Layer* layer = reinterpret_cast<Layer*>(layerPtr);
910a08f95cfeca7217f9c533b03663bf0dceedd259aChris Craik    renderer->drawLayer(layer, x, y);
9116c319ca1275c8db892c39b48fc54864c949f9171Romain Guy}
9126c319ca1275c8db892c39b48fc54864c949f9171Romain Guy
91377a811610f99e21da7f88dafef60d09f345d0506Romain Guystatic jboolean android_view_GLES20Canvas_copyLayer(JNIEnv* env, jobject clazz,
91436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong layerPtr, jlong bitmapPtr) {
9159f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    Layer* layer = reinterpret_cast<Layer*>(layerPtr);
9169f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapPtr);
91777a811610f99e21da7f88dafef60d09f345d0506Romain Guy    return LayerRenderer::copyLayer(layer, bitmap);
91877a811610f99e21da7f88dafef60d09f345d0506Romain Guy}
91977a811610f99e21da7f88dafef60d09f345d0506Romain Guy
92011cb642756093a4af901b1525375b1eb2b5c3e2bRomain Guystatic void android_view_GLES20Canvas_pushLayerUpdate(JNIEnv* env, jobject clazz,
92136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jlong layerPtr) {
9229f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
9239f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    Layer* layer = reinterpret_cast<Layer*>(layerPtr);
92411cb642756093a4af901b1525375b1eb2b5c3e2bRomain Guy    renderer->pushLayerUpdate(layer);
92511cb642756093a4af901b1525375b1eb2b5c3e2bRomain Guy}
92611cb642756093a4af901b1525375b1eb2b5c3e2bRomain Guy
927e93482f5eac3df581d57e64c2a771a96aa868585Romain Guystatic void android_view_GLES20Canvas_cancelLayerUpdate(JNIEnv* env, jobject clazz,
92836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jlong layerPtr) {
9299f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
9309f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    Layer* layer = reinterpret_cast<Layer*>(layerPtr);
931e93482f5eac3df581d57e64c2a771a96aa868585Romain Guy    renderer->cancelLayerUpdate(layer);
932e93482f5eac3df581d57e64c2a771a96aa868585Romain Guy}
933e93482f5eac3df581d57e64c2a771a96aa868585Romain Guy
93411cb642756093a4af901b1525375b1eb2b5c3e2bRomain Guystatic void android_view_GLES20Canvas_clearLayerUpdates(JNIEnv* env, jobject clazz,
93536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr) {
9369f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
93711cb642756093a4af901b1525375b1eb2b5c3e2bRomain Guy    renderer->clearLayerUpdates();
93811cb642756093a4af901b1525375b1eb2b5c3e2bRomain Guy}
93911cb642756093a4af901b1525375b1eb2b5c3e2bRomain Guy
940405436021da156fbe3c5d4de48bdefa564cf7fc0Romain Guystatic void android_view_GLES20Canvas_flushLayerUpdates(JNIEnv* env, jobject clazz,
94136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr) {
9429f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
943405436021da156fbe3c5d4de48bdefa564cf7fc0Romain Guy    renderer->flushLayerUpdates();
944405436021da156fbe3c5d4de48bdefa564cf7fc0Romain Guy}
945405436021da156fbe3c5d4de48bdefa564cf7fc0Romain Guy
946163935113919a184122b8b3bd672ef08c8df65dcRomain Guy#endif // USE_OPENGL_RENDERER
947163935113919a184122b8b3bd672ef08c8df65dcRomain Guy
948163935113919a184122b8b3bd672ef08c8df65dcRomain Guy// ----------------------------------------------------------------------------
949163935113919a184122b8b3bd672ef08c8df65dcRomain Guy// Common
950163935113919a184122b8b3bd672ef08c8df65dcRomain Guy// ----------------------------------------------------------------------------
951163935113919a184122b8b3bd672ef08c8df65dcRomain Guy
952163935113919a184122b8b3bd672ef08c8df65dcRomain Guystatic jboolean android_view_GLES20Canvas_isAvailable(JNIEnv* env, jobject clazz) {
953163935113919a184122b8b3bd672ef08c8df65dcRomain Guy#ifdef USE_OPENGL_RENDERER
9544406345cd62d3687ce590c357854472f7f906e6cJesse Hall    char prop[PROPERTY_VALUE_MAX];
9554406345cd62d3687ce590c357854472f7f906e6cJesse Hall    if (property_get("ro.kernel.qemu", prop, NULL) == 0) {
9564406345cd62d3687ce590c357854472f7f906e6cJesse Hall        // not in the emulator
9574406345cd62d3687ce590c357854472f7f906e6cJesse Hall        return JNI_TRUE;
9584406345cd62d3687ce590c357854472f7f906e6cJesse Hall    }
9594406345cd62d3687ce590c357854472f7f906e6cJesse Hall    // In the emulator this property will be set to 1 when hardware GLES is
9604406345cd62d3687ce590c357854472f7f906e6cJesse Hall    // enabled, 0 otherwise. On old emulator versions it will be undefined.
9614406345cd62d3687ce590c357854472f7f906e6cJesse Hall    property_get("ro.kernel.qemu.gles", prop, "0");
9624406345cd62d3687ce590c357854472f7f906e6cJesse Hall    return atoi(prop) == 1 ? JNI_TRUE : JNI_FALSE;
963163935113919a184122b8b3bd672ef08c8df65dcRomain Guy#else
964163935113919a184122b8b3bd672ef08c8df65dcRomain Guy    return JNI_FALSE;
965163935113919a184122b8b3bd672ef08c8df65dcRomain Guy#endif
966163935113919a184122b8b3bd672ef08c8df65dcRomain Guy}
967163935113919a184122b8b3bd672ef08c8df65dcRomain Guy
968a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy// ----------------------------------------------------------------------------
9699c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase// Logging
9709c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase// ----------------------------------------------------------------------------
9719c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase
9729c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haasestatic void
97365b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guyandroid_app_ActivityThread_dumpGraphics(JNIEnv* env, jobject clazz, jobject javaFileDescriptor) {
974905787a7c91d23daa4efc3d16bd8cbf1a683e779Chet Haase#ifdef USE_OPENGL_RENDERER
975a3804cf77f0edd93f6247a055cdafb856b117eecElliott Hughes    int fd = jniGetFDFromFileDescriptor(env, javaFileDescriptor);
976e18264b079481a244b30e3f71012c53bbd861f92John Reck    android::uirenderer::RenderNode::outputLogBuffer(fd);
977905787a7c91d23daa4efc3d16bd8cbf1a683e779Chet Haase#endif // USE_OPENGL_RENDERER
9789c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase}
9799c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase
9809c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase// ----------------------------------------------------------------------------
981e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// JNI Glue
982e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// ----------------------------------------------------------------------------
983e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
984e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guyconst char* const kClassPathName = "android/view/GLES20Canvas";
985e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
986e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guystatic JNINativeMethod gMethods[] = {
98761c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy    { "nIsAvailable",       "()Z",             (void*) android_view_GLES20Canvas_isAvailable },
988163935113919a184122b8b3bd672ef08c8df65dcRomain Guy
98961c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy#ifdef USE_OPENGL_RENDERER
990ba6be8a62dcdb3ffd210cd36b9af4e3a658eac47Romain Guy    { "nFlushCaches",       "(I)V",            (void*) android_view_GLES20Canvas_flushCaches },
9913b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    { "nInitCaches",        "()Z",             (void*) android_view_GLES20Canvas_initCaches },
992ba6be8a62dcdb3ffd210cd36b9af4e3a658eac47Romain Guy    { "nTerminateCaches",   "()V",             (void*) android_view_GLES20Canvas_terminateCaches },
9937d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy
99417ab38f8a87bc90eab11373f878f220ce3031de6Ashok Bhat    { "nInitAtlas",         "(Landroid/view/GraphicBuffer;[JI)V",
9953b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy            (void*) android_view_GLES20Canvas_initAtlas },
9963b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy
99736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nCreateRenderer",    "()J",             (void*) android_view_GLES20Canvas_createRenderer },
99836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDestroyRenderer",   "(J)V",            (void*) android_view_GLES20Canvas_destroyRenderer },
99936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nSetViewport",       "(JII)V",          (void*) android_view_GLES20Canvas_setViewport },
100036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nPrepare",           "(JZ)I",           (void*) android_view_GLES20Canvas_prepare },
100136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nPrepareDirty",      "(JIIIIZ)I",       (void*) android_view_GLES20Canvas_prepareDirty },
100236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nFinish",            "(J)V",            (void*) android_view_GLES20Canvas_finish },
1003ba9b613437c34873fa95800a25fc51720638267cChris Craik    { "nSetProperty",           "(Ljava/lang/String;Ljava/lang/String;)V",
1004ba9b613437c34873fa95800a25fc51720638267cChris Craik            (void*) android_view_GLES20Canvas_setProperty },
100561c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy
100678dd96d5af20f489f0e8b288617d57774ec284f7Romain Guy
1007530041d3191ce817832a0108514617768e43cda6Romain Guy    { "nGetStencilSize",    "()I",             (void*) android_view_GLES20Canvas_getStencilSize },
1008530041d3191ce817832a0108514617768e43cda6Romain Guy
100936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nCallDrawGLFunction", "(JJ)I",          (void*) android_view_GLES20Canvas_callDrawGLFunction },
101036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDetachFunctor",      "(JJ)V",          (void*) android_view_GLES20Canvas_detachFunctor },
101136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nAttachFunctor",      "(JJ)V",          (void*) android_view_GLES20Canvas_attachFunctor },
101236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nInvokeFunctors",     "(JLandroid/graphics/Rect;)I",
10138f3b8e32993d190a26c70c839a63d8ce4c3b16d9Romain Guy            (void*) android_view_GLES20Canvas_invokeFunctors },
10147d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy
101536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nSave",              "(JI)I",           (void*) android_view_GLES20Canvas_save },
101636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nRestore",           "(J)V",            (void*) android_view_GLES20Canvas_restore },
101736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nRestoreToCount",    "(JI)V",           (void*) android_view_GLES20Canvas_restoreToCount },
101836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nGetSaveCount",      "(J)I",            (void*) android_view_GLES20Canvas_getSaveCount },
101936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat
102036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nSaveLayer",         "(JFFFFJI)I",      (void*) android_view_GLES20Canvas_saveLayer },
102136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nSaveLayer",         "(JJI)I",          (void*) android_view_GLES20Canvas_saveLayerClip },
102236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nSaveLayerAlpha",    "(JFFFFII)I",      (void*) android_view_GLES20Canvas_saveLayerAlpha },
102336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nSaveLayerAlpha",    "(JII)I",          (void*) android_view_GLES20Canvas_saveLayerAlphaClip },
102436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat
102536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nQuickReject",       "(JFFFF)Z",        (void*) android_view_GLES20Canvas_quickReject },
102636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nClipRect",          "(JFFFFI)Z",       (void*) android_view_GLES20Canvas_clipRectF },
102736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nClipRect",          "(JIIIII)Z",       (void*) android_view_GLES20Canvas_clipRect },
102836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nClipPath",          "(JJI)Z",          (void*) android_view_GLES20Canvas_clipPath },
102936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nClipRegion",        "(JJI)Z",          (void*) android_view_GLES20Canvas_clipRegion },
103036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat
103136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nTranslate",         "(JFF)V",          (void*) android_view_GLES20Canvas_translate },
103236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nRotate",            "(JF)V",           (void*) android_view_GLES20Canvas_rotate },
103336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nScale",             "(JFF)V",          (void*) android_view_GLES20Canvas_scale },
103436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nSkew",              "(JFF)V",          (void*) android_view_GLES20Canvas_skew },
103536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat
103636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nSetMatrix",         "(JJ)V",           (void*) android_view_GLES20Canvas_setMatrix },
103736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nGetMatrix",         "(JJ)V",           (void*) android_view_GLES20Canvas_getMatrix },
103836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nConcatMatrix",      "(JJ)V",           (void*) android_view_GLES20Canvas_concatMatrix },
103936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat
104036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawBitmap",        "(JJ[BFFJ)V",      (void*) android_view_GLES20Canvas_drawBitmap },
104136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawBitmap",        "(JJ[BFFFFFFFFJ)V",(void*) android_view_GLES20Canvas_drawBitmapRect },
104236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawBitmap",        "(JJ[BJJ)V",       (void*) android_view_GLES20Canvas_drawBitmapMatrix },
104336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawBitmap",        "(J[IIIFFIIZJ)V",  (void*) android_view_GLES20Canvas_drawBitmapData },
104436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat
104536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawBitmapMesh",    "(JJ[BII[FI[IIJ)V",(void*) android_view_GLES20Canvas_drawBitmapMesh },
104636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat
104736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawPatch",         "(JJ[BJFFFFJ)V",   (void*) android_view_GLES20Canvas_drawPatch },
104836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat
104936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawColor",         "(JII)V",          (void*) android_view_GLES20Canvas_drawColor },
105036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawRect",          "(JFFFFJ)V",       (void*) android_view_GLES20Canvas_drawRect },
105136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawRects",         "(JJJ)V",          (void*) android_view_GLES20Canvas_drawRegionAsRects },
105236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawRects",         "(J[FIJ)V",        (void*) android_view_GLES20Canvas_drawRects },
105336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawRoundRect",     "(JFFFFFFJ)V",     (void*) android_view_GLES20Canvas_drawRoundRect },
105436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawCircle",        "(JFFFJ)V",        (void*) android_view_GLES20Canvas_drawCircle },
105552244fff29042926e21fa897ef5ab11148e35299John Reck    { "nDrawCircle",        "(JJJJJ)V",        (void*) android_view_GLES20Canvas_drawCircleProps },
105636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawOval",          "(JFFFFJ)V",       (void*) android_view_GLES20Canvas_drawOval },
105736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawArc",           "(JFFFFFFZJ)V",    (void*) android_view_GLES20Canvas_drawArc },
105836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawPoints",        "(J[FIIJ)V",       (void*) android_view_GLES20Canvas_drawPoints },
105936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat
106036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawPath",          "(JJJ)V",          (void*) android_view_GLES20Canvas_drawPath },
106136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawLines",         "(J[FIIJ)V",       (void*) android_view_GLES20Canvas_drawLines },
106236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat
106336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nResetModifiers",    "(JI)V",           (void*) android_view_GLES20Canvas_resetModifiers },
106436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nSetupShader",       "(JJ)V",           (void*) android_view_GLES20Canvas_setupShader },
106536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nSetupShadow",       "(JFFFI)V",        (void*) android_view_GLES20Canvas_setupShadow },
106636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat
106736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nSetupPaintFilter",  "(JII)V",          (void*) android_view_GLES20Canvas_setupPaintFilter },
106836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nResetPaintFilter",  "(J)V",            (void*) android_view_GLES20Canvas_resetPaintFilter },
106936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat
107036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawText",          "(J[CIIFFIJ)V",    (void*) android_view_GLES20Canvas_drawTextArray },
107136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawText",          "(JLjava/lang/String;IIFFIJ)V",
1072a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy            (void*) android_view_GLES20Canvas_drawText },
1073a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy
107436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawTextOnPath",    "(J[CIIJFFIJ)V",   (void*) android_view_GLES20Canvas_drawTextArrayOnPath },
107536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawTextOnPath",    "(JLjava/lang/String;IIJFFIJ)V",
1076325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy            (void*) android_view_GLES20Canvas_drawTextOnPath },
1077325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy
107836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawTextRun",       "(J[CIIIIFFIJ)V",  (void*) android_view_GLES20Canvas_drawTextRunArray },
107936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawTextRun",       "(JLjava/lang/String;IIIIFFIJ)V",
108061c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy            (void*) android_view_GLES20Canvas_drawTextRun },
108161c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy
108236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawPosText",       "(J[CII[FJ)V",     (void*) android_view_GLES20Canvas_drawPosTextArray },
108336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawPosText",       "(JLjava/lang/String;II[FJ)V",
1084eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy            (void*) android_view_GLES20Canvas_drawPosText },
1085eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy
108636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nGetClipBounds",     "(JLandroid/graphics/Rect;)Z",
1087ce0537b80087a6225273040a987414b1dd081aa0Romain Guy            (void*) android_view_GLES20Canvas_getClipBounds },
1088b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
108944fd8d24f761f82d21e9b00932648a1b6bf91449John Reck    { "nFinishRecording",        "(J)J",      (void*) android_view_GLES20Canvas_finishRecording },
109036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawDisplayList",        "(JJLandroid/graphics/Rect;I)I",
10918f3b8e32993d190a26c70c839a63d8ce4c3b16d9Romain Guy            (void*) android_view_GLES20Canvas_drawDisplayList },
109213631f3da855f200a151e7837ed9f6b079622b58Romain Guy
109336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nCreateDisplayListRenderer", "()J",     (void*) android_view_GLES20Canvas_createDisplayListRenderer },
109413631f3da855f200a151e7837ed9f6b079622b58Romain Guy
109536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawLayer",              "(JJFF)V",    (void*) android_view_GLES20Canvas_drawLayer },
109636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nCopyLayer",              "(JJ)Z",      (void*) android_view_GLES20Canvas_copyLayer },
109736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nClearLayerUpdates",      "(J)V",       (void*) android_view_GLES20Canvas_clearLayerUpdates },
109836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nFlushLayerUpdates",      "(J)V",       (void*) android_view_GLES20Canvas_flushLayerUpdates },
109936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nPushLayerUpdate",        "(JJ)V",      (void*) android_view_GLES20Canvas_pushLayerUpdate },
110036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nCancelLayerUpdate",      "(JJ)V",      (void*) android_view_GLES20Canvas_cancelLayerUpdate },
110136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat
1102f61970fc79e9c5cf340fa942597628242361864aRomain Guy    { "nGetMaximumTextureWidth",  "()I",       (void*) android_view_GLES20Canvas_getMaxTextureWidth },
1103f61970fc79e9c5cf340fa942597628242361864aRomain Guy    { "nGetMaximumTextureHeight", "()I",       (void*) android_view_GLES20Canvas_getMaxTextureHeight },
1104f61970fc79e9c5cf340fa942597628242361864aRomain Guy
1105163935113919a184122b8b3bd672ef08c8df65dcRomain Guy#endif
1106e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy};
1107e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
11089c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haasestatic JNINativeMethod gActivityThreadMethods[] = {
11099c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    { "dumpGraphicsInfo",        "(Ljava/io/FileDescriptor;)V",
11109c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase                                               (void*) android_app_ActivityThread_dumpGraphics }
11119c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase};
11129c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase
11139c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase
1114163935113919a184122b8b3bd672ef08c8df65dcRomain Guy#ifdef USE_OPENGL_RENDERER
1115163935113919a184122b8b3bd672ef08c8df65dcRomain Guy    #define FIND_CLASS(var, className) \
1116163935113919a184122b8b3bd672ef08c8df65dcRomain Guy            var = env->FindClass(className); \
111717cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro            LOG_FATAL_IF(! var, "Unable to find class " className);
111817cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro
1119163935113919a184122b8b3bd672ef08c8df65dcRomain Guy    #define GET_METHOD_ID(var, clazz, methodName, methodDescriptor) \
1120163935113919a184122b8b3bd672ef08c8df65dcRomain Guy            var = env->GetMethodID(clazz, methodName, methodDescriptor); \
1121163935113919a184122b8b3bd672ef08c8df65dcRomain Guy            LOG_FATAL_IF(! var, "Unable to find method " methodName);
1122163935113919a184122b8b3bd672ef08c8df65dcRomain Guy#else
1123163935113919a184122b8b3bd672ef08c8df65dcRomain Guy    #define FIND_CLASS(var, className)
1124163935113919a184122b8b3bd672ef08c8df65dcRomain Guy    #define GET_METHOD_ID(var, clazz, methodName, methodDescriptor)
1125163935113919a184122b8b3bd672ef08c8df65dcRomain Guy#endif
11269d5316e3f56d138504565ff311145ac01621dff4Romain Guy
1127e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guyint register_android_view_GLES20Canvas(JNIEnv* env) {
112817cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro    jclass clazz;
112917cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro    FIND_CLASS(clazz, "android/graphics/Rect");
113017cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro    GET_METHOD_ID(gRectClassInfo.set, clazz, "set", "(IIII)V");
11319d5316e3f56d138504565ff311145ac01621dff4Romain Guy
1132e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    return AndroidRuntime::registerNativeMethods(env, kClassPathName, gMethods, NELEM(gMethods));
1133e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy}
1134e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
11359c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haaseconst char* const kActivityThreadPathName = "android/app/ActivityThread";
11369c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase
11376be3d5561cbeccf0a8257a4acb155657f868e548Romain Guyint register_android_app_ActivityThread(JNIEnv* env) {
11386be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy    return AndroidRuntime::registerNativeMethods(env, kActivityThreadPathName,
11399c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase            gActivityThreadMethods, NELEM(gActivityThreadMethods));
11409c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase}
11419c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase
1142e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy};
1143