android_view_GLES20Canvas.cpp revision 0e89e2b7bcb2c035e8cee77f93120e7c5617f8d2
1e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy/* 2e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy * Copyright (C) 2010 The Android Open Source Project 3e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy * 4e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy * Licensed under the Apache License, Version 2.0 (the "License"); 5e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy * you may not use this file except in compliance with the License. 6e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy * You may obtain a copy of the License at 7e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy * 8e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy * http://www.apache.org/licenses/LICENSE-2.0 9e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy * 10e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy * Unless required by applicable law or agreed to in writing, software 11e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy * distributed under the License is distributed on an "AS IS" BASIS, 12e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy * See the License for the specific language governing permissions and 14e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy * limitations under the License. 15e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy */ 16e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy 17a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy#define LOG_TAG "OpenGLRenderer" 18a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy 19e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy#include "jni.h" 20e4ac2d6b5723c95e648c489b187ddde449452c13Patrick Dubroy#include "GraphicsJNI.h" 21e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy#include <nativehelper/JNIHelp.h> 226554943a1dd6854c0f4976900956e556767b49e1Romain Guy 23e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy#include <android_runtime/AndroidRuntime.h> 246554943a1dd6854c0f4976900956e556767b49e1Romain Guy 25b13b9bdad2baf6ad1ec2e56b6b7598fa20f55fc4Mathias Agopian#include <androidfw/ResourceTypes.h> 26e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy 276554943a1dd6854c0f4976900956e556767b49e1Romain Guy#include <private/hwui/DrawGlInfo.h> 286554943a1dd6854c0f4976900956e556767b49e1Romain Guy 296554943a1dd6854c0f4976900956e556767b49e1Romain Guy#include <cutils/properties.h> 308f0095cd33558e9cc8a440047908e53b68906f5fRomain Guy 31ce0537b80087a6225273040a987414b1dd081aa0Romain Guy#include <SkBitmap.h> 32c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy#include <SkCanvas.h> 3357ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III#include <SkImageInfo.h> 34f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy#include <SkMatrix.h> 352ce932832e7caa1a6021539a9b7828ee5f49a610Chris Craik#include <SkPorterDuff.h> 36079ba2c85b15e882629b8d188f5fbdb42f7f8eeaRomain Guy#include <SkRegion.h> 37a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy#include <SkScalerContext.h> 3861c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy#include <SkTemplates.h> 3985bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy#include <SkXfermode.h> 40e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy 41b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy#include <DisplayListRenderer.h> 429d5316e3f56d138504565ff311145ac01621dff4Romain Guy#include <Rect.h> 43113e0824d6bddf4376240681f9cf6a2deded9498John Reck#include <RenderNode.h> 4452244fff29042926e21fa897ef5ab11148e35299John Reck#include <CanvasProperty.h> 456ba30b85ddfbe37c338ee8dde3dd33322eb38d47Behdad Esfahbod#include <Paint.h> 460e89e2b7bcb2c035e8cee77f93120e7c5617f8d2John Reck#include <renderthread/RenderProxy.h> 4785bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy 481a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien#include "MinikinUtils.h" 49e8e62a4a032a80409114a37908b5f18ab0080848Romain Guy 50e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guynamespace android { 51e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy 529d5316e3f56d138504565ff311145ac01621dff4Romain Guyusing namespace uirenderer; 539d5316e3f56d138504565ff311145ac01621dff4Romain Guy 54163935113919a184122b8b3bd672ef08c8df65dcRomain Guy/** 553b20251a355c88193c439f928a84ae69483fb488John Reck * Note: DisplayListRenderer JNI layer is generated and compiled only on supported 56163935113919a184122b8b3bd672ef08c8df65dcRomain Guy * devices. This means all the logic must be compiled only when the 57163935113919a184122b8b3bd672ef08c8df65dcRomain Guy * preprocessor variable USE_OPENGL_RENDERER is defined. 58163935113919a184122b8b3bd672ef08c8df65dcRomain Guy */ 59163935113919a184122b8b3bd672ef08c8df65dcRomain Guy#ifdef USE_OPENGL_RENDERER 60163935113919a184122b8b3bd672ef08c8df65dcRomain Guy 61244ada1d35419b7be9de0fc833bb03955b725ffaRomain Guy// ---------------------------------------------------------------------------- 62bdb801ca993bcccbf2a4c2401d1720c3fa523777Romain Guy// Defines 63244ada1d35419b7be9de0fc833bb03955b725ffaRomain Guy// ---------------------------------------------------------------------------- 64bdb801ca993bcccbf2a4c2401d1720c3fa523777Romain Guy 65bdb801ca993bcccbf2a4c2401d1720c3fa523777Romain Guy// Debug 66e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy#define DEBUG_RENDERER 0 67bdb801ca993bcccbf2a4c2401d1720c3fa523777Romain Guy 68bdb801ca993bcccbf2a4c2401d1720c3fa523777Romain Guy// Debug 69bdb801ca993bcccbf2a4c2401d1720c3fa523777Romain Guy#if DEBUG_RENDERER 705baa3a62a97544669fba6d65a11c07f252e654ddSteve Block #define RENDERER_LOGD(...) ALOGD(__VA_ARGS__) 71bdb801ca993bcccbf2a4c2401d1720c3fa523777Romain Guy#else 72bdb801ca993bcccbf2a4c2401d1720c3fa523777Romain Guy #define RENDERER_LOGD(...) 73bdb801ca993bcccbf2a4c2401d1720c3fa523777Romain Guy#endif 74e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy 759d5316e3f56d138504565ff311145ac01621dff4Romain Guy// ---------------------------------------------------------------------------- 769d5316e3f56d138504565ff311145ac01621dff4Romain Guy 779d5316e3f56d138504565ff311145ac01621dff4Romain Guystatic struct { 787ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy jmethodID set; 799d5316e3f56d138504565ff311145ac01621dff4Romain Guy} gRectClassInfo; 809d5316e3f56d138504565ff311145ac01621dff4Romain Guy 81e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// ---------------------------------------------------------------------------- 82e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// Constructors 83e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// ---------------------------------------------------------------------------- 84e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy 855c13d89c1332fcc499379b9064b891187b75ca32Chet Haasestatic void android_view_GLES20Canvas_destroyRenderer(JNIEnv* env, jobject clazz, 8636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr) { 873b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 883b20251a355c88193c439f928a84ae69483fb488John Reck RENDERER_LOGD("Destroy DisplayListRenderer"); 89f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy delete renderer; 90e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy} 91e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy 92e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// ---------------------------------------------------------------------------- 93e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// Setup 94e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// ---------------------------------------------------------------------------- 95e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy 967d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_setViewport(JNIEnv* env, jobject clazz, 9736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr, jint width, jint height) { 983b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 99f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy renderer->setViewport(width, height); 100e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy} 101e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy 102cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craikstatic void android_view_GLES20Canvas_setHighContrastText(JNIEnv* env, jobject clazz, 103cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik jlong rendererPtr, jboolean highContrastText) { 104cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 105cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik renderer->setHighContrastText(highContrastText); 106cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik} 107cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik 1088afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craikstatic void android_view_GLES20Canvas_insertReorderBarrier(JNIEnv* env, jobject clazz, 1098afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik jlong rendererPtr, jboolean reorderEnable) { 1108afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 1118afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik renderer->insertReorderBarrier(reorderEnable); 1128afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik} 1138afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik 11444b2fe3fc114ee5f7273c6b0fee2cc999bf244a2Chet Haasestatic int android_view_GLES20Canvas_prepare(JNIEnv* env, jobject clazz, 11536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr, jboolean opaque) { 1163b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 11744b2fe3fc114ee5f7273c6b0fee2cc999bf244a2Chet Haase return renderer->prepare(opaque); 118e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy} 119e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy 12044b2fe3fc114ee5f7273c6b0fee2cc999bf244a2Chet Haasestatic int android_view_GLES20Canvas_prepareDirty(JNIEnv* env, jobject clazz, 12136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr, jint left, jint top, jint right, jint bottom, 1227d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy jboolean opaque) { 1233b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 12444b2fe3fc114ee5f7273c6b0fee2cc999bf244a2Chet Haase return renderer->prepareDirty(left, top, right, bottom, opaque); 1257d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy} 1267d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy 1277d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_finish(JNIEnv* env, jobject clazz, 12836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr) { 1293b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 130b025b9c8b4efefadb01937db61a1f8ee7d2452bfRomain Guy renderer->finish(); 131b025b9c8b4efefadb01937db61a1f8ee7d2452bfRomain Guy} 132b025b9c8b4efefadb01937db61a1f8ee7d2452bfRomain Guy 133ba9b613437c34873fa95800a25fc51720638267cChris Craikstatic void android_view_GLES20Canvas_setProperty(JNIEnv* env, 134ba9b613437c34873fa95800a25fc51720638267cChris Craik jobject clazz, jstring name, jstring value) { 135ba9b613437c34873fa95800a25fc51720638267cChris Craik if (!Caches::hasInstance()) { 136ba9b613437c34873fa95800a25fc51720638267cChris Craik ALOGW("can't set property, no Caches instance"); 137ba9b613437c34873fa95800a25fc51720638267cChris Craik return; 138ba9b613437c34873fa95800a25fc51720638267cChris Craik } 139ba9b613437c34873fa95800a25fc51720638267cChris Craik 140ba9b613437c34873fa95800a25fc51720638267cChris Craik if (name == NULL || value == NULL) { 141ba9b613437c34873fa95800a25fc51720638267cChris Craik ALOGW("can't set prop, null passed"); 142ba9b613437c34873fa95800a25fc51720638267cChris Craik } 143ba9b613437c34873fa95800a25fc51720638267cChris Craik 144ba9b613437c34873fa95800a25fc51720638267cChris Craik const char* nameCharArray = env->GetStringUTFChars(name, NULL); 145ba9b613437c34873fa95800a25fc51720638267cChris Craik const char* valueCharArray = env->GetStringUTFChars(value, NULL); 146ba9b613437c34873fa95800a25fc51720638267cChris Craik Caches::getInstance().setTempProperty(nameCharArray, valueCharArray); 147ba9b613437c34873fa95800a25fc51720638267cChris Craik env->ReleaseStringUTFChars(name, nameCharArray); 148ba9b613437c34873fa95800a25fc51720638267cChris Craik env->ReleaseStringUTFChars(name, valueCharArray); 149ba9b613437c34873fa95800a25fc51720638267cChris Craik} 150ba9b613437c34873fa95800a25fc51720638267cChris Craik 151530041d3191ce817832a0108514617768e43cda6Romain Guy// ---------------------------------------------------------------------------- 152530041d3191ce817832a0108514617768e43cda6Romain Guy// Functor 153530041d3191ce817832a0108514617768e43cda6Romain Guy// ---------------------------------------------------------------------------- 154530041d3191ce817832a0108514617768e43cda6Romain Guy 1556554943a1dd6854c0f4976900956e556767b49e1Romain Guystatic jint android_view_GLES20Canvas_callDrawGLFunction(JNIEnv* env, jobject clazz, 15636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr, jlong functorPtr) { 1573b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 1589f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik Functor* functor = reinterpret_cast<Functor*>(functorPtr); 159cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy android::uirenderer::Rect dirty; 160cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy return renderer->callDrawGLFunction(functor, dirty); 161daf98e941e140e8739458126640183b9f296a2abChet Haase} 162daf98e941e140e8739458126640183b9f296a2abChet Haase 1638f3b8e32993d190a26c70c839a63d8ce4c3b16d9Romain Guy// ---------------------------------------------------------------------------- 1648f3b8e32993d190a26c70c839a63d8ce4c3b16d9Romain Guy// Misc 1658f3b8e32993d190a26c70c839a63d8ce4c3b16d9Romain Guy// ---------------------------------------------------------------------------- 1668f3b8e32993d190a26c70c839a63d8ce4c3b16d9Romain Guy 167f61970fc79e9c5cf340fa942597628242361864aRomain Guystatic jint android_view_GLES20Canvas_getMaxTextureWidth(JNIEnv* env, jobject clazz) { 168f61970fc79e9c5cf340fa942597628242361864aRomain Guy return Caches::getInstance().maxTextureSize; 169f61970fc79e9c5cf340fa942597628242361864aRomain Guy} 170f61970fc79e9c5cf340fa942597628242361864aRomain Guy 171f61970fc79e9c5cf340fa942597628242361864aRomain Guystatic jint android_view_GLES20Canvas_getMaxTextureHeight(JNIEnv* env, jobject clazz) { 172f61970fc79e9c5cf340fa942597628242361864aRomain Guy return Caches::getInstance().maxTextureSize; 173f61970fc79e9c5cf340fa942597628242361864aRomain Guy} 174f61970fc79e9c5cf340fa942597628242361864aRomain Guy 175e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// ---------------------------------------------------------------------------- 176bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy// State 177bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy// ---------------------------------------------------------------------------- 178bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy 17936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhatstatic jint android_view_GLES20Canvas_save(JNIEnv* env, jobject clazz, jlong rendererPtr, 180bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy jint flags) { 1813b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 182f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy return renderer->save(flags); 183f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy} 184bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy 1857d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic jint android_view_GLES20Canvas_getSaveCount(JNIEnv* env, jobject clazz, 18636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr) { 1873b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 188f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy return renderer->getSaveCount(); 189bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy} 190bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy 1917d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_restore(JNIEnv* env, jobject clazz, 19236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr) { 1933b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 194f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy renderer->restore(); 195bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy} 196bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy 1977d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_restoreToCount(JNIEnv* env, jobject clazz, 19836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr, jint saveCount) { 1993b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 200f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy renderer->restoreToCount(saveCount); 201bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy} 202bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy 203f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy// ---------------------------------------------------------------------------- 204bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy// Layers 205bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy// ---------------------------------------------------------------------------- 206bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy 2077d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic jint android_view_GLES20Canvas_saveLayer(JNIEnv* env, jobject clazz, 20836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr, jfloat left, jfloat top, jfloat right, jfloat bottom, 20936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong paintPtr, jint saveFlags) { 2103b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 2116ba30b85ddfbe37c338ee8dde3dd33322eb38d47Behdad Esfahbod Paint* paint = reinterpret_cast<Paint*>(paintPtr); 212bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy return renderer->saveLayer(left, top, right, bottom, paint, saveFlags); 213bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy} 214bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy 215189887e0ae171c1b7601991442104a30e56c50abRomain Guystatic jint android_view_GLES20Canvas_saveLayerClip(JNIEnv* env, jobject clazz, 21636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr, jlong paintPtr, jint saveFlags) { 2173b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 2186ba30b85ddfbe37c338ee8dde3dd33322eb38d47Behdad Esfahbod Paint* paint = reinterpret_cast<Paint*>(paintPtr); 2193f085429fd47ebd32ac2463b3eae2a5a6c17be25Chris Craik const android::uirenderer::Rect& bounds(renderer->getLocalClipBounds()); 220189887e0ae171c1b7601991442104a30e56c50abRomain Guy return renderer->saveLayer(bounds.left, bounds.top, bounds.right, bounds.bottom, 221189887e0ae171c1b7601991442104a30e56c50abRomain Guy paint, saveFlags); 222189887e0ae171c1b7601991442104a30e56c50abRomain Guy} 223189887e0ae171c1b7601991442104a30e56c50abRomain Guy 2247d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic jint android_view_GLES20Canvas_saveLayerAlpha(JNIEnv* env, jobject clazz, 22536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr, jfloat left, jfloat top, jfloat right, jfloat bottom, 226bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy jint alpha, jint saveFlags) { 2273b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 228bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy return renderer->saveLayerAlpha(left, top, right, bottom, alpha, saveFlags); 229bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy} 230bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy 231189887e0ae171c1b7601991442104a30e56c50abRomain Guystatic jint android_view_GLES20Canvas_saveLayerAlphaClip(JNIEnv* env, jobject clazz, 23236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr, jint alpha, jint saveFlags) { 2333b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 2343f085429fd47ebd32ac2463b3eae2a5a6c17be25Chris Craik const android::uirenderer::Rect& bounds(renderer->getLocalClipBounds()); 235189887e0ae171c1b7601991442104a30e56c50abRomain Guy return renderer->saveLayerAlpha(bounds.left, bounds.top, bounds.right, bounds.bottom, 236189887e0ae171c1b7601991442104a30e56c50abRomain Guy alpha, saveFlags); 237189887e0ae171c1b7601991442104a30e56c50abRomain Guy} 238189887e0ae171c1b7601991442104a30e56c50abRomain Guy 239bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy// ---------------------------------------------------------------------------- 240f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy// Clipping 241f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy// ---------------------------------------------------------------------------- 242f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy 24336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhatstatic jboolean android_view_GLES20Canvas_quickReject(JNIEnv* env, jobject clazz, 24436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr, jfloat left, jfloat top, jfloat right, jfloat bottom) { 2453b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 24636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat const bool result = renderer->quickRejectConservative(left, top, right, bottom); 24736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat return result ? JNI_TRUE : JNI_FALSE; 248c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy} 249c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy 25036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhatstatic jboolean android_view_GLES20Canvas_clipRectF(JNIEnv* env, jobject clazz, 25136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr, jfloat left, jfloat top, jfloat right, jfloat bottom, 25236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jint op) { 2533b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 25436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat const bool result = renderer->clipRect(left, top, right, bottom, 25536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat static_cast<SkRegion::Op>(op)); 25636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat return result ? JNI_TRUE : JNI_FALSE; 257f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy} 258bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy 25936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhatstatic jboolean android_view_GLES20Canvas_clipRect(JNIEnv* env, jobject clazz, 26036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr, jint left, jint top, jint right, jint bottom, 26136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jint op) { 2623b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 26336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat const bool result = renderer->clipRect(float(left), float(top), float(right), 26436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat float(bottom), 26536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat static_cast<SkRegion::Op>(op)); 26636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat return result ? JNI_TRUE : JNI_FALSE; 267bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy} 268bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy 26936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhatstatic jboolean android_view_GLES20Canvas_clipPath(JNIEnv* env, jobject clazz, 27036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr, jlong pathPtr, jint op) { 2713b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 2729f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik SkPath* path = reinterpret_cast<SkPath*>(pathPtr); 27336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat const bool result = renderer->clipPath(path, static_cast<SkRegion::Op>(op)); 27436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat return result ? JNI_TRUE : JNI_FALSE; 275735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy} 276735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy 27736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhatstatic jboolean android_view_GLES20Canvas_clipRegion(JNIEnv* env, jobject clazz, 27836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr, jlong regionPtr, jint op) { 2793b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 2809f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik SkRegion* region = reinterpret_cast<SkRegion*>(regionPtr); 28136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat const bool result = renderer->clipRegion(region, static_cast<SkRegion::Op>(op)); 28236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat return result ? JNI_TRUE : JNI_FALSE; 283735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy} 284735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy 28536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhatstatic jboolean android_view_GLES20Canvas_getClipBounds(JNIEnv* env, jobject clazz, 28636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr, jobject rect) { 2873b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 2883f085429fd47ebd32ac2463b3eae2a5a6c17be25Chris Craik const android::uirenderer::Rect& bounds(renderer->getLocalClipBounds()); 2899d5316e3f56d138504565ff311145ac01621dff4Romain Guy 2907ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy env->CallVoidMethod(rect, gRectClassInfo.set, 2917ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy int(bounds.left), int(bounds.top), int(bounds.right), int(bounds.bottom)); 2929d5316e3f56d138504565ff311145ac01621dff4Romain Guy 29336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat return !bounds.isEmpty() ? JNI_TRUE : JNI_FALSE; 2949d5316e3f56d138504565ff311145ac01621dff4Romain Guy} 2959d5316e3f56d138504565ff311145ac01621dff4Romain Guy 296bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy// ---------------------------------------------------------------------------- 297f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy// Transforms 298bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy// ---------------------------------------------------------------------------- 299bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy 3007d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_translate(JNIEnv* env, jobject clazz, 30136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr, jfloat dx, jfloat dy) { 3023b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 3037ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy renderer->translate(dx, dy); 304f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy} 305bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy 3067d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_rotate(JNIEnv* env, jobject clazz, 30736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr, jfloat degrees) { 3083b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 3097ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy renderer->rotate(degrees); 310bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy} 311bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy 3127d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_scale(JNIEnv* env, jobject clazz, 31336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr, jfloat sx, jfloat sy) { 3143b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 3157ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy renderer->scale(sx, sy); 316f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy} 317bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy 3187d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_skew(JNIEnv* env, jobject clazz, 31936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr, jfloat sx, jfloat sy) { 3203b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 321807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy renderer->skew(sx, sy); 322807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy} 323807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy 3247d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_setMatrix(JNIEnv* env, jobject clazz, 32536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr, jlong matrixPtr) { 3263b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 3279f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixPtr); 328139088228faa7f3c446af7387e017933998a5570Derek Sollenberger renderer->setMatrix(matrix ? *matrix : SkMatrix::I()); 329f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy} 330f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy 3317d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_getMatrix(JNIEnv* env, jobject clazz, 33236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr, jlong matrixPtr) { 3333b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 3349f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixPtr); 3357ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy renderer->getMatrix(matrix); 336f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy} 337f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy 3387d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_concatMatrix(JNIEnv* env, jobject clazz, 33936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr, jlong matrixPtr) { 3403b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 3419f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixPtr); 342139088228faa7f3c446af7387e017933998a5570Derek Sollenberger renderer->concatMatrix(*matrix); 343bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy} 344bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy 345bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy// ---------------------------------------------------------------------------- 346bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy// Drawing 34785bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy// ---------------------------------------------------------------------------- 34885bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy 3497d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawBitmap(JNIEnv* env, jobject clazz, 35036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr, jlong bitmapPtr, jbyteArray buffer, 35136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jfloat left, jfloat top, jlong paintPtr) { 3529f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapPtr); 3530c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik // This object allows the renderer to allocate a global JNI ref to the buffer object. 3540c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik JavaHeapBitmapRef bitmapRef(env, bitmap, buffer); 3550c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik 3563b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 3576ba30b85ddfbe37c338ee8dde3dd33322eb38d47Behdad Esfahbod Paint* paint = reinterpret_cast<Paint*>(paintPtr); 358796475006f5d670e8383a2050f11719522437a43Chris Craik 359796475006f5d670e8383a2050f11719522437a43Chris Craik // apply transform directly to canvas, so it affects shaders correctly 360796475006f5d670e8383a2050f11719522437a43Chris Craik renderer->save(SkCanvas::kMatrix_SaveFlag); 361796475006f5d670e8383a2050f11719522437a43Chris Craik renderer->translate(left, top); 362796475006f5d670e8383a2050f11719522437a43Chris Craik renderer->drawBitmap(bitmap, paint); 363796475006f5d670e8383a2050f11719522437a43Chris Craik renderer->restore(); 364ce0537b80087a6225273040a987414b1dd081aa0Romain Guy} 365ce0537b80087a6225273040a987414b1dd081aa0Romain Guy 3667d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawBitmapRect(JNIEnv* env, jobject clazz, 36736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr, jlong bitmapPtr, jbyteArray buffer, 368ce0537b80087a6225273040a987414b1dd081aa0Romain Guy float srcLeft, float srcTop, float srcRight, float srcBottom, 36936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat float dstLeft, float dstTop, float dstRight, float dstBottom, jlong paintPtr) { 3709f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapPtr); 3710c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik // This object allows the renderer to allocate a global JNI ref to the buffer object. 3720c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik JavaHeapBitmapRef bitmapRef(env, bitmap, buffer); 3730c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik 3743b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 3756ba30b85ddfbe37c338ee8dde3dd33322eb38d47Behdad Esfahbod Paint* paint = reinterpret_cast<Paint*>(paintPtr); 376dbd77cd444f89d94ec5333223c1bc17dbe0c90cdRomain Guy renderer->drawBitmap(bitmap, srcLeft, srcTop, srcRight, srcBottom, 377dbd77cd444f89d94ec5333223c1bc17dbe0c90cdRomain Guy dstLeft, dstTop, dstRight, dstBottom, paint); 378f86ef57f8bcd8ba43ce222ec6a8b4f67d3600640Romain Guy} 3798ba548f81d1ab5f1750cbf86098c4a14e0b8beadRomain Guy 3807d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawBitmapMatrix(JNIEnv* env, jobject clazz, 38136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr, jlong bitmapPtr, jbyteArray buffer, 38236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong matrixPtr, jlong paintPtr) { 3839f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapPtr); 3840c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik // This object allows the renderer to allocate a global JNI ref to the buffer object. 3850c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik JavaHeapBitmapRef bitmapRef(env, bitmap, buffer); 3860c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik 3873b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 3889f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixPtr); 3896ba30b85ddfbe37c338ee8dde3dd33322eb38d47Behdad Esfahbod Paint* paint = reinterpret_cast<Paint*>(paintPtr); 390796475006f5d670e8383a2050f11719522437a43Chris Craik 391796475006f5d670e8383a2050f11719522437a43Chris Craik // apply transform directly to canvas, so it affects shaders correctly 392796475006f5d670e8383a2050f11719522437a43Chris Craik renderer->save(SkCanvas::kMatrix_SaveFlag); 393796475006f5d670e8383a2050f11719522437a43Chris Craik renderer->concatMatrix(*matrix); 394796475006f5d670e8383a2050f11719522437a43Chris Craik renderer->drawBitmap(bitmap, paint); 395796475006f5d670e8383a2050f11719522437a43Chris Craik renderer->restore(); 396ce0537b80087a6225273040a987414b1dd081aa0Romain Guy} 397ce0537b80087a6225273040a987414b1dd081aa0Romain Guy 398e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guystatic void android_view_GLES20Canvas_drawBitmapData(JNIEnv* env, jobject clazz, 39936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr, jintArray colors, jint offset, jint stride, 40036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jfloat left, jfloat top, jint width, jint height, jboolean hasAlpha, jlong paintPtr) { 40157ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III // Note: If hasAlpha is false, kRGB_565_SkColorType will be used, which will 40257ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III // correct the alphaType to kOpaque_SkAlphaType. 403b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed const SkImageInfo info = SkImageInfo::Make(width, height, 404b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed hasAlpha ? kN32_SkColorType : kRGB_565_SkColorType, 405b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed kPremul_SkAlphaType); 40649c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy SkBitmap* bitmap = new SkBitmap; 407b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed if (!bitmap->allocPixels(info)) { 40849c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy delete bitmap; 409e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy return; 410e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy } 411e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy 41257ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III if (!GraphicsJNI::SetPixels(env, colors, offset, stride, 0, 0, width, height, *bitmap)) { 41349c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy delete bitmap; 414e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy return; 415e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy } 416e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy 4173b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 4186ba30b85ddfbe37c338ee8dde3dd33322eb38d47Behdad Esfahbod Paint* paint = reinterpret_cast<Paint*>(paintPtr); 419796475006f5d670e8383a2050f11719522437a43Chris Craik 420796475006f5d670e8383a2050f11719522437a43Chris Craik // apply transform directly to canvas, so it affects shaders correctly 421796475006f5d670e8383a2050f11719522437a43Chris Craik renderer->save(SkCanvas::kMatrix_SaveFlag); 422796475006f5d670e8383a2050f11719522437a43Chris Craik renderer->translate(left, top); 423796475006f5d670e8383a2050f11719522437a43Chris Craik renderer->drawBitmapData(bitmap, paint); 424796475006f5d670e8383a2050f11719522437a43Chris Craik renderer->restore(); 42549c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy 426f23b25abfb76e75f63103abc882bc91b8327a957Chris Craik // Note - bitmap isn't deleted as DisplayListRenderer owns it now 427e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy} 428e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy 4297d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawBitmapMesh(JNIEnv* env, jobject clazz, 43036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr, jlong bitmapPtr, jbyteArray buffer, 4310c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik jint meshWidth, jint meshHeight, jfloatArray vertices, jint offset, jintArray colors, 43236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jint colorOffset, jlong paintPtr) { 4339f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapPtr); 4340c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik // This object allows the renderer to allocate a global JNI ref to the buffer object. 4350c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik JavaHeapBitmapRef bitmapRef(env, bitmap, buffer); 4360c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik 4375a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy jfloat* verticesArray = vertices ? env->GetFloatArrayElements(vertices, NULL) + offset : NULL; 4385a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy jint* colorsArray = colors ? env->GetIntArrayElements(colors, NULL) + colorOffset : NULL; 4395a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy 4403b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 4416ba30b85ddfbe37c338ee8dde3dd33322eb38d47Behdad Esfahbod Paint* paint = reinterpret_cast<Paint*>(paintPtr); 4425a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy renderer->drawBitmapMesh(bitmap, meshWidth, meshHeight, verticesArray, colorsArray, paint); 4435a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy 4445a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy if (vertices) env->ReleaseFloatArrayElements(vertices, verticesArray, 0); 4455a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy if (colors) env->ReleaseIntArrayElements(colors, colorsArray, 0); 4465a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy} 4475a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy 4487d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawPatch(JNIEnv* env, jobject clazz, 44936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr, jlong bitmapPtr, jbyteArray buffer, jlong patchPtr, 45036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat float left, float top, float right, float bottom, jlong paintPtr) { 4519f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapPtr); 4520c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik // This object allows the renderer to allocate a global JNI ref to the buffer object. 4530c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik JavaHeapBitmapRef bitmapRef(env, bitmap, buffer); 4540c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik 4553b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 4569f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik Res_png_9patch* patch = reinterpret_cast<Res_png_9patch*>(patchPtr); 4576ba30b85ddfbe37c338ee8dde3dd33322eb38d47Behdad Esfahbod Paint* paint = reinterpret_cast<Paint*>(paintPtr); 4583b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy renderer->drawPatch(bitmap, patch, left, top, right, bottom, paint); 459deba785f122a47915756ffd991f5540d952cf937Romain Guy} 460deba785f122a47915756ffd991f5540d952cf937Romain Guy 4617d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawColor(JNIEnv* env, jobject clazz, 4622ce932832e7caa1a6021539a9b7828ee5f49a610Chris Craik jlong rendererPtr, jint color, jint modeHandle) { 4633b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 4642ce932832e7caa1a6021539a9b7828ee5f49a610Chris Craik SkPorterDuff::Mode mode = static_cast<SkPorterDuff::Mode>(modeHandle); 4652ce932832e7caa1a6021539a9b7828ee5f49a610Chris Craik renderer->drawColor(color, SkPorterDuff::ToXfermodeMode(mode)); 46685bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy} 46785bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy 4687d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawRect(JNIEnv* env, jobject clazz, 46936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr, jfloat left, jfloat top, jfloat right, jfloat bottom, 47036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong paintPtr) { 4713b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 4726ba30b85ddfbe37c338ee8dde3dd33322eb38d47Behdad Esfahbod Paint* paint = reinterpret_cast<Paint*>(paintPtr); 473c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy renderer->drawRect(left, top, right, bottom, paint); 474c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy} 475c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy 4767d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawRoundRect(JNIEnv* env, jobject clazz, 47736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr, jfloat left, jfloat top, jfloat right, jfloat bottom, 47836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jfloat rx, jfloat ry, jlong paintPtr) { 4793b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 4806ba30b85ddfbe37c338ee8dde3dd33322eb38d47Behdad Esfahbod Paint* paint = reinterpret_cast<Paint*>(paintPtr); 48101d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy renderer->drawRoundRect(left, top, right, bottom, rx, ry, paint); 48201d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy} 48301d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy 484072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggistatic void android_view_GLES20Canvas_drawRoundRectProps(JNIEnv* env, jobject clazz, 485072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggi jlong rendererPtr, jlong leftPropPtr, jlong topPropPtr, jlong rightPropPtr, 486072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggi jlong bottomPropPtr, jlong rxPropPtr, jlong ryPropPtr, jlong paintPropPtr) { 487072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggi DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 488072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggi CanvasPropertyPrimitive* leftProp = reinterpret_cast<CanvasPropertyPrimitive*>(leftPropPtr); 489072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggi CanvasPropertyPrimitive* topProp = reinterpret_cast<CanvasPropertyPrimitive*>(topPropPtr); 490072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggi CanvasPropertyPrimitive* rightProp = reinterpret_cast<CanvasPropertyPrimitive*>(rightPropPtr); 491072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggi CanvasPropertyPrimitive* bottomProp = reinterpret_cast<CanvasPropertyPrimitive*>(bottomPropPtr); 492072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggi CanvasPropertyPrimitive* rxProp = reinterpret_cast<CanvasPropertyPrimitive*>(rxPropPtr); 493072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggi CanvasPropertyPrimitive* ryProp = reinterpret_cast<CanvasPropertyPrimitive*>(ryPropPtr); 494072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggi CanvasPropertyPaint* paintProp = reinterpret_cast<CanvasPropertyPaint*>(paintPropPtr); 495072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggi renderer->drawRoundRect(leftProp, topProp, rightProp, bottomProp, rxProp, ryProp, paintProp); 496072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggi} 497072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggi 4987d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawCircle(JNIEnv* env, jobject clazz, 49936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr, jfloat x, jfloat y, jfloat radius, jlong paintPtr) { 5003b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 5016ba30b85ddfbe37c338ee8dde3dd33322eb38d47Behdad Esfahbod Paint* paint = reinterpret_cast<Paint*>(paintPtr); 50201d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy renderer->drawCircle(x, y, radius, paint); 50301d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy} 50401d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy 50552244fff29042926e21fa897ef5ab11148e35299John Reckstatic void android_view_GLES20Canvas_drawCircleProps(JNIEnv* env, jobject clazz, 50652244fff29042926e21fa897ef5ab11148e35299John Reck jlong rendererPtr, jlong xPropPtr, jlong yPropPtr, jlong radiusPropPtr, jlong paintPropPtr) { 5073b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 50852244fff29042926e21fa897ef5ab11148e35299John Reck CanvasPropertyPrimitive* xProp = reinterpret_cast<CanvasPropertyPrimitive*>(xPropPtr); 50952244fff29042926e21fa897ef5ab11148e35299John Reck CanvasPropertyPrimitive* yProp = reinterpret_cast<CanvasPropertyPrimitive*>(yPropPtr); 51052244fff29042926e21fa897ef5ab11148e35299John Reck CanvasPropertyPrimitive* radiusProp = reinterpret_cast<CanvasPropertyPrimitive*>(radiusPropPtr); 51152244fff29042926e21fa897ef5ab11148e35299John Reck CanvasPropertyPaint* paintProp = reinterpret_cast<CanvasPropertyPaint*>(paintPropPtr); 51252244fff29042926e21fa897ef5ab11148e35299John Reck renderer->drawCircle(xProp, yProp, radiusProp, paintProp); 51352244fff29042926e21fa897ef5ab11148e35299John Reck} 51452244fff29042926e21fa897ef5ab11148e35299John Reck 5157d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawOval(JNIEnv* env, jobject clazz, 51636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr, jfloat left, jfloat top, jfloat right, jfloat bottom, 51736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong paintPtr) { 5183b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 5196ba30b85ddfbe37c338ee8dde3dd33322eb38d47Behdad Esfahbod Paint* paint = reinterpret_cast<Paint*>(paintPtr); 520c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy renderer->drawOval(left, top, right, bottom, paint); 521c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy} 522c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy 5237d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawArc(JNIEnv* env, jobject clazz, 52436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr, jfloat left, jfloat top, jfloat right, jfloat bottom, 52536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jfloat startAngle, jfloat sweepAngle, jboolean useCenter, jlong paintPtr) { 5263b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 5276ba30b85ddfbe37c338ee8dde3dd33322eb38d47Behdad Esfahbod Paint* paint = reinterpret_cast<Paint*>(paintPtr); 5288b2f5267f16c295f12faab810527cd6311997e34Romain Guy renderer->drawArc(left, top, right, bottom, startAngle, sweepAngle, useCenter, paint); 5298b2f5267f16c295f12faab810527cd6311997e34Romain Guy} 5308b2f5267f16c295f12faab810527cd6311997e34Romain Guy 531672433d90fab7383cd28beac9d4485b566a90940Romain Guystatic void android_view_GLES20Canvas_drawRegionAsRects(JNIEnv* env, jobject clazz, 53236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr, jlong regionPtr, jlong paintPtr) { 5333b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 5349f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik SkRegion* region = reinterpret_cast<SkRegion*>(regionPtr); 5356ba30b85ddfbe37c338ee8dde3dd33322eb38d47Behdad Esfahbod Paint* paint = reinterpret_cast<Paint*>(paintPtr); 5366ba30b85ddfbe37c338ee8dde3dd33322eb38d47Behdad Esfahbod if (paint->getStyle() != Paint::kFill_Style || 537672433d90fab7383cd28beac9d4485b566a90940Romain Guy (paint->isAntiAlias() && !renderer->isCurrentTransformSimple())) { 538672433d90fab7383cd28beac9d4485b566a90940Romain Guy SkRegion::Iterator it(*region); 539672433d90fab7383cd28beac9d4485b566a90940Romain Guy while (!it.done()) { 540672433d90fab7383cd28beac9d4485b566a90940Romain Guy const SkIRect& r = it.rect(); 541672433d90fab7383cd28beac9d4485b566a90940Romain Guy renderer->drawRect(r.fLeft, r.fTop, r.fRight, r.fBottom, paint); 542672433d90fab7383cd28beac9d4485b566a90940Romain Guy it.next(); 543672433d90fab7383cd28beac9d4485b566a90940Romain Guy } 544672433d90fab7383cd28beac9d4485b566a90940Romain Guy } else { 545672433d90fab7383cd28beac9d4485b566a90940Romain Guy int count = 0; 546672433d90fab7383cd28beac9d4485b566a90940Romain Guy Vector<float> rects; 547672433d90fab7383cd28beac9d4485b566a90940Romain Guy SkRegion::Iterator it(*region); 548672433d90fab7383cd28beac9d4485b566a90940Romain Guy while (!it.done()) { 549672433d90fab7383cd28beac9d4485b566a90940Romain Guy const SkIRect& r = it.rect(); 550672433d90fab7383cd28beac9d4485b566a90940Romain Guy rects.push(r.fLeft); 551672433d90fab7383cd28beac9d4485b566a90940Romain Guy rects.push(r.fTop); 552672433d90fab7383cd28beac9d4485b566a90940Romain Guy rects.push(r.fRight); 553672433d90fab7383cd28beac9d4485b566a90940Romain Guy rects.push(r.fBottom); 5542af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik count += 4; 555672433d90fab7383cd28beac9d4485b566a90940Romain Guy it.next(); 556672433d90fab7383cd28beac9d4485b566a90940Romain Guy } 557672433d90fab7383cd28beac9d4485b566a90940Romain Guy renderer->drawRects(rects.array(), count, paint); 558a48a1a87ba17f20f7006eaab21dcedf86c015c13Romain Guy } 559a48a1a87ba17f20f7006eaab21dcedf86c015c13Romain Guy} 560a48a1a87ba17f20f7006eaab21dcedf86c015c13Romain Guy 561ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guystatic void android_view_GLES20Canvas_drawPoints(JNIEnv* env, jobject clazz, 56236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr, jfloatArray points, jint offset, jint count, jlong paintPtr) { 5633b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 564ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy jfloat* storage = env->GetFloatArrayElements(points, NULL); 5656ba30b85ddfbe37c338ee8dde3dd33322eb38d47Behdad Esfahbod Paint* paint = reinterpret_cast<Paint*>(paintPtr); 566ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy renderer->drawPoints(storage + offset, count, paint); 567ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy env->ReleaseFloatArrayElements(points, storage, 0); 568ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy} 569ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy 5707d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawPath(JNIEnv* env, jobject clazz, 57136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr, jlong pathPtr, jlong paintPtr) { 5723b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 5739f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik SkPath* path = reinterpret_cast<SkPath*>(pathPtr); 5746ba30b85ddfbe37c338ee8dde3dd33322eb38d47Behdad Esfahbod Paint* paint = reinterpret_cast<Paint*>(paintPtr); 5757fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy renderer->drawPath(path, paint); 5767fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy} 5777fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy 5787d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawLines(JNIEnv* env, jobject clazz, 57936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr, jfloatArray points, jint offset, jint count, jlong paintPtr) { 5803b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 581759ea80dca64ad652110a129e0d8bf93fea79f61Romain Guy jfloat* storage = env->GetFloatArrayElements(points, NULL); 5826ba30b85ddfbe37c338ee8dde3dd33322eb38d47Behdad Esfahbod Paint* paint = reinterpret_cast<Paint*>(paintPtr); 583759ea80dca64ad652110a129e0d8bf93fea79f61Romain Guy renderer->drawLines(storage + offset, count, paint); 584759ea80dca64ad652110a129e0d8bf93fea79f61Romain Guy env->ReleaseFloatArrayElements(points, storage, 0); 585759ea80dca64ad652110a129e0d8bf93fea79f61Romain Guy} 586759ea80dca64ad652110a129e0d8bf93fea79f61Romain Guy 58785bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy// ---------------------------------------------------------------------------- 5885ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy// Draw filters 5895ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy// ---------------------------------------------------------------------------- 5905ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy 5915ff9df658230d49e42c43586997a02d8e4dd417eRomain Guystatic void android_view_GLES20Canvas_setupPaintFilter(JNIEnv* env, jobject clazz, 59236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr, jint clearBits, jint setBits) { 5933b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 5945ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy renderer->setupPaintFilter(clearBits, setBits); 5955ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy} 5965ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy 5975ff9df658230d49e42c43586997a02d8e4dd417eRomain Guystatic void android_view_GLES20Canvas_resetPaintFilter(JNIEnv* env, jobject clazz, 59836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr) { 5993b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 6005ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy renderer->resetPaintFilter(); 6015ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy} 6025ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy 6035ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy// ---------------------------------------------------------------------------- 604a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy// Text 605a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy// ---------------------------------------------------------------------------- 606a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy 607f2114d5646194100242206b267ddd6e7194b7da9Raph Levienclass RenderTextFunctor { 608f2114d5646194100242206b267ddd6e7194b7da9Raph Levienpublic: 6093b20251a355c88193c439f928a84ae69483fb488John Reck RenderTextFunctor(const Layout& layout, DisplayListRenderer* renderer, jfloat x, jfloat y, 6106ba30b85ddfbe37c338ee8dde3dd33322eb38d47Behdad Esfahbod Paint* paint, uint16_t* glyphs, float* pos, float totalAdvance, 611f2114d5646194100242206b267ddd6e7194b7da9Raph Levien uirenderer::Rect& bounds) 612f2114d5646194100242206b267ddd6e7194b7da9Raph Levien : layout(layout), renderer(renderer), x(x), y(y), paint(paint), glyphs(glyphs), 613f2114d5646194100242206b267ddd6e7194b7da9Raph Levien pos(pos), totalAdvance(totalAdvance), bounds(bounds) { } 6141fc0fa87d42ce9268ece76b85b9edc834593e53aRaph Levien void operator()(size_t start, size_t end) { 615f2114d5646194100242206b267ddd6e7194b7da9Raph Levien for (size_t i = start; i < end; i++) { 616f2114d5646194100242206b267ddd6e7194b7da9Raph Levien glyphs[i] = layout.getGlyphId(i); 617f2114d5646194100242206b267ddd6e7194b7da9Raph Levien pos[2 * i] = layout.getX(i); 618f2114d5646194100242206b267ddd6e7194b7da9Raph Levien pos[2 * i + 1] = layout.getY(i); 619f2114d5646194100242206b267ddd6e7194b7da9Raph Levien } 620f2114d5646194100242206b267ddd6e7194b7da9Raph Levien size_t glyphsCount = end - start; 621f2114d5646194100242206b267ddd6e7194b7da9Raph Levien int bytesCount = glyphsCount * sizeof(jchar); 622f2114d5646194100242206b267ddd6e7194b7da9Raph Levien renderer->drawText((const char*) (glyphs + start), bytesCount, glyphsCount, 623f2114d5646194100242206b267ddd6e7194b7da9Raph Levien x, y, pos + 2 * start, paint, totalAdvance, bounds); 624f2114d5646194100242206b267ddd6e7194b7da9Raph Levien } 625f2114d5646194100242206b267ddd6e7194b7da9Raph Levienprivate: 626f2114d5646194100242206b267ddd6e7194b7da9Raph Levien const Layout& layout; 6273b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer; 628f2114d5646194100242206b267ddd6e7194b7da9Raph Levien jfloat x; 629f2114d5646194100242206b267ddd6e7194b7da9Raph Levien jfloat y; 6306ba30b85ddfbe37c338ee8dde3dd33322eb38d47Behdad Esfahbod Paint* paint; 631f2114d5646194100242206b267ddd6e7194b7da9Raph Levien uint16_t* glyphs; 632f2114d5646194100242206b267ddd6e7194b7da9Raph Levien float* pos; 633f2114d5646194100242206b267ddd6e7194b7da9Raph Levien float totalAdvance; 634f2114d5646194100242206b267ddd6e7194b7da9Raph Levien uirenderer::Rect& bounds; 635f2114d5646194100242206b267ddd6e7194b7da9Raph Levien}; 636f2114d5646194100242206b267ddd6e7194b7da9Raph Levien 6373b20251a355c88193c439f928a84ae69483fb488John Reckstatic void renderTextLayout(DisplayListRenderer* renderer, Layout* layout, 6386ba30b85ddfbe37c338ee8dde3dd33322eb38d47Behdad Esfahbod jfloat x, jfloat y, Paint* paint) { 6391a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien size_t nGlyphs = layout->nGlyphs(); 6401a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien float* pos = new float[nGlyphs * 2]; 6411a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien uint16_t* glyphs = new uint16_t[nGlyphs]; 6421a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien MinikinRect b; 6431a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien layout->getBounds(&b); 6441a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien android::uirenderer::Rect bounds(b.mLeft, b.mTop, b.mRight, b.mBottom); 6451a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien bounds.translate(x, y); 6461a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien float totalAdvance = layout->getAdvance(); 6471a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien 648f2114d5646194100242206b267ddd6e7194b7da9Raph Levien RenderTextFunctor f(*layout, renderer, x, y, paint, glyphs, pos, totalAdvance, bounds); 6491fc0fa87d42ce9268ece76b85b9edc834593e53aRaph Levien MinikinUtils::forFontRun(*layout, paint, f); 6501a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien delete[] glyphs; 6511a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien delete[] pos; 6521a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien} 6531a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien 6543b20251a355c88193c439f928a84ae69483fb488John Reckstatic void renderText(DisplayListRenderer* renderer, const jchar* text, int count, 6556ba30b85ddfbe37c338ee8dde3dd33322eb38d47Behdad Esfahbod jfloat x, jfloat y, int bidiFlags, Paint* paint, TypefaceImpl* typeface) { 6561a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien Layout layout; 65763c5c78a72a21d57913e8601cc2a1ab72a424a02Behdad Esfahbod MinikinUtils::doLayout(&layout, paint, bidiFlags, typeface, text, 0, count, count); 6583660789f06c5fbcb81e6c7c79612048bff8f0f66Raph Levien x += MinikinUtils::xOffsetForTextAlign(paint, layout); 6591a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien renderTextLayout(renderer, &layout, x, y, paint); 660e8e62a4a032a80409114a37908b5f18ab0080848Romain Guy} 661e8e62a4a032a80409114a37908b5f18ab0080848Romain Guy 6629d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levienclass RenderTextOnPathFunctor { 6639d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levienpublic: 6643b20251a355c88193c439f928a84ae69483fb488John Reck RenderTextOnPathFunctor(const Layout& layout, DisplayListRenderer* renderer, float hOffset, 6656ba30b85ddfbe37c338ee8dde3dd33322eb38d47Behdad Esfahbod float vOffset, Paint* paint, SkPath* path) 6669d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien : layout(layout), renderer(renderer), hOffset(hOffset), vOffset(vOffset), 6679d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien paint(paint), path(path) { 6689d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien } 6699d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien void operator()(size_t start, size_t end) { 6709d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien uint16_t glyphs[1]; 6719d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien for (size_t i = start; i < end; i++) { 6729d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien glyphs[0] = layout.getGlyphId(i); 6739d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien float x = hOffset + layout.getX(i); 6749d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien float y = vOffset + layout.getY(i); 6759d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien renderer->drawTextOnPath((const char*) glyphs, sizeof(glyphs), 1, path, x, y, paint); 6769d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien } 6779d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien } 6789d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levienprivate: 6799d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien const Layout& layout; 6803b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer; 6819d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien float hOffset; 6829d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien float vOffset; 6836ba30b85ddfbe37c338ee8dde3dd33322eb38d47Behdad Esfahbod Paint* paint; 6849d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien SkPath* path; 6859d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien}; 6869d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien 6873b20251a355c88193c439f928a84ae69483fb488John Reckstatic void renderTextOnPath(DisplayListRenderer* renderer, const jchar* text, int count, 6886ba30b85ddfbe37c338ee8dde3dd33322eb38d47Behdad Esfahbod SkPath* path, jfloat hOffset, jfloat vOffset, int bidiFlags, Paint* paint, 6899d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien TypefaceImpl* typeface) { 6909d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien Layout layout; 69163c5c78a72a21d57913e8601cc2a1ab72a424a02Behdad Esfahbod MinikinUtils::doLayout(&layout, paint, bidiFlags, typeface, text, 0, count, count); 6929d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien hOffset += MinikinUtils::hOffsetForTextAlign(paint, layout, *path); 6936ba30b85ddfbe37c338ee8dde3dd33322eb38d47Behdad Esfahbod Paint::Align align = paint->getTextAlign(); 6946ba30b85ddfbe37c338ee8dde3dd33322eb38d47Behdad Esfahbod paint->setTextAlign(Paint::kLeft_Align); 6959d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien 6969d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien RenderTextOnPathFunctor f(layout, renderer, hOffset, vOffset, paint, path); 6979d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien MinikinUtils::forFontRun(layout, paint, f); 6989d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien paint->setTextAlign(align); 699325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy} 700325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy 7013b20251a355c88193c439f928a84ae69483fb488John Reckstatic void renderTextRun(DisplayListRenderer* renderer, const jchar* text, 70261c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy jint start, jint count, jint contextCount, jfloat x, jfloat y, 7036ba30b85ddfbe37c338ee8dde3dd33322eb38d47Behdad Esfahbod int bidiFlags, Paint* paint, TypefaceImpl* typeface) { 7041a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien Layout layout; 70563c5c78a72a21d57913e8601cc2a1ab72a424a02Behdad Esfahbod MinikinUtils::doLayout(&layout, paint, bidiFlags, typeface, text, start, count, contextCount); 7063660789f06c5fbcb81e6c7c79612048bff8f0f66Raph Levien x += MinikinUtils::xOffsetForTextAlign(paint, layout); 7071a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien renderTextLayout(renderer, &layout, x, y, paint); 70861c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy} 70961c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy 7107d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawTextArray(JNIEnv* env, jobject clazz, 71136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr, jcharArray text, jint index, jint count, 712051910b9f998030dacb8a0722588cc715813fde1Raph Levien jfloat x, jfloat y, jint bidiFlags, jlong paintPtr, jlong typefacePtr) { 7133b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 714a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy jchar* textArray = env->GetCharArrayElements(text, NULL); 7156ba30b85ddfbe37c338ee8dde3dd33322eb38d47Behdad Esfahbod Paint* paint = reinterpret_cast<Paint*>(paintPtr); 7161a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien TypefaceImpl* typeface = reinterpret_cast<TypefaceImpl*>(typefacePtr); 7179f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik 718051910b9f998030dacb8a0722588cc715813fde1Raph Levien renderText(renderer, textArray + index, count, x, y, bidiFlags, paint, typeface); 719a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy env->ReleaseCharArrayElements(text, textArray, JNI_ABORT); 720a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy} 721a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy 7227d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawText(JNIEnv* env, jobject clazz, 72336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr, jstring text, jint start, jint end, 724051910b9f998030dacb8a0722588cc715813fde1Raph Levien jfloat x, jfloat y, jint bidiFlags, jlong paintPtr, jlong typefacePtr) { 7253b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 726a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy const jchar* textArray = env->GetStringChars(text, NULL); 7276ba30b85ddfbe37c338ee8dde3dd33322eb38d47Behdad Esfahbod Paint* paint = reinterpret_cast<Paint*>(paintPtr); 7281a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien TypefaceImpl* typeface = reinterpret_cast<TypefaceImpl*>(typefacePtr); 7299f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik 730051910b9f998030dacb8a0722588cc715813fde1Raph Levien renderText(renderer, textArray + start, end - start, x, y, bidiFlags, paint, typeface); 731a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy env->ReleaseStringChars(text, textArray); 732a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy} 733a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy 734325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guystatic void android_view_GLES20Canvas_drawTextArrayOnPath(JNIEnv* env, jobject clazz, 73536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr, jcharArray text, jint index, jint count, 7369d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien jlong pathPtr, jfloat hOffset, jfloat vOffset, jint bidiFlags, jlong paintPtr, 7379d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien jlong typefacePtr) { 7383b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 739325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy jchar* textArray = env->GetCharArrayElements(text, NULL); 7409f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik SkPath* path = reinterpret_cast<SkPath*>(pathPtr); 7416ba30b85ddfbe37c338ee8dde3dd33322eb38d47Behdad Esfahbod Paint* paint = reinterpret_cast<Paint*>(paintPtr); 7429d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien TypefaceImpl* typeface = reinterpret_cast<TypefaceImpl*>(typefacePtr); 7439f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik 744325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy renderTextOnPath(renderer, textArray + index, count, path, 7459d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien hOffset, vOffset, bidiFlags, paint, typeface); 746325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy env->ReleaseCharArrayElements(text, textArray, JNI_ABORT); 747325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy} 748325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy 749325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guystatic void android_view_GLES20Canvas_drawTextOnPath(JNIEnv* env, jobject clazz, 75036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr, jstring text, jint start, jint end, 7519d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien jlong pathPtr, jfloat hOffset, jfloat vOffset, jint bidiFlags, jlong paintPtr, 7529d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien jlong typefacePtr) { 7533b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 754325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy const jchar* textArray = env->GetStringChars(text, NULL); 7559f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik SkPath* path = reinterpret_cast<SkPath*>(pathPtr); 7566ba30b85ddfbe37c338ee8dde3dd33322eb38d47Behdad Esfahbod Paint* paint = reinterpret_cast<Paint*>(paintPtr); 7579d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien TypefaceImpl* typeface = reinterpret_cast<TypefaceImpl*>(typefacePtr); 7589f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik 759325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy renderTextOnPath(renderer, textArray + start, end - start, path, 7609d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien hOffset, vOffset, bidiFlags, paint, typeface); 761325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy env->ReleaseStringChars(text, textArray); 762325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy} 763325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy 7647d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawTextRunArray(JNIEnv* env, jobject clazz, 76536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr, jcharArray text, jint index, jint count, 766051910b9f998030dacb8a0722588cc715813fde1Raph Levien jint contextIndex, jint contextCount, jfloat x, jfloat y, jboolean isRtl, 7671a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien jlong paintPtr, jlong typefacePtr) { 7683b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 76961c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy jchar* textArray = env->GetCharArrayElements(text, NULL); 7706ba30b85ddfbe37c338ee8dde3dd33322eb38d47Behdad Esfahbod Paint* paint = reinterpret_cast<Paint*>(paintPtr); 7711a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien TypefaceImpl* typeface = reinterpret_cast<TypefaceImpl*>(typefacePtr); 7729f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik 773051910b9f998030dacb8a0722588cc715813fde1Raph Levien int bidiFlags = isRtl ? kBidi_Force_RTL : kBidi_Force_LTR; 77461c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy renderTextRun(renderer, textArray + contextIndex, index - contextIndex, 775051910b9f998030dacb8a0722588cc715813fde1Raph Levien count, contextCount, x, y, bidiFlags, paint, typeface); 77661c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy env->ReleaseCharArrayElements(text, textArray, JNI_ABORT); 77761c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy } 77861c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy 7797d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawTextRun(JNIEnv* env, jobject clazz, 78036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr, jstring text, jint start, jint end, 781051910b9f998030dacb8a0722588cc715813fde1Raph Levien jint contextStart, int contextEnd, jfloat x, jfloat y, jboolean isRtl, 7821a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien jlong paintPtr, jlong typefacePtr) { 7833b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 78461c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy const jchar* textArray = env->GetStringChars(text, NULL); 78561c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy jint count = end - start; 78661c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy jint contextCount = contextEnd - contextStart; 7876ba30b85ddfbe37c338ee8dde3dd33322eb38d47Behdad Esfahbod Paint* paint = reinterpret_cast<Paint*>(paintPtr); 7881a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien TypefaceImpl* typeface = reinterpret_cast<TypefaceImpl*>(typefacePtr); 7899f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik 790051910b9f998030dacb8a0722588cc715813fde1Raph Levien int bidiFlags = isRtl ? kBidi_Force_RTL : kBidi_Force_LTR; 79161c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy renderTextRun(renderer, textArray + contextStart, start - contextStart, 792051910b9f998030dacb8a0722588cc715813fde1Raph Levien count, contextCount, x, y, bidiFlags, paint, typeface); 79361c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy env->ReleaseStringChars(text, textArray); 79461c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy} 79561c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy 796b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy// ---------------------------------------------------------------------------- 797b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy// Display lists 798b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy// ---------------------------------------------------------------------------- 799b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 80044fd8d24f761f82d21e9b00932648a1b6bf91449John Reckstatic jlong android_view_GLES20Canvas_finishRecording(JNIEnv* env, 80144fd8d24f761f82d21e9b00932648a1b6bf91449John Reck jobject clazz, jlong rendererPtr) { 8029f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 80344fd8d24f761f82d21e9b00932648a1b6bf91449John Reck return reinterpret_cast<jlong>(renderer->finishRecording()); 804162a0217563f4665da6eb183dfce0fef740f641fJeff Brown} 805162a0217563f4665da6eb183dfce0fef740f641fJeff Brown 8063f085429fd47ebd32ac2463b3eae2a5a6c17be25Chris Craikstatic jlong android_view_GLES20Canvas_createDisplayListRenderer(JNIEnv* env, jobject clazz) { 80744fd8d24f761f82d21e9b00932648a1b6bf91449John Reck return reinterpret_cast<jlong>(new DisplayListRenderer); 8085977baa1fa24125c148a72699b53e62abaf08960Chet Haase} 8095977baa1fa24125c148a72699b53e62abaf08960Chet Haase 810a7090e0cfd7c719a6d4c03aae34f5db98754cbddChris Craikstatic jint android_view_GLES20Canvas_drawRenderNode(JNIEnv* env, 811a7090e0cfd7c719a6d4c03aae34f5db98754cbddChris Craik jobject clazz, jlong rendererPtr, jlong renderNodePtr, 8121271e2cc80b01d577e9db339459ef0222bb9320dChet Haase jobject dirty, jint flags) { 8133b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 814a7090e0cfd7c719a6d4c03aae34f5db98754cbddChris Craik RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 815cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy android::uirenderer::Rect bounds; 816a7090e0cfd7c719a6d4c03aae34f5db98754cbddChris Craik status_t status = renderer->drawRenderNode(renderNode, bounds, flags); 8176554943a1dd6854c0f4976900956e556767b49e1Romain Guy if (status != DrawGlInfo::kStatusDone && dirty != NULL) { 818cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy env->CallVoidMethod(dirty, gRectClassInfo.set, 819cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy int(bounds.left), int(bounds.top), int(bounds.right), int(bounds.bottom)); 820cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy } 8216554943a1dd6854c0f4976900956e556767b49e1Romain Guy return status; 822b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy} 823b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 8246c319ca1275c8db892c39b48fc54864c949f9171Romain Guy// ---------------------------------------------------------------------------- 8256c319ca1275c8db892c39b48fc54864c949f9171Romain Guy// Layers 8266c319ca1275c8db892c39b48fc54864c949f9171Romain Guy// ---------------------------------------------------------------------------- 8276c319ca1275c8db892c39b48fc54864c949f9171Romain Guy 8287d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawLayer(JNIEnv* env, jobject clazz, 82936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr, jlong layerPtr, jfloat x, jfloat y) { 8303b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 8319f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik Layer* layer = reinterpret_cast<Layer*>(layerPtr); 832a08f95cfeca7217f9c533b03663bf0dceedd259aChris Craik renderer->drawLayer(layer, x, y); 8336c319ca1275c8db892c39b48fc54864c949f9171Romain Guy} 8346c319ca1275c8db892c39b48fc54864c949f9171Romain Guy 835163935113919a184122b8b3bd672ef08c8df65dcRomain Guy#endif // USE_OPENGL_RENDERER 836163935113919a184122b8b3bd672ef08c8df65dcRomain Guy 837163935113919a184122b8b3bd672ef08c8df65dcRomain Guy// ---------------------------------------------------------------------------- 838163935113919a184122b8b3bd672ef08c8df65dcRomain Guy// Common 839163935113919a184122b8b3bd672ef08c8df65dcRomain Guy// ---------------------------------------------------------------------------- 840163935113919a184122b8b3bd672ef08c8df65dcRomain Guy 841163935113919a184122b8b3bd672ef08c8df65dcRomain Guystatic jboolean android_view_GLES20Canvas_isAvailable(JNIEnv* env, jobject clazz) { 842163935113919a184122b8b3bd672ef08c8df65dcRomain Guy#ifdef USE_OPENGL_RENDERER 8434406345cd62d3687ce590c357854472f7f906e6cJesse Hall char prop[PROPERTY_VALUE_MAX]; 8444406345cd62d3687ce590c357854472f7f906e6cJesse Hall if (property_get("ro.kernel.qemu", prop, NULL) == 0) { 8454406345cd62d3687ce590c357854472f7f906e6cJesse Hall // not in the emulator 8464406345cd62d3687ce590c357854472f7f906e6cJesse Hall return JNI_TRUE; 8474406345cd62d3687ce590c357854472f7f906e6cJesse Hall } 8484406345cd62d3687ce590c357854472f7f906e6cJesse Hall // In the emulator this property will be set to 1 when hardware GLES is 8494406345cd62d3687ce590c357854472f7f906e6cJesse Hall // enabled, 0 otherwise. On old emulator versions it will be undefined. 8504406345cd62d3687ce590c357854472f7f906e6cJesse Hall property_get("ro.kernel.qemu.gles", prop, "0"); 8514406345cd62d3687ce590c357854472f7f906e6cJesse Hall return atoi(prop) == 1 ? JNI_TRUE : JNI_FALSE; 852163935113919a184122b8b3bd672ef08c8df65dcRomain Guy#else 853163935113919a184122b8b3bd672ef08c8df65dcRomain Guy return JNI_FALSE; 854163935113919a184122b8b3bd672ef08c8df65dcRomain Guy#endif 855163935113919a184122b8b3bd672ef08c8df65dcRomain Guy} 856163935113919a184122b8b3bd672ef08c8df65dcRomain Guy 857a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy// ---------------------------------------------------------------------------- 8589c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase// Logging 8599c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase// ---------------------------------------------------------------------------- 8609c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase 8619c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haasestatic void 86265b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guyandroid_app_ActivityThread_dumpGraphics(JNIEnv* env, jobject clazz, jobject javaFileDescriptor) { 863905787a7c91d23daa4efc3d16bd8cbf1a683e779Chet Haase#ifdef USE_OPENGL_RENDERER 864a3804cf77f0edd93f6247a055cdafb856b117eecElliott Hughes int fd = jniGetFDFromFileDescriptor(env, javaFileDescriptor); 8650e89e2b7bcb2c035e8cee77f93120e7c5617f8d2John Reck android::uirenderer::renderthread::RenderProxy::outputLogBuffer(fd); 866905787a7c91d23daa4efc3d16bd8cbf1a683e779Chet Haase#endif // USE_OPENGL_RENDERER 8679c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase} 8689c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase 8699c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase// ---------------------------------------------------------------------------- 870e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// JNI Glue 871e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// ---------------------------------------------------------------------------- 872e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy 873e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guyconst char* const kClassPathName = "android/view/GLES20Canvas"; 874e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy 875e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guystatic JNINativeMethod gMethods[] = { 87661c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy { "nIsAvailable", "()Z", (void*) android_view_GLES20Canvas_isAvailable }, 877163935113919a184122b8b3bd672ef08c8df65dcRomain Guy 87861c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy#ifdef USE_OPENGL_RENDERER 8797d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy 88036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nDestroyRenderer", "(J)V", (void*) android_view_GLES20Canvas_destroyRenderer }, 88136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nSetViewport", "(JII)V", (void*) android_view_GLES20Canvas_setViewport }, 882cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik { "nSetHighContrastText","(JZ)V", (void*) android_view_GLES20Canvas_setHighContrastText }, 8838afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik { "nInsertReorderBarrier","(JZ)V", (void*) android_view_GLES20Canvas_insertReorderBarrier }, 88436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nPrepare", "(JZ)I", (void*) android_view_GLES20Canvas_prepare }, 88536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nPrepareDirty", "(JIIIIZ)I", (void*) android_view_GLES20Canvas_prepareDirty }, 88636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nFinish", "(J)V", (void*) android_view_GLES20Canvas_finish }, 887ba9b613437c34873fa95800a25fc51720638267cChris Craik { "nSetProperty", "(Ljava/lang/String;Ljava/lang/String;)V", 888ba9b613437c34873fa95800a25fc51720638267cChris Craik (void*) android_view_GLES20Canvas_setProperty }, 88961c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy 89036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nCallDrawGLFunction", "(JJ)I", (void*) android_view_GLES20Canvas_callDrawGLFunction }, 8917d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy 89236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nSave", "(JI)I", (void*) android_view_GLES20Canvas_save }, 89336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nRestore", "(J)V", (void*) android_view_GLES20Canvas_restore }, 89436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nRestoreToCount", "(JI)V", (void*) android_view_GLES20Canvas_restoreToCount }, 89536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nGetSaveCount", "(J)I", (void*) android_view_GLES20Canvas_getSaveCount }, 89636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat 89736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nSaveLayer", "(JFFFFJI)I", (void*) android_view_GLES20Canvas_saveLayer }, 89836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nSaveLayer", "(JJI)I", (void*) android_view_GLES20Canvas_saveLayerClip }, 89936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nSaveLayerAlpha", "(JFFFFII)I", (void*) android_view_GLES20Canvas_saveLayerAlpha }, 90036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nSaveLayerAlpha", "(JII)I", (void*) android_view_GLES20Canvas_saveLayerAlphaClip }, 90136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat 90236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nQuickReject", "(JFFFF)Z", (void*) android_view_GLES20Canvas_quickReject }, 90336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nClipRect", "(JFFFFI)Z", (void*) android_view_GLES20Canvas_clipRectF }, 90436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nClipRect", "(JIIIII)Z", (void*) android_view_GLES20Canvas_clipRect }, 90536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nClipPath", "(JJI)Z", (void*) android_view_GLES20Canvas_clipPath }, 90636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nClipRegion", "(JJI)Z", (void*) android_view_GLES20Canvas_clipRegion }, 90736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat 90836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nTranslate", "(JFF)V", (void*) android_view_GLES20Canvas_translate }, 90936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nRotate", "(JF)V", (void*) android_view_GLES20Canvas_rotate }, 91036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nScale", "(JFF)V", (void*) android_view_GLES20Canvas_scale }, 91136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nSkew", "(JFF)V", (void*) android_view_GLES20Canvas_skew }, 91236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat 91336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nSetMatrix", "(JJ)V", (void*) android_view_GLES20Canvas_setMatrix }, 91436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nGetMatrix", "(JJ)V", (void*) android_view_GLES20Canvas_getMatrix }, 91536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nConcatMatrix", "(JJ)V", (void*) android_view_GLES20Canvas_concatMatrix }, 91636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat 91736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nDrawBitmap", "(JJ[BFFJ)V", (void*) android_view_GLES20Canvas_drawBitmap }, 91836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nDrawBitmap", "(JJ[BFFFFFFFFJ)V",(void*) android_view_GLES20Canvas_drawBitmapRect }, 91936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nDrawBitmap", "(JJ[BJJ)V", (void*) android_view_GLES20Canvas_drawBitmapMatrix }, 92036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nDrawBitmap", "(J[IIIFFIIZJ)V", (void*) android_view_GLES20Canvas_drawBitmapData }, 92136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat 92236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nDrawBitmapMesh", "(JJ[BII[FI[IIJ)V",(void*) android_view_GLES20Canvas_drawBitmapMesh }, 92336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat 92436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nDrawPatch", "(JJ[BJFFFFJ)V", (void*) android_view_GLES20Canvas_drawPatch }, 92536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat 92636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nDrawColor", "(JII)V", (void*) android_view_GLES20Canvas_drawColor }, 92736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nDrawRect", "(JFFFFJ)V", (void*) android_view_GLES20Canvas_drawRect }, 92836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nDrawRects", "(JJJ)V", (void*) android_view_GLES20Canvas_drawRegionAsRects }, 92936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nDrawRoundRect", "(JFFFFFFJ)V", (void*) android_view_GLES20Canvas_drawRoundRect }, 930072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggi { "nDrawRoundRect", "(JJJJJJJJ)V", (void*) android_view_GLES20Canvas_drawRoundRectProps }, 93136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nDrawCircle", "(JFFFJ)V", (void*) android_view_GLES20Canvas_drawCircle }, 93252244fff29042926e21fa897ef5ab11148e35299John Reck { "nDrawCircle", "(JJJJJ)V", (void*) android_view_GLES20Canvas_drawCircleProps }, 93336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nDrawOval", "(JFFFFJ)V", (void*) android_view_GLES20Canvas_drawOval }, 93436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nDrawArc", "(JFFFFFFZJ)V", (void*) android_view_GLES20Canvas_drawArc }, 93536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nDrawPoints", "(J[FIIJ)V", (void*) android_view_GLES20Canvas_drawPoints }, 93636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat 93736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nDrawPath", "(JJJ)V", (void*) android_view_GLES20Canvas_drawPath }, 93836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nDrawLines", "(J[FIIJ)V", (void*) android_view_GLES20Canvas_drawLines }, 93936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat 94036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nSetupPaintFilter", "(JII)V", (void*) android_view_GLES20Canvas_setupPaintFilter }, 94136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nResetPaintFilter", "(J)V", (void*) android_view_GLES20Canvas_resetPaintFilter }, 94236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat 9431a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien { "nDrawText", "(J[CIIFFIJJ)V", (void*) android_view_GLES20Canvas_drawTextArray }, 9441a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien { "nDrawText", "(JLjava/lang/String;IIFFIJJ)V", 945a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy (void*) android_view_GLES20Canvas_drawText }, 946a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy 9479d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien { "nDrawTextOnPath", "(J[CIIJFFIJJ)V", (void*) android_view_GLES20Canvas_drawTextArrayOnPath }, 9489d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien { "nDrawTextOnPath", "(JLjava/lang/String;IIJFFIJJ)V", 949325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy (void*) android_view_GLES20Canvas_drawTextOnPath }, 950325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy 951051910b9f998030dacb8a0722588cc715813fde1Raph Levien { "nDrawTextRun", "(J[CIIIIFFZJJ)V", (void*) android_view_GLES20Canvas_drawTextRunArray }, 952051910b9f998030dacb8a0722588cc715813fde1Raph Levien { "nDrawTextRun", "(JLjava/lang/String;IIIIFFZJJ)V", 95361c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy (void*) android_view_GLES20Canvas_drawTextRun }, 95461c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy 955a7090e0cfd7c719a6d4c03aae34f5db98754cbddChris Craik { "nGetClipBounds", "(JLandroid/graphics/Rect;)Z", (void*) android_view_GLES20Canvas_getClipBounds }, 956b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 957a7090e0cfd7c719a6d4c03aae34f5db98754cbddChris Craik { "nFinishRecording", "(J)J", (void*) android_view_GLES20Canvas_finishRecording }, 958a7090e0cfd7c719a6d4c03aae34f5db98754cbddChris Craik { "nDrawRenderNode", "(JJLandroid/graphics/Rect;I)I", (void*) android_view_GLES20Canvas_drawRenderNode }, 95913631f3da855f200a151e7837ed9f6b079622b58Romain Guy 96036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nCreateDisplayListRenderer", "()J", (void*) android_view_GLES20Canvas_createDisplayListRenderer }, 96113631f3da855f200a151e7837ed9f6b079622b58Romain Guy 96236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nDrawLayer", "(JJFF)V", (void*) android_view_GLES20Canvas_drawLayer }, 96336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat 964f61970fc79e9c5cf340fa942597628242361864aRomain Guy { "nGetMaximumTextureWidth", "()I", (void*) android_view_GLES20Canvas_getMaxTextureWidth }, 965f61970fc79e9c5cf340fa942597628242361864aRomain Guy { "nGetMaximumTextureHeight", "()I", (void*) android_view_GLES20Canvas_getMaxTextureHeight }, 966f61970fc79e9c5cf340fa942597628242361864aRomain Guy 967163935113919a184122b8b3bd672ef08c8df65dcRomain Guy#endif 968e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy}; 969e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy 9709c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haasestatic JNINativeMethod gActivityThreadMethods[] = { 9719c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase { "dumpGraphicsInfo", "(Ljava/io/FileDescriptor;)V", 9729c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase (void*) android_app_ActivityThread_dumpGraphics } 9739c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase}; 9749c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase 9759c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase 976163935113919a184122b8b3bd672ef08c8df65dcRomain Guy#ifdef USE_OPENGL_RENDERER 977163935113919a184122b8b3bd672ef08c8df65dcRomain Guy #define FIND_CLASS(var, className) \ 978163935113919a184122b8b3bd672ef08c8df65dcRomain Guy var = env->FindClass(className); \ 97917cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro LOG_FATAL_IF(! var, "Unable to find class " className); 98017cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro 981163935113919a184122b8b3bd672ef08c8df65dcRomain Guy #define GET_METHOD_ID(var, clazz, methodName, methodDescriptor) \ 982163935113919a184122b8b3bd672ef08c8df65dcRomain Guy var = env->GetMethodID(clazz, methodName, methodDescriptor); \ 983163935113919a184122b8b3bd672ef08c8df65dcRomain Guy LOG_FATAL_IF(! var, "Unable to find method " methodName); 984163935113919a184122b8b3bd672ef08c8df65dcRomain Guy#else 985163935113919a184122b8b3bd672ef08c8df65dcRomain Guy #define FIND_CLASS(var, className) 986163935113919a184122b8b3bd672ef08c8df65dcRomain Guy #define GET_METHOD_ID(var, clazz, methodName, methodDescriptor) 987163935113919a184122b8b3bd672ef08c8df65dcRomain Guy#endif 9889d5316e3f56d138504565ff311145ac01621dff4Romain Guy 989e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guyint register_android_view_GLES20Canvas(JNIEnv* env) { 99017cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro jclass clazz; 99117cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro FIND_CLASS(clazz, "android/graphics/Rect"); 99217cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro GET_METHOD_ID(gRectClassInfo.set, clazz, "set", "(IIII)V"); 9939d5316e3f56d138504565ff311145ac01621dff4Romain Guy 994e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy return AndroidRuntime::registerNativeMethods(env, kClassPathName, gMethods, NELEM(gMethods)); 995e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy} 996e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy 9979c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haaseconst char* const kActivityThreadPathName = "android/app/ActivityThread"; 9989c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase 9996be3d5561cbeccf0a8257a4acb155657f868e548Romain Guyint register_android_app_ActivityThread(JNIEnv* env) { 10006be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy return AndroidRuntime::registerNativeMethods(env, kActivityThreadPathName, 10019c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase gActivityThreadMethods, NELEM(gActivityThreadMethods)); 10029c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase} 10039c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase 1004e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy}; 1005