android_view_GLES20Canvas.cpp revision 1a73f732f91e97c9c66b808c245ddda36a10e987
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
531a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien#ifdef USE_MINIKIN
541a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien#include <minikin/Layout.h>
551a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien#include "MinikinSkia.h"
561a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien#include "MinikinUtils.h"
571a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien#endif
581a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien
59d1d4bb70704e8f37d0823837eacdae21ebe0ed05Romain Guy#include <TextLayout.h>
60b02d0ca5553300063e4332192632312600caf4b9Fabrice Di Meglio#include <TextLayoutCache.h>
61e8e62a4a032a80409114a37908b5f18ab0080848Romain Guy
62e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guynamespace android {
63e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
649d5316e3f56d138504565ff311145ac01621dff4Romain Guyusing namespace uirenderer;
659d5316e3f56d138504565ff311145ac01621dff4Romain Guy
66163935113919a184122b8b3bd672ef08c8df65dcRomain Guy/**
67163935113919a184122b8b3bd672ef08c8df65dcRomain Guy * Note: OpenGLRenderer JNI layer is generated and compiled only on supported
68163935113919a184122b8b3bd672ef08c8df65dcRomain Guy *       devices. This means all the logic must be compiled only when the
69163935113919a184122b8b3bd672ef08c8df65dcRomain Guy *       preprocessor variable USE_OPENGL_RENDERER is defined.
70163935113919a184122b8b3bd672ef08c8df65dcRomain Guy */
71163935113919a184122b8b3bd672ef08c8df65dcRomain Guy#ifdef USE_OPENGL_RENDERER
72163935113919a184122b8b3bd672ef08c8df65dcRomain Guy
73244ada1d35419b7be9de0fc833bb03955b725ffaRomain Guy// ----------------------------------------------------------------------------
74bdb801ca993bcccbf2a4c2401d1720c3fa523777Romain Guy// Defines
75244ada1d35419b7be9de0fc833bb03955b725ffaRomain Guy// ----------------------------------------------------------------------------
76bdb801ca993bcccbf2a4c2401d1720c3fa523777Romain Guy
77bdb801ca993bcccbf2a4c2401d1720c3fa523777Romain Guy// Debug
78e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy#define DEBUG_RENDERER 0
79bdb801ca993bcccbf2a4c2401d1720c3fa523777Romain Guy
80bdb801ca993bcccbf2a4c2401d1720c3fa523777Romain Guy// Debug
81bdb801ca993bcccbf2a4c2401d1720c3fa523777Romain Guy#if DEBUG_RENDERER
825baa3a62a97544669fba6d65a11c07f252e654ddSteve Block    #define RENDERER_LOGD(...) ALOGD(__VA_ARGS__)
83bdb801ca993bcccbf2a4c2401d1720c3fa523777Romain Guy#else
84bdb801ca993bcccbf2a4c2401d1720c3fa523777Romain Guy    #define RENDERER_LOGD(...)
85bdb801ca993bcccbf2a4c2401d1720c3fa523777Romain Guy#endif
86e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy
87a168d7372132d6c87835878794b6ed43d0d282fdRomain Guy#define MODIFIER_SHADOW 1
88a168d7372132d6c87835878794b6ed43d0d282fdRomain Guy#define MODIFIER_SHADER 2
89a168d7372132d6c87835878794b6ed43d0d282fdRomain Guy
909d5316e3f56d138504565ff311145ac01621dff4Romain Guy// ----------------------------------------------------------------------------
919d5316e3f56d138504565ff311145ac01621dff4Romain Guy
929d5316e3f56d138504565ff311145ac01621dff4Romain Guystatic struct {
937ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    jmethodID set;
949d5316e3f56d138504565ff311145ac01621dff4Romain Guy} gRectClassInfo;
959d5316e3f56d138504565ff311145ac01621dff4Romain Guy
96e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// ----------------------------------------------------------------------------
97244ada1d35419b7be9de0fc833bb03955b725ffaRomain Guy// Caching
987d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy// ----------------------------------------------------------------------------
997d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy
100bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guystatic void android_view_GLES20Canvas_flushCaches(JNIEnv* env, jobject clazz,
10136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jint mode) {
102bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy    if (Caches::hasInstance()) {
10336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        Caches::getInstance().flush(static_cast<Caches::FlushMode>(mode));
104bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy    }
105bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy}
106bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy
10736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhatstatic jboolean android_view_GLES20Canvas_initCaches(JNIEnv* env, jobject clazz) {
1088ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy    if (Caches::hasInstance()) {
10936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        return Caches::getInstance().init() ? JNI_TRUE : JNI_FALSE;
1108ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy    }
11136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    return JNI_FALSE;
1128ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy}
1138ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy
1148ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guystatic void android_view_GLES20Canvas_terminateCaches(JNIEnv* env, jobject clazz) {
1158ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy    if (Caches::hasInstance()) {
1168ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy        Caches::getInstance().terminate();
1178ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy    }
1188ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy}
1198ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy
1207d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy// ----------------------------------------------------------------------------
1213b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy// Caching
1223b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy// ----------------------------------------------------------------------------
1233b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy
1243b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guystatic void android_view_GLES20Canvas_initAtlas(JNIEnv* env, jobject clazz,
12517ab38f8a87bc90eab11373f878f220ce3031de6Ashok Bhat        jobject graphicBuffer, jlongArray atlasMapArray, jint count) {
1263b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy
1273b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    sp<GraphicBuffer> buffer = graphicBufferForJavaObject(env, graphicBuffer);
12817ab38f8a87bc90eab11373f878f220ce3031de6Ashok Bhat    jlong* jAtlasMap = env->GetLongArrayElements(atlasMapArray, NULL);
12917ab38f8a87bc90eab11373f878f220ce3031de6Ashok Bhat    Caches::getInstance().assetAtlas.init(buffer, jAtlasMap, count);
13017ab38f8a87bc90eab11373f878f220ce3031de6Ashok Bhat    env->ReleaseLongArrayElements(atlasMapArray, jAtlasMap, 0);
1313b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy}
1323b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy
1333b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy// ----------------------------------------------------------------------------
134e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// Constructors
135e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// ----------------------------------------------------------------------------
136e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
13736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhatstatic jlong android_view_GLES20Canvas_createRenderer(JNIEnv* env, jobject clazz) {
138bdb801ca993bcccbf2a4c2401d1720c3fa523777Romain Guy    RENDERER_LOGD("Create OpenGLRenderer");
13987e2f757be9b24d369bab354e37c276e851b1fc7Romain Guy    OpenGLRenderer* renderer = new OpenGLRenderer();
14087e2f757be9b24d369bab354e37c276e851b1fc7Romain Guy    renderer->initProperties();
14136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    return reinterpret_cast<jlong>(renderer);
142e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy}
143e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
1445c13d89c1332fcc499379b9064b891187b75ca32Chet Haasestatic void android_view_GLES20Canvas_destroyRenderer(JNIEnv* env, jobject clazz,
14536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr) {
1469f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
147bdb801ca993bcccbf2a4c2401d1720c3fa523777Romain Guy    RENDERER_LOGD("Destroy OpenGLRenderer");
148f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy    delete renderer;
149e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy}
150e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
151e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// ----------------------------------------------------------------------------
152e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// Setup
153e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// ----------------------------------------------------------------------------
154e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
1557d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_setViewport(JNIEnv* env, jobject clazz,
15636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jint width, jint height) {
1579f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
158f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy    renderer->setViewport(width, height);
159e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy}
160e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
16144b2fe3fc114ee5f7273c6b0fee2cc999bf244a2Chet Haasestatic int android_view_GLES20Canvas_prepare(JNIEnv* env, jobject clazz,
16236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jboolean opaque) {
1639f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
16444b2fe3fc114ee5f7273c6b0fee2cc999bf244a2Chet Haase    return renderer->prepare(opaque);
165e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy}
166e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
16744b2fe3fc114ee5f7273c6b0fee2cc999bf244a2Chet Haasestatic int android_view_GLES20Canvas_prepareDirty(JNIEnv* env, jobject clazz,
16836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jint left, jint top, jint right, jint bottom,
1697d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy        jboolean opaque) {
1709f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
17144b2fe3fc114ee5f7273c6b0fee2cc999bf244a2Chet Haase    return renderer->prepareDirty(left, top, right, bottom, opaque);
1727d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy}
1737d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy
1747d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_finish(JNIEnv* env, jobject clazz,
17536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr) {
1769f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
177b025b9c8b4efefadb01937db61a1f8ee7d2452bfRomain Guy    renderer->finish();
178b025b9c8b4efefadb01937db61a1f8ee7d2452bfRomain Guy}
179b025b9c8b4efefadb01937db61a1f8ee7d2452bfRomain Guy
180530041d3191ce817832a0108514617768e43cda6Romain Guystatic jint android_view_GLES20Canvas_getStencilSize(JNIEnv* env, jobject clazz) {
1810baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy    return Stencil::getStencilSize();
182530041d3191ce817832a0108514617768e43cda6Romain Guy}
183530041d3191ce817832a0108514617768e43cda6Romain Guy
184ba9b613437c34873fa95800a25fc51720638267cChris Craikstatic void android_view_GLES20Canvas_setProperty(JNIEnv* env,
185ba9b613437c34873fa95800a25fc51720638267cChris Craik        jobject clazz, jstring name, jstring value) {
186ba9b613437c34873fa95800a25fc51720638267cChris Craik    if (!Caches::hasInstance()) {
187ba9b613437c34873fa95800a25fc51720638267cChris Craik        ALOGW("can't set property, no Caches instance");
188ba9b613437c34873fa95800a25fc51720638267cChris Craik        return;
189ba9b613437c34873fa95800a25fc51720638267cChris Craik    }
190ba9b613437c34873fa95800a25fc51720638267cChris Craik
191ba9b613437c34873fa95800a25fc51720638267cChris Craik    if (name == NULL || value == NULL) {
192ba9b613437c34873fa95800a25fc51720638267cChris Craik        ALOGW("can't set prop, null passed");
193ba9b613437c34873fa95800a25fc51720638267cChris Craik    }
194ba9b613437c34873fa95800a25fc51720638267cChris Craik
195ba9b613437c34873fa95800a25fc51720638267cChris Craik    const char* nameCharArray = env->GetStringUTFChars(name, NULL);
196ba9b613437c34873fa95800a25fc51720638267cChris Craik    const char* valueCharArray = env->GetStringUTFChars(value, NULL);
197ba9b613437c34873fa95800a25fc51720638267cChris Craik    Caches::getInstance().setTempProperty(nameCharArray, valueCharArray);
198ba9b613437c34873fa95800a25fc51720638267cChris Craik    env->ReleaseStringUTFChars(name, nameCharArray);
199ba9b613437c34873fa95800a25fc51720638267cChris Craik    env->ReleaseStringUTFChars(name, valueCharArray);
200ba9b613437c34873fa95800a25fc51720638267cChris Craik}
201ba9b613437c34873fa95800a25fc51720638267cChris Craik
202530041d3191ce817832a0108514617768e43cda6Romain Guy// ----------------------------------------------------------------------------
203530041d3191ce817832a0108514617768e43cda6Romain Guy// Functor
204530041d3191ce817832a0108514617768e43cda6Romain Guy// ----------------------------------------------------------------------------
205530041d3191ce817832a0108514617768e43cda6Romain Guy
2066554943a1dd6854c0f4976900956e556767b49e1Romain Guystatic jint android_view_GLES20Canvas_callDrawGLFunction(JNIEnv* env, jobject clazz,
20736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jlong functorPtr) {
2089f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
2099f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    Functor* functor = reinterpret_cast<Functor*>(functorPtr);
210cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy    android::uirenderer::Rect dirty;
211cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy    return renderer->callDrawGLFunction(functor, dirty);
212daf98e941e140e8739458126640183b9f296a2abChet Haase}
213daf98e941e140e8739458126640183b9f296a2abChet Haase
214ba6be8a62dcdb3ffd210cd36b9af4e3a658eac47Romain Guystatic void android_view_GLES20Canvas_detachFunctor(JNIEnv* env,
215017546e65280a3389b6167f5fc3b5d1c3001154aNarayan Kamath        jobject clazz, jlong rendererPtr, jlong functorPtr) {
2169f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
2179f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    Functor* functor = reinterpret_cast<Functor*>(functorPtr);
218ba6be8a62dcdb3ffd210cd36b9af4e3a658eac47Romain Guy    renderer->detachFunctor(functor);
219ba6be8a62dcdb3ffd210cd36b9af4e3a658eac47Romain Guy}
220ba6be8a62dcdb3ffd210cd36b9af4e3a658eac47Romain Guy
221ba6be8a62dcdb3ffd210cd36b9af4e3a658eac47Romain Guystatic void android_view_GLES20Canvas_attachFunctor(JNIEnv* env,
22236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jobject clazz, jlong rendererPtr, jlong functorPtr) {
2239f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
2249f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    Functor* functor = reinterpret_cast<Functor*>(functorPtr);
225ba6be8a62dcdb3ffd210cd36b9af4e3a658eac47Romain Guy    renderer->attachFunctor(functor);
226ba6be8a62dcdb3ffd210cd36b9af4e3a658eac47Romain Guy}
227ba6be8a62dcdb3ffd210cd36b9af4e3a658eac47Romain Guy
2288f3b8e32993d190a26c70c839a63d8ce4c3b16d9Romain Guystatic jint android_view_GLES20Canvas_invokeFunctors(JNIEnv* env,
22936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jobject clazz, jlong rendererPtr, jobject dirty) {
2309f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
2318f3b8e32993d190a26c70c839a63d8ce4c3b16d9Romain Guy    android::uirenderer::Rect bounds;
2328f3b8e32993d190a26c70c839a63d8ce4c3b16d9Romain Guy    status_t status = renderer->invokeFunctors(bounds);
2338f3b8e32993d190a26c70c839a63d8ce4c3b16d9Romain Guy    if (status != DrawGlInfo::kStatusDone && dirty != NULL) {
2348f3b8e32993d190a26c70c839a63d8ce4c3b16d9Romain Guy        env->CallVoidMethod(dirty, gRectClassInfo.set,
2358f3b8e32993d190a26c70c839a63d8ce4c3b16d9Romain Guy                int(bounds.left), int(bounds.top), int(bounds.right), int(bounds.bottom));
2368f3b8e32993d190a26c70c839a63d8ce4c3b16d9Romain Guy    }
2378f3b8e32993d190a26c70c839a63d8ce4c3b16d9Romain Guy    return status;
2388f3b8e32993d190a26c70c839a63d8ce4c3b16d9Romain Guy}
2398f3b8e32993d190a26c70c839a63d8ce4c3b16d9Romain Guy
2408f3b8e32993d190a26c70c839a63d8ce4c3b16d9Romain Guy// ----------------------------------------------------------------------------
2418f3b8e32993d190a26c70c839a63d8ce4c3b16d9Romain Guy// Misc
2428f3b8e32993d190a26c70c839a63d8ce4c3b16d9Romain Guy// ----------------------------------------------------------------------------
2438f3b8e32993d190a26c70c839a63d8ce4c3b16d9Romain Guy
244f61970fc79e9c5cf340fa942597628242361864aRomain Guystatic jint android_view_GLES20Canvas_getMaxTextureWidth(JNIEnv* env, jobject clazz) {
245f61970fc79e9c5cf340fa942597628242361864aRomain Guy    return Caches::getInstance().maxTextureSize;
246f61970fc79e9c5cf340fa942597628242361864aRomain Guy}
247f61970fc79e9c5cf340fa942597628242361864aRomain Guy
248f61970fc79e9c5cf340fa942597628242361864aRomain Guystatic jint android_view_GLES20Canvas_getMaxTextureHeight(JNIEnv* env, jobject clazz) {
249f61970fc79e9c5cf340fa942597628242361864aRomain Guy    return Caches::getInstance().maxTextureSize;
250f61970fc79e9c5cf340fa942597628242361864aRomain Guy}
251f61970fc79e9c5cf340fa942597628242361864aRomain Guy
252e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// ----------------------------------------------------------------------------
253bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy// State
254bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy// ----------------------------------------------------------------------------
255bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
25636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhatstatic jint android_view_GLES20Canvas_save(JNIEnv* env, jobject clazz, jlong rendererPtr,
257bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy        jint flags) {
2589f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
259f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy    return renderer->save(flags);
260f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy}
261bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
2627d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic jint android_view_GLES20Canvas_getSaveCount(JNIEnv* env, jobject clazz,
26336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr) {
2649f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
265f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy    return renderer->getSaveCount();
266bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy}
267bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
2687d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_restore(JNIEnv* env, jobject clazz,
26936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr) {
2709f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
271f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy    renderer->restore();
272bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy}
273bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
2747d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_restoreToCount(JNIEnv* env, jobject clazz,
27536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jint saveCount) {
2769f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
277f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy    renderer->restoreToCount(saveCount);
278bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy}
279bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
280f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy// ----------------------------------------------------------------------------
281bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy// Layers
282bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy// ----------------------------------------------------------------------------
283bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy
2847d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic jint android_view_GLES20Canvas_saveLayer(JNIEnv* env, jobject clazz,
28536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jfloat left, jfloat top, jfloat right, jfloat bottom,
28636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong paintPtr, jint saveFlags) {
2879f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
2889f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
289bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy    return renderer->saveLayer(left, top, right, bottom, paint, saveFlags);
290bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy}
291bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy
292189887e0ae171c1b7601991442104a30e56c50abRomain Guystatic jint android_view_GLES20Canvas_saveLayerClip(JNIEnv* env, jobject clazz,
29336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jlong paintPtr, jint saveFlags) {
2949f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
2959f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
2963f085429fd47ebd32ac2463b3eae2a5a6c17be25Chris Craik    const android::uirenderer::Rect& bounds(renderer->getLocalClipBounds());
297189887e0ae171c1b7601991442104a30e56c50abRomain Guy    return renderer->saveLayer(bounds.left, bounds.top, bounds.right, bounds.bottom,
298189887e0ae171c1b7601991442104a30e56c50abRomain Guy            paint, saveFlags);
299189887e0ae171c1b7601991442104a30e56c50abRomain Guy}
300189887e0ae171c1b7601991442104a30e56c50abRomain Guy
3017d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic jint android_view_GLES20Canvas_saveLayerAlpha(JNIEnv* env, jobject clazz,
30236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jfloat left, jfloat top, jfloat right, jfloat bottom,
303bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy        jint alpha, jint saveFlags) {
3049f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
305bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy    return renderer->saveLayerAlpha(left, top, right, bottom, alpha, saveFlags);
306bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy}
307bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy
308189887e0ae171c1b7601991442104a30e56c50abRomain Guystatic jint android_view_GLES20Canvas_saveLayerAlphaClip(JNIEnv* env, jobject clazz,
30936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jint alpha, jint saveFlags) {
3109f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
3113f085429fd47ebd32ac2463b3eae2a5a6c17be25Chris Craik    const android::uirenderer::Rect& bounds(renderer->getLocalClipBounds());
312189887e0ae171c1b7601991442104a30e56c50abRomain Guy    return renderer->saveLayerAlpha(bounds.left, bounds.top, bounds.right, bounds.bottom,
313189887e0ae171c1b7601991442104a30e56c50abRomain Guy            alpha, saveFlags);
314189887e0ae171c1b7601991442104a30e56c50abRomain Guy}
315189887e0ae171c1b7601991442104a30e56c50abRomain Guy
316bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy// ----------------------------------------------------------------------------
317f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy// Clipping
318f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy// ----------------------------------------------------------------------------
319f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy
32036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhatstatic jboolean android_view_GLES20Canvas_quickReject(JNIEnv* env, jobject clazz,
32136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jfloat left, jfloat top, jfloat right, jfloat bottom) {
3229f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
32336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    const bool result = renderer->quickRejectConservative(left, top, right, bottom);
32436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    return result ? JNI_TRUE : JNI_FALSE;
325c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy}
326c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy
32736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhatstatic jboolean android_view_GLES20Canvas_clipRectF(JNIEnv* env, jobject clazz,
32836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jfloat left, jfloat top, jfloat right, jfloat bottom,
32936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jint op) {
3309f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
33136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    const bool result = renderer->clipRect(left, top, right, bottom,
33236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat                                           static_cast<SkRegion::Op>(op));
33336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    return result ? JNI_TRUE : JNI_FALSE;
334f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy}
335bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
33636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhatstatic jboolean android_view_GLES20Canvas_clipRect(JNIEnv* env, jobject clazz,
33736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jint left, jint top, jint right, jint bottom,
33836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jint op) {
3399f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
34036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    const bool result = renderer->clipRect(float(left), float(top), float(right),
34136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat                                           float(bottom),
34236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat                                           static_cast<SkRegion::Op>(op));
34336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    return result ? JNI_TRUE : JNI_FALSE;
344bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy}
345bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
34636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhatstatic jboolean android_view_GLES20Canvas_clipPath(JNIEnv* env, jobject clazz,
34736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jlong pathPtr, jint op) {
3489f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
3499f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPath* path = reinterpret_cast<SkPath*>(pathPtr);
35036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    const bool result = renderer->clipPath(path, static_cast<SkRegion::Op>(op));
35136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    return result ? JNI_TRUE : JNI_FALSE;
352735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy}
353735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy
35436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhatstatic jboolean android_view_GLES20Canvas_clipRegion(JNIEnv* env, jobject clazz,
35536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jlong regionPtr, jint op) {
3569f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
3579f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkRegion* region = reinterpret_cast<SkRegion*>(regionPtr);
35836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    const bool result = renderer->clipRegion(region, static_cast<SkRegion::Op>(op));
35936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    return result ? JNI_TRUE : JNI_FALSE;
360735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy}
361735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy
36236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhatstatic jboolean android_view_GLES20Canvas_getClipBounds(JNIEnv* env, jobject clazz,
36336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jobject rect) {
3649f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
3653f085429fd47ebd32ac2463b3eae2a5a6c17be25Chris Craik    const android::uirenderer::Rect& bounds(renderer->getLocalClipBounds());
3669d5316e3f56d138504565ff311145ac01621dff4Romain Guy
3677ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    env->CallVoidMethod(rect, gRectClassInfo.set,
3687ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy            int(bounds.left), int(bounds.top), int(bounds.right), int(bounds.bottom));
3699d5316e3f56d138504565ff311145ac01621dff4Romain Guy
37036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    return !bounds.isEmpty() ? JNI_TRUE : JNI_FALSE;
3719d5316e3f56d138504565ff311145ac01621dff4Romain Guy}
3729d5316e3f56d138504565ff311145ac01621dff4Romain Guy
373bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy// ----------------------------------------------------------------------------
374f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy// Transforms
375bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy// ----------------------------------------------------------------------------
376bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
3777d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_translate(JNIEnv* env, jobject clazz,
37836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jfloat dx, jfloat dy) {
3799f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
3807ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    renderer->translate(dx, dy);
381f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy}
382bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
3837d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_rotate(JNIEnv* env, jobject clazz,
38436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jfloat degrees) {
3859f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
3867ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    renderer->rotate(degrees);
387bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy}
388bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
3897d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_scale(JNIEnv* env, jobject clazz,
39036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jfloat sx, jfloat sy) {
3919f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
3927ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    renderer->scale(sx, sy);
393f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy}
394bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
3957d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_skew(JNIEnv* env, jobject clazz,
39636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jfloat sx, jfloat sy) {
3979f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
398807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy    renderer->skew(sx, sy);
399807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy}
400807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy
4017d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_setMatrix(JNIEnv* env, jobject clazz,
40236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jlong matrixPtr) {
4039f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
4049f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixPtr);
4057ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    renderer->setMatrix(matrix);
406f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy}
407f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy
4087d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_getMatrix(JNIEnv* env, jobject clazz,
40936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jlong matrixPtr) {
4109f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
4119f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixPtr);
4127ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    renderer->getMatrix(matrix);
413f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy}
414f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy
4157d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_concatMatrix(JNIEnv* env, jobject clazz,
41636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jlong matrixPtr) {
4179f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
4189f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixPtr);
4197ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    renderer->concatMatrix(matrix);
420bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy}
421bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
422bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy// ----------------------------------------------------------------------------
423bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy// Drawing
42485bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy// ----------------------------------------------------------------------------
42585bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy
4267d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawBitmap(JNIEnv* env, jobject clazz,
42736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jlong bitmapPtr, jbyteArray buffer,
42836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jfloat left, jfloat top, jlong paintPtr) {
4299f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapPtr);
4300c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik    // This object allows the renderer to allocate a global JNI ref to the buffer object.
4310c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik    JavaHeapBitmapRef bitmapRef(env, bitmap, buffer);
4320c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik
4339f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
4349f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
435dbd77cd444f89d94ec5333223c1bc17dbe0c90cdRomain Guy    renderer->drawBitmap(bitmap, left, top, paint);
436ce0537b80087a6225273040a987414b1dd081aa0Romain Guy}
437ce0537b80087a6225273040a987414b1dd081aa0Romain Guy
4387d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawBitmapRect(JNIEnv* env, jobject clazz,
43936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jlong bitmapPtr, jbyteArray buffer,
440ce0537b80087a6225273040a987414b1dd081aa0Romain Guy        float srcLeft, float srcTop, float srcRight, float srcBottom,
44136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        float dstLeft, float dstTop, float dstRight, float dstBottom, jlong paintPtr) {
4429f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapPtr);
4430c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik    // This object allows the renderer to allocate a global JNI ref to the buffer object.
4440c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik    JavaHeapBitmapRef bitmapRef(env, bitmap, buffer);
4450c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik
4469f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
4479f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
448dbd77cd444f89d94ec5333223c1bc17dbe0c90cdRomain Guy    renderer->drawBitmap(bitmap, srcLeft, srcTop, srcRight, srcBottom,
449dbd77cd444f89d94ec5333223c1bc17dbe0c90cdRomain Guy            dstLeft, dstTop, dstRight, dstBottom, paint);
450f86ef57f8bcd8ba43ce222ec6a8b4f67d3600640Romain Guy}
4518ba548f81d1ab5f1750cbf86098c4a14e0b8beadRomain Guy
4527d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawBitmapMatrix(JNIEnv* env, jobject clazz,
45336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jlong bitmapPtr, jbyteArray buffer,
45436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong matrixPtr, jlong paintPtr) {
4559f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapPtr);
4560c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik    // This object allows the renderer to allocate a global JNI ref to the buffer object.
4570c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik    JavaHeapBitmapRef bitmapRef(env, bitmap, buffer);
4580c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik
4599f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
4609f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixPtr);
4619f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
462dbd77cd444f89d94ec5333223c1bc17dbe0c90cdRomain Guy    renderer->drawBitmap(bitmap, matrix, paint);
463ce0537b80087a6225273040a987414b1dd081aa0Romain Guy}
464ce0537b80087a6225273040a987414b1dd081aa0Romain Guy
465e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guystatic void android_view_GLES20Canvas_drawBitmapData(JNIEnv* env, jobject clazz,
46636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jintArray colors, jint offset, jint stride,
46736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jfloat left, jfloat top, jint width, jint height, jboolean hasAlpha, jlong paintPtr) {
46849c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    SkBitmap* bitmap = new SkBitmap;
46949c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    bitmap->setConfig(hasAlpha ? SkBitmap::kARGB_8888_Config : SkBitmap::kRGB_565_Config,
47049c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy            width, height);
471e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy
47249c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    if (!bitmap->allocPixels()) {
47349c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy        delete bitmap;
474e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy        return;
475e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy    }
476e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy
4771abf5d62429e5a9329520b2f7c2b5a5e7a8e72ecChris Craik    if (!GraphicsJNI::SetPixels(env, colors, offset, stride, 0, 0, width, height, *bitmap, true)) {
47849c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy        delete bitmap;
479e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy        return;
480e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy    }
481e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy
4829f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
4839f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
48449c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    renderer->drawBitmapData(bitmap, left, top, paint);
48549c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy
48649c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    // If the renderer is a deferred renderer it will own the bitmap
487b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik    if (!renderer->isRecording()) {
48849c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy        delete bitmap;
48949c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    }
490e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy}
491e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy
4927d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawBitmapMesh(JNIEnv* env, jobject clazz,
49336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jlong bitmapPtr, jbyteArray buffer,
4940c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik        jint meshWidth, jint meshHeight, jfloatArray vertices, jint offset, jintArray colors,
49536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jint colorOffset, jlong paintPtr) {
4969f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapPtr);
4970c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik    // This object allows the renderer to allocate a global JNI ref to the buffer object.
4980c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik    JavaHeapBitmapRef bitmapRef(env, bitmap, buffer);
4990c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik
5005a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    jfloat* verticesArray = vertices ? env->GetFloatArrayElements(vertices, NULL) + offset : NULL;
5015a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    jint* colorsArray = colors ? env->GetIntArrayElements(colors, NULL) + colorOffset : NULL;
5025a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy
5039f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
5049f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
5055a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    renderer->drawBitmapMesh(bitmap, meshWidth, meshHeight, verticesArray, colorsArray, paint);
5065a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy
5075a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    if (vertices) env->ReleaseFloatArrayElements(vertices, verticesArray, 0);
5085a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    if (colors) env->ReleaseIntArrayElements(colors, colorsArray, 0);
5095a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy}
5105a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy
5117d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawPatch(JNIEnv* env, jobject clazz,
51236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jlong bitmapPtr, jbyteArray buffer, jlong patchPtr,
51336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        float left, float top, float right, float bottom, jlong paintPtr) {
5149f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapPtr);
5150c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik    // This object allows the renderer to allocate a global JNI ref to the buffer object.
5160c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik    JavaHeapBitmapRef bitmapRef(env, bitmap, buffer);
5170c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik
5189f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
5199f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    Res_png_9patch* patch = reinterpret_cast<Res_png_9patch*>(patchPtr);
5209f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
5213b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    renderer->drawPatch(bitmap, patch, left, top, right, bottom, paint);
522deba785f122a47915756ffd991f5540d952cf937Romain Guy}
523deba785f122a47915756ffd991f5540d952cf937Romain Guy
5247d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawColor(JNIEnv* env, jobject clazz,
52536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jint color, jint mode) {
5269f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
52736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    renderer->drawColor(color, static_cast<SkXfermode::Mode>(mode));
52885bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy}
52985bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy
5307d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawRect(JNIEnv* env, jobject clazz,
53136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jfloat left, jfloat top, jfloat right, jfloat bottom,
53236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong paintPtr) {
5339f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
5349f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
535c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy    renderer->drawRect(left, top, right, bottom, paint);
536c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy}
537c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy
5387d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawRoundRect(JNIEnv* env, jobject clazz,
53936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jfloat left, jfloat top, jfloat right, jfloat bottom,
54036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jfloat rx, jfloat ry, jlong paintPtr) {
5419f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
5429f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
54301d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    renderer->drawRoundRect(left, top, right, bottom, rx, ry, paint);
54401d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy}
54501d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy
5467d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawCircle(JNIEnv* env, jobject clazz,
54736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jfloat x, jfloat y, jfloat radius, jlong paintPtr) {
5489f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
5499f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
55001d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    renderer->drawCircle(x, y, radius, paint);
55101d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy}
55201d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy
5537d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawOval(JNIEnv* env, jobject clazz,
55436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jfloat left, jfloat top, jfloat right, jfloat bottom,
55536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong paintPtr) {
5569f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
5579f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
558c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy    renderer->drawOval(left, top, right, bottom, paint);
559c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy}
560c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy
5617d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawArc(JNIEnv* env, jobject clazz,
56236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jfloat left, jfloat top, jfloat right, jfloat bottom,
56336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jfloat startAngle, jfloat sweepAngle, jboolean useCenter, jlong paintPtr) {
5649f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
5659f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
5668b2f5267f16c295f12faab810527cd6311997e34Romain Guy    renderer->drawArc(left, top, right, bottom, startAngle, sweepAngle, useCenter, paint);
5678b2f5267f16c295f12faab810527cd6311997e34Romain Guy}
5688b2f5267f16c295f12faab810527cd6311997e34Romain Guy
569672433d90fab7383cd28beac9d4485b566a90940Romain Guystatic void android_view_GLES20Canvas_drawRegionAsRects(JNIEnv* env, jobject clazz,
57036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jlong regionPtr, jlong paintPtr) {
5719f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
5729f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkRegion* region = reinterpret_cast<SkRegion*>(regionPtr);
5739f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
574672433d90fab7383cd28beac9d4485b566a90940Romain Guy    if (paint->getStyle() != SkPaint::kFill_Style ||
575672433d90fab7383cd28beac9d4485b566a90940Romain Guy            (paint->isAntiAlias() && !renderer->isCurrentTransformSimple())) {
576672433d90fab7383cd28beac9d4485b566a90940Romain Guy        SkRegion::Iterator it(*region);
577672433d90fab7383cd28beac9d4485b566a90940Romain Guy        while (!it.done()) {
578672433d90fab7383cd28beac9d4485b566a90940Romain Guy            const SkIRect& r = it.rect();
579672433d90fab7383cd28beac9d4485b566a90940Romain Guy            renderer->drawRect(r.fLeft, r.fTop, r.fRight, r.fBottom, paint);
580672433d90fab7383cd28beac9d4485b566a90940Romain Guy            it.next();
581672433d90fab7383cd28beac9d4485b566a90940Romain Guy        }
582672433d90fab7383cd28beac9d4485b566a90940Romain Guy    } else {
583672433d90fab7383cd28beac9d4485b566a90940Romain Guy        int count = 0;
584672433d90fab7383cd28beac9d4485b566a90940Romain Guy        Vector<float> rects;
585672433d90fab7383cd28beac9d4485b566a90940Romain Guy        SkRegion::Iterator it(*region);
586672433d90fab7383cd28beac9d4485b566a90940Romain Guy        while (!it.done()) {
587672433d90fab7383cd28beac9d4485b566a90940Romain Guy            const SkIRect& r = it.rect();
588672433d90fab7383cd28beac9d4485b566a90940Romain Guy            rects.push(r.fLeft);
589672433d90fab7383cd28beac9d4485b566a90940Romain Guy            rects.push(r.fTop);
590672433d90fab7383cd28beac9d4485b566a90940Romain Guy            rects.push(r.fRight);
591672433d90fab7383cd28beac9d4485b566a90940Romain Guy            rects.push(r.fBottom);
5922af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik            count += 4;
593672433d90fab7383cd28beac9d4485b566a90940Romain Guy            it.next();
594672433d90fab7383cd28beac9d4485b566a90940Romain Guy        }
595672433d90fab7383cd28beac9d4485b566a90940Romain Guy        renderer->drawRects(rects.array(), count, paint);
596a48a1a87ba17f20f7006eaab21dcedf86c015c13Romain Guy    }
597a48a1a87ba17f20f7006eaab21dcedf86c015c13Romain Guy}
598a48a1a87ba17f20f7006eaab21dcedf86c015c13Romain Guy
599672433d90fab7383cd28beac9d4485b566a90940Romain Guystatic void android_view_GLES20Canvas_drawRects(JNIEnv* env, jobject clazz,
60036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jfloatArray rects, jint count, jlong paintPtr) {
6019f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
602672433d90fab7383cd28beac9d4485b566a90940Romain Guy    jfloat* storage = env->GetFloatArrayElements(rects, NULL);
6039f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
604672433d90fab7383cd28beac9d4485b566a90940Romain Guy    renderer->drawRects(storage, count, paint);
605672433d90fab7383cd28beac9d4485b566a90940Romain Guy    env->ReleaseFloatArrayElements(rects, storage, 0);
606672433d90fab7383cd28beac9d4485b566a90940Romain Guy}
607672433d90fab7383cd28beac9d4485b566a90940Romain Guy
608ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guystatic void android_view_GLES20Canvas_drawPoints(JNIEnv* env, jobject clazz,
60936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jfloatArray points, jint offset, jint count, jlong paintPtr) {
6109f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
611ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy    jfloat* storage = env->GetFloatArrayElements(points, NULL);
6129f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
613ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy    renderer->drawPoints(storage + offset, count, paint);
614ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy    env->ReleaseFloatArrayElements(points, storage, 0);
615ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy}
616ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy
6177d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawPath(JNIEnv* env, jobject clazz,
61836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jlong pathPtr, jlong paintPtr) {
6199f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
6209f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPath* path = reinterpret_cast<SkPath*>(pathPtr);
6219f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
6227fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy    renderer->drawPath(path, paint);
6237fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy}
6247fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy
6257d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawLines(JNIEnv* env, jobject clazz,
62636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jfloatArray points, jint offset, jint count, jlong paintPtr) {
6279f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
628759ea80dca64ad652110a129e0d8bf93fea79f61Romain Guy    jfloat* storage = env->GetFloatArrayElements(points, NULL);
6299f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
630759ea80dca64ad652110a129e0d8bf93fea79f61Romain Guy    renderer->drawLines(storage + offset, count, paint);
631759ea80dca64ad652110a129e0d8bf93fea79f61Romain Guy    env->ReleaseFloatArrayElements(points, storage, 0);
632759ea80dca64ad652110a129e0d8bf93fea79f61Romain Guy}
633759ea80dca64ad652110a129e0d8bf93fea79f61Romain Guy
63485bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy// ----------------------------------------------------------------------------
635db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy// Shaders and color filters
636d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy// ----------------------------------------------------------------------------
637d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy
6387d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_resetModifiers(JNIEnv* env, jobject clazz,
63936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jint modifiers) {
6409f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
641a168d7372132d6c87835878794b6ed43d0d282fdRomain Guy    if (modifiers & MODIFIER_SHADOW) renderer->resetShadow();
642a168d7372132d6c87835878794b6ed43d0d282fdRomain Guy    if (modifiers & MODIFIER_SHADER) renderer->resetShader();
643d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy}
644d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy
6457d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_setupShader(JNIEnv* env, jobject clazz,
64636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jlong shaderPtr) {
6479f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
6489f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkiaShader* shader = reinterpret_cast<SkiaShader*>(shaderPtr);
64906f96e2652e4855b6520ad9dd70583677605b79aRomain Guy    renderer->setupShader(shader);
6507fac2e18339f765320d759e8d4c090f92431959eRomain Guy}
6517fac2e18339f765320d759e8d4c090f92431959eRomain Guy
652db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy
6537d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_setupShadow(JNIEnv* env, jobject clazz,
65436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jfloat radius, jfloat dx, jfloat dy, jint color) {
6559f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
6561e45aae5de003657e5d18f74d34998f5de5db5b7Romain Guy    renderer->setupShadow(radius, dx, dy, color);
6571e45aae5de003657e5d18f74d34998f5de5db5b7Romain Guy}
6581e45aae5de003657e5d18f74d34998f5de5db5b7Romain Guy
659d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy// ----------------------------------------------------------------------------
6605ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy// Draw filters
6615ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy// ----------------------------------------------------------------------------
6625ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy
6635ff9df658230d49e42c43586997a02d8e4dd417eRomain Guystatic void android_view_GLES20Canvas_setupPaintFilter(JNIEnv* env, jobject clazz,
66436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jint clearBits, jint setBits) {
6659f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
6665ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    renderer->setupPaintFilter(clearBits, setBits);
6675ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy}
6685ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy
6695ff9df658230d49e42c43586997a02d8e4dd417eRomain Guystatic void android_view_GLES20Canvas_resetPaintFilter(JNIEnv* env, jobject clazz,
67036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr) {
6719f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
6725ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    renderer->resetPaintFilter();
6735ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy}
6745ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy
6755ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy// ----------------------------------------------------------------------------
676a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy// Text
677a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy// ----------------------------------------------------------------------------
678a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy
67941541825bc90dac740e424cdd41a8c997e15cdb7Chris Craikstatic float xOffsetForTextAlign(SkPaint* paint, float totalAdvance) {
68041541825bc90dac740e424cdd41a8c997e15cdb7Chris Craik    switch (paint->getTextAlign()) {
68141541825bc90dac740e424cdd41a8c997e15cdb7Chris Craik        case SkPaint::kCenter_Align:
68241541825bc90dac740e424cdd41a8c997e15cdb7Chris Craik            return -totalAdvance / 2.0f;
68341541825bc90dac740e424cdd41a8c997e15cdb7Chris Craik            break;
68441541825bc90dac740e424cdd41a8c997e15cdb7Chris Craik        case SkPaint::kRight_Align:
68541541825bc90dac740e424cdd41a8c997e15cdb7Chris Craik            return -totalAdvance;
68641541825bc90dac740e424cdd41a8c997e15cdb7Chris Craik            break;
68741541825bc90dac740e424cdd41a8c997e15cdb7Chris Craik        default:
68841541825bc90dac740e424cdd41a8c997e15cdb7Chris Craik            break;
68941541825bc90dac740e424cdd41a8c997e15cdb7Chris Craik    }
69041541825bc90dac740e424cdd41a8c997e15cdb7Chris Craik    return 0;
69141541825bc90dac740e424cdd41a8c997e15cdb7Chris Craik}
69241541825bc90dac740e424cdd41a8c997e15cdb7Chris Craik
6931a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien#ifdef USE_MINIKIN
6941a73f732f91e97c9c66b808c245ddda36a10e987Raph Levienstatic void renderTextLayout(OpenGLRenderer* renderer, Layout* layout,
6951a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien    jfloat x, jfloat y, SkPaint* paint) {
6961a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien    size_t nGlyphs = layout->nGlyphs();
6971a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien    float* pos = new float[nGlyphs * 2];
6981a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien    uint16_t* glyphs = new uint16_t[nGlyphs];
6991a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien    SkTypeface* lastFace = 0;
7001a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien    SkTypeface* skFace = 0;
7011a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien    size_t start = 0;
7021a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien    MinikinRect b;
7031a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien    layout->getBounds(&b);
7041a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien    android::uirenderer::Rect bounds(b.mLeft, b.mTop, b.mRight, b.mBottom);
7051a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien    bounds.translate(x, y);
7061a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien    float totalAdvance = layout->getAdvance();
7071a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien
7081a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien    for (size_t i = 0; i < nGlyphs; i++) {
7091a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien        MinikinFontSkia* mfs = static_cast<MinikinFontSkia *>(layout->getFont(i));
7101a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien        skFace = mfs->GetSkTypeface();
7111a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien        glyphs[i] = layout->getGlyphId(i);
7121a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien        pos[2 * i] = SkFloatToScalar(layout->getX(i));
7131a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien        pos[2 * i + 1] = SkFloatToScalar(layout->getY(i));
7141a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien        if (i > 0 && skFace != lastFace) {
7151a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien            paint->setTypeface(lastFace);
7161a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien            size_t glyphsCount = i - start;
7171a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien            int bytesCount = glyphsCount * sizeof(jchar);
7181a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien            renderer->drawText((const char*) (glyphs + start), bytesCount, glyphsCount,
7191a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien                x, y, pos + 2 * start, paint, totalAdvance, bounds);
7201a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien            start = i;
7211a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien        }
7221a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien        lastFace = skFace;
7231a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien    }
7241a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien    if (skFace != NULL) {
7251a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien        paint->setTypeface(skFace);
7261a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien        size_t glyphsCount = nGlyphs - start;
7271a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien        int bytesCount = glyphsCount * sizeof(jchar);
7281a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien        renderer->drawText((const char*) (glyphs + start), bytesCount, glyphsCount,
7291a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien            x, y, pos + 2 * start, paint, totalAdvance, bounds);
7301a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien    }
7311a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien    delete[] glyphs;
7321a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien    delete[] pos;
7331a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien}
7341a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien#endif
7351a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien
736e8e62a4a032a80409114a37908b5f18ab0080848Romain Guystatic void renderText(OpenGLRenderer* renderer, const jchar* text, int count,
7371a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien        jfloat x, jfloat y, int flags, SkPaint* paint, TypefaceImpl* typeface) {
7381a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien#ifdef USE_MINIKIN
7391a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien    Layout layout;
7401a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien    MinikinUtils::SetLayoutProperties(&layout, paint, typeface);
7411a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien    layout.doLayout(text, count);
7421a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien    x += xOffsetForTextAlign(paint, layout.getAdvance());
7431a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien    renderTextLayout(renderer, &layout, x, y, paint);
7441a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien#else
745a731b082b2c43204e6e9f927ab82fb732934a83bFabrice Di Meglio    sp<TextLayoutValue> value = TextLayoutEngine::getInstance().getValue(paint,
746da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio            text, 0, count, count, flags);
7472ea75880142152b3a9993cb245754d73c05749a7Fabrice Di Meglio    if (value == NULL) {
748b02d0ca5553300063e4332192632312600caf4b9Fabrice Di Meglio        return;
7492ea75880142152b3a9993cb245754d73c05749a7Fabrice Di Meglio    }
7505c863f741e8e484bb39decd516c9fa4c6322e671Fabrice Di Meglio    const jchar* glyphs = value->getGlyphs();
7515c863f741e8e484bb39decd516c9fa4c6322e671Fabrice Di Meglio    size_t glyphsCount = value->getGlyphsCount();
752996e57c84368058be793897ebc355b917a59abc2Raph Levien    jfloat totalAdvance = value->getTotalAdvance();
753b15b446f420b3ec69424dabcbcbc8cf019d6c8d6Romain Guy    x += xOffsetForTextAlign(paint, totalAdvance);
754996e57c84368058be793897ebc355b917a59abc2Raph Levien    const float* positions = value->getPos();
75579df5323e7ed541b854cea5684a89e8be8c2dfc9Fabrice Di Meglio    int bytesCount = glyphsCount * sizeof(jchar);
75641541825bc90dac740e424cdd41a8c997e15cdb7Chris Craik    const SkRect& r = value->getBounds();
75741541825bc90dac740e424cdd41a8c997e15cdb7Chris Craik    android::uirenderer::Rect bounds(r.fLeft, r.fTop, r.fRight, r.fBottom);
758f09b746acb266a849f3421df1604ebec161bb93dChris Craik    bounds.translate(x, y);
75941541825bc90dac740e424cdd41a8c997e15cdb7Chris Craik
76041541825bc90dac740e424cdd41a8c997e15cdb7Chris Craik    renderer->drawText((const char*) glyphs, bytesCount, glyphsCount,
761b15b446f420b3ec69424dabcbcbc8cf019d6c8d6Romain Guy            x, y, positions, paint, totalAdvance, bounds);
7621a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien#endif
763e8e62a4a032a80409114a37908b5f18ab0080848Romain Guy}
764e8e62a4a032a80409114a37908b5f18ab0080848Romain Guy
765325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guystatic void renderTextOnPath(OpenGLRenderer* renderer, const jchar* text, int count,
766da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio        SkPath* path, jfloat hOffset, jfloat vOffset, int flags, SkPaint* paint) {
767325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    sp<TextLayoutValue> value = TextLayoutEngine::getInstance().getValue(paint,
768da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio            text, 0, count, count, flags);
769325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    if (value == NULL) {
770325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy        return;
771325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    }
772325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    const jchar* glyphs = value->getGlyphs();
773325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    size_t glyphsCount = value->getGlyphsCount();
774325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    int bytesCount = glyphsCount * sizeof(jchar);
775325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    renderer->drawTextOnPath((const char*) glyphs, bytesCount, glyphsCount, path,
776325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy            hOffset, vOffset, paint);
777325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy}
778325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy
77961c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guystatic void renderTextRun(OpenGLRenderer* renderer, const jchar* text,
78061c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy        jint start, jint count, jint contextCount, jfloat x, jfloat y,
7811a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien        int flags, SkPaint* paint, TypefaceImpl* typeface) {
7821a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien#ifdef USE_MINIKIN
7831a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien    Layout layout;
7841a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien    MinikinUtils::SetLayoutProperties(&layout, paint, typeface);
7851a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien    layout.doLayout(text + start, count);
7861a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien    x += xOffsetForTextAlign(paint, layout.getAdvance());
7871a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien    renderTextLayout(renderer, &layout, x, y, paint);
7881a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien#else
789a731b082b2c43204e6e9f927ab82fb732934a83bFabrice Di Meglio    sp<TextLayoutValue> value = TextLayoutEngine::getInstance().getValue(paint,
790da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio            text, start, count, contextCount, flags);
7912ea75880142152b3a9993cb245754d73c05749a7Fabrice Di Meglio    if (value == NULL) {
792b02d0ca5553300063e4332192632312600caf4b9Fabrice Di Meglio        return;
7932ea75880142152b3a9993cb245754d73c05749a7Fabrice Di Meglio    }
7945c863f741e8e484bb39decd516c9fa4c6322e671Fabrice Di Meglio    const jchar* glyphs = value->getGlyphs();
7955c863f741e8e484bb39decd516c9fa4c6322e671Fabrice Di Meglio    size_t glyphsCount = value->getGlyphsCount();
796996e57c84368058be793897ebc355b917a59abc2Raph Levien    jfloat totalAdvance = value->getTotalAdvance();
797b15b446f420b3ec69424dabcbcbc8cf019d6c8d6Romain Guy    x += xOffsetForTextAlign(paint, totalAdvance);
798996e57c84368058be793897ebc355b917a59abc2Raph Levien    const float* positions = value->getPos();
79979df5323e7ed541b854cea5684a89e8be8c2dfc9Fabrice Di Meglio    int bytesCount = glyphsCount * sizeof(jchar);
80041541825bc90dac740e424cdd41a8c997e15cdb7Chris Craik    const SkRect& r = value->getBounds();
80141541825bc90dac740e424cdd41a8c997e15cdb7Chris Craik    android::uirenderer::Rect bounds(r.fLeft, r.fTop, r.fRight, r.fBottom);
802f09b746acb266a849f3421df1604ebec161bb93dChris Craik    bounds.translate(x, y);
80341541825bc90dac740e424cdd41a8c997e15cdb7Chris Craik
80441541825bc90dac740e424cdd41a8c997e15cdb7Chris Craik    renderer->drawText((const char*) glyphs, bytesCount, glyphsCount,
805b15b446f420b3ec69424dabcbcbc8cf019d6c8d6Romain Guy            x, y, positions, paint, totalAdvance, bounds);
8061a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien#endif
80761c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy}
80861c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy
8097d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawTextArray(JNIEnv* env, jobject clazz,
81036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jcharArray text, jint index, jint count,
8111a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien        jfloat x, jfloat y, jint flags, jlong paintPtr, jlong typefacePtr) {
8129f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
813a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy    jchar* textArray = env->GetCharArrayElements(text, NULL);
8149f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
8151a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien    TypefaceImpl* typeface = reinterpret_cast<TypefaceImpl*>(typefacePtr);
8169f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik
8171a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien    renderText(renderer, textArray + index, count, x, y, flags, paint, typeface);
818a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy    env->ReleaseCharArrayElements(text, textArray, JNI_ABORT);
819a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy}
820a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy
8217d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawText(JNIEnv* env, jobject clazz,
82236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jstring text, jint start, jint end,
8231a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien        jfloat x, jfloat y, jint flags, jlong paintPtr, jlong typefacePtr) {
8249f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
825a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy    const jchar* textArray = env->GetStringChars(text, NULL);
8269f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
8271a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien    TypefaceImpl* typeface = reinterpret_cast<TypefaceImpl*>(typefacePtr);
8289f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik
8291a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien    renderText(renderer, textArray + start, end - start, x, y, flags, paint, typeface);
830a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy    env->ReleaseStringChars(text, textArray);
831a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy}
832a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy
833325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guystatic void android_view_GLES20Canvas_drawTextArrayOnPath(JNIEnv* env, jobject clazz,
83436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jcharArray text, jint index, jint count,
83536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong pathPtr, jfloat hOffset, jfloat vOffset, jint flags, jlong paintPtr) {
8369f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
837325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    jchar* textArray = env->GetCharArrayElements(text, NULL);
8389f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPath* path = reinterpret_cast<SkPath*>(pathPtr);
8399f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
8409f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik
841325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    renderTextOnPath(renderer, textArray + index, count, path,
842da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio            hOffset, vOffset, flags, paint);
843325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    env->ReleaseCharArrayElements(text, textArray, JNI_ABORT);
844325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy}
845325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy
846325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guystatic void android_view_GLES20Canvas_drawTextOnPath(JNIEnv* env, jobject clazz,
84736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jstring text, jint start, jint end,
84836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong pathPtr, jfloat hOffset, jfloat vOffset, jint flags, jlong paintPtr) {
8499f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
850325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    const jchar* textArray = env->GetStringChars(text, NULL);
8519f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPath* path = reinterpret_cast<SkPath*>(pathPtr);
8529f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
8539f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik
854325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    renderTextOnPath(renderer, textArray + start, end - start, path,
855da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio            hOffset, vOffset, flags, paint);
856325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    env->ReleaseStringChars(text, textArray);
857325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy}
858325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy
8597d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawTextRunArray(JNIEnv* env, jobject clazz,
86036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jcharArray text, jint index, jint count,
861da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio        jint contextIndex, jint contextCount, jfloat x, jfloat y, jint dirFlags,
8621a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien        jlong paintPtr, jlong typefacePtr) {
8639f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
86461c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy    jchar* textArray = env->GetCharArrayElements(text, NULL);
8659f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
8661a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien    TypefaceImpl* typeface = reinterpret_cast<TypefaceImpl*>(typefacePtr);
8679f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik
86861c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy    renderTextRun(renderer, textArray + contextIndex, index - contextIndex,
8691a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien            count, contextCount, x, y, dirFlags, paint, typeface);
87061c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy    env->ReleaseCharArrayElements(text, textArray, JNI_ABORT);
87161c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy }
87261c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy
8737d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawTextRun(JNIEnv* env, jobject clazz,
87436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jstring text, jint start, jint end,
875da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio        jint contextStart, int contextEnd, jfloat x, jfloat y, jint dirFlags,
8761a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien        jlong paintPtr, jlong typefacePtr) {
8779f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
87861c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy    const jchar* textArray = env->GetStringChars(text, NULL);
87961c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy    jint count = end - start;
88061c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy    jint contextCount = contextEnd - contextStart;
8819f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
8821a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien    TypefaceImpl* typeface = reinterpret_cast<TypefaceImpl*>(typefacePtr);
8839f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik
88461c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy    renderTextRun(renderer, textArray + contextStart, start - contextStart,
8851a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien            count, contextCount, x, y, dirFlags, paint, typeface);
88661c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy    env->ReleaseStringChars(text, textArray);
88761c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy}
88861c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy
889eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guystatic void renderPosText(OpenGLRenderer* renderer, const jchar* text, int count,
890da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio        const jfloat* positions, jint dirFlags, SkPaint* paint) {
891a731b082b2c43204e6e9f927ab82fb732934a83bFabrice Di Meglio    sp<TextLayoutValue> value = TextLayoutEngine::getInstance().getValue(paint,
892da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio            text, 0, count, count, dirFlags);
893eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    if (value == NULL) {
894eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy        return;
895eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    }
896eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    const jchar* glyphs = value->getGlyphs();
897eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    size_t glyphsCount = value->getGlyphsCount();
898671d6cf460531825a321edb200523d0faa7792c9Romain Guy    if (count < int(glyphsCount)) glyphsCount = count;
899eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    int bytesCount = glyphsCount * sizeof(jchar);
900eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy
901671d6cf460531825a321edb200523d0faa7792c9Romain Guy    renderer->drawPosText((const char*) glyphs, bytesCount, glyphsCount, positions, paint);
902eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy}
903eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy
904eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guystatic void android_view_GLES20Canvas_drawPosTextArray(JNIEnv* env, jobject clazz,
90536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jcharArray text, jint index, jint count,
90636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jfloatArray pos, jlong paintPtr) {
9079f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
908eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    jchar* textArray = env->GetCharArrayElements(text, NULL);
909eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    jfloat* positions = env->GetFloatArrayElements(pos, NULL);
9109f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
911eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy
912da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio    renderPosText(renderer, textArray + index, count, positions, kBidi_LTR, paint);
913eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy
914eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    env->ReleaseFloatArrayElements(pos, positions, JNI_ABORT);
915eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    env->ReleaseCharArrayElements(text, textArray, JNI_ABORT);
916eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy}
917eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy
918eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guystatic void android_view_GLES20Canvas_drawPosText(JNIEnv* env, jobject clazz,
91936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jstring text, jint start, jint end,
92036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jfloatArray pos, jlong paintPtr) {
9219f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
922eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    const jchar* textArray = env->GetStringChars(text, NULL);
923eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    jfloat* positions = env->GetFloatArrayElements(pos, NULL);
9249f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
925eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy
926da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio    renderPosText(renderer, textArray + start, end - start, positions, kBidi_LTR, paint);
927eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy
928eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    env->ReleaseFloatArrayElements(pos, positions, JNI_ABORT);
929eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    env->ReleaseStringChars(text, textArray);
930eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy}
931eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy
932b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy// ----------------------------------------------------------------------------
933b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy// Display lists
934b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy// ----------------------------------------------------------------------------
935b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
93644fd8d24f761f82d21e9b00932648a1b6bf91449John Reckstatic jlong android_view_GLES20Canvas_finishRecording(JNIEnv* env,
93744fd8d24f761f82d21e9b00932648a1b6bf91449John Reck        jobject clazz, jlong rendererPtr) {
9389f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
93944fd8d24f761f82d21e9b00932648a1b6bf91449John Reck    return reinterpret_cast<jlong>(renderer->finishRecording());
940162a0217563f4665da6eb183dfce0fef740f641fJeff Brown}
941162a0217563f4665da6eb183dfce0fef740f641fJeff Brown
9423f085429fd47ebd32ac2463b3eae2a5a6c17be25Chris Craikstatic jlong android_view_GLES20Canvas_createDisplayListRenderer(JNIEnv* env, jobject clazz) {
94344fd8d24f761f82d21e9b00932648a1b6bf91449John Reck    return reinterpret_cast<jlong>(new DisplayListRenderer);
9445977baa1fa24125c148a72699b53e62abaf08960Chet Haase}
9455977baa1fa24125c148a72699b53e62abaf08960Chet Haase
9466554943a1dd6854c0f4976900956e556767b49e1Romain Guystatic jint android_view_GLES20Canvas_drawDisplayList(JNIEnv* env,
94736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jobject clazz, jlong rendererPtr, jlong displayListPtr,
9481271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        jobject dirty, jint flags) {
9499f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
950e18264b079481a244b30e3f71012c53bbd861f92John Reck    RenderNode* displayList = reinterpret_cast<RenderNode*>(displayListPtr);
951cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy    android::uirenderer::Rect bounds;
9521271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    status_t status = renderer->drawDisplayList(displayList, bounds, flags);
9536554943a1dd6854c0f4976900956e556767b49e1Romain Guy    if (status != DrawGlInfo::kStatusDone && dirty != NULL) {
954cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy        env->CallVoidMethod(dirty, gRectClassInfo.set,
955cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy                int(bounds.left), int(bounds.top), int(bounds.right), int(bounds.bottom));
956cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy    }
9576554943a1dd6854c0f4976900956e556767b49e1Romain Guy    return status;
958b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
959b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
9606c319ca1275c8db892c39b48fc54864c949f9171Romain Guy// ----------------------------------------------------------------------------
9616c319ca1275c8db892c39b48fc54864c949f9171Romain Guy// Layers
9626c319ca1275c8db892c39b48fc54864c949f9171Romain Guy// ----------------------------------------------------------------------------
9636c319ca1275c8db892c39b48fc54864c949f9171Romain Guy
9647d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawLayer(JNIEnv* env, jobject clazz,
96536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jlong layerPtr, jfloat x, jfloat y) {
9669f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
9679f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    Layer* layer = reinterpret_cast<Layer*>(layerPtr);
968a08f95cfeca7217f9c533b03663bf0dceedd259aChris Craik    renderer->drawLayer(layer, x, y);
9696c319ca1275c8db892c39b48fc54864c949f9171Romain Guy}
9706c319ca1275c8db892c39b48fc54864c949f9171Romain Guy
97177a811610f99e21da7f88dafef60d09f345d0506Romain Guystatic jboolean android_view_GLES20Canvas_copyLayer(JNIEnv* env, jobject clazz,
97236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong layerPtr, jlong bitmapPtr) {
9739f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    Layer* layer = reinterpret_cast<Layer*>(layerPtr);
9749f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapPtr);
97577a811610f99e21da7f88dafef60d09f345d0506Romain Guy    return LayerRenderer::copyLayer(layer, bitmap);
97677a811610f99e21da7f88dafef60d09f345d0506Romain Guy}
97777a811610f99e21da7f88dafef60d09f345d0506Romain Guy
97811cb642756093a4af901b1525375b1eb2b5c3e2bRomain Guystatic void android_view_GLES20Canvas_pushLayerUpdate(JNIEnv* env, jobject clazz,
97936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jlong layerPtr) {
9809f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
9819f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    Layer* layer = reinterpret_cast<Layer*>(layerPtr);
98211cb642756093a4af901b1525375b1eb2b5c3e2bRomain Guy    renderer->pushLayerUpdate(layer);
98311cb642756093a4af901b1525375b1eb2b5c3e2bRomain Guy}
98411cb642756093a4af901b1525375b1eb2b5c3e2bRomain Guy
985e93482f5eac3df581d57e64c2a771a96aa868585Romain Guystatic void android_view_GLES20Canvas_cancelLayerUpdate(JNIEnv* env, jobject clazz,
98636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr, jlong layerPtr) {
9879f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
9889f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    Layer* layer = reinterpret_cast<Layer*>(layerPtr);
989e93482f5eac3df581d57e64c2a771a96aa868585Romain Guy    renderer->cancelLayerUpdate(layer);
990e93482f5eac3df581d57e64c2a771a96aa868585Romain Guy}
991e93482f5eac3df581d57e64c2a771a96aa868585Romain Guy
99211cb642756093a4af901b1525375b1eb2b5c3e2bRomain Guystatic void android_view_GLES20Canvas_clearLayerUpdates(JNIEnv* env, jobject clazz,
99336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr) {
9949f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
99511cb642756093a4af901b1525375b1eb2b5c3e2bRomain Guy    renderer->clearLayerUpdates();
99611cb642756093a4af901b1525375b1eb2b5c3e2bRomain Guy}
99711cb642756093a4af901b1525375b1eb2b5c3e2bRomain Guy
998405436021da156fbe3c5d4de48bdefa564cf7fc0Romain Guystatic void android_view_GLES20Canvas_flushLayerUpdates(JNIEnv* env, jobject clazz,
99936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong rendererPtr) {
10009f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
1001405436021da156fbe3c5d4de48bdefa564cf7fc0Romain Guy    renderer->flushLayerUpdates();
1002405436021da156fbe3c5d4de48bdefa564cf7fc0Romain Guy}
1003405436021da156fbe3c5d4de48bdefa564cf7fc0Romain Guy
1004163935113919a184122b8b3bd672ef08c8df65dcRomain Guy#endif // USE_OPENGL_RENDERER
1005163935113919a184122b8b3bd672ef08c8df65dcRomain Guy
1006163935113919a184122b8b3bd672ef08c8df65dcRomain Guy// ----------------------------------------------------------------------------
1007163935113919a184122b8b3bd672ef08c8df65dcRomain Guy// Common
1008163935113919a184122b8b3bd672ef08c8df65dcRomain Guy// ----------------------------------------------------------------------------
1009163935113919a184122b8b3bd672ef08c8df65dcRomain Guy
1010163935113919a184122b8b3bd672ef08c8df65dcRomain Guystatic jboolean android_view_GLES20Canvas_isAvailable(JNIEnv* env, jobject clazz) {
1011163935113919a184122b8b3bd672ef08c8df65dcRomain Guy#ifdef USE_OPENGL_RENDERER
10124406345cd62d3687ce590c357854472f7f906e6cJesse Hall    char prop[PROPERTY_VALUE_MAX];
10134406345cd62d3687ce590c357854472f7f906e6cJesse Hall    if (property_get("ro.kernel.qemu", prop, NULL) == 0) {
10144406345cd62d3687ce590c357854472f7f906e6cJesse Hall        // not in the emulator
10154406345cd62d3687ce590c357854472f7f906e6cJesse Hall        return JNI_TRUE;
10164406345cd62d3687ce590c357854472f7f906e6cJesse Hall    }
10174406345cd62d3687ce590c357854472f7f906e6cJesse Hall    // In the emulator this property will be set to 1 when hardware GLES is
10184406345cd62d3687ce590c357854472f7f906e6cJesse Hall    // enabled, 0 otherwise. On old emulator versions it will be undefined.
10194406345cd62d3687ce590c357854472f7f906e6cJesse Hall    property_get("ro.kernel.qemu.gles", prop, "0");
10204406345cd62d3687ce590c357854472f7f906e6cJesse Hall    return atoi(prop) == 1 ? JNI_TRUE : JNI_FALSE;
1021163935113919a184122b8b3bd672ef08c8df65dcRomain Guy#else
1022163935113919a184122b8b3bd672ef08c8df65dcRomain Guy    return JNI_FALSE;
1023163935113919a184122b8b3bd672ef08c8df65dcRomain Guy#endif
1024163935113919a184122b8b3bd672ef08c8df65dcRomain Guy}
1025163935113919a184122b8b3bd672ef08c8df65dcRomain Guy
1026a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy// ----------------------------------------------------------------------------
10279c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase// Logging
10289c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase// ----------------------------------------------------------------------------
10299c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase
10309c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haasestatic void
103165b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guyandroid_app_ActivityThread_dumpGraphics(JNIEnv* env, jobject clazz, jobject javaFileDescriptor) {
1032905787a7c91d23daa4efc3d16bd8cbf1a683e779Chet Haase#ifdef USE_OPENGL_RENDERER
1033a3804cf77f0edd93f6247a055cdafb856b117eecElliott Hughes    int fd = jniGetFDFromFileDescriptor(env, javaFileDescriptor);
1034e18264b079481a244b30e3f71012c53bbd861f92John Reck    android::uirenderer::RenderNode::outputLogBuffer(fd);
1035905787a7c91d23daa4efc3d16bd8cbf1a683e779Chet Haase#endif // USE_OPENGL_RENDERER
10369c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase}
10379c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase
10389c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase// ----------------------------------------------------------------------------
1039e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// JNI Glue
1040e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// ----------------------------------------------------------------------------
1041e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
1042e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guyconst char* const kClassPathName = "android/view/GLES20Canvas";
1043e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
1044e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guystatic JNINativeMethod gMethods[] = {
104561c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy    { "nIsAvailable",       "()Z",             (void*) android_view_GLES20Canvas_isAvailable },
1046163935113919a184122b8b3bd672ef08c8df65dcRomain Guy
104761c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy#ifdef USE_OPENGL_RENDERER
1048ba6be8a62dcdb3ffd210cd36b9af4e3a658eac47Romain Guy    { "nFlushCaches",       "(I)V",            (void*) android_view_GLES20Canvas_flushCaches },
10493b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    { "nInitCaches",        "()Z",             (void*) android_view_GLES20Canvas_initCaches },
1050ba6be8a62dcdb3ffd210cd36b9af4e3a658eac47Romain Guy    { "nTerminateCaches",   "()V",             (void*) android_view_GLES20Canvas_terminateCaches },
10517d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy
105217ab38f8a87bc90eab11373f878f220ce3031de6Ashok Bhat    { "nInitAtlas",         "(Landroid/view/GraphicBuffer;[JI)V",
10533b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy            (void*) android_view_GLES20Canvas_initAtlas },
10543b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy
105536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nCreateRenderer",    "()J",             (void*) android_view_GLES20Canvas_createRenderer },
105636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDestroyRenderer",   "(J)V",            (void*) android_view_GLES20Canvas_destroyRenderer },
105736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nSetViewport",       "(JII)V",          (void*) android_view_GLES20Canvas_setViewport },
105836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nPrepare",           "(JZ)I",           (void*) android_view_GLES20Canvas_prepare },
105936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nPrepareDirty",      "(JIIIIZ)I",       (void*) android_view_GLES20Canvas_prepareDirty },
106036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nFinish",            "(J)V",            (void*) android_view_GLES20Canvas_finish },
1061ba9b613437c34873fa95800a25fc51720638267cChris Craik    { "nSetProperty",           "(Ljava/lang/String;Ljava/lang/String;)V",
1062ba9b613437c34873fa95800a25fc51720638267cChris Craik            (void*) android_view_GLES20Canvas_setProperty },
106361c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy
106478dd96d5af20f489f0e8b288617d57774ec284f7Romain Guy
1065530041d3191ce817832a0108514617768e43cda6Romain Guy    { "nGetStencilSize",    "()I",             (void*) android_view_GLES20Canvas_getStencilSize },
1066530041d3191ce817832a0108514617768e43cda6Romain Guy
106736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nCallDrawGLFunction", "(JJ)I",          (void*) android_view_GLES20Canvas_callDrawGLFunction },
106836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDetachFunctor",      "(JJ)V",          (void*) android_view_GLES20Canvas_detachFunctor },
106936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nAttachFunctor",      "(JJ)V",          (void*) android_view_GLES20Canvas_attachFunctor },
107036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nInvokeFunctors",     "(JLandroid/graphics/Rect;)I",
10718f3b8e32993d190a26c70c839a63d8ce4c3b16d9Romain Guy            (void*) android_view_GLES20Canvas_invokeFunctors },
10727d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy
107336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nSave",              "(JI)I",           (void*) android_view_GLES20Canvas_save },
107436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nRestore",           "(J)V",            (void*) android_view_GLES20Canvas_restore },
107536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nRestoreToCount",    "(JI)V",           (void*) android_view_GLES20Canvas_restoreToCount },
107636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nGetSaveCount",      "(J)I",            (void*) android_view_GLES20Canvas_getSaveCount },
107736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat
107836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nSaveLayer",         "(JFFFFJI)I",      (void*) android_view_GLES20Canvas_saveLayer },
107936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nSaveLayer",         "(JJI)I",          (void*) android_view_GLES20Canvas_saveLayerClip },
108036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nSaveLayerAlpha",    "(JFFFFII)I",      (void*) android_view_GLES20Canvas_saveLayerAlpha },
108136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nSaveLayerAlpha",    "(JII)I",          (void*) android_view_GLES20Canvas_saveLayerAlphaClip },
108236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat
108336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nQuickReject",       "(JFFFF)Z",        (void*) android_view_GLES20Canvas_quickReject },
108436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nClipRect",          "(JFFFFI)Z",       (void*) android_view_GLES20Canvas_clipRectF },
108536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nClipRect",          "(JIIIII)Z",       (void*) android_view_GLES20Canvas_clipRect },
108636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nClipPath",          "(JJI)Z",          (void*) android_view_GLES20Canvas_clipPath },
108736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nClipRegion",        "(JJI)Z",          (void*) android_view_GLES20Canvas_clipRegion },
108836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat
108936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nTranslate",         "(JFF)V",          (void*) android_view_GLES20Canvas_translate },
109036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nRotate",            "(JF)V",           (void*) android_view_GLES20Canvas_rotate },
109136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nScale",             "(JFF)V",          (void*) android_view_GLES20Canvas_scale },
109236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nSkew",              "(JFF)V",          (void*) android_view_GLES20Canvas_skew },
109336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat
109436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nSetMatrix",         "(JJ)V",           (void*) android_view_GLES20Canvas_setMatrix },
109536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nGetMatrix",         "(JJ)V",           (void*) android_view_GLES20Canvas_getMatrix },
109636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nConcatMatrix",      "(JJ)V",           (void*) android_view_GLES20Canvas_concatMatrix },
109736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat
109836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawBitmap",        "(JJ[BFFJ)V",      (void*) android_view_GLES20Canvas_drawBitmap },
109936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawBitmap",        "(JJ[BFFFFFFFFJ)V",(void*) android_view_GLES20Canvas_drawBitmapRect },
110036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawBitmap",        "(JJ[BJJ)V",       (void*) android_view_GLES20Canvas_drawBitmapMatrix },
110136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawBitmap",        "(J[IIIFFIIZJ)V",  (void*) android_view_GLES20Canvas_drawBitmapData },
110236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat
110336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawBitmapMesh",    "(JJ[BII[FI[IIJ)V",(void*) android_view_GLES20Canvas_drawBitmapMesh },
110436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat
110536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawPatch",         "(JJ[BJFFFFJ)V",   (void*) android_view_GLES20Canvas_drawPatch },
110636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat
110736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawColor",         "(JII)V",          (void*) android_view_GLES20Canvas_drawColor },
110836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawRect",          "(JFFFFJ)V",       (void*) android_view_GLES20Canvas_drawRect },
110936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawRects",         "(JJJ)V",          (void*) android_view_GLES20Canvas_drawRegionAsRects },
111036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawRects",         "(J[FIJ)V",        (void*) android_view_GLES20Canvas_drawRects },
111136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawRoundRect",     "(JFFFFFFJ)V",     (void*) android_view_GLES20Canvas_drawRoundRect },
111236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawCircle",        "(JFFFJ)V",        (void*) android_view_GLES20Canvas_drawCircle },
111336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawOval",          "(JFFFFJ)V",       (void*) android_view_GLES20Canvas_drawOval },
111436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawArc",           "(JFFFFFFZJ)V",    (void*) android_view_GLES20Canvas_drawArc },
111536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawPoints",        "(J[FIIJ)V",       (void*) android_view_GLES20Canvas_drawPoints },
111636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat
111736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawPath",          "(JJJ)V",          (void*) android_view_GLES20Canvas_drawPath },
111836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawLines",         "(J[FIIJ)V",       (void*) android_view_GLES20Canvas_drawLines },
111936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat
112036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nResetModifiers",    "(JI)V",           (void*) android_view_GLES20Canvas_resetModifiers },
112136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nSetupShader",       "(JJ)V",           (void*) android_view_GLES20Canvas_setupShader },
112236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nSetupShadow",       "(JFFFI)V",        (void*) android_view_GLES20Canvas_setupShadow },
112336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat
112436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nSetupPaintFilter",  "(JII)V",          (void*) android_view_GLES20Canvas_setupPaintFilter },
112536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nResetPaintFilter",  "(J)V",            (void*) android_view_GLES20Canvas_resetPaintFilter },
112636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat
11271a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien    { "nDrawText",          "(J[CIIFFIJJ)V",   (void*) android_view_GLES20Canvas_drawTextArray },
11281a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien    { "nDrawText",          "(JLjava/lang/String;IIFFIJJ)V",
1129a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy            (void*) android_view_GLES20Canvas_drawText },
1130a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy
113136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawTextOnPath",    "(J[CIIJFFIJ)V",   (void*) android_view_GLES20Canvas_drawTextArrayOnPath },
113236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawTextOnPath",    "(JLjava/lang/String;IIJFFIJ)V",
1133325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy            (void*) android_view_GLES20Canvas_drawTextOnPath },
1134325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy
11351a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien    { "nDrawTextRun",       "(J[CIIIIFFIJJ)V",  (void*) android_view_GLES20Canvas_drawTextRunArray },
11361a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien    { "nDrawTextRun",       "(JLjava/lang/String;IIIIFFIJJ)V",
113761c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy            (void*) android_view_GLES20Canvas_drawTextRun },
113861c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy
113936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawPosText",       "(J[CII[FJ)V",     (void*) android_view_GLES20Canvas_drawPosTextArray },
114036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawPosText",       "(JLjava/lang/String;II[FJ)V",
1141eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy            (void*) android_view_GLES20Canvas_drawPosText },
1142eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy
114336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nGetClipBounds",     "(JLandroid/graphics/Rect;)Z",
1144ce0537b80087a6225273040a987414b1dd081aa0Romain Guy            (void*) android_view_GLES20Canvas_getClipBounds },
1145b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
114644fd8d24f761f82d21e9b00932648a1b6bf91449John Reck    { "nFinishRecording",        "(J)J",      (void*) android_view_GLES20Canvas_finishRecording },
114736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawDisplayList",        "(JJLandroid/graphics/Rect;I)I",
11488f3b8e32993d190a26c70c839a63d8ce4c3b16d9Romain Guy            (void*) android_view_GLES20Canvas_drawDisplayList },
114913631f3da855f200a151e7837ed9f6b079622b58Romain Guy
115036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nCreateDisplayListRenderer", "()J",     (void*) android_view_GLES20Canvas_createDisplayListRenderer },
115113631f3da855f200a151e7837ed9f6b079622b58Romain Guy
115236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nDrawLayer",              "(JJFF)V",    (void*) android_view_GLES20Canvas_drawLayer },
115336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nCopyLayer",              "(JJ)Z",      (void*) android_view_GLES20Canvas_copyLayer },
115436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nClearLayerUpdates",      "(J)V",       (void*) android_view_GLES20Canvas_clearLayerUpdates },
115536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nFlushLayerUpdates",      "(J)V",       (void*) android_view_GLES20Canvas_flushLayerUpdates },
115636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nPushLayerUpdate",        "(JJ)V",      (void*) android_view_GLES20Canvas_pushLayerUpdate },
115736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    { "nCancelLayerUpdate",      "(JJ)V",      (void*) android_view_GLES20Canvas_cancelLayerUpdate },
115836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat
1159f61970fc79e9c5cf340fa942597628242361864aRomain Guy    { "nGetMaximumTextureWidth",  "()I",       (void*) android_view_GLES20Canvas_getMaxTextureWidth },
1160f61970fc79e9c5cf340fa942597628242361864aRomain Guy    { "nGetMaximumTextureHeight", "()I",       (void*) android_view_GLES20Canvas_getMaxTextureHeight },
1161f61970fc79e9c5cf340fa942597628242361864aRomain Guy
1162163935113919a184122b8b3bd672ef08c8df65dcRomain Guy#endif
1163e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy};
1164e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
11659c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haasestatic JNINativeMethod gActivityThreadMethods[] = {
11669c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    { "dumpGraphicsInfo",        "(Ljava/io/FileDescriptor;)V",
11679c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase                                               (void*) android_app_ActivityThread_dumpGraphics }
11689c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase};
11699c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase
11709c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase
1171163935113919a184122b8b3bd672ef08c8df65dcRomain Guy#ifdef USE_OPENGL_RENDERER
1172163935113919a184122b8b3bd672ef08c8df65dcRomain Guy    #define FIND_CLASS(var, className) \
1173163935113919a184122b8b3bd672ef08c8df65dcRomain Guy            var = env->FindClass(className); \
117417cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro            LOG_FATAL_IF(! var, "Unable to find class " className);
117517cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro
1176163935113919a184122b8b3bd672ef08c8df65dcRomain Guy    #define GET_METHOD_ID(var, clazz, methodName, methodDescriptor) \
1177163935113919a184122b8b3bd672ef08c8df65dcRomain Guy            var = env->GetMethodID(clazz, methodName, methodDescriptor); \
1178163935113919a184122b8b3bd672ef08c8df65dcRomain Guy            LOG_FATAL_IF(! var, "Unable to find method " methodName);
1179163935113919a184122b8b3bd672ef08c8df65dcRomain Guy#else
1180163935113919a184122b8b3bd672ef08c8df65dcRomain Guy    #define FIND_CLASS(var, className)
1181163935113919a184122b8b3bd672ef08c8df65dcRomain Guy    #define GET_METHOD_ID(var, clazz, methodName, methodDescriptor)
1182163935113919a184122b8b3bd672ef08c8df65dcRomain Guy#endif
11839d5316e3f56d138504565ff311145ac01621dff4Romain Guy
1184e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guyint register_android_view_GLES20Canvas(JNIEnv* env) {
118517cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro    jclass clazz;
118617cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro    FIND_CLASS(clazz, "android/graphics/Rect");
118717cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro    GET_METHOD_ID(gRectClassInfo.set, clazz, "set", "(IIII)V");
11889d5316e3f56d138504565ff311145ac01621dff4Romain Guy
1189e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    return AndroidRuntime::registerNativeMethods(env, kClassPathName, gMethods, NELEM(gMethods));
1190e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy}
1191e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
11929c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haaseconst char* const kActivityThreadPathName = "android/app/ActivityThread";
11939c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase
11946be3d5561cbeccf0a8257a4acb155657f868e548Romain Guyint register_android_app_ActivityThread(JNIEnv* env) {
11956be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy    return AndroidRuntime::registerNativeMethods(env, kActivityThreadPathName,
11969c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase            gActivityThreadMethods, NELEM(gActivityThreadMethods));
11979c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase}
11989c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase
1199e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy};
1200