android_view_GLES20Canvas.cpp revision 113e0824d6bddf4376240681f9cf6a2deded9498
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>
5285bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy
53d1d4bb70704e8f37d0823837eacdae21ebe0ed05Romain Guy#include <TextLayout.h>
54b02d0ca5553300063e4332192632312600caf4b9Fabrice Di Meglio#include <TextLayoutCache.h>
55e8e62a4a032a80409114a37908b5f18ab0080848Romain Guy
56e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guynamespace android {
57e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
589d5316e3f56d138504565ff311145ac01621dff4Romain Guyusing namespace uirenderer;
599d5316e3f56d138504565ff311145ac01621dff4Romain Guy
60163935113919a184122b8b3bd672ef08c8df65dcRomain Guy/**
61163935113919a184122b8b3bd672ef08c8df65dcRomain Guy * Note: OpenGLRenderer JNI layer is generated and compiled only on supported
62163935113919a184122b8b3bd672ef08c8df65dcRomain Guy *       devices. This means all the logic must be compiled only when the
63163935113919a184122b8b3bd672ef08c8df65dcRomain Guy *       preprocessor variable USE_OPENGL_RENDERER is defined.
64163935113919a184122b8b3bd672ef08c8df65dcRomain Guy */
65163935113919a184122b8b3bd672ef08c8df65dcRomain Guy#ifdef USE_OPENGL_RENDERER
66163935113919a184122b8b3bd672ef08c8df65dcRomain Guy
67244ada1d35419b7be9de0fc833bb03955b725ffaRomain Guy// ----------------------------------------------------------------------------
68bdb801ca993bcccbf2a4c2401d1720c3fa523777Romain Guy// Defines
69244ada1d35419b7be9de0fc833bb03955b725ffaRomain Guy// ----------------------------------------------------------------------------
70bdb801ca993bcccbf2a4c2401d1720c3fa523777Romain Guy
71bdb801ca993bcccbf2a4c2401d1720c3fa523777Romain Guy// Debug
72e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy#define DEBUG_RENDERER 0
73bdb801ca993bcccbf2a4c2401d1720c3fa523777Romain Guy
74bdb801ca993bcccbf2a4c2401d1720c3fa523777Romain Guy// Debug
75bdb801ca993bcccbf2a4c2401d1720c3fa523777Romain Guy#if DEBUG_RENDERER
765baa3a62a97544669fba6d65a11c07f252e654ddSteve Block    #define RENDERER_LOGD(...) ALOGD(__VA_ARGS__)
77bdb801ca993bcccbf2a4c2401d1720c3fa523777Romain Guy#else
78bdb801ca993bcccbf2a4c2401d1720c3fa523777Romain Guy    #define RENDERER_LOGD(...)
79bdb801ca993bcccbf2a4c2401d1720c3fa523777Romain Guy#endif
80e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy
81a168d7372132d6c87835878794b6ed43d0d282fdRomain Guy#define MODIFIER_SHADOW 1
82a168d7372132d6c87835878794b6ed43d0d282fdRomain Guy#define MODIFIER_SHADER 2
83a168d7372132d6c87835878794b6ed43d0d282fdRomain Guy
849d5316e3f56d138504565ff311145ac01621dff4Romain Guy// ----------------------------------------------------------------------------
859d5316e3f56d138504565ff311145ac01621dff4Romain Guy
869d5316e3f56d138504565ff311145ac01621dff4Romain Guystatic struct {
877ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    jmethodID set;
889d5316e3f56d138504565ff311145ac01621dff4Romain Guy} gRectClassInfo;
899d5316e3f56d138504565ff311145ac01621dff4Romain Guy
90e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// ----------------------------------------------------------------------------
91244ada1d35419b7be9de0fc833bb03955b725ffaRomain Guy// Caching
927d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy// ----------------------------------------------------------------------------
937d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy
94bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guystatic void android_view_GLES20Canvas_flushCaches(JNIEnv* env, jobject clazz,
9536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jint mode) {
96bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy    if (Caches::hasInstance()) {
9736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        Caches::getInstance().flush(static_cast<Caches::FlushMode>(mode));
98bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy    }
99bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy}
100bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy
10136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhatstatic jboolean android_view_GLES20Canvas_initCaches(JNIEnv* env, jobject clazz) {
1028ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy    if (Caches::hasInstance()) {
10336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        return Caches::getInstance().init() ? JNI_TRUE : JNI_FALSE;
1048ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy    }
10536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    return JNI_FALSE;
1068ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy}
1078ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy
1088ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guystatic void android_view_GLES20Canvas_terminateCaches(JNIEnv* env, jobject clazz) {
1098ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy    if (Caches::hasInstance()) {
1108ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy        Caches::getInstance().terminate();
1118ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy    }
1128ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy}
1138ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy
1147d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy// ----------------------------------------------------------------------------
1153b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy// Caching
1163b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy// ----------------------------------------------------------------------------
1173b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy
1183b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guystatic void android_view_GLES20Canvas_initAtlas(JNIEnv* env, jobject clazz,
11917ab38f8a87bc90eab11373f878f220ce3031de6Ashok Bhat        jobject graphicBuffer, jlongArray atlasMapArray, jint count) {
1203b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy
1213b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    sp<GraphicBuffer> buffer = graphicBufferForJavaObject(env, graphicBuffer);
12217ab38f8a87bc90eab11373f878f220ce3031de6Ashok Bhat    jlong* jAtlasMap = env->GetLongArrayElements(atlasMapArray, NULL);
12317ab38f8a87bc90eab11373f878f220ce3031de6Ashok Bhat    Caches::getInstance().assetAtlas.init(buffer, jAtlasMap, count);
12417ab38f8a87bc90eab11373f878f220ce3031de6Ashok Bhat    env->ReleaseLongArrayElements(atlasMapArray, jAtlasMap, 0);
1253b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy}
1263b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy
1273b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy// ----------------------------------------------------------------------------
128e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// Constructors
129e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// ----------------------------------------------------------------------------
130e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
13136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhatstatic jlong android_view_GLES20Canvas_createRenderer(JNIEnv* env, jobject clazz) {
132bdb801ca993bcccbf2a4c2401d1720c3fa523777Romain Guy    RENDERER_LOGD("Create OpenGLRenderer");
13387e2f757be9b24d369bab354e37c276e851b1fc7Romain Guy    OpenGLRenderer* renderer = new OpenGLRenderer();
13487e2f757be9b24d369bab354e37c276e851b1fc7Romain Guy    renderer->initProperties();
13536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    return reinterpret_cast<jlong>(renderer);
136e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy}
137e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
1385c13d89c1332fcc499379b9064b891187b75ca32Chet Haasestatic void android_view_GLES20Canvas_destroyRenderer(JNIEnv* env, jobject clazz,
13936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr) {
1409f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
141bdb801ca993bcccbf2a4c2401d1720c3fa523777Romain Guy    RENDERER_LOGD("Destroy OpenGLRenderer");
142f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy    delete renderer;
143e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy}
144e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
145e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// ----------------------------------------------------------------------------
146e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// Setup
147e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// ----------------------------------------------------------------------------
148e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
1497d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_setViewport(JNIEnv* env, jobject clazz,
15036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jint width, jint height) {
1519f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
152f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy    renderer->setViewport(width, height);
153e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy}
154e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
15544b2fe3fc114ee5f7273c6b0fee2cc999bf244a2Chet Haasestatic int android_view_GLES20Canvas_prepare(JNIEnv* env, jobject clazz,
15636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jboolean opaque) {
1579f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
15844b2fe3fc114ee5f7273c6b0fee2cc999bf244a2Chet Haase    return renderer->prepare(opaque);
159e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy}
160e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
16144b2fe3fc114ee5f7273c6b0fee2cc999bf244a2Chet Haasestatic int android_view_GLES20Canvas_prepareDirty(JNIEnv* env, jobject clazz,
16236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jint left, jint top, jint right, jint bottom,
1637d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy        jboolean opaque) {
1649f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
16544b2fe3fc114ee5f7273c6b0fee2cc999bf244a2Chet Haase    return renderer->prepareDirty(left, top, right, bottom, opaque);
1667d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy}
1677d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy
1687d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_finish(JNIEnv* env, jobject clazz,
16936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr) {
1709f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
171b025b9c8b4efefadb01937db61a1f8ee7d2452bfRomain Guy    renderer->finish();
172b025b9c8b4efefadb01937db61a1f8ee7d2452bfRomain Guy}
173b025b9c8b4efefadb01937db61a1f8ee7d2452bfRomain Guy
174530041d3191ce817832a0108514617768e43cda6Romain Guystatic jint android_view_GLES20Canvas_getStencilSize(JNIEnv* env, jobject clazz) {
1750baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy    return Stencil::getStencilSize();
176530041d3191ce817832a0108514617768e43cda6Romain Guy}
177530041d3191ce817832a0108514617768e43cda6Romain Guy
178ba9b613437c34873fa95800a25fc51720638267cChris Craikstatic void android_view_GLES20Canvas_setProperty(JNIEnv* env,
179ba9b613437c34873fa95800a25fc51720638267cChris Craik        jobject clazz, jstring name, jstring value) {
180ba9b613437c34873fa95800a25fc51720638267cChris Craik    if (!Caches::hasInstance()) {
181ba9b613437c34873fa95800a25fc51720638267cChris Craik        ALOGW("can't set property, no Caches instance");
182ba9b613437c34873fa95800a25fc51720638267cChris Craik        return;
183ba9b613437c34873fa95800a25fc51720638267cChris Craik    }
184ba9b613437c34873fa95800a25fc51720638267cChris Craik
185ba9b613437c34873fa95800a25fc51720638267cChris Craik    if (name == NULL || value == NULL) {
186ba9b613437c34873fa95800a25fc51720638267cChris Craik        ALOGW("can't set prop, null passed");
187ba9b613437c34873fa95800a25fc51720638267cChris Craik    }
188ba9b613437c34873fa95800a25fc51720638267cChris Craik
189ba9b613437c34873fa95800a25fc51720638267cChris Craik    const char* nameCharArray = env->GetStringUTFChars(name, NULL);
190ba9b613437c34873fa95800a25fc51720638267cChris Craik    const char* valueCharArray = env->GetStringUTFChars(value, NULL);
191ba9b613437c34873fa95800a25fc51720638267cChris Craik    Caches::getInstance().setTempProperty(nameCharArray, valueCharArray);
192ba9b613437c34873fa95800a25fc51720638267cChris Craik    env->ReleaseStringUTFChars(name, nameCharArray);
193ba9b613437c34873fa95800a25fc51720638267cChris Craik    env->ReleaseStringUTFChars(name, valueCharArray);
194ba9b613437c34873fa95800a25fc51720638267cChris Craik}
195ba9b613437c34873fa95800a25fc51720638267cChris Craik
196530041d3191ce817832a0108514617768e43cda6Romain Guy// ----------------------------------------------------------------------------
197530041d3191ce817832a0108514617768e43cda6Romain Guy// Functor
198530041d3191ce817832a0108514617768e43cda6Romain Guy// ----------------------------------------------------------------------------
199530041d3191ce817832a0108514617768e43cda6Romain Guy
2006554943a1dd6854c0f4976900956e556767b49e1Romain Guystatic jint android_view_GLES20Canvas_callDrawGLFunction(JNIEnv* env, jobject clazz,
20136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jlong functorPtr) {
2029f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
2039f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    Functor* functor = reinterpret_cast<Functor*>(functorPtr);
204cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy    android::uirenderer::Rect dirty;
205cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy    return renderer->callDrawGLFunction(functor, dirty);
206daf98e941e140e8739458126640183b9f296a2abChet Haase}
207daf98e941e140e8739458126640183b9f296a2abChet Haase
208ba6be8a62dcdb3ffd210cd36b9af4e3a658eac47Romain Guystatic void android_view_GLES20Canvas_detachFunctor(JNIEnv* env,
209017546e65280a3389b6167f5fc3b5d1c3001154aNarayan Kamath        jobject clazz, jlong rendererPtr, jlong functorPtr) {
2109f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
2119f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    Functor* functor = reinterpret_cast<Functor*>(functorPtr);
212ba6be8a62dcdb3ffd210cd36b9af4e3a658eac47Romain Guy    renderer->detachFunctor(functor);
213ba6be8a62dcdb3ffd210cd36b9af4e3a658eac47Romain Guy}
214ba6be8a62dcdb3ffd210cd36b9af4e3a658eac47Romain Guy
215ba6be8a62dcdb3ffd210cd36b9af4e3a658eac47Romain Guystatic void android_view_GLES20Canvas_attachFunctor(JNIEnv* env,
21636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jobject clazz, jlong rendererPtr, jlong functorPtr) {
2179f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
2189f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    Functor* functor = reinterpret_cast<Functor*>(functorPtr);
219ba6be8a62dcdb3ffd210cd36b9af4e3a658eac47Romain Guy    renderer->attachFunctor(functor);
220ba6be8a62dcdb3ffd210cd36b9af4e3a658eac47Romain Guy}
221ba6be8a62dcdb3ffd210cd36b9af4e3a658eac47Romain Guy
2228f3b8e32993d190a26c70c839a63d8ce4c3b16d9Romain Guystatic jint android_view_GLES20Canvas_invokeFunctors(JNIEnv* env,
22336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jobject clazz, jlong rendererPtr, jobject dirty) {
2249f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
2258f3b8e32993d190a26c70c839a63d8ce4c3b16d9Romain Guy    android::uirenderer::Rect bounds;
2268f3b8e32993d190a26c70c839a63d8ce4c3b16d9Romain Guy    status_t status = renderer->invokeFunctors(bounds);
2278f3b8e32993d190a26c70c839a63d8ce4c3b16d9Romain Guy    if (status != DrawGlInfo::kStatusDone && dirty != NULL) {
2288f3b8e32993d190a26c70c839a63d8ce4c3b16d9Romain Guy        env->CallVoidMethod(dirty, gRectClassInfo.set,
2298f3b8e32993d190a26c70c839a63d8ce4c3b16d9Romain Guy                int(bounds.left), int(bounds.top), int(bounds.right), int(bounds.bottom));
2308f3b8e32993d190a26c70c839a63d8ce4c3b16d9Romain Guy    }
2318f3b8e32993d190a26c70c839a63d8ce4c3b16d9Romain Guy    return status;
2328f3b8e32993d190a26c70c839a63d8ce4c3b16d9Romain Guy}
2338f3b8e32993d190a26c70c839a63d8ce4c3b16d9Romain Guy
2348f3b8e32993d190a26c70c839a63d8ce4c3b16d9Romain Guy// ----------------------------------------------------------------------------
2358f3b8e32993d190a26c70c839a63d8ce4c3b16d9Romain Guy// Misc
2368f3b8e32993d190a26c70c839a63d8ce4c3b16d9Romain Guy// ----------------------------------------------------------------------------
2378f3b8e32993d190a26c70c839a63d8ce4c3b16d9Romain Guy
238f61970fc79e9c5cf340fa942597628242361864aRomain Guystatic jint android_view_GLES20Canvas_getMaxTextureWidth(JNIEnv* env, jobject clazz) {
239f61970fc79e9c5cf340fa942597628242361864aRomain Guy    return Caches::getInstance().maxTextureSize;
240f61970fc79e9c5cf340fa942597628242361864aRomain Guy}
241f61970fc79e9c5cf340fa942597628242361864aRomain Guy
242f61970fc79e9c5cf340fa942597628242361864aRomain Guystatic jint android_view_GLES20Canvas_getMaxTextureHeight(JNIEnv* env, jobject clazz) {
243f61970fc79e9c5cf340fa942597628242361864aRomain Guy    return Caches::getInstance().maxTextureSize;
244f61970fc79e9c5cf340fa942597628242361864aRomain Guy}
245f61970fc79e9c5cf340fa942597628242361864aRomain Guy
246e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// ----------------------------------------------------------------------------
247bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy// State
248bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy// ----------------------------------------------------------------------------
249bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
25036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhatstatic jint android_view_GLES20Canvas_save(JNIEnv* env, jobject clazz, jlong rendererPtr,
251bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy        jint flags) {
2529f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
253f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy    return renderer->save(flags);
254f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy}
255bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
2567d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic jint android_view_GLES20Canvas_getSaveCount(JNIEnv* env, jobject clazz,
25736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr) {
2589f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
259f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy    return renderer->getSaveCount();
260bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy}
261bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
2627d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_restore(JNIEnv* env, jobject clazz,
26336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr) {
2649f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
265f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy    renderer->restore();
266bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy}
267bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
2687d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_restoreToCount(JNIEnv* env, jobject clazz,
26936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jint saveCount) {
2709f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
271f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy    renderer->restoreToCount(saveCount);
272bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy}
273bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
274f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy// ----------------------------------------------------------------------------
275bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy// Layers
276bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy// ----------------------------------------------------------------------------
277bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy
2787d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic jint android_view_GLES20Canvas_saveLayer(JNIEnv* env, jobject clazz,
27936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jfloat left, jfloat top, jfloat right, jfloat bottom,
28036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong paintPtr, jint saveFlags) {
2819f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
2829f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
283bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy    return renderer->saveLayer(left, top, right, bottom, paint, saveFlags);
284bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy}
285bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy
286189887e0ae171c1b7601991442104a30e56c50abRomain Guystatic jint android_view_GLES20Canvas_saveLayerClip(JNIEnv* env, jobject clazz,
28736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jlong paintPtr, jint saveFlags) {
2889f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
2899f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
290189887e0ae171c1b7601991442104a30e56c50abRomain Guy    const android::uirenderer::Rect& bounds(renderer->getClipBounds());
291189887e0ae171c1b7601991442104a30e56c50abRomain Guy    return renderer->saveLayer(bounds.left, bounds.top, bounds.right, bounds.bottom,
292189887e0ae171c1b7601991442104a30e56c50abRomain Guy            paint, saveFlags);
293189887e0ae171c1b7601991442104a30e56c50abRomain Guy}
294189887e0ae171c1b7601991442104a30e56c50abRomain Guy
2957d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic jint android_view_GLES20Canvas_saveLayerAlpha(JNIEnv* env, jobject clazz,
29636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jfloat left, jfloat top, jfloat right, jfloat bottom,
297bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy        jint alpha, jint saveFlags) {
2989f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
299bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy    return renderer->saveLayerAlpha(left, top, right, bottom, alpha, saveFlags);
300bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy}
301bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy
302189887e0ae171c1b7601991442104a30e56c50abRomain Guystatic jint android_view_GLES20Canvas_saveLayerAlphaClip(JNIEnv* env, jobject clazz,
30336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jint alpha, jint saveFlags) {
3049f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
305189887e0ae171c1b7601991442104a30e56c50abRomain Guy    const android::uirenderer::Rect& bounds(renderer->getClipBounds());
306189887e0ae171c1b7601991442104a30e56c50abRomain Guy    return renderer->saveLayerAlpha(bounds.left, bounds.top, bounds.right, bounds.bottom,
307189887e0ae171c1b7601991442104a30e56c50abRomain Guy            alpha, saveFlags);
308189887e0ae171c1b7601991442104a30e56c50abRomain Guy}
309189887e0ae171c1b7601991442104a30e56c50abRomain Guy
310bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy// ----------------------------------------------------------------------------
311f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy// Clipping
312f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy// ----------------------------------------------------------------------------
313f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy
31436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhatstatic jboolean android_view_GLES20Canvas_quickReject(JNIEnv* env, jobject clazz,
31536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jfloat left, jfloat top, jfloat right, jfloat bottom) {
3169f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
31736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    const bool result = renderer->quickRejectConservative(left, top, right, bottom);
31836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    return result ? JNI_TRUE : JNI_FALSE;
319c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy}
320c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy
32136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhatstatic jboolean android_view_GLES20Canvas_clipRectF(JNIEnv* env, jobject clazz,
32236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jfloat left, jfloat top, jfloat right, jfloat bottom,
32336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jint op) {
3249f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
32536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    const bool result = renderer->clipRect(left, top, right, bottom,
32636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat                                           static_cast<SkRegion::Op>(op));
32736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    return result ? JNI_TRUE : JNI_FALSE;
328f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy}
329bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
33036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhatstatic jboolean android_view_GLES20Canvas_clipRect(JNIEnv* env, jobject clazz,
33136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jint left, jint top, jint right, jint bottom,
33236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jint op) {
3339f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
33436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    const bool result = renderer->clipRect(float(left), float(top), float(right),
33536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat                                           float(bottom),
33636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat                                           static_cast<SkRegion::Op>(op));
33736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    return result ? JNI_TRUE : JNI_FALSE;
338bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy}
339bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
34036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhatstatic jboolean android_view_GLES20Canvas_clipPath(JNIEnv* env, jobject clazz,
34136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jlong pathPtr, jint op) {
3429f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
3439f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPath* path = reinterpret_cast<SkPath*>(pathPtr);
34436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    const bool result = renderer->clipPath(path, static_cast<SkRegion::Op>(op));
34536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    return result ? JNI_TRUE : JNI_FALSE;
346735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy}
347735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy
34836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhatstatic jboolean android_view_GLES20Canvas_clipRegion(JNIEnv* env, jobject clazz,
34936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jlong regionPtr, jint op) {
3509f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
3519f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkRegion* region = reinterpret_cast<SkRegion*>(regionPtr);
35236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    const bool result = renderer->clipRegion(region, static_cast<SkRegion::Op>(op));
35336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    return result ? JNI_TRUE : JNI_FALSE;
354735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy}
355735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy
35636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhatstatic jboolean android_view_GLES20Canvas_getClipBounds(JNIEnv* env, jobject clazz,
35736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jobject rect) {
3589f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
3597ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    const android::uirenderer::Rect& bounds(renderer->getClipBounds());
3609d5316e3f56d138504565ff311145ac01621dff4Romain Guy
3617ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    env->CallVoidMethod(rect, gRectClassInfo.set,
3627ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy            int(bounds.left), int(bounds.top), int(bounds.right), int(bounds.bottom));
3639d5316e3f56d138504565ff311145ac01621dff4Romain Guy
36436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    return !bounds.isEmpty() ? JNI_TRUE : JNI_FALSE;
3659d5316e3f56d138504565ff311145ac01621dff4Romain Guy}
3669d5316e3f56d138504565ff311145ac01621dff4Romain Guy
367bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy// ----------------------------------------------------------------------------
368f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy// Transforms
369bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy// ----------------------------------------------------------------------------
370bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
3717d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_translate(JNIEnv* env, jobject clazz,
37236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jfloat dx, jfloat dy) {
3739f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
3747ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    renderer->translate(dx, dy);
375f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy}
376bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
3777d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_rotate(JNIEnv* env, jobject clazz,
37836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jfloat degrees) {
3799f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
3807ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    renderer->rotate(degrees);
381bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy}
382bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
3837d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_scale(JNIEnv* env, jobject clazz,
38436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jfloat sx, jfloat sy) {
3859f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
3867ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    renderer->scale(sx, sy);
387f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy}
388bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
3897d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_skew(JNIEnv* env, jobject clazz,
39036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jfloat sx, jfloat sy) {
3919f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
392807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy    renderer->skew(sx, sy);
393807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy}
394807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy
3957d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_setMatrix(JNIEnv* env, jobject clazz,
39636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jlong matrixPtr) {
3979f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
3989f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixPtr);
3997ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    renderer->setMatrix(matrix);
400f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy}
401f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy
4027d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_getMatrix(JNIEnv* env, jobject clazz,
40336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jlong matrixPtr) {
4049f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
4059f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixPtr);
4067ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    renderer->getMatrix(matrix);
407f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy}
408f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy
4097d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_concatMatrix(JNIEnv* env, jobject clazz,
41036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jlong matrixPtr) {
4119f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
4129f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixPtr);
4137ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    renderer->concatMatrix(matrix);
414bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy}
415bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
416bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy// ----------------------------------------------------------------------------
417bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy// Drawing
41885bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy// ----------------------------------------------------------------------------
41985bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy
4207d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawBitmap(JNIEnv* env, jobject clazz,
42136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jlong bitmapPtr, jbyteArray buffer,
42236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jfloat left, jfloat top, jlong paintPtr) {
4239f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapPtr);
4240c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik    // This object allows the renderer to allocate a global JNI ref to the buffer object.
4250c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik    JavaHeapBitmapRef bitmapRef(env, bitmap, buffer);
4260c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik
4279f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
4289f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
429dbd77cd444f89d94ec5333223c1bc17dbe0c90cdRomain Guy    renderer->drawBitmap(bitmap, left, top, paint);
430ce0537b80087a6225273040a987414b1dd081aa0Romain Guy}
431ce0537b80087a6225273040a987414b1dd081aa0Romain Guy
4327d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawBitmapRect(JNIEnv* env, jobject clazz,
43336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jlong bitmapPtr, jbyteArray buffer,
434ce0537b80087a6225273040a987414b1dd081aa0Romain Guy        float srcLeft, float srcTop, float srcRight, float srcBottom,
43536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        float dstLeft, float dstTop, float dstRight, float dstBottom, jlong paintPtr) {
4369f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapPtr);
4370c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik    // This object allows the renderer to allocate a global JNI ref to the buffer object.
4380c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik    JavaHeapBitmapRef bitmapRef(env, bitmap, buffer);
4390c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik
4409f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
4419f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
442dbd77cd444f89d94ec5333223c1bc17dbe0c90cdRomain Guy    renderer->drawBitmap(bitmap, srcLeft, srcTop, srcRight, srcBottom,
443dbd77cd444f89d94ec5333223c1bc17dbe0c90cdRomain Guy            dstLeft, dstTop, dstRight, dstBottom, paint);
444f86ef57f8bcd8ba43ce222ec6a8b4f67d3600640Romain Guy}
4458ba548f81d1ab5f1750cbf86098c4a14e0b8beadRomain Guy
4467d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawBitmapMatrix(JNIEnv* env, jobject clazz,
44736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jlong bitmapPtr, jbyteArray buffer,
44836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong matrixPtr, jlong paintPtr) {
4499f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapPtr);
4500c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik    // This object allows the renderer to allocate a global JNI ref to the buffer object.
4510c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik    JavaHeapBitmapRef bitmapRef(env, bitmap, buffer);
4520c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik
4539f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
4549f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixPtr);
4559f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
456dbd77cd444f89d94ec5333223c1bc17dbe0c90cdRomain Guy    renderer->drawBitmap(bitmap, matrix, paint);
457ce0537b80087a6225273040a987414b1dd081aa0Romain Guy}
458ce0537b80087a6225273040a987414b1dd081aa0Romain Guy
459e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guystatic void android_view_GLES20Canvas_drawBitmapData(JNIEnv* env, jobject clazz,
46036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jintArray colors, jint offset, jint stride,
46136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jfloat left, jfloat top, jint width, jint height, jboolean hasAlpha, jlong paintPtr) {
46249c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    SkBitmap* bitmap = new SkBitmap;
46349c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    bitmap->setConfig(hasAlpha ? SkBitmap::kARGB_8888_Config : SkBitmap::kRGB_565_Config,
46449c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy            width, height);
465e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy
46649c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    if (!bitmap->allocPixels()) {
46749c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy        delete bitmap;
468e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy        return;
469e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy    }
470e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy
4711abf5d62429e5a9329520b2f7c2b5a5e7a8e72ecChris Craik    if (!GraphicsJNI::SetPixels(env, colors, offset, stride, 0, 0, width, height, *bitmap, true)) {
47249c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy        delete bitmap;
473e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy        return;
474e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy    }
475e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy
4769f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
4779f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
47849c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    renderer->drawBitmapData(bitmap, left, top, paint);
47949c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy
48049c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    // If the renderer is a deferred renderer it will own the bitmap
481b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik    if (!renderer->isRecording()) {
48249c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy        delete bitmap;
48349c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    }
484e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy}
485e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy
4867d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawBitmapMesh(JNIEnv* env, jobject clazz,
48736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jlong bitmapPtr, jbyteArray buffer,
4880c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik        jint meshWidth, jint meshHeight, jfloatArray vertices, jint offset, jintArray colors,
48936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jint colorOffset, jlong paintPtr) {
4909f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapPtr);
4910c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik    // This object allows the renderer to allocate a global JNI ref to the buffer object.
4920c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik    JavaHeapBitmapRef bitmapRef(env, bitmap, buffer);
4930c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik
4945a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    jfloat* verticesArray = vertices ? env->GetFloatArrayElements(vertices, NULL) + offset : NULL;
4955a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    jint* colorsArray = colors ? env->GetIntArrayElements(colors, NULL) + colorOffset : NULL;
4965a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy
4979f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
4989f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
4995a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    renderer->drawBitmapMesh(bitmap, meshWidth, meshHeight, verticesArray, colorsArray, paint);
5005a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy
5015a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    if (vertices) env->ReleaseFloatArrayElements(vertices, verticesArray, 0);
5025a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    if (colors) env->ReleaseIntArrayElements(colors, colorsArray, 0);
5035a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy}
5045a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy
5057d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawPatch(JNIEnv* env, jobject clazz,
50636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jlong bitmapPtr, jbyteArray buffer, jlong patchPtr,
50736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        float left, float top, float right, float bottom, jlong paintPtr) {
5089f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapPtr);
5090c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik    // This object allows the renderer to allocate a global JNI ref to the buffer object.
5100c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik    JavaHeapBitmapRef bitmapRef(env, bitmap, buffer);
5110c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik
5129f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
5139f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    Res_png_9patch* patch = reinterpret_cast<Res_png_9patch*>(patchPtr);
5149f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
5153b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    renderer->drawPatch(bitmap, patch, left, top, right, bottom, paint);
516deba785f122a47915756ffd991f5540d952cf937Romain Guy}
517deba785f122a47915756ffd991f5540d952cf937Romain Guy
5187d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawColor(JNIEnv* env, jobject clazz,
51936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jint color, jint mode) {
5209f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
52136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    renderer->drawColor(color, static_cast<SkXfermode::Mode>(mode));
52285bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy}
52385bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy
5247d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawRect(JNIEnv* env, jobject clazz,
52536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jfloat left, jfloat top, jfloat right, jfloat bottom,
52636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong paintPtr) {
5279f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
5289f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
529c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy    renderer->drawRect(left, top, right, bottom, paint);
530c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy}
531c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy
5327d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawRoundRect(JNIEnv* env, jobject clazz,
53336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jfloat left, jfloat top, jfloat right, jfloat bottom,
53436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jfloat rx, jfloat ry, jlong paintPtr) {
5359f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
5369f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
53701d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    renderer->drawRoundRect(left, top, right, bottom, rx, ry, paint);
53801d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy}
53901d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy
5407d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawCircle(JNIEnv* env, jobject clazz,
54136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jfloat x, jfloat y, jfloat radius, jlong paintPtr) {
5429f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
5439f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
54401d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    renderer->drawCircle(x, y, radius, paint);
54501d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy}
54601d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy
5477d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawOval(JNIEnv* env, jobject clazz,
54836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jfloat left, jfloat top, jfloat right, jfloat bottom,
54936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong paintPtr) {
5509f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
5519f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
552c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy    renderer->drawOval(left, top, right, bottom, paint);
553c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy}
554c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy
5557d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawArc(JNIEnv* env, jobject clazz,
55636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jfloat left, jfloat top, jfloat right, jfloat bottom,
55736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jfloat startAngle, jfloat sweepAngle, jboolean useCenter, jlong paintPtr) {
5589f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
5599f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
5608b2f5267f16c295f12faab810527cd6311997e34Romain Guy    renderer->drawArc(left, top, right, bottom, startAngle, sweepAngle, useCenter, paint);
5618b2f5267f16c295f12faab810527cd6311997e34Romain Guy}
5628b2f5267f16c295f12faab810527cd6311997e34Romain Guy
563672433d90fab7383cd28beac9d4485b566a90940Romain Guystatic void android_view_GLES20Canvas_drawRegionAsRects(JNIEnv* env, jobject clazz,
56436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jlong regionPtr, jlong paintPtr) {
5659f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
5669f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkRegion* region = reinterpret_cast<SkRegion*>(regionPtr);
5679f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
568672433d90fab7383cd28beac9d4485b566a90940Romain Guy    if (paint->getStyle() != SkPaint::kFill_Style ||
569672433d90fab7383cd28beac9d4485b566a90940Romain Guy            (paint->isAntiAlias() && !renderer->isCurrentTransformSimple())) {
570672433d90fab7383cd28beac9d4485b566a90940Romain Guy        SkRegion::Iterator it(*region);
571672433d90fab7383cd28beac9d4485b566a90940Romain Guy        while (!it.done()) {
572672433d90fab7383cd28beac9d4485b566a90940Romain Guy            const SkIRect& r = it.rect();
573672433d90fab7383cd28beac9d4485b566a90940Romain Guy            renderer->drawRect(r.fLeft, r.fTop, r.fRight, r.fBottom, paint);
574672433d90fab7383cd28beac9d4485b566a90940Romain Guy            it.next();
575672433d90fab7383cd28beac9d4485b566a90940Romain Guy        }
576672433d90fab7383cd28beac9d4485b566a90940Romain Guy    } else {
577672433d90fab7383cd28beac9d4485b566a90940Romain Guy        int count = 0;
578672433d90fab7383cd28beac9d4485b566a90940Romain Guy        Vector<float> rects;
579672433d90fab7383cd28beac9d4485b566a90940Romain Guy        SkRegion::Iterator it(*region);
580672433d90fab7383cd28beac9d4485b566a90940Romain Guy        while (!it.done()) {
581672433d90fab7383cd28beac9d4485b566a90940Romain Guy            const SkIRect& r = it.rect();
582672433d90fab7383cd28beac9d4485b566a90940Romain Guy            rects.push(r.fLeft);
583672433d90fab7383cd28beac9d4485b566a90940Romain Guy            rects.push(r.fTop);
584672433d90fab7383cd28beac9d4485b566a90940Romain Guy            rects.push(r.fRight);
585672433d90fab7383cd28beac9d4485b566a90940Romain Guy            rects.push(r.fBottom);
5862af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik            count += 4;
587672433d90fab7383cd28beac9d4485b566a90940Romain Guy            it.next();
588672433d90fab7383cd28beac9d4485b566a90940Romain Guy        }
589672433d90fab7383cd28beac9d4485b566a90940Romain Guy        renderer->drawRects(rects.array(), count, paint);
590a48a1a87ba17f20f7006eaab21dcedf86c015c13Romain Guy    }
591a48a1a87ba17f20f7006eaab21dcedf86c015c13Romain Guy}
592a48a1a87ba17f20f7006eaab21dcedf86c015c13Romain Guy
593672433d90fab7383cd28beac9d4485b566a90940Romain Guystatic void android_view_GLES20Canvas_drawRects(JNIEnv* env, jobject clazz,
59436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jfloatArray rects, jint count, jlong paintPtr) {
5959f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
596672433d90fab7383cd28beac9d4485b566a90940Romain Guy    jfloat* storage = env->GetFloatArrayElements(rects, NULL);
5979f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
598672433d90fab7383cd28beac9d4485b566a90940Romain Guy    renderer->drawRects(storage, count, paint);
599672433d90fab7383cd28beac9d4485b566a90940Romain Guy    env->ReleaseFloatArrayElements(rects, storage, 0);
600672433d90fab7383cd28beac9d4485b566a90940Romain Guy}
601672433d90fab7383cd28beac9d4485b566a90940Romain Guy
602ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guystatic void android_view_GLES20Canvas_drawPoints(JNIEnv* env, jobject clazz,
60336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jfloatArray points, jint offset, jint count, jlong paintPtr) {
6049f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
605ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy    jfloat* storage = env->GetFloatArrayElements(points, NULL);
6069f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
607ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy    renderer->drawPoints(storage + offset, count, paint);
608ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy    env->ReleaseFloatArrayElements(points, storage, 0);
609ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy}
610ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy
6117d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawPath(JNIEnv* env, jobject clazz,
61236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jlong pathPtr, jlong paintPtr) {
6139f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
6149f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPath* path = reinterpret_cast<SkPath*>(pathPtr);
6159f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
6167fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy    renderer->drawPath(path, paint);
6177fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy}
6187fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy
6197d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawLines(JNIEnv* env, jobject clazz,
62036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jfloatArray points, jint offset, jint count, jlong paintPtr) {
6219f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
622759ea80dca64ad652110a129e0d8bf93fea79f61Romain Guy    jfloat* storage = env->GetFloatArrayElements(points, NULL);
6239f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
624759ea80dca64ad652110a129e0d8bf93fea79f61Romain Guy    renderer->drawLines(storage + offset, count, paint);
625759ea80dca64ad652110a129e0d8bf93fea79f61Romain Guy    env->ReleaseFloatArrayElements(points, storage, 0);
626759ea80dca64ad652110a129e0d8bf93fea79f61Romain Guy}
627759ea80dca64ad652110a129e0d8bf93fea79f61Romain Guy
62885bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy// ----------------------------------------------------------------------------
629db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy// Shaders and color filters
630d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy// ----------------------------------------------------------------------------
631d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy
6327d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_resetModifiers(JNIEnv* env, jobject clazz,
63336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jint modifiers) {
6349f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
635a168d7372132d6c87835878794b6ed43d0d282fdRomain Guy    if (modifiers & MODIFIER_SHADOW) renderer->resetShadow();
636a168d7372132d6c87835878794b6ed43d0d282fdRomain Guy    if (modifiers & MODIFIER_SHADER) renderer->resetShader();
637d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy}
638d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy
6397d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_setupShader(JNIEnv* env, jobject clazz,
64036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jlong shaderPtr) {
6419f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
6429f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkiaShader* shader = reinterpret_cast<SkiaShader*>(shaderPtr);
64306f96e2652e4855b6520ad9dd70583677605b79aRomain Guy    renderer->setupShader(shader);
6447fac2e18339f765320d759e8d4c090f92431959eRomain Guy}
6457fac2e18339f765320d759e8d4c090f92431959eRomain Guy
646db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy
6477d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_setupShadow(JNIEnv* env, jobject clazz,
64836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jfloat radius, jfloat dx, jfloat dy, jint color) {
6499f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
6501e45aae5de003657e5d18f74d34998f5de5db5b7Romain Guy    renderer->setupShadow(radius, dx, dy, color);
6511e45aae5de003657e5d18f74d34998f5de5db5b7Romain Guy}
6521e45aae5de003657e5d18f74d34998f5de5db5b7Romain Guy
653d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy// ----------------------------------------------------------------------------
6545ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy// Draw filters
6555ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy// ----------------------------------------------------------------------------
6565ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy
6575ff9df658230d49e42c43586997a02d8e4dd417eRomain Guystatic void android_view_GLES20Canvas_setupPaintFilter(JNIEnv* env, jobject clazz,
65836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jint clearBits, jint setBits) {
6599f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
6605ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    renderer->setupPaintFilter(clearBits, setBits);
6615ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy}
6625ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy
6635ff9df658230d49e42c43586997a02d8e4dd417eRomain Guystatic void android_view_GLES20Canvas_resetPaintFilter(JNIEnv* env, jobject clazz,
66436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr) {
6659f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
6665ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    renderer->resetPaintFilter();
6675ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy}
6685ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy
6695ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy// ----------------------------------------------------------------------------
670a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy// Text
671a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy// ----------------------------------------------------------------------------
672a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy
67341541825bc90dac740e424cdd41a8c997e15cdb7Chris Craikstatic float xOffsetForTextAlign(SkPaint* paint, float totalAdvance) {
67441541825bc90dac740e424cdd41a8c997e15cdb7Chris Craik    switch (paint->getTextAlign()) {
67541541825bc90dac740e424cdd41a8c997e15cdb7Chris Craik        case SkPaint::kCenter_Align:
67641541825bc90dac740e424cdd41a8c997e15cdb7Chris Craik            return -totalAdvance / 2.0f;
67741541825bc90dac740e424cdd41a8c997e15cdb7Chris Craik            break;
67841541825bc90dac740e424cdd41a8c997e15cdb7Chris Craik        case SkPaint::kRight_Align:
67941541825bc90dac740e424cdd41a8c997e15cdb7Chris Craik            return -totalAdvance;
68041541825bc90dac740e424cdd41a8c997e15cdb7Chris Craik            break;
68141541825bc90dac740e424cdd41a8c997e15cdb7Chris Craik        default:
68241541825bc90dac740e424cdd41a8c997e15cdb7Chris Craik            break;
68341541825bc90dac740e424cdd41a8c997e15cdb7Chris Craik    }
68441541825bc90dac740e424cdd41a8c997e15cdb7Chris Craik    return 0;
68541541825bc90dac740e424cdd41a8c997e15cdb7Chris Craik}
68641541825bc90dac740e424cdd41a8c997e15cdb7Chris Craik
687e8e62a4a032a80409114a37908b5f18ab0080848Romain Guystatic void renderText(OpenGLRenderer* renderer, const jchar* text, int count,
688da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio        jfloat x, jfloat y, int flags, SkPaint* paint) {
689a731b082b2c43204e6e9f927ab82fb732934a83bFabrice Di Meglio    sp<TextLayoutValue> value = TextLayoutEngine::getInstance().getValue(paint,
690da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio            text, 0, count, count, flags);
6912ea75880142152b3a9993cb245754d73c05749a7Fabrice Di Meglio    if (value == NULL) {
692b02d0ca5553300063e4332192632312600caf4b9Fabrice Di Meglio        return;
6932ea75880142152b3a9993cb245754d73c05749a7Fabrice Di Meglio    }
6945c863f741e8e484bb39decd516c9fa4c6322e671Fabrice Di Meglio    const jchar* glyphs = value->getGlyphs();
6955c863f741e8e484bb39decd516c9fa4c6322e671Fabrice Di Meglio    size_t glyphsCount = value->getGlyphsCount();
696996e57c84368058be793897ebc355b917a59abc2Raph Levien    jfloat totalAdvance = value->getTotalAdvance();
697b15b446f420b3ec69424dabcbcbc8cf019d6c8d6Romain Guy    x += xOffsetForTextAlign(paint, totalAdvance);
698996e57c84368058be793897ebc355b917a59abc2Raph Levien    const float* positions = value->getPos();
69979df5323e7ed541b854cea5684a89e8be8c2dfc9Fabrice Di Meglio    int bytesCount = glyphsCount * sizeof(jchar);
70041541825bc90dac740e424cdd41a8c997e15cdb7Chris Craik    const SkRect& r = value->getBounds();
70141541825bc90dac740e424cdd41a8c997e15cdb7Chris Craik    android::uirenderer::Rect bounds(r.fLeft, r.fTop, r.fRight, r.fBottom);
702f09b746acb266a849f3421df1604ebec161bb93dChris Craik    bounds.translate(x, y);
70341541825bc90dac740e424cdd41a8c997e15cdb7Chris Craik
70441541825bc90dac740e424cdd41a8c997e15cdb7Chris Craik    renderer->drawText((const char*) glyphs, bytesCount, glyphsCount,
705b15b446f420b3ec69424dabcbcbc8cf019d6c8d6Romain Guy            x, y, positions, paint, totalAdvance, bounds);
706e8e62a4a032a80409114a37908b5f18ab0080848Romain Guy}
707e8e62a4a032a80409114a37908b5f18ab0080848Romain Guy
708325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guystatic void renderTextOnPath(OpenGLRenderer* renderer, const jchar* text, int count,
709da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio        SkPath* path, jfloat hOffset, jfloat vOffset, int flags, SkPaint* paint) {
710325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    sp<TextLayoutValue> value = TextLayoutEngine::getInstance().getValue(paint,
711da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio            text, 0, count, count, flags);
712325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    if (value == NULL) {
713325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy        return;
714325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    }
715325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    const jchar* glyphs = value->getGlyphs();
716325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    size_t glyphsCount = value->getGlyphsCount();
717325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    int bytesCount = glyphsCount * sizeof(jchar);
718325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    renderer->drawTextOnPath((const char*) glyphs, bytesCount, glyphsCount, path,
719325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy            hOffset, vOffset, paint);
720325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy}
721325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy
72261c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guystatic void renderTextRun(OpenGLRenderer* renderer, const jchar* text,
72361c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy        jint start, jint count, jint contextCount, jfloat x, jfloat y,
724da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio        int flags, SkPaint* paint) {
725a731b082b2c43204e6e9f927ab82fb732934a83bFabrice Di Meglio    sp<TextLayoutValue> value = TextLayoutEngine::getInstance().getValue(paint,
726da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio            text, start, count, contextCount, flags);
7272ea75880142152b3a9993cb245754d73c05749a7Fabrice Di Meglio    if (value == NULL) {
728b02d0ca5553300063e4332192632312600caf4b9Fabrice Di Meglio        return;
7292ea75880142152b3a9993cb245754d73c05749a7Fabrice Di Meglio    }
7305c863f741e8e484bb39decd516c9fa4c6322e671Fabrice Di Meglio    const jchar* glyphs = value->getGlyphs();
7315c863f741e8e484bb39decd516c9fa4c6322e671Fabrice Di Meglio    size_t glyphsCount = value->getGlyphsCount();
732996e57c84368058be793897ebc355b917a59abc2Raph Levien    jfloat totalAdvance = value->getTotalAdvance();
733b15b446f420b3ec69424dabcbcbc8cf019d6c8d6Romain Guy    x += xOffsetForTextAlign(paint, totalAdvance);
734996e57c84368058be793897ebc355b917a59abc2Raph Levien    const float* positions = value->getPos();
73579df5323e7ed541b854cea5684a89e8be8c2dfc9Fabrice Di Meglio    int bytesCount = glyphsCount * sizeof(jchar);
73641541825bc90dac740e424cdd41a8c997e15cdb7Chris Craik    const SkRect& r = value->getBounds();
73741541825bc90dac740e424cdd41a8c997e15cdb7Chris Craik    android::uirenderer::Rect bounds(r.fLeft, r.fTop, r.fRight, r.fBottom);
738f09b746acb266a849f3421df1604ebec161bb93dChris Craik    bounds.translate(x, y);
73941541825bc90dac740e424cdd41a8c997e15cdb7Chris Craik
74041541825bc90dac740e424cdd41a8c997e15cdb7Chris Craik    renderer->drawText((const char*) glyphs, bytesCount, glyphsCount,
741b15b446f420b3ec69424dabcbcbc8cf019d6c8d6Romain Guy            x, y, positions, paint, totalAdvance, bounds);
74261c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy}
74361c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy
7447d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawTextArray(JNIEnv* env, jobject clazz,
74536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jcharArray text, jint index, jint count,
74636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jfloat x, jfloat y, jint flags, jlong paintPtr) {
7479f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
748a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy    jchar* textArray = env->GetCharArrayElements(text, NULL);
7499f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
7509f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik
751da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio    renderText(renderer, textArray + index, count, x, y, flags, paint);
752a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy    env->ReleaseCharArrayElements(text, textArray, JNI_ABORT);
753a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy}
754a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy
7557d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawText(JNIEnv* env, jobject clazz,
75636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jstring text, jint start, jint end,
75736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jfloat x, jfloat y, jint flags, jlong paintPtr) {
7589f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
759a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy    const jchar* textArray = env->GetStringChars(text, NULL);
7609f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
7619f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik
762da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio    renderText(renderer, textArray + start, end - start, x, y, flags, paint);
763a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy    env->ReleaseStringChars(text, textArray);
764a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy}
765a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy
766325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guystatic void android_view_GLES20Canvas_drawTextArrayOnPath(JNIEnv* env, jobject clazz,
76736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jcharArray text, jint index, jint count,
76836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong pathPtr, jfloat hOffset, jfloat vOffset, jint flags, jlong paintPtr) {
7699f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
770325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    jchar* textArray = env->GetCharArrayElements(text, NULL);
7719f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPath* path = reinterpret_cast<SkPath*>(pathPtr);
7729f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
7739f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik
774325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    renderTextOnPath(renderer, textArray + index, count, path,
775da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio            hOffset, vOffset, flags, paint);
776325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    env->ReleaseCharArrayElements(text, textArray, JNI_ABORT);
777325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy}
778325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy
779325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guystatic void android_view_GLES20Canvas_drawTextOnPath(JNIEnv* env, jobject clazz,
78036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jstring text, jint start, jint end,
78136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong pathPtr, jfloat hOffset, jfloat vOffset, jint flags, jlong paintPtr) {
7829f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
783325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    const jchar* textArray = env->GetStringChars(text, NULL);
7849f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPath* path = reinterpret_cast<SkPath*>(pathPtr);
7859f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
7869f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik
787325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    renderTextOnPath(renderer, textArray + start, end - start, path,
788da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio            hOffset, vOffset, flags, paint);
789325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    env->ReleaseStringChars(text, textArray);
790325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy}
791325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy
7927d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawTextRunArray(JNIEnv* env, jobject clazz,
79336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jcharArray text, jint index, jint count,
794da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio        jint contextIndex, jint contextCount, jfloat x, jfloat y, jint dirFlags,
79536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong paintPtr) {
7969f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
79761c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy    jchar* textArray = env->GetCharArrayElements(text, NULL);
7989f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
7999f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik
80061c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy    renderTextRun(renderer, textArray + contextIndex, index - contextIndex,
801da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio            count, contextCount, x, y, dirFlags, paint);
80261c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy    env->ReleaseCharArrayElements(text, textArray, JNI_ABORT);
80361c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy }
80461c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy
8057d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawTextRun(JNIEnv* env, jobject clazz,
80636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jstring text, jint start, jint end,
807da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio        jint contextStart, int contextEnd, jfloat x, jfloat y, jint dirFlags,
80836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong paintPtr) {
8099f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
81061c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy    const jchar* textArray = env->GetStringChars(text, NULL);
81161c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy    jint count = end - start;
81261c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy    jint contextCount = contextEnd - contextStart;
8139f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
8149f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik
81561c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy    renderTextRun(renderer, textArray + contextStart, start - contextStart,
816da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio            count, contextCount, x, y, dirFlags, paint);
81761c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy    env->ReleaseStringChars(text, textArray);
81861c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy}
81961c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy
820eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guystatic void renderPosText(OpenGLRenderer* renderer, const jchar* text, int count,
821da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio        const jfloat* positions, jint dirFlags, SkPaint* paint) {
822a731b082b2c43204e6e9f927ab82fb732934a83bFabrice Di Meglio    sp<TextLayoutValue> value = TextLayoutEngine::getInstance().getValue(paint,
823da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio            text, 0, count, count, dirFlags);
824eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    if (value == NULL) {
825eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy        return;
826eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    }
827eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    const jchar* glyphs = value->getGlyphs();
828eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    size_t glyphsCount = value->getGlyphsCount();
829671d6cf460531825a321edb200523d0faa7792c9Romain Guy    if (count < int(glyphsCount)) glyphsCount = count;
830eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    int bytesCount = glyphsCount * sizeof(jchar);
831eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy
832671d6cf460531825a321edb200523d0faa7792c9Romain Guy    renderer->drawPosText((const char*) glyphs, bytesCount, glyphsCount, positions, paint);
833eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy}
834eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy
835eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guystatic void android_view_GLES20Canvas_drawPosTextArray(JNIEnv* env, jobject clazz,
83636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jcharArray text, jint index, jint count,
83736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jfloatArray pos, jlong paintPtr) {
8389f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
839eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    jchar* textArray = env->GetCharArrayElements(text, NULL);
840eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    jfloat* positions = env->GetFloatArrayElements(pos, NULL);
8419f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
842eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy
843da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio    renderPosText(renderer, textArray + index, count, positions, kBidi_LTR, paint);
844eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy
845eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    env->ReleaseFloatArrayElements(pos, positions, JNI_ABORT);
846eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    env->ReleaseCharArrayElements(text, textArray, JNI_ABORT);
847eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy}
848eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy
849eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guystatic void android_view_GLES20Canvas_drawPosText(JNIEnv* env, jobject clazz,
85036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jstring text, jint start, jint end,
85136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jfloatArray pos, jlong paintPtr) {
8529f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
853eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    const jchar* textArray = env->GetStringChars(text, NULL);
854eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    jfloat* positions = env->GetFloatArrayElements(pos, NULL);
8559f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
856eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy
857da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio    renderPosText(renderer, textArray + start, end - start, positions, kBidi_LTR, paint);
858eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy
859eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    env->ReleaseFloatArrayElements(pos, positions, JNI_ABORT);
860eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    env->ReleaseStringChars(text, textArray);
861eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy}
862eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy
863b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy// ----------------------------------------------------------------------------
864b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy// Display lists
865b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy// ----------------------------------------------------------------------------
866b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
86744fd8d24f761f82d21e9b00932648a1b6bf91449John Reckstatic jlong android_view_GLES20Canvas_finishRecording(JNIEnv* env,
86844fd8d24f761f82d21e9b00932648a1b6bf91449John Reck        jobject clazz, jlong rendererPtr) {
8699f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
87044fd8d24f761f82d21e9b00932648a1b6bf91449John Reck    return reinterpret_cast<jlong>(renderer->finishRecording());
871162a0217563f4665da6eb183dfce0fef740f641fJeff Brown}
872162a0217563f4665da6eb183dfce0fef740f641fJeff Brown
87344fd8d24f761f82d21e9b00932648a1b6bf91449John Reckstatic jlong android_view_GLES20Canvas_createDisplayListRenderer(JNIEnv* env,
874162a0217563f4665da6eb183dfce0fef740f641fJeff Brown        jobject clazz) {
87544fd8d24f761f82d21e9b00932648a1b6bf91449John Reck    return reinterpret_cast<jlong>(new DisplayListRenderer);
8765977baa1fa24125c148a72699b53e62abaf08960Chet Haase}
8775977baa1fa24125c148a72699b53e62abaf08960Chet Haase
8786554943a1dd6854c0f4976900956e556767b49e1Romain Guystatic jint android_view_GLES20Canvas_drawDisplayList(JNIEnv* env,
87936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jobject clazz, jlong rendererPtr, jlong displayListPtr,
8801271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        jobject dirty, jint flags) {
8819f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
882e18264b079481a244b30e3f71012c53bbd861f92John Reck    RenderNode* displayList = reinterpret_cast<RenderNode*>(displayListPtr);
883cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy    android::uirenderer::Rect bounds;
8841271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    status_t status = renderer->drawDisplayList(displayList, bounds, flags);
8856554943a1dd6854c0f4976900956e556767b49e1Romain Guy    if (status != DrawGlInfo::kStatusDone && dirty != NULL) {
886cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy        env->CallVoidMethod(dirty, gRectClassInfo.set,
887cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy                int(bounds.left), int(bounds.top), int(bounds.right), int(bounds.bottom));
888cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy    }
8896554943a1dd6854c0f4976900956e556767b49e1Romain Guy    return status;
890b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
891b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
8926c319ca1275c8db892c39b48fc54864c949f9171Romain Guy// ----------------------------------------------------------------------------
8936c319ca1275c8db892c39b48fc54864c949f9171Romain Guy// Layers
8946c319ca1275c8db892c39b48fc54864c949f9171Romain Guy// ----------------------------------------------------------------------------
8956c319ca1275c8db892c39b48fc54864c949f9171Romain Guy
896c89b14bba0f6cc2c91629080617f7ed215f697f3Romain Guystatic void android_view_GLES20Canvas_interrupt(JNIEnv* env, jobject clazz,
89736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr) {
8989f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
899c89b14bba0f6cc2c91629080617f7ed215f697f3Romain Guy    renderer->interrupt();
900c89b14bba0f6cc2c91629080617f7ed215f697f3Romain Guy}
901c89b14bba0f6cc2c91629080617f7ed215f697f3Romain Guy
902c89b14bba0f6cc2c91629080617f7ed215f697f3Romain Guystatic void android_view_GLES20Canvas_resume(JNIEnv* env, jobject clazz,
90336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr) {
9049f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
905c89b14bba0f6cc2c91629080617f7ed215f697f3Romain Guy    renderer->resume();
906c89b14bba0f6cc2c91629080617f7ed215f697f3Romain Guy}
907c89b14bba0f6cc2c91629080617f7ed215f697f3Romain Guy
9087d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawLayer(JNIEnv* env, jobject clazz,
90936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jlong layerPtr, jfloat x, jfloat y) {
9109f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
9119f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    Layer* layer = reinterpret_cast<Layer*>(layerPtr);
912a08f95cfeca7217f9c533b03663bf0dceedd259aChris Craik    renderer->drawLayer(layer, x, y);
9136c319ca1275c8db892c39b48fc54864c949f9171Romain Guy}
9146c319ca1275c8db892c39b48fc54864c949f9171Romain Guy
91577a811610f99e21da7f88dafef60d09f345d0506Romain Guystatic jboolean android_view_GLES20Canvas_copyLayer(JNIEnv* env, jobject clazz,
91636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong layerPtr, jlong bitmapPtr) {
9179f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    Layer* layer = reinterpret_cast<Layer*>(layerPtr);
9189f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapPtr);
91977a811610f99e21da7f88dafef60d09f345d0506Romain Guy    return LayerRenderer::copyLayer(layer, bitmap);
92077a811610f99e21da7f88dafef60d09f345d0506Romain Guy}
92177a811610f99e21da7f88dafef60d09f345d0506Romain Guy
92211cb642756093a4af901b1525375b1eb2b5c3e2bRomain Guystatic void android_view_GLES20Canvas_pushLayerUpdate(JNIEnv* env, jobject clazz,
92336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jlong layerPtr) {
9249f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
9259f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    Layer* layer = reinterpret_cast<Layer*>(layerPtr);
92611cb642756093a4af901b1525375b1eb2b5c3e2bRomain Guy    renderer->pushLayerUpdate(layer);
92711cb642756093a4af901b1525375b1eb2b5c3e2bRomain Guy}
92811cb642756093a4af901b1525375b1eb2b5c3e2bRomain Guy
929e93482f5eac3df581d57e64c2a771a96aa868585Romain Guystatic void android_view_GLES20Canvas_cancelLayerUpdate(JNIEnv* env, jobject clazz,
93036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jlong layerPtr) {
9319f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
9329f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    Layer* layer = reinterpret_cast<Layer*>(layerPtr);
933e93482f5eac3df581d57e64c2a771a96aa868585Romain Guy    renderer->cancelLayerUpdate(layer);
934e93482f5eac3df581d57e64c2a771a96aa868585Romain Guy}
935e93482f5eac3df581d57e64c2a771a96aa868585Romain Guy
93611cb642756093a4af901b1525375b1eb2b5c3e2bRomain Guystatic void android_view_GLES20Canvas_clearLayerUpdates(JNIEnv* env, jobject clazz,
93736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr) {
9389f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
93911cb642756093a4af901b1525375b1eb2b5c3e2bRomain Guy    renderer->clearLayerUpdates();
94011cb642756093a4af901b1525375b1eb2b5c3e2bRomain Guy}
94111cb642756093a4af901b1525375b1eb2b5c3e2bRomain Guy
942405436021da156fbe3c5d4de48bdefa564cf7fc0Romain Guystatic void android_view_GLES20Canvas_flushLayerUpdates(JNIEnv* env, jobject clazz,
94336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr) {
9449f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
945405436021da156fbe3c5d4de48bdefa564cf7fc0Romain Guy    renderer->flushLayerUpdates();
946405436021da156fbe3c5d4de48bdefa564cf7fc0Romain Guy}
947405436021da156fbe3c5d4de48bdefa564cf7fc0Romain Guy
948163935113919a184122b8b3bd672ef08c8df65dcRomain Guy#endif // USE_OPENGL_RENDERER
949163935113919a184122b8b3bd672ef08c8df65dcRomain Guy
950163935113919a184122b8b3bd672ef08c8df65dcRomain Guy// ----------------------------------------------------------------------------
951163935113919a184122b8b3bd672ef08c8df65dcRomain Guy// Common
952163935113919a184122b8b3bd672ef08c8df65dcRomain Guy// ----------------------------------------------------------------------------
953163935113919a184122b8b3bd672ef08c8df65dcRomain Guy
954163935113919a184122b8b3bd672ef08c8df65dcRomain Guystatic jboolean android_view_GLES20Canvas_isAvailable(JNIEnv* env, jobject clazz) {
955163935113919a184122b8b3bd672ef08c8df65dcRomain Guy#ifdef USE_OPENGL_RENDERER
9564406345cd62d3687ce590c357854472f7f906e6cJesse Hall    char prop[PROPERTY_VALUE_MAX];
9574406345cd62d3687ce590c357854472f7f906e6cJesse Hall    if (property_get("ro.kernel.qemu", prop, NULL) == 0) {
9584406345cd62d3687ce590c357854472f7f906e6cJesse Hall        // not in the emulator
9594406345cd62d3687ce590c357854472f7f906e6cJesse Hall        return JNI_TRUE;
9604406345cd62d3687ce590c357854472f7f906e6cJesse Hall    }
9614406345cd62d3687ce590c357854472f7f906e6cJesse Hall    // In the emulator this property will be set to 1 when hardware GLES is
9624406345cd62d3687ce590c357854472f7f906e6cJesse Hall    // enabled, 0 otherwise. On old emulator versions it will be undefined.
9634406345cd62d3687ce590c357854472f7f906e6cJesse Hall    property_get("ro.kernel.qemu.gles", prop, "0");
9644406345cd62d3687ce590c357854472f7f906e6cJesse Hall    return atoi(prop) == 1 ? JNI_TRUE : JNI_FALSE;
965163935113919a184122b8b3bd672ef08c8df65dcRomain Guy#else
966163935113919a184122b8b3bd672ef08c8df65dcRomain Guy    return JNI_FALSE;
967163935113919a184122b8b3bd672ef08c8df65dcRomain Guy#endif
968163935113919a184122b8b3bd672ef08c8df65dcRomain Guy}
969163935113919a184122b8b3bd672ef08c8df65dcRomain Guy
970a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy// ----------------------------------------------------------------------------
9719c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase// Logging
9729c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase// ----------------------------------------------------------------------------
9739c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase
9749c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haasestatic void
97565b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guyandroid_app_ActivityThread_dumpGraphics(JNIEnv* env, jobject clazz, jobject javaFileDescriptor) {
976905787a7c91d23daa4efc3d16bd8cbf1a683e779Chet Haase#ifdef USE_OPENGL_RENDERER
977a3804cf77f0edd93f6247a055cdafb856b117eecElliott Hughes    int fd = jniGetFDFromFileDescriptor(env, javaFileDescriptor);
978e18264b079481a244b30e3f71012c53bbd861f92John Reck    android::uirenderer::RenderNode::outputLogBuffer(fd);
979905787a7c91d23daa4efc3d16bd8cbf1a683e779Chet Haase#endif // USE_OPENGL_RENDERER
9809c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase}
9819c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase
9829c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase// ----------------------------------------------------------------------------
983e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// JNI Glue
984e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// ----------------------------------------------------------------------------
985e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
986e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guyconst char* const kClassPathName = "android/view/GLES20Canvas";
987e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
988e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guystatic JNINativeMethod gMethods[] = {
98961c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy    { "nIsAvailable",       "()Z",             (void*) android_view_GLES20Canvas_isAvailable },
990163935113919a184122b8b3bd672ef08c8df65dcRomain Guy
99161c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy#ifdef USE_OPENGL_RENDERER
992ba6be8a62dcdb3ffd210cd36b9af4e3a658eac47Romain Guy    { "nFlushCaches",       "(I)V",            (void*) android_view_GLES20Canvas_flushCaches },
9933b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    { "nInitCaches",        "()Z",             (void*) android_view_GLES20Canvas_initCaches },
994ba6be8a62dcdb3ffd210cd36b9af4e3a658eac47Romain Guy    { "nTerminateCaches",   "()V",             (void*) android_view_GLES20Canvas_terminateCaches },
9957d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy
99617ab38f8a87bc90eab11373f878f220ce3031de6Ashok Bhat    { "nInitAtlas",         "(Landroid/view/GraphicBuffer;[JI)V",
9973b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy            (void*) android_view_GLES20Canvas_initAtlas },
9983b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy
99936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nCreateRenderer",    "()J",             (void*) android_view_GLES20Canvas_createRenderer },
100036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDestroyRenderer",   "(J)V",            (void*) android_view_GLES20Canvas_destroyRenderer },
100136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nSetViewport",       "(JII)V",          (void*) android_view_GLES20Canvas_setViewport },
100236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nPrepare",           "(JZ)I",           (void*) android_view_GLES20Canvas_prepare },
100336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nPrepareDirty",      "(JIIIIZ)I",       (void*) android_view_GLES20Canvas_prepareDirty },
100436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nFinish",            "(J)V",            (void*) android_view_GLES20Canvas_finish },
1005ba9b613437c34873fa95800a25fc51720638267cChris Craik    { "nSetProperty",           "(Ljava/lang/String;Ljava/lang/String;)V",
1006ba9b613437c34873fa95800a25fc51720638267cChris Craik            (void*) android_view_GLES20Canvas_setProperty },
100761c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy
100878dd96d5af20f489f0e8b288617d57774ec284f7Romain Guy
1009530041d3191ce817832a0108514617768e43cda6Romain Guy    { "nGetStencilSize",    "()I",             (void*) android_view_GLES20Canvas_getStencilSize },
1010530041d3191ce817832a0108514617768e43cda6Romain Guy
101136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nCallDrawGLFunction", "(JJ)I",          (void*) android_view_GLES20Canvas_callDrawGLFunction },
101236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDetachFunctor",      "(JJ)V",          (void*) android_view_GLES20Canvas_detachFunctor },
101336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nAttachFunctor",      "(JJ)V",          (void*) android_view_GLES20Canvas_attachFunctor },
101436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nInvokeFunctors",     "(JLandroid/graphics/Rect;)I",
10158f3b8e32993d190a26c70c839a63d8ce4c3b16d9Romain Guy            (void*) android_view_GLES20Canvas_invokeFunctors },
10167d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy
101736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nSave",              "(JI)I",           (void*) android_view_GLES20Canvas_save },
101836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nRestore",           "(J)V",            (void*) android_view_GLES20Canvas_restore },
101936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nRestoreToCount",    "(JI)V",           (void*) android_view_GLES20Canvas_restoreToCount },
102036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nGetSaveCount",      "(J)I",            (void*) android_view_GLES20Canvas_getSaveCount },
102136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat
102236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nSaveLayer",         "(JFFFFJI)I",      (void*) android_view_GLES20Canvas_saveLayer },
102336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nSaveLayer",         "(JJI)I",          (void*) android_view_GLES20Canvas_saveLayerClip },
102436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nSaveLayerAlpha",    "(JFFFFII)I",      (void*) android_view_GLES20Canvas_saveLayerAlpha },
102536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nSaveLayerAlpha",    "(JII)I",          (void*) android_view_GLES20Canvas_saveLayerAlphaClip },
102636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat
102736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nQuickReject",       "(JFFFF)Z",        (void*) android_view_GLES20Canvas_quickReject },
102836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nClipRect",          "(JFFFFI)Z",       (void*) android_view_GLES20Canvas_clipRectF },
102936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nClipRect",          "(JIIIII)Z",       (void*) android_view_GLES20Canvas_clipRect },
103036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nClipPath",          "(JJI)Z",          (void*) android_view_GLES20Canvas_clipPath },
103136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nClipRegion",        "(JJI)Z",          (void*) android_view_GLES20Canvas_clipRegion },
103236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat
103336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nTranslate",         "(JFF)V",          (void*) android_view_GLES20Canvas_translate },
103436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nRotate",            "(JF)V",           (void*) android_view_GLES20Canvas_rotate },
103536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nScale",             "(JFF)V",          (void*) android_view_GLES20Canvas_scale },
103636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nSkew",              "(JFF)V",          (void*) android_view_GLES20Canvas_skew },
103736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat
103836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nSetMatrix",         "(JJ)V",           (void*) android_view_GLES20Canvas_setMatrix },
103936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nGetMatrix",         "(JJ)V",           (void*) android_view_GLES20Canvas_getMatrix },
104036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nConcatMatrix",      "(JJ)V",           (void*) android_view_GLES20Canvas_concatMatrix },
104136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat
104236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawBitmap",        "(JJ[BFFJ)V",      (void*) android_view_GLES20Canvas_drawBitmap },
104336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawBitmap",        "(JJ[BFFFFFFFFJ)V",(void*) android_view_GLES20Canvas_drawBitmapRect },
104436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawBitmap",        "(JJ[BJJ)V",       (void*) android_view_GLES20Canvas_drawBitmapMatrix },
104536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawBitmap",        "(J[IIIFFIIZJ)V",  (void*) android_view_GLES20Canvas_drawBitmapData },
104636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat
104736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawBitmapMesh",    "(JJ[BII[FI[IIJ)V",(void*) android_view_GLES20Canvas_drawBitmapMesh },
104836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat
104936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawPatch",         "(JJ[BJFFFFJ)V",   (void*) android_view_GLES20Canvas_drawPatch },
105036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat
105136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawColor",         "(JII)V",          (void*) android_view_GLES20Canvas_drawColor },
105236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawRect",          "(JFFFFJ)V",       (void*) android_view_GLES20Canvas_drawRect },
105336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawRects",         "(JJJ)V",          (void*) android_view_GLES20Canvas_drawRegionAsRects },
105436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawRects",         "(J[FIJ)V",        (void*) android_view_GLES20Canvas_drawRects },
105536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawRoundRect",     "(JFFFFFFJ)V",     (void*) android_view_GLES20Canvas_drawRoundRect },
105636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawCircle",        "(JFFFJ)V",        (void*) android_view_GLES20Canvas_drawCircle },
105736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawOval",          "(JFFFFJ)V",       (void*) android_view_GLES20Canvas_drawOval },
105836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawArc",           "(JFFFFFFZJ)V",    (void*) android_view_GLES20Canvas_drawArc },
105936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawPoints",        "(J[FIIJ)V",       (void*) android_view_GLES20Canvas_drawPoints },
106036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat
106136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawPath",          "(JJJ)V",          (void*) android_view_GLES20Canvas_drawPath },
106236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawLines",         "(J[FIIJ)V",       (void*) android_view_GLES20Canvas_drawLines },
106336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat
106436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nResetModifiers",    "(JI)V",           (void*) android_view_GLES20Canvas_resetModifiers },
106536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nSetupShader",       "(JJ)V",           (void*) android_view_GLES20Canvas_setupShader },
106636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nSetupShadow",       "(JFFFI)V",        (void*) android_view_GLES20Canvas_setupShadow },
106736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat
106836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nSetupPaintFilter",  "(JII)V",          (void*) android_view_GLES20Canvas_setupPaintFilter },
106936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nResetPaintFilter",  "(J)V",            (void*) android_view_GLES20Canvas_resetPaintFilter },
107036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat
107136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawText",          "(J[CIIFFIJ)V",    (void*) android_view_GLES20Canvas_drawTextArray },
107236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawText",          "(JLjava/lang/String;IIFFIJ)V",
1073a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy            (void*) android_view_GLES20Canvas_drawText },
1074a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy
107536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawTextOnPath",    "(J[CIIJFFIJ)V",   (void*) android_view_GLES20Canvas_drawTextArrayOnPath },
107636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawTextOnPath",    "(JLjava/lang/String;IIJFFIJ)V",
1077325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy            (void*) android_view_GLES20Canvas_drawTextOnPath },
1078325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy
107936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawTextRun",       "(J[CIIIIFFIJ)V",  (void*) android_view_GLES20Canvas_drawTextRunArray },
108036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawTextRun",       "(JLjava/lang/String;IIIIFFIJ)V",
108161c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy            (void*) android_view_GLES20Canvas_drawTextRun },
108261c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy
108336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawPosText",       "(J[CII[FJ)V",     (void*) android_view_GLES20Canvas_drawPosTextArray },
108436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawPosText",       "(JLjava/lang/String;II[FJ)V",
1085eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy            (void*) android_view_GLES20Canvas_drawPosText },
1086eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy
108736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nGetClipBounds",     "(JLandroid/graphics/Rect;)Z",
1088ce0537b80087a6225273040a987414b1dd081aa0Romain Guy            (void*) android_view_GLES20Canvas_getClipBounds },
1089b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
109044fd8d24f761f82d21e9b00932648a1b6bf91449John Reck    { "nFinishRecording",        "(J)J",      (void*) android_view_GLES20Canvas_finishRecording },
109136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawDisplayList",        "(JJLandroid/graphics/Rect;I)I",
10928f3b8e32993d190a26c70c839a63d8ce4c3b16d9Romain Guy            (void*) android_view_GLES20Canvas_drawDisplayList },
109313631f3da855f200a151e7837ed9f6b079622b58Romain Guy
109436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nCreateDisplayListRenderer", "()J",     (void*) android_view_GLES20Canvas_createDisplayListRenderer },
109513631f3da855f200a151e7837ed9f6b079622b58Romain Guy
109636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nInterrupt",              "(J)V",       (void*) android_view_GLES20Canvas_interrupt },
109736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nResume",                 "(J)V",       (void*) android_view_GLES20Canvas_resume },
10986c319ca1275c8db892c39b48fc54864c949f9171Romain Guy
109936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawLayer",              "(JJFF)V",    (void*) android_view_GLES20Canvas_drawLayer },
110036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nCopyLayer",              "(JJ)Z",      (void*) android_view_GLES20Canvas_copyLayer },
110136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nClearLayerUpdates",      "(J)V",       (void*) android_view_GLES20Canvas_clearLayerUpdates },
110236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nFlushLayerUpdates",      "(J)V",       (void*) android_view_GLES20Canvas_flushLayerUpdates },
110336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nPushLayerUpdate",        "(JJ)V",      (void*) android_view_GLES20Canvas_pushLayerUpdate },
110436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nCancelLayerUpdate",      "(JJ)V",      (void*) android_view_GLES20Canvas_cancelLayerUpdate },
110536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat
1106f61970fc79e9c5cf340fa942597628242361864aRomain Guy    { "nGetMaximumTextureWidth",  "()I",       (void*) android_view_GLES20Canvas_getMaxTextureWidth },
1107f61970fc79e9c5cf340fa942597628242361864aRomain Guy    { "nGetMaximumTextureHeight", "()I",       (void*) android_view_GLES20Canvas_getMaxTextureHeight },
1108f61970fc79e9c5cf340fa942597628242361864aRomain Guy
1109163935113919a184122b8b3bd672ef08c8df65dcRomain Guy#endif
1110e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy};
1111e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
11129c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haasestatic JNINativeMethod gActivityThreadMethods[] = {
11139c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    { "dumpGraphicsInfo",        "(Ljava/io/FileDescriptor;)V",
11149c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase                                               (void*) android_app_ActivityThread_dumpGraphics }
11159c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase};
11169c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase
11179c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase
1118163935113919a184122b8b3bd672ef08c8df65dcRomain Guy#ifdef USE_OPENGL_RENDERER
1119163935113919a184122b8b3bd672ef08c8df65dcRomain Guy    #define FIND_CLASS(var, className) \
1120163935113919a184122b8b3bd672ef08c8df65dcRomain Guy            var = env->FindClass(className); \
112117cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro            LOG_FATAL_IF(! var, "Unable to find class " className);
112217cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro
1123163935113919a184122b8b3bd672ef08c8df65dcRomain Guy    #define GET_METHOD_ID(var, clazz, methodName, methodDescriptor) \
1124163935113919a184122b8b3bd672ef08c8df65dcRomain Guy            var = env->GetMethodID(clazz, methodName, methodDescriptor); \
1125163935113919a184122b8b3bd672ef08c8df65dcRomain Guy            LOG_FATAL_IF(! var, "Unable to find method " methodName);
1126163935113919a184122b8b3bd672ef08c8df65dcRomain Guy#else
1127163935113919a184122b8b3bd672ef08c8df65dcRomain Guy    #define FIND_CLASS(var, className)
1128163935113919a184122b8b3bd672ef08c8df65dcRomain Guy    #define GET_METHOD_ID(var, clazz, methodName, methodDescriptor)
1129163935113919a184122b8b3bd672ef08c8df65dcRomain Guy#endif
11309d5316e3f56d138504565ff311145ac01621dff4Romain Guy
1131e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guyint register_android_view_GLES20Canvas(JNIEnv* env) {
113217cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro    jclass clazz;
113317cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro    FIND_CLASS(clazz, "android/graphics/Rect");
113417cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro    GET_METHOD_ID(gRectClassInfo.set, clazz, "set", "(IIII)V");
11359d5316e3f56d138504565ff311145ac01621dff4Romain Guy
1136e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    return AndroidRuntime::registerNativeMethods(env, kClassPathName, gMethods, NELEM(gMethods));
1137e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy}
1138e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
11399c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haaseconst char* const kActivityThreadPathName = "android/app/ActivityThread";
11409c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase
11416be3d5561cbeccf0a8257a4acb155657f868e548Romain Guyint register_android_app_ActivityThread(JNIEnv* env) {
11426be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy    return AndroidRuntime::registerNativeMethods(env, kActivityThreadPathName,
11439c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase            gActivityThreadMethods, NELEM(gActivityThreadMethods));
11449c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase}
11459c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase
1146e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy};
1147