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