android_view_GLES20Canvas.cpp revision cce47eb580d666ead1f6095d1e3b65233592bbaa
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> 35c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy#include <SkPaint.h> 362ce932832e7caa1a6021539a9b7828ee5f49a610Chris Craik#include <SkPorterDuff.h> 37079ba2c85b15e882629b8d188f5fbdb42f7f8eeaRomain Guy#include <SkRegion.h> 38a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy#include <SkScalerContext.h> 3961c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy#include <SkTemplates.h> 4085bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy#include <SkXfermode.h> 41e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy 42b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy#include <DisplayListRenderer.h> 439d5316e3f56d138504565ff311145ac01621dff4Romain Guy#include <Rect.h> 44113e0824d6bddf4376240681f9cf6a2deded9498John Reck#include <RenderNode.h> 4552244fff29042926e21fa897ef5ab11148e35299John Reck#include <CanvasProperty.h> 4685bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy 471a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien#include <minikin/Layout.h> 481a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien#include "MinikinSkia.h" 491a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien#include "MinikinUtils.h" 50e8e62a4a032a80409114a37908b5f18ab0080848Romain Guy 51e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guynamespace android { 52e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy 539d5316e3f56d138504565ff311145ac01621dff4Romain Guyusing namespace uirenderer; 549d5316e3f56d138504565ff311145ac01621dff4Romain Guy 55163935113919a184122b8b3bd672ef08c8df65dcRomain Guy/** 563b20251a355c88193c439f928a84ae69483fb488John Reck * Note: DisplayListRenderer JNI layer is generated and compiled only on supported 57163935113919a184122b8b3bd672ef08c8df65dcRomain Guy * devices. This means all the logic must be compiled only when the 58163935113919a184122b8b3bd672ef08c8df65dcRomain Guy * preprocessor variable USE_OPENGL_RENDERER is defined. 59163935113919a184122b8b3bd672ef08c8df65dcRomain Guy */ 60163935113919a184122b8b3bd672ef08c8df65dcRomain Guy#ifdef USE_OPENGL_RENDERER 61163935113919a184122b8b3bd672ef08c8df65dcRomain Guy 62244ada1d35419b7be9de0fc833bb03955b725ffaRomain Guy// ---------------------------------------------------------------------------- 63bdb801ca993bcccbf2a4c2401d1720c3fa523777Romain Guy// Defines 64244ada1d35419b7be9de0fc833bb03955b725ffaRomain Guy// ---------------------------------------------------------------------------- 65bdb801ca993bcccbf2a4c2401d1720c3fa523777Romain Guy 66bdb801ca993bcccbf2a4c2401d1720c3fa523777Romain Guy// Debug 67e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy#define DEBUG_RENDERER 0 68bdb801ca993bcccbf2a4c2401d1720c3fa523777Romain Guy 69bdb801ca993bcccbf2a4c2401d1720c3fa523777Romain Guy// Debug 70bdb801ca993bcccbf2a4c2401d1720c3fa523777Romain Guy#if DEBUG_RENDERER 715baa3a62a97544669fba6d65a11c07f252e654ddSteve Block #define RENDERER_LOGD(...) ALOGD(__VA_ARGS__) 72bdb801ca993bcccbf2a4c2401d1720c3fa523777Romain Guy#else 73bdb801ca993bcccbf2a4c2401d1720c3fa523777Romain Guy #define RENDERER_LOGD(...) 74bdb801ca993bcccbf2a4c2401d1720c3fa523777Romain Guy#endif 75e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy 769d5316e3f56d138504565ff311145ac01621dff4Romain Guy// ---------------------------------------------------------------------------- 779d5316e3f56d138504565ff311145ac01621dff4Romain Guy 789d5316e3f56d138504565ff311145ac01621dff4Romain Guystatic struct { 797ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy jmethodID set; 809d5316e3f56d138504565ff311145ac01621dff4Romain Guy} gRectClassInfo; 819d5316e3f56d138504565ff311145ac01621dff4Romain Guy 82e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// ---------------------------------------------------------------------------- 83e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// Constructors 84e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// ---------------------------------------------------------------------------- 85e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy 865c13d89c1332fcc499379b9064b891187b75ca32Chet Haasestatic void android_view_GLES20Canvas_destroyRenderer(JNIEnv* env, jobject clazz, 8736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr) { 883b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 893b20251a355c88193c439f928a84ae69483fb488John Reck RENDERER_LOGD("Destroy DisplayListRenderer"); 90f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy delete renderer; 91e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy} 92e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy 93e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// ---------------------------------------------------------------------------- 94e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// Setup 95e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// ---------------------------------------------------------------------------- 96e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy 977d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_setViewport(JNIEnv* env, jobject clazz, 9836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr, jint width, jint height) { 993b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 100f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy renderer->setViewport(width, height); 101e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy} 102e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy 103cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craikstatic void android_view_GLES20Canvas_setHighContrastText(JNIEnv* env, jobject clazz, 104cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik jlong rendererPtr, jboolean highContrastText) { 105cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 106cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik renderer->setHighContrastText(highContrastText); 107cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik} 108cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik 10944b2fe3fc114ee5f7273c6b0fee2cc999bf244a2Chet Haasestatic int android_view_GLES20Canvas_prepare(JNIEnv* env, jobject clazz, 11036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr, jboolean opaque) { 1113b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 11244b2fe3fc114ee5f7273c6b0fee2cc999bf244a2Chet Haase return renderer->prepare(opaque); 113e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy} 114e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy 11544b2fe3fc114ee5f7273c6b0fee2cc999bf244a2Chet Haasestatic int android_view_GLES20Canvas_prepareDirty(JNIEnv* env, jobject clazz, 11636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr, jint left, jint top, jint right, jint bottom, 1177d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy jboolean opaque) { 1183b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 11944b2fe3fc114ee5f7273c6b0fee2cc999bf244a2Chet Haase return renderer->prepareDirty(left, top, right, bottom, opaque); 1207d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy} 1217d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy 1227d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_finish(JNIEnv* env, jobject clazz, 12336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr) { 1243b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 125b025b9c8b4efefadb01937db61a1f8ee7d2452bfRomain Guy renderer->finish(); 126b025b9c8b4efefadb01937db61a1f8ee7d2452bfRomain Guy} 127b025b9c8b4efefadb01937db61a1f8ee7d2452bfRomain Guy 128ba9b613437c34873fa95800a25fc51720638267cChris Craikstatic void android_view_GLES20Canvas_setProperty(JNIEnv* env, 129ba9b613437c34873fa95800a25fc51720638267cChris Craik jobject clazz, jstring name, jstring value) { 130ba9b613437c34873fa95800a25fc51720638267cChris Craik if (!Caches::hasInstance()) { 131ba9b613437c34873fa95800a25fc51720638267cChris Craik ALOGW("can't set property, no Caches instance"); 132ba9b613437c34873fa95800a25fc51720638267cChris Craik return; 133ba9b613437c34873fa95800a25fc51720638267cChris Craik } 134ba9b613437c34873fa95800a25fc51720638267cChris Craik 135ba9b613437c34873fa95800a25fc51720638267cChris Craik if (name == NULL || value == NULL) { 136ba9b613437c34873fa95800a25fc51720638267cChris Craik ALOGW("can't set prop, null passed"); 137ba9b613437c34873fa95800a25fc51720638267cChris Craik } 138ba9b613437c34873fa95800a25fc51720638267cChris Craik 139ba9b613437c34873fa95800a25fc51720638267cChris Craik const char* nameCharArray = env->GetStringUTFChars(name, NULL); 140ba9b613437c34873fa95800a25fc51720638267cChris Craik const char* valueCharArray = env->GetStringUTFChars(value, NULL); 141ba9b613437c34873fa95800a25fc51720638267cChris Craik Caches::getInstance().setTempProperty(nameCharArray, valueCharArray); 142ba9b613437c34873fa95800a25fc51720638267cChris Craik env->ReleaseStringUTFChars(name, nameCharArray); 143ba9b613437c34873fa95800a25fc51720638267cChris Craik env->ReleaseStringUTFChars(name, valueCharArray); 144ba9b613437c34873fa95800a25fc51720638267cChris Craik} 145ba9b613437c34873fa95800a25fc51720638267cChris Craik 146530041d3191ce817832a0108514617768e43cda6Romain Guy// ---------------------------------------------------------------------------- 147530041d3191ce817832a0108514617768e43cda6Romain Guy// Functor 148530041d3191ce817832a0108514617768e43cda6Romain Guy// ---------------------------------------------------------------------------- 149530041d3191ce817832a0108514617768e43cda6Romain Guy 1506554943a1dd6854c0f4976900956e556767b49e1Romain Guystatic jint android_view_GLES20Canvas_callDrawGLFunction(JNIEnv* env, jobject clazz, 15136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr, jlong functorPtr) { 1523b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 1539f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik Functor* functor = reinterpret_cast<Functor*>(functorPtr); 154cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy android::uirenderer::Rect dirty; 155cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy return renderer->callDrawGLFunction(functor, dirty); 156daf98e941e140e8739458126640183b9f296a2abChet Haase} 157daf98e941e140e8739458126640183b9f296a2abChet Haase 1588f3b8e32993d190a26c70c839a63d8ce4c3b16d9Romain Guy// ---------------------------------------------------------------------------- 1598f3b8e32993d190a26c70c839a63d8ce4c3b16d9Romain Guy// Misc 1608f3b8e32993d190a26c70c839a63d8ce4c3b16d9Romain Guy// ---------------------------------------------------------------------------- 1618f3b8e32993d190a26c70c839a63d8ce4c3b16d9Romain Guy 162f61970fc79e9c5cf340fa942597628242361864aRomain Guystatic jint android_view_GLES20Canvas_getMaxTextureWidth(JNIEnv* env, jobject clazz) { 163f61970fc79e9c5cf340fa942597628242361864aRomain Guy return Caches::getInstance().maxTextureSize; 164f61970fc79e9c5cf340fa942597628242361864aRomain Guy} 165f61970fc79e9c5cf340fa942597628242361864aRomain Guy 166f61970fc79e9c5cf340fa942597628242361864aRomain Guystatic jint android_view_GLES20Canvas_getMaxTextureHeight(JNIEnv* env, jobject clazz) { 167f61970fc79e9c5cf340fa942597628242361864aRomain Guy return Caches::getInstance().maxTextureSize; 168f61970fc79e9c5cf340fa942597628242361864aRomain Guy} 169f61970fc79e9c5cf340fa942597628242361864aRomain Guy 170e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// ---------------------------------------------------------------------------- 171bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy// State 172bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy// ---------------------------------------------------------------------------- 173bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy 17436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhatstatic jint android_view_GLES20Canvas_save(JNIEnv* env, jobject clazz, jlong rendererPtr, 175bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy jint flags) { 1763b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 177f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy return renderer->save(flags); 178f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy} 179bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy 1807d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic jint android_view_GLES20Canvas_getSaveCount(JNIEnv* env, jobject clazz, 18136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr) { 1823b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 183f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy return renderer->getSaveCount(); 184bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy} 185bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy 1867d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_restore(JNIEnv* env, jobject clazz, 18736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr) { 1883b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 189f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy renderer->restore(); 190bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy} 191bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy 1927d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_restoreToCount(JNIEnv* env, jobject clazz, 19336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr, jint saveCount) { 1943b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 195f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy renderer->restoreToCount(saveCount); 196bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy} 197bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy 198f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy// ---------------------------------------------------------------------------- 199bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy// Layers 200bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy// ---------------------------------------------------------------------------- 201bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy 2027d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic jint android_view_GLES20Canvas_saveLayer(JNIEnv* env, jobject clazz, 20336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr, jfloat left, jfloat top, jfloat right, jfloat bottom, 20436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong paintPtr, jint saveFlags) { 2053b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 2069f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr); 207bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy return renderer->saveLayer(left, top, right, bottom, paint, saveFlags); 208bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy} 209bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy 210189887e0ae171c1b7601991442104a30e56c50abRomain Guystatic jint android_view_GLES20Canvas_saveLayerClip(JNIEnv* env, jobject clazz, 21136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr, jlong paintPtr, jint saveFlags) { 2123b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 2139f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr); 2143f085429fd47ebd32ac2463b3eae2a5a6c17be25Chris Craik const android::uirenderer::Rect& bounds(renderer->getLocalClipBounds()); 215189887e0ae171c1b7601991442104a30e56c50abRomain Guy return renderer->saveLayer(bounds.left, bounds.top, bounds.right, bounds.bottom, 216189887e0ae171c1b7601991442104a30e56c50abRomain Guy paint, saveFlags); 217189887e0ae171c1b7601991442104a30e56c50abRomain Guy} 218189887e0ae171c1b7601991442104a30e56c50abRomain Guy 2197d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic jint android_view_GLES20Canvas_saveLayerAlpha(JNIEnv* env, jobject clazz, 22036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr, jfloat left, jfloat top, jfloat right, jfloat bottom, 221bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy jint alpha, jint saveFlags) { 2223b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 223bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy return renderer->saveLayerAlpha(left, top, right, bottom, alpha, saveFlags); 224bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy} 225bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy 226189887e0ae171c1b7601991442104a30e56c50abRomain Guystatic jint android_view_GLES20Canvas_saveLayerAlphaClip(JNIEnv* env, jobject clazz, 22736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr, jint alpha, jint saveFlags) { 2283b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 2293f085429fd47ebd32ac2463b3eae2a5a6c17be25Chris Craik const android::uirenderer::Rect& bounds(renderer->getLocalClipBounds()); 230189887e0ae171c1b7601991442104a30e56c50abRomain Guy return renderer->saveLayerAlpha(bounds.left, bounds.top, bounds.right, bounds.bottom, 231189887e0ae171c1b7601991442104a30e56c50abRomain Guy alpha, saveFlags); 232189887e0ae171c1b7601991442104a30e56c50abRomain Guy} 233189887e0ae171c1b7601991442104a30e56c50abRomain Guy 234bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy// ---------------------------------------------------------------------------- 235f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy// Clipping 236f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy// ---------------------------------------------------------------------------- 237f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy 23836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhatstatic jboolean android_view_GLES20Canvas_quickReject(JNIEnv* env, jobject clazz, 23936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr, jfloat left, jfloat top, jfloat right, jfloat bottom) { 2403b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 24136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat const bool result = renderer->quickRejectConservative(left, top, right, bottom); 24236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat return result ? JNI_TRUE : JNI_FALSE; 243c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy} 244c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy 24536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhatstatic jboolean android_view_GLES20Canvas_clipRectF(JNIEnv* env, jobject clazz, 24636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr, jfloat left, jfloat top, jfloat right, jfloat bottom, 24736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jint op) { 2483b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 24936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat const bool result = renderer->clipRect(left, top, right, bottom, 25036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat static_cast<SkRegion::Op>(op)); 25136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat return result ? JNI_TRUE : JNI_FALSE; 252f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy} 253bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy 25436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhatstatic jboolean android_view_GLES20Canvas_clipRect(JNIEnv* env, jobject clazz, 25536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr, jint left, jint top, jint right, jint bottom, 25636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jint op) { 2573b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 25836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat const bool result = renderer->clipRect(float(left), float(top), float(right), 25936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat float(bottom), 26036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat static_cast<SkRegion::Op>(op)); 26136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat return result ? JNI_TRUE : JNI_FALSE; 262bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy} 263bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy 26436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhatstatic jboolean android_view_GLES20Canvas_clipPath(JNIEnv* env, jobject clazz, 26536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr, jlong pathPtr, jint op) { 2663b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 2679f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik SkPath* path = reinterpret_cast<SkPath*>(pathPtr); 26836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat const bool result = renderer->clipPath(path, static_cast<SkRegion::Op>(op)); 26936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat return result ? JNI_TRUE : JNI_FALSE; 270735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy} 271735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy 27236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhatstatic jboolean android_view_GLES20Canvas_clipRegion(JNIEnv* env, jobject clazz, 27336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr, jlong regionPtr, jint op) { 2743b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 2759f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik SkRegion* region = reinterpret_cast<SkRegion*>(regionPtr); 27636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat const bool result = renderer->clipRegion(region, static_cast<SkRegion::Op>(op)); 27736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat return result ? JNI_TRUE : JNI_FALSE; 278735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy} 279735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy 28036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhatstatic jboolean android_view_GLES20Canvas_getClipBounds(JNIEnv* env, jobject clazz, 28136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr, jobject rect) { 2823b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 2833f085429fd47ebd32ac2463b3eae2a5a6c17be25Chris Craik const android::uirenderer::Rect& bounds(renderer->getLocalClipBounds()); 2849d5316e3f56d138504565ff311145ac01621dff4Romain Guy 2857ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy env->CallVoidMethod(rect, gRectClassInfo.set, 2867ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy int(bounds.left), int(bounds.top), int(bounds.right), int(bounds.bottom)); 2879d5316e3f56d138504565ff311145ac01621dff4Romain Guy 28836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat return !bounds.isEmpty() ? JNI_TRUE : JNI_FALSE; 2899d5316e3f56d138504565ff311145ac01621dff4Romain Guy} 2909d5316e3f56d138504565ff311145ac01621dff4Romain Guy 291bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy// ---------------------------------------------------------------------------- 292f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy// Transforms 293bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy// ---------------------------------------------------------------------------- 294bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy 2957d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_translate(JNIEnv* env, jobject clazz, 29636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr, jfloat dx, jfloat dy) { 2973b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 2987ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy renderer->translate(dx, dy); 299f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy} 300bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy 3017d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_rotate(JNIEnv* env, jobject clazz, 30236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr, jfloat degrees) { 3033b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 3047ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy renderer->rotate(degrees); 305bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy} 306bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy 3077d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_scale(JNIEnv* env, jobject clazz, 30836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr, jfloat sx, jfloat sy) { 3093b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 3107ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy renderer->scale(sx, sy); 311f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy} 312bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy 3137d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_skew(JNIEnv* env, jobject clazz, 31436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr, jfloat sx, jfloat sy) { 3153b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 316807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy renderer->skew(sx, sy); 317807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy} 318807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy 3197d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_setMatrix(JNIEnv* env, jobject clazz, 32036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr, jlong matrixPtr) { 3213b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 3229f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixPtr); 323139088228faa7f3c446af7387e017933998a5570Derek Sollenberger renderer->setMatrix(matrix ? *matrix : SkMatrix::I()); 324f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy} 325f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy 3267d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_getMatrix(JNIEnv* env, jobject clazz, 32736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr, jlong matrixPtr) { 3283b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 3299f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixPtr); 3307ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy renderer->getMatrix(matrix); 331f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy} 332f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy 3337d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_concatMatrix(JNIEnv* env, jobject clazz, 33436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr, jlong matrixPtr) { 3353b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 3369f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixPtr); 337139088228faa7f3c446af7387e017933998a5570Derek Sollenberger renderer->concatMatrix(*matrix); 338bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy} 339bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy 340bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy// ---------------------------------------------------------------------------- 341bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy// Drawing 34285bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy// ---------------------------------------------------------------------------- 34385bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy 3447d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawBitmap(JNIEnv* env, jobject clazz, 34536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr, jlong bitmapPtr, jbyteArray buffer, 34636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jfloat left, jfloat top, jlong paintPtr) { 3479f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapPtr); 3480c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik // This object allows the renderer to allocate a global JNI ref to the buffer object. 3490c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik JavaHeapBitmapRef bitmapRef(env, bitmap, buffer); 3500c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik 3513b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 3529f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr); 353dbd77cd444f89d94ec5333223c1bc17dbe0c90cdRomain Guy renderer->drawBitmap(bitmap, left, top, paint); 354ce0537b80087a6225273040a987414b1dd081aa0Romain Guy} 355ce0537b80087a6225273040a987414b1dd081aa0Romain Guy 3567d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawBitmapRect(JNIEnv* env, jobject clazz, 35736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr, jlong bitmapPtr, jbyteArray buffer, 358ce0537b80087a6225273040a987414b1dd081aa0Romain Guy float srcLeft, float srcTop, float srcRight, float srcBottom, 35936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat float dstLeft, float dstTop, float dstRight, float dstBottom, jlong paintPtr) { 3609f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapPtr); 3610c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik // This object allows the renderer to allocate a global JNI ref to the buffer object. 3620c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik JavaHeapBitmapRef bitmapRef(env, bitmap, buffer); 3630c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik 3643b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 3659f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr); 366dbd77cd444f89d94ec5333223c1bc17dbe0c90cdRomain Guy renderer->drawBitmap(bitmap, srcLeft, srcTop, srcRight, srcBottom, 367dbd77cd444f89d94ec5333223c1bc17dbe0c90cdRomain Guy dstLeft, dstTop, dstRight, dstBottom, paint); 368f86ef57f8bcd8ba43ce222ec6a8b4f67d3600640Romain Guy} 3698ba548f81d1ab5f1750cbf86098c4a14e0b8beadRomain Guy 3707d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawBitmapMatrix(JNIEnv* env, jobject clazz, 37136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr, jlong bitmapPtr, jbyteArray buffer, 37236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong matrixPtr, jlong paintPtr) { 3739f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapPtr); 3740c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik // This object allows the renderer to allocate a global JNI ref to the buffer object. 3750c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik JavaHeapBitmapRef bitmapRef(env, bitmap, buffer); 3760c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik 3773b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 3789f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixPtr); 3799f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr); 380139088228faa7f3c446af7387e017933998a5570Derek Sollenberger renderer->drawBitmap(bitmap, *matrix, paint); 381ce0537b80087a6225273040a987414b1dd081aa0Romain Guy} 382ce0537b80087a6225273040a987414b1dd081aa0Romain Guy 383e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guystatic void android_view_GLES20Canvas_drawBitmapData(JNIEnv* env, jobject clazz, 38436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr, jintArray colors, jint offset, jint stride, 38536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jfloat left, jfloat top, jint width, jint height, jboolean hasAlpha, jlong paintPtr) { 38657ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III // Note: If hasAlpha is false, kRGB_565_SkColorType will be used, which will 38757ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III // correct the alphaType to kOpaque_SkAlphaType. 388b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed const SkImageInfo info = SkImageInfo::Make(width, height, 389b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed hasAlpha ? kN32_SkColorType : kRGB_565_SkColorType, 390b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed kPremul_SkAlphaType); 39149c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy SkBitmap* bitmap = new SkBitmap; 392b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed if (!bitmap->allocPixels(info)) { 39349c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy delete bitmap; 394e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy return; 395e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy } 396e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy 39757ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III if (!GraphicsJNI::SetPixels(env, colors, offset, stride, 0, 0, width, height, *bitmap)) { 39849c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy delete bitmap; 399e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy return; 400e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy } 401e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy 4023b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 4039f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr); 40449c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy renderer->drawBitmapData(bitmap, left, top, paint); 40549c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy 406f23b25abfb76e75f63103abc882bc91b8327a957Chris Craik // Note - bitmap isn't deleted as DisplayListRenderer owns it now 407e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy} 408e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy 4097d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawBitmapMesh(JNIEnv* env, jobject clazz, 41036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr, jlong bitmapPtr, jbyteArray buffer, 4110c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik jint meshWidth, jint meshHeight, jfloatArray vertices, jint offset, jintArray colors, 41236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jint colorOffset, jlong paintPtr) { 4139f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapPtr); 4140c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik // This object allows the renderer to allocate a global JNI ref to the buffer object. 4150c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik JavaHeapBitmapRef bitmapRef(env, bitmap, buffer); 4160c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik 4175a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy jfloat* verticesArray = vertices ? env->GetFloatArrayElements(vertices, NULL) + offset : NULL; 4185a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy jint* colorsArray = colors ? env->GetIntArrayElements(colors, NULL) + colorOffset : NULL; 4195a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy 4203b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 4219f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr); 4225a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy renderer->drawBitmapMesh(bitmap, meshWidth, meshHeight, verticesArray, colorsArray, paint); 4235a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy 4245a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy if (vertices) env->ReleaseFloatArrayElements(vertices, verticesArray, 0); 4255a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy if (colors) env->ReleaseIntArrayElements(colors, colorsArray, 0); 4265a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy} 4275a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy 4287d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawPatch(JNIEnv* env, jobject clazz, 42936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr, jlong bitmapPtr, jbyteArray buffer, jlong patchPtr, 43036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat float left, float top, float right, float bottom, jlong paintPtr) { 4319f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapPtr); 4320c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik // This object allows the renderer to allocate a global JNI ref to the buffer object. 4330c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik JavaHeapBitmapRef bitmapRef(env, bitmap, buffer); 4340c20c3898a533b7b76f60827cb6ea02e17c5953dChris Craik 4353b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 4369f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik Res_png_9patch* patch = reinterpret_cast<Res_png_9patch*>(patchPtr); 4379f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr); 4383b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy renderer->drawPatch(bitmap, patch, left, top, right, bottom, paint); 439deba785f122a47915756ffd991f5540d952cf937Romain Guy} 440deba785f122a47915756ffd991f5540d952cf937Romain Guy 4417d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawColor(JNIEnv* env, jobject clazz, 4422ce932832e7caa1a6021539a9b7828ee5f49a610Chris Craik jlong rendererPtr, jint color, jint modeHandle) { 4433b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 4442ce932832e7caa1a6021539a9b7828ee5f49a610Chris Craik SkPorterDuff::Mode mode = static_cast<SkPorterDuff::Mode>(modeHandle); 4452ce932832e7caa1a6021539a9b7828ee5f49a610Chris Craik renderer->drawColor(color, SkPorterDuff::ToXfermodeMode(mode)); 44685bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy} 44785bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy 4487d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawRect(JNIEnv* env, jobject clazz, 44936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr, jfloat left, jfloat top, jfloat right, jfloat bottom, 45036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong paintPtr) { 4513b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 4529f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr); 453c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy renderer->drawRect(left, top, right, bottom, paint); 454c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy} 455c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy 4567d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawRoundRect(JNIEnv* env, jobject clazz, 45736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr, jfloat left, jfloat top, jfloat right, jfloat bottom, 45836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jfloat rx, jfloat ry, jlong paintPtr) { 4593b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 4609f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr); 46101d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy renderer->drawRoundRect(left, top, right, bottom, rx, ry, paint); 46201d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy} 46301d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy 4647d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawCircle(JNIEnv* env, jobject clazz, 46536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr, jfloat x, jfloat y, jfloat radius, jlong paintPtr) { 4663b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 4679f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr); 46801d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy renderer->drawCircle(x, y, radius, paint); 46901d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy} 47001d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy 47152244fff29042926e21fa897ef5ab11148e35299John Reckstatic void android_view_GLES20Canvas_drawCircleProps(JNIEnv* env, jobject clazz, 47252244fff29042926e21fa897ef5ab11148e35299John Reck jlong rendererPtr, jlong xPropPtr, jlong yPropPtr, jlong radiusPropPtr, jlong paintPropPtr) { 4733b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 47452244fff29042926e21fa897ef5ab11148e35299John Reck CanvasPropertyPrimitive* xProp = reinterpret_cast<CanvasPropertyPrimitive*>(xPropPtr); 47552244fff29042926e21fa897ef5ab11148e35299John Reck CanvasPropertyPrimitive* yProp = reinterpret_cast<CanvasPropertyPrimitive*>(yPropPtr); 47652244fff29042926e21fa897ef5ab11148e35299John Reck CanvasPropertyPrimitive* radiusProp = reinterpret_cast<CanvasPropertyPrimitive*>(radiusPropPtr); 47752244fff29042926e21fa897ef5ab11148e35299John Reck CanvasPropertyPaint* paintProp = reinterpret_cast<CanvasPropertyPaint*>(paintPropPtr); 47852244fff29042926e21fa897ef5ab11148e35299John Reck renderer->drawCircle(xProp, yProp, radiusProp, paintProp); 47952244fff29042926e21fa897ef5ab11148e35299John Reck} 48052244fff29042926e21fa897ef5ab11148e35299John Reck 4817d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawOval(JNIEnv* env, jobject clazz, 48236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr, jfloat left, jfloat top, jfloat right, jfloat bottom, 48336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong paintPtr) { 4843b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 4859f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr); 486c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy renderer->drawOval(left, top, right, bottom, paint); 487c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy} 488c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy 4897d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawArc(JNIEnv* env, jobject clazz, 49036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr, jfloat left, jfloat top, jfloat right, jfloat bottom, 49136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jfloat startAngle, jfloat sweepAngle, jboolean useCenter, jlong paintPtr) { 4923b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 4939f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr); 4948b2f5267f16c295f12faab810527cd6311997e34Romain Guy renderer->drawArc(left, top, right, bottom, startAngle, sweepAngle, useCenter, paint); 4958b2f5267f16c295f12faab810527cd6311997e34Romain Guy} 4968b2f5267f16c295f12faab810527cd6311997e34Romain Guy 497672433d90fab7383cd28beac9d4485b566a90940Romain Guystatic void android_view_GLES20Canvas_drawRegionAsRects(JNIEnv* env, jobject clazz, 49836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr, jlong regionPtr, jlong paintPtr) { 4993b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 5009f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik SkRegion* region = reinterpret_cast<SkRegion*>(regionPtr); 5019f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr); 502672433d90fab7383cd28beac9d4485b566a90940Romain Guy if (paint->getStyle() != SkPaint::kFill_Style || 503672433d90fab7383cd28beac9d4485b566a90940Romain Guy (paint->isAntiAlias() && !renderer->isCurrentTransformSimple())) { 504672433d90fab7383cd28beac9d4485b566a90940Romain Guy SkRegion::Iterator it(*region); 505672433d90fab7383cd28beac9d4485b566a90940Romain Guy while (!it.done()) { 506672433d90fab7383cd28beac9d4485b566a90940Romain Guy const SkIRect& r = it.rect(); 507672433d90fab7383cd28beac9d4485b566a90940Romain Guy renderer->drawRect(r.fLeft, r.fTop, r.fRight, r.fBottom, paint); 508672433d90fab7383cd28beac9d4485b566a90940Romain Guy it.next(); 509672433d90fab7383cd28beac9d4485b566a90940Romain Guy } 510672433d90fab7383cd28beac9d4485b566a90940Romain Guy } else { 511672433d90fab7383cd28beac9d4485b566a90940Romain Guy int count = 0; 512672433d90fab7383cd28beac9d4485b566a90940Romain Guy Vector<float> rects; 513672433d90fab7383cd28beac9d4485b566a90940Romain Guy SkRegion::Iterator it(*region); 514672433d90fab7383cd28beac9d4485b566a90940Romain Guy while (!it.done()) { 515672433d90fab7383cd28beac9d4485b566a90940Romain Guy const SkIRect& r = it.rect(); 516672433d90fab7383cd28beac9d4485b566a90940Romain Guy rects.push(r.fLeft); 517672433d90fab7383cd28beac9d4485b566a90940Romain Guy rects.push(r.fTop); 518672433d90fab7383cd28beac9d4485b566a90940Romain Guy rects.push(r.fRight); 519672433d90fab7383cd28beac9d4485b566a90940Romain Guy rects.push(r.fBottom); 5202af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik count += 4; 521672433d90fab7383cd28beac9d4485b566a90940Romain Guy it.next(); 522672433d90fab7383cd28beac9d4485b566a90940Romain Guy } 523672433d90fab7383cd28beac9d4485b566a90940Romain Guy renderer->drawRects(rects.array(), count, paint); 524a48a1a87ba17f20f7006eaab21dcedf86c015c13Romain Guy } 525a48a1a87ba17f20f7006eaab21dcedf86c015c13Romain Guy} 526a48a1a87ba17f20f7006eaab21dcedf86c015c13Romain Guy 527ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guystatic void android_view_GLES20Canvas_drawPoints(JNIEnv* env, jobject clazz, 52836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr, jfloatArray points, jint offset, jint count, jlong paintPtr) { 5293b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 530ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy jfloat* storage = env->GetFloatArrayElements(points, NULL); 5319f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr); 532ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy renderer->drawPoints(storage + offset, count, paint); 533ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy env->ReleaseFloatArrayElements(points, storage, 0); 534ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy} 535ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy 5367d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawPath(JNIEnv* env, jobject clazz, 53736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr, jlong pathPtr, jlong paintPtr) { 5383b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 5399f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik SkPath* path = reinterpret_cast<SkPath*>(pathPtr); 5409f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr); 5417fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy renderer->drawPath(path, paint); 5427fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy} 5437fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy 5447d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawLines(JNIEnv* env, jobject clazz, 54536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr, jfloatArray points, jint offset, jint count, jlong paintPtr) { 5463b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 547759ea80dca64ad652110a129e0d8bf93fea79f61Romain Guy jfloat* storage = env->GetFloatArrayElements(points, NULL); 5489f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr); 549759ea80dca64ad652110a129e0d8bf93fea79f61Romain Guy renderer->drawLines(storage + offset, count, paint); 550759ea80dca64ad652110a129e0d8bf93fea79f61Romain Guy env->ReleaseFloatArrayElements(points, storage, 0); 551759ea80dca64ad652110a129e0d8bf93fea79f61Romain Guy} 552759ea80dca64ad652110a129e0d8bf93fea79f61Romain Guy 55385bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy// ---------------------------------------------------------------------------- 5545ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy// Draw filters 5555ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy// ---------------------------------------------------------------------------- 5565ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy 5575ff9df658230d49e42c43586997a02d8e4dd417eRomain Guystatic void android_view_GLES20Canvas_setupPaintFilter(JNIEnv* env, jobject clazz, 55836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr, jint clearBits, jint setBits) { 5593b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 5605ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy renderer->setupPaintFilter(clearBits, setBits); 5615ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy} 5625ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy 5635ff9df658230d49e42c43586997a02d8e4dd417eRomain Guystatic void android_view_GLES20Canvas_resetPaintFilter(JNIEnv* env, jobject clazz, 56436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr) { 5653b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 5665ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy renderer->resetPaintFilter(); 5675ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy} 5685ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy 5695ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy// ---------------------------------------------------------------------------- 570a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy// Text 571a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy// ---------------------------------------------------------------------------- 572a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy 573f2114d5646194100242206b267ddd6e7194b7da9Raph Levienclass RenderTextFunctor { 574f2114d5646194100242206b267ddd6e7194b7da9Raph Levienpublic: 5753b20251a355c88193c439f928a84ae69483fb488John Reck RenderTextFunctor(const Layout& layout, DisplayListRenderer* renderer, jfloat x, jfloat y, 576f2114d5646194100242206b267ddd6e7194b7da9Raph Levien SkPaint* paint, uint16_t* glyphs, float* pos, float totalAdvance, 577f2114d5646194100242206b267ddd6e7194b7da9Raph Levien uirenderer::Rect& bounds) 578f2114d5646194100242206b267ddd6e7194b7da9Raph Levien : layout(layout), renderer(renderer), x(x), y(y), paint(paint), glyphs(glyphs), 579f2114d5646194100242206b267ddd6e7194b7da9Raph Levien pos(pos), totalAdvance(totalAdvance), bounds(bounds) { } 5801fc0fa87d42ce9268ece76b85b9edc834593e53aRaph Levien void operator()(size_t start, size_t end) { 581f2114d5646194100242206b267ddd6e7194b7da9Raph Levien for (size_t i = start; i < end; i++) { 582f2114d5646194100242206b267ddd6e7194b7da9Raph Levien glyphs[i] = layout.getGlyphId(i); 583f2114d5646194100242206b267ddd6e7194b7da9Raph Levien pos[2 * i] = layout.getX(i); 584f2114d5646194100242206b267ddd6e7194b7da9Raph Levien pos[2 * i + 1] = layout.getY(i); 585f2114d5646194100242206b267ddd6e7194b7da9Raph Levien } 586f2114d5646194100242206b267ddd6e7194b7da9Raph Levien size_t glyphsCount = end - start; 587f2114d5646194100242206b267ddd6e7194b7da9Raph Levien int bytesCount = glyphsCount * sizeof(jchar); 588f2114d5646194100242206b267ddd6e7194b7da9Raph Levien renderer->drawText((const char*) (glyphs + start), bytesCount, glyphsCount, 589f2114d5646194100242206b267ddd6e7194b7da9Raph Levien x, y, pos + 2 * start, paint, totalAdvance, bounds); 590f2114d5646194100242206b267ddd6e7194b7da9Raph Levien } 591f2114d5646194100242206b267ddd6e7194b7da9Raph Levienprivate: 592f2114d5646194100242206b267ddd6e7194b7da9Raph Levien const Layout& layout; 5933b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer; 594f2114d5646194100242206b267ddd6e7194b7da9Raph Levien jfloat x; 595f2114d5646194100242206b267ddd6e7194b7da9Raph Levien jfloat y; 596f2114d5646194100242206b267ddd6e7194b7da9Raph Levien SkPaint* paint; 597f2114d5646194100242206b267ddd6e7194b7da9Raph Levien uint16_t* glyphs; 598f2114d5646194100242206b267ddd6e7194b7da9Raph Levien float* pos; 599f2114d5646194100242206b267ddd6e7194b7da9Raph Levien float totalAdvance; 600f2114d5646194100242206b267ddd6e7194b7da9Raph Levien uirenderer::Rect& bounds; 601f2114d5646194100242206b267ddd6e7194b7da9Raph Levien}; 602f2114d5646194100242206b267ddd6e7194b7da9Raph Levien 6033b20251a355c88193c439f928a84ae69483fb488John Reckstatic void renderTextLayout(DisplayListRenderer* renderer, Layout* layout, 6041a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien jfloat x, jfloat y, SkPaint* paint) { 6051a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien size_t nGlyphs = layout->nGlyphs(); 6061a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien float* pos = new float[nGlyphs * 2]; 6071a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien uint16_t* glyphs = new uint16_t[nGlyphs]; 6081a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien MinikinRect b; 6091a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien layout->getBounds(&b); 6101a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien android::uirenderer::Rect bounds(b.mLeft, b.mTop, b.mRight, b.mBottom); 6111a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien bounds.translate(x, y); 6121a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien float totalAdvance = layout->getAdvance(); 6131a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien 614f2114d5646194100242206b267ddd6e7194b7da9Raph Levien RenderTextFunctor f(*layout, renderer, x, y, paint, glyphs, pos, totalAdvance, bounds); 6151fc0fa87d42ce9268ece76b85b9edc834593e53aRaph Levien MinikinUtils::forFontRun(*layout, paint, f); 6161a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien delete[] glyphs; 6171a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien delete[] pos; 6181a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien} 6191a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien 6203b20251a355c88193c439f928a84ae69483fb488John Reckstatic void renderText(DisplayListRenderer* renderer, const jchar* text, int count, 621051910b9f998030dacb8a0722588cc715813fde1Raph Levien jfloat x, jfloat y, int bidiFlags, SkPaint* paint, TypefaceImpl* typeface) { 6221a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien Layout layout; 623051910b9f998030dacb8a0722588cc715813fde1Raph Levien std::string css = MinikinUtils::setLayoutProperties(&layout, paint, bidiFlags, typeface); 6246bfd7e7df3a9f9ea2f9e57a3552eed7f518be711Raph Levien layout.doLayout(text, 0, count, count, css); 6253660789f06c5fbcb81e6c7c79612048bff8f0f66Raph Levien x += MinikinUtils::xOffsetForTextAlign(paint, layout); 6261a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien renderTextLayout(renderer, &layout, x, y, paint); 627e8e62a4a032a80409114a37908b5f18ab0080848Romain Guy} 628e8e62a4a032a80409114a37908b5f18ab0080848Romain Guy 6299d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levienclass RenderTextOnPathFunctor { 6309d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levienpublic: 6313b20251a355c88193c439f928a84ae69483fb488John Reck RenderTextOnPathFunctor(const Layout& layout, DisplayListRenderer* renderer, float hOffset, 6329d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien float vOffset, SkPaint* paint, SkPath* path) 6339d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien : layout(layout), renderer(renderer), hOffset(hOffset), vOffset(vOffset), 6349d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien paint(paint), path(path) { 6359d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien } 6369d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien void operator()(size_t start, size_t end) { 6379d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien uint16_t glyphs[1]; 6389d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien for (size_t i = start; i < end; i++) { 6399d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien glyphs[0] = layout.getGlyphId(i); 6409d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien float x = hOffset + layout.getX(i); 6419d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien float y = vOffset + layout.getY(i); 6429d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien renderer->drawTextOnPath((const char*) glyphs, sizeof(glyphs), 1, path, x, y, paint); 6439d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien } 6449d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien } 6459d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levienprivate: 6469d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien const Layout& layout; 6473b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer; 6489d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien float hOffset; 6499d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien float vOffset; 6509d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien SkPaint* paint; 6519d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien SkPath* path; 6529d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien}; 6539d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien 6543b20251a355c88193c439f928a84ae69483fb488John Reckstatic void renderTextOnPath(DisplayListRenderer* renderer, const jchar* text, int count, 6559d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien SkPath* path, jfloat hOffset, jfloat vOffset, int bidiFlags, SkPaint* paint, 6569d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien TypefaceImpl* typeface) { 6579d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien Layout layout; 6589d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien std::string css = MinikinUtils::setLayoutProperties(&layout, paint, bidiFlags, typeface); 6599d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien layout.doLayout(text, 0, count, count, css); 6609d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien hOffset += MinikinUtils::hOffsetForTextAlign(paint, layout, *path); 6619d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien SkPaint::Align align = paint->getTextAlign(); 6629d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien paint->setTextAlign(SkPaint::kLeft_Align); 6639d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien 6649d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien RenderTextOnPathFunctor f(layout, renderer, hOffset, vOffset, paint, path); 6659d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien MinikinUtils::forFontRun(layout, paint, f); 6669d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien paint->setTextAlign(align); 667325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy} 668325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy 6693b20251a355c88193c439f928a84ae69483fb488John Reckstatic void renderTextRun(DisplayListRenderer* renderer, const jchar* text, 67061c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy jint start, jint count, jint contextCount, jfloat x, jfloat y, 671051910b9f998030dacb8a0722588cc715813fde1Raph Levien int bidiFlags, SkPaint* paint, TypefaceImpl* typeface) { 6721a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien Layout layout; 673051910b9f998030dacb8a0722588cc715813fde1Raph Levien std::string css = MinikinUtils::setLayoutProperties(&layout, paint, bidiFlags, typeface); 6746bfd7e7df3a9f9ea2f9e57a3552eed7f518be711Raph Levien layout.doLayout(text, start, count, contextCount, css); 6753660789f06c5fbcb81e6c7c79612048bff8f0f66Raph Levien x += MinikinUtils::xOffsetForTextAlign(paint, layout); 6761a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien renderTextLayout(renderer, &layout, x, y, paint); 67761c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy} 67861c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy 6797d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawTextArray(JNIEnv* env, jobject clazz, 68036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr, jcharArray text, jint index, jint count, 681051910b9f998030dacb8a0722588cc715813fde1Raph Levien jfloat x, jfloat y, jint bidiFlags, jlong paintPtr, jlong typefacePtr) { 6823b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 683a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy jchar* textArray = env->GetCharArrayElements(text, NULL); 6849f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr); 6851a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien TypefaceImpl* typeface = reinterpret_cast<TypefaceImpl*>(typefacePtr); 6869f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik 687051910b9f998030dacb8a0722588cc715813fde1Raph Levien renderText(renderer, textArray + index, count, x, y, bidiFlags, paint, typeface); 688a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy env->ReleaseCharArrayElements(text, textArray, JNI_ABORT); 689a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy} 690a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy 6917d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawText(JNIEnv* env, jobject clazz, 69236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr, jstring text, jint start, jint end, 693051910b9f998030dacb8a0722588cc715813fde1Raph Levien jfloat x, jfloat y, jint bidiFlags, jlong paintPtr, jlong typefacePtr) { 6943b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 695a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy const jchar* textArray = env->GetStringChars(text, NULL); 6969f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr); 6971a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien TypefaceImpl* typeface = reinterpret_cast<TypefaceImpl*>(typefacePtr); 6989f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik 699051910b9f998030dacb8a0722588cc715813fde1Raph Levien renderText(renderer, textArray + start, end - start, x, y, bidiFlags, paint, typeface); 700a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy env->ReleaseStringChars(text, textArray); 701a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy} 702a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy 703325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guystatic void android_view_GLES20Canvas_drawTextArrayOnPath(JNIEnv* env, jobject clazz, 70436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr, jcharArray text, jint index, jint count, 7059d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien jlong pathPtr, jfloat hOffset, jfloat vOffset, jint bidiFlags, jlong paintPtr, 7069d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien jlong typefacePtr) { 7073b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 708325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy jchar* textArray = env->GetCharArrayElements(text, NULL); 7099f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik SkPath* path = reinterpret_cast<SkPath*>(pathPtr); 7109f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr); 7119d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien TypefaceImpl* typeface = reinterpret_cast<TypefaceImpl*>(typefacePtr); 7129f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik 713325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy renderTextOnPath(renderer, textArray + index, count, path, 7149d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien hOffset, vOffset, bidiFlags, paint, typeface); 715325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy env->ReleaseCharArrayElements(text, textArray, JNI_ABORT); 716325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy} 717325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy 718325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guystatic void android_view_GLES20Canvas_drawTextOnPath(JNIEnv* env, jobject clazz, 71936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr, jstring text, jint start, jint end, 7209d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien jlong pathPtr, jfloat hOffset, jfloat vOffset, jint bidiFlags, jlong paintPtr, 7219d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien jlong typefacePtr) { 7223b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 723325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy const jchar* textArray = env->GetStringChars(text, NULL); 7249f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik SkPath* path = reinterpret_cast<SkPath*>(pathPtr); 7259f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr); 7269d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien TypefaceImpl* typeface = reinterpret_cast<TypefaceImpl*>(typefacePtr); 7279f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik 728325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy renderTextOnPath(renderer, textArray + start, end - start, path, 7299d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien hOffset, vOffset, bidiFlags, paint, typeface); 730325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy env->ReleaseStringChars(text, textArray); 731325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy} 732325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy 7337d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawTextRunArray(JNIEnv* env, jobject clazz, 73436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr, jcharArray text, jint index, jint count, 735051910b9f998030dacb8a0722588cc715813fde1Raph Levien jint contextIndex, jint contextCount, jfloat x, jfloat y, jboolean isRtl, 7361a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien jlong paintPtr, jlong typefacePtr) { 7373b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 73861c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy jchar* textArray = env->GetCharArrayElements(text, NULL); 7399f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr); 7401a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien TypefaceImpl* typeface = reinterpret_cast<TypefaceImpl*>(typefacePtr); 7419f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik 742051910b9f998030dacb8a0722588cc715813fde1Raph Levien int bidiFlags = isRtl ? kBidi_Force_RTL : kBidi_Force_LTR; 74361c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy renderTextRun(renderer, textArray + contextIndex, index - contextIndex, 744051910b9f998030dacb8a0722588cc715813fde1Raph Levien count, contextCount, x, y, bidiFlags, paint, typeface); 74561c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy env->ReleaseCharArrayElements(text, textArray, JNI_ABORT); 74661c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy } 74761c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy 7487d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawTextRun(JNIEnv* env, jobject clazz, 74936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr, jstring text, jint start, jint end, 750051910b9f998030dacb8a0722588cc715813fde1Raph Levien jint contextStart, int contextEnd, jfloat x, jfloat y, jboolean isRtl, 7511a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien jlong paintPtr, jlong typefacePtr) { 7523b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 75361c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy const jchar* textArray = env->GetStringChars(text, NULL); 75461c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy jint count = end - start; 75561c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy jint contextCount = contextEnd - contextStart; 7569f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr); 7571a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien TypefaceImpl* typeface = reinterpret_cast<TypefaceImpl*>(typefacePtr); 7589f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik 759051910b9f998030dacb8a0722588cc715813fde1Raph Levien int bidiFlags = isRtl ? kBidi_Force_RTL : kBidi_Force_LTR; 76061c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy renderTextRun(renderer, textArray + contextStart, start - contextStart, 761051910b9f998030dacb8a0722588cc715813fde1Raph Levien count, contextCount, x, y, bidiFlags, paint, typeface); 76261c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy env->ReleaseStringChars(text, textArray); 76361c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy} 76461c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy 765b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy// ---------------------------------------------------------------------------- 766b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy// Display lists 767b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy// ---------------------------------------------------------------------------- 768b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 76944fd8d24f761f82d21e9b00932648a1b6bf91449John Reckstatic jlong android_view_GLES20Canvas_finishRecording(JNIEnv* env, 77044fd8d24f761f82d21e9b00932648a1b6bf91449John Reck jobject clazz, jlong rendererPtr) { 7719f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 77244fd8d24f761f82d21e9b00932648a1b6bf91449John Reck return reinterpret_cast<jlong>(renderer->finishRecording()); 773162a0217563f4665da6eb183dfce0fef740f641fJeff Brown} 774162a0217563f4665da6eb183dfce0fef740f641fJeff Brown 7753f085429fd47ebd32ac2463b3eae2a5a6c17be25Chris Craikstatic jlong android_view_GLES20Canvas_createDisplayListRenderer(JNIEnv* env, jobject clazz) { 77644fd8d24f761f82d21e9b00932648a1b6bf91449John Reck return reinterpret_cast<jlong>(new DisplayListRenderer); 7775977baa1fa24125c148a72699b53e62abaf08960Chet Haase} 7785977baa1fa24125c148a72699b53e62abaf08960Chet Haase 779a7090e0cfd7c719a6d4c03aae34f5db98754cbddChris Craikstatic jint android_view_GLES20Canvas_drawRenderNode(JNIEnv* env, 780a7090e0cfd7c719a6d4c03aae34f5db98754cbddChris Craik jobject clazz, jlong rendererPtr, jlong renderNodePtr, 7811271e2cc80b01d577e9db339459ef0222bb9320dChet Haase jobject dirty, jint flags) { 7823b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 783a7090e0cfd7c719a6d4c03aae34f5db98754cbddChris Craik RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 784cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy android::uirenderer::Rect bounds; 785a7090e0cfd7c719a6d4c03aae34f5db98754cbddChris Craik status_t status = renderer->drawRenderNode(renderNode, bounds, flags); 7866554943a1dd6854c0f4976900956e556767b49e1Romain Guy if (status != DrawGlInfo::kStatusDone && dirty != NULL) { 787cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy env->CallVoidMethod(dirty, gRectClassInfo.set, 788cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy int(bounds.left), int(bounds.top), int(bounds.right), int(bounds.bottom)); 789cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy } 7906554943a1dd6854c0f4976900956e556767b49e1Romain Guy return status; 791b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy} 792b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 7936c319ca1275c8db892c39b48fc54864c949f9171Romain Guy// ---------------------------------------------------------------------------- 7946c319ca1275c8db892c39b48fc54864c949f9171Romain Guy// Layers 7956c319ca1275c8db892c39b48fc54864c949f9171Romain Guy// ---------------------------------------------------------------------------- 7966c319ca1275c8db892c39b48fc54864c949f9171Romain Guy 7977d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guystatic void android_view_GLES20Canvas_drawLayer(JNIEnv* env, jobject clazz, 79836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong rendererPtr, jlong layerPtr, jfloat x, jfloat y) { 7993b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr); 8009f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik Layer* layer = reinterpret_cast<Layer*>(layerPtr); 801a08f95cfeca7217f9c533b03663bf0dceedd259aChris Craik renderer->drawLayer(layer, x, y); 8026c319ca1275c8db892c39b48fc54864c949f9171Romain Guy} 8036c319ca1275c8db892c39b48fc54864c949f9171Romain Guy 804163935113919a184122b8b3bd672ef08c8df65dcRomain Guy#endif // USE_OPENGL_RENDERER 805163935113919a184122b8b3bd672ef08c8df65dcRomain Guy 806163935113919a184122b8b3bd672ef08c8df65dcRomain Guy// ---------------------------------------------------------------------------- 807163935113919a184122b8b3bd672ef08c8df65dcRomain Guy// Common 808163935113919a184122b8b3bd672ef08c8df65dcRomain Guy// ---------------------------------------------------------------------------- 809163935113919a184122b8b3bd672ef08c8df65dcRomain Guy 810163935113919a184122b8b3bd672ef08c8df65dcRomain Guystatic jboolean android_view_GLES20Canvas_isAvailable(JNIEnv* env, jobject clazz) { 811163935113919a184122b8b3bd672ef08c8df65dcRomain Guy#ifdef USE_OPENGL_RENDERER 8124406345cd62d3687ce590c357854472f7f906e6cJesse Hall char prop[PROPERTY_VALUE_MAX]; 8134406345cd62d3687ce590c357854472f7f906e6cJesse Hall if (property_get("ro.kernel.qemu", prop, NULL) == 0) { 8144406345cd62d3687ce590c357854472f7f906e6cJesse Hall // not in the emulator 8154406345cd62d3687ce590c357854472f7f906e6cJesse Hall return JNI_TRUE; 8164406345cd62d3687ce590c357854472f7f906e6cJesse Hall } 8174406345cd62d3687ce590c357854472f7f906e6cJesse Hall // In the emulator this property will be set to 1 when hardware GLES is 8184406345cd62d3687ce590c357854472f7f906e6cJesse Hall // enabled, 0 otherwise. On old emulator versions it will be undefined. 8194406345cd62d3687ce590c357854472f7f906e6cJesse Hall property_get("ro.kernel.qemu.gles", prop, "0"); 8204406345cd62d3687ce590c357854472f7f906e6cJesse Hall return atoi(prop) == 1 ? JNI_TRUE : JNI_FALSE; 821163935113919a184122b8b3bd672ef08c8df65dcRomain Guy#else 822163935113919a184122b8b3bd672ef08c8df65dcRomain Guy return JNI_FALSE; 823163935113919a184122b8b3bd672ef08c8df65dcRomain Guy#endif 824163935113919a184122b8b3bd672ef08c8df65dcRomain Guy} 825163935113919a184122b8b3bd672ef08c8df65dcRomain Guy 826a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy// ---------------------------------------------------------------------------- 8279c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase// Logging 8289c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase// ---------------------------------------------------------------------------- 8299c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase 8309c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haasestatic void 83165b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guyandroid_app_ActivityThread_dumpGraphics(JNIEnv* env, jobject clazz, jobject javaFileDescriptor) { 832905787a7c91d23daa4efc3d16bd8cbf1a683e779Chet Haase#ifdef USE_OPENGL_RENDERER 833a3804cf77f0edd93f6247a055cdafb856b117eecElliott Hughes int fd = jniGetFDFromFileDescriptor(env, javaFileDescriptor); 834e18264b079481a244b30e3f71012c53bbd861f92John Reck android::uirenderer::RenderNode::outputLogBuffer(fd); 835905787a7c91d23daa4efc3d16bd8cbf1a683e779Chet Haase#endif // USE_OPENGL_RENDERER 8369c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase} 8379c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase 8389c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase// ---------------------------------------------------------------------------- 839e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// JNI Glue 840e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// ---------------------------------------------------------------------------- 841e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy 842e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guyconst char* const kClassPathName = "android/view/GLES20Canvas"; 843e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy 844e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guystatic JNINativeMethod gMethods[] = { 84561c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy { "nIsAvailable", "()Z", (void*) android_view_GLES20Canvas_isAvailable }, 846163935113919a184122b8b3bd672ef08c8df65dcRomain Guy 84761c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy#ifdef USE_OPENGL_RENDERER 8487d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy 84936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nDestroyRenderer", "(J)V", (void*) android_view_GLES20Canvas_destroyRenderer }, 85036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nSetViewport", "(JII)V", (void*) android_view_GLES20Canvas_setViewport }, 851cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik { "nSetHighContrastText","(JZ)V", (void*) android_view_GLES20Canvas_setHighContrastText }, 85236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nPrepare", "(JZ)I", (void*) android_view_GLES20Canvas_prepare }, 85336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nPrepareDirty", "(JIIIIZ)I", (void*) android_view_GLES20Canvas_prepareDirty }, 85436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nFinish", "(J)V", (void*) android_view_GLES20Canvas_finish }, 855ba9b613437c34873fa95800a25fc51720638267cChris Craik { "nSetProperty", "(Ljava/lang/String;Ljava/lang/String;)V", 856ba9b613437c34873fa95800a25fc51720638267cChris Craik (void*) android_view_GLES20Canvas_setProperty }, 85761c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy 85836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nCallDrawGLFunction", "(JJ)I", (void*) android_view_GLES20Canvas_callDrawGLFunction }, 8597d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy 86036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nSave", "(JI)I", (void*) android_view_GLES20Canvas_save }, 86136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nRestore", "(J)V", (void*) android_view_GLES20Canvas_restore }, 86236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nRestoreToCount", "(JI)V", (void*) android_view_GLES20Canvas_restoreToCount }, 86336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nGetSaveCount", "(J)I", (void*) android_view_GLES20Canvas_getSaveCount }, 86436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat 86536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nSaveLayer", "(JFFFFJI)I", (void*) android_view_GLES20Canvas_saveLayer }, 86636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nSaveLayer", "(JJI)I", (void*) android_view_GLES20Canvas_saveLayerClip }, 86736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nSaveLayerAlpha", "(JFFFFII)I", (void*) android_view_GLES20Canvas_saveLayerAlpha }, 86836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nSaveLayerAlpha", "(JII)I", (void*) android_view_GLES20Canvas_saveLayerAlphaClip }, 86936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat 87036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nQuickReject", "(JFFFF)Z", (void*) android_view_GLES20Canvas_quickReject }, 87136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nClipRect", "(JFFFFI)Z", (void*) android_view_GLES20Canvas_clipRectF }, 87236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nClipRect", "(JIIIII)Z", (void*) android_view_GLES20Canvas_clipRect }, 87336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nClipPath", "(JJI)Z", (void*) android_view_GLES20Canvas_clipPath }, 87436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nClipRegion", "(JJI)Z", (void*) android_view_GLES20Canvas_clipRegion }, 87536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat 87636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nTranslate", "(JFF)V", (void*) android_view_GLES20Canvas_translate }, 87736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nRotate", "(JF)V", (void*) android_view_GLES20Canvas_rotate }, 87836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nScale", "(JFF)V", (void*) android_view_GLES20Canvas_scale }, 87936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nSkew", "(JFF)V", (void*) android_view_GLES20Canvas_skew }, 88036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat 88136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nSetMatrix", "(JJ)V", (void*) android_view_GLES20Canvas_setMatrix }, 88236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nGetMatrix", "(JJ)V", (void*) android_view_GLES20Canvas_getMatrix }, 88336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nConcatMatrix", "(JJ)V", (void*) android_view_GLES20Canvas_concatMatrix }, 88436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat 88536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nDrawBitmap", "(JJ[BFFJ)V", (void*) android_view_GLES20Canvas_drawBitmap }, 88636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nDrawBitmap", "(JJ[BFFFFFFFFJ)V",(void*) android_view_GLES20Canvas_drawBitmapRect }, 88736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nDrawBitmap", "(JJ[BJJ)V", (void*) android_view_GLES20Canvas_drawBitmapMatrix }, 88836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nDrawBitmap", "(J[IIIFFIIZJ)V", (void*) android_view_GLES20Canvas_drawBitmapData }, 88936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat 89036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nDrawBitmapMesh", "(JJ[BII[FI[IIJ)V",(void*) android_view_GLES20Canvas_drawBitmapMesh }, 89136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat 89236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nDrawPatch", "(JJ[BJFFFFJ)V", (void*) android_view_GLES20Canvas_drawPatch }, 89336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat 89436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nDrawColor", "(JII)V", (void*) android_view_GLES20Canvas_drawColor }, 89536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nDrawRect", "(JFFFFJ)V", (void*) android_view_GLES20Canvas_drawRect }, 89636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nDrawRects", "(JJJ)V", (void*) android_view_GLES20Canvas_drawRegionAsRects }, 89736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nDrawRoundRect", "(JFFFFFFJ)V", (void*) android_view_GLES20Canvas_drawRoundRect }, 89836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nDrawCircle", "(JFFFJ)V", (void*) android_view_GLES20Canvas_drawCircle }, 89952244fff29042926e21fa897ef5ab11148e35299John Reck { "nDrawCircle", "(JJJJJ)V", (void*) android_view_GLES20Canvas_drawCircleProps }, 90036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nDrawOval", "(JFFFFJ)V", (void*) android_view_GLES20Canvas_drawOval }, 90136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nDrawArc", "(JFFFFFFZJ)V", (void*) android_view_GLES20Canvas_drawArc }, 90236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nDrawPoints", "(J[FIIJ)V", (void*) android_view_GLES20Canvas_drawPoints }, 90336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat 90436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nDrawPath", "(JJJ)V", (void*) android_view_GLES20Canvas_drawPath }, 90536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nDrawLines", "(J[FIIJ)V", (void*) android_view_GLES20Canvas_drawLines }, 90636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat 90736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nSetupPaintFilter", "(JII)V", (void*) android_view_GLES20Canvas_setupPaintFilter }, 90836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nResetPaintFilter", "(J)V", (void*) android_view_GLES20Canvas_resetPaintFilter }, 90936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat 9101a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien { "nDrawText", "(J[CIIFFIJJ)V", (void*) android_view_GLES20Canvas_drawTextArray }, 9111a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien { "nDrawText", "(JLjava/lang/String;IIFFIJJ)V", 912a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy (void*) android_view_GLES20Canvas_drawText }, 913a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy 9149d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien { "nDrawTextOnPath", "(J[CIIJFFIJJ)V", (void*) android_view_GLES20Canvas_drawTextArrayOnPath }, 9159d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien { "nDrawTextOnPath", "(JLjava/lang/String;IIJFFIJJ)V", 916325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy (void*) android_view_GLES20Canvas_drawTextOnPath }, 917325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy 918051910b9f998030dacb8a0722588cc715813fde1Raph Levien { "nDrawTextRun", "(J[CIIIIFFZJJ)V", (void*) android_view_GLES20Canvas_drawTextRunArray }, 919051910b9f998030dacb8a0722588cc715813fde1Raph Levien { "nDrawTextRun", "(JLjava/lang/String;IIIIFFZJJ)V", 92061c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy (void*) android_view_GLES20Canvas_drawTextRun }, 92161c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy 922a7090e0cfd7c719a6d4c03aae34f5db98754cbddChris Craik { "nGetClipBounds", "(JLandroid/graphics/Rect;)Z", (void*) android_view_GLES20Canvas_getClipBounds }, 923b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 924a7090e0cfd7c719a6d4c03aae34f5db98754cbddChris Craik { "nFinishRecording", "(J)J", (void*) android_view_GLES20Canvas_finishRecording }, 925a7090e0cfd7c719a6d4c03aae34f5db98754cbddChris Craik { "nDrawRenderNode", "(JJLandroid/graphics/Rect;I)I", (void*) android_view_GLES20Canvas_drawRenderNode }, 92613631f3da855f200a151e7837ed9f6b079622b58Romain Guy 92736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nCreateDisplayListRenderer", "()J", (void*) android_view_GLES20Canvas_createDisplayListRenderer }, 92813631f3da855f200a151e7837ed9f6b079622b58Romain Guy 92936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nDrawLayer", "(JJFF)V", (void*) android_view_GLES20Canvas_drawLayer }, 93036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat 931f61970fc79e9c5cf340fa942597628242361864aRomain Guy { "nGetMaximumTextureWidth", "()I", (void*) android_view_GLES20Canvas_getMaxTextureWidth }, 932f61970fc79e9c5cf340fa942597628242361864aRomain Guy { "nGetMaximumTextureHeight", "()I", (void*) android_view_GLES20Canvas_getMaxTextureHeight }, 933f61970fc79e9c5cf340fa942597628242361864aRomain Guy 934163935113919a184122b8b3bd672ef08c8df65dcRomain Guy#endif 935e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy}; 936e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy 9379c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haasestatic JNINativeMethod gActivityThreadMethods[] = { 9389c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase { "dumpGraphicsInfo", "(Ljava/io/FileDescriptor;)V", 9399c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase (void*) android_app_ActivityThread_dumpGraphics } 9409c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase}; 9419c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase 9429c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase 943163935113919a184122b8b3bd672ef08c8df65dcRomain Guy#ifdef USE_OPENGL_RENDERER 944163935113919a184122b8b3bd672ef08c8df65dcRomain Guy #define FIND_CLASS(var, className) \ 945163935113919a184122b8b3bd672ef08c8df65dcRomain Guy var = env->FindClass(className); \ 94617cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro LOG_FATAL_IF(! var, "Unable to find class " className); 94717cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro 948163935113919a184122b8b3bd672ef08c8df65dcRomain Guy #define GET_METHOD_ID(var, clazz, methodName, methodDescriptor) \ 949163935113919a184122b8b3bd672ef08c8df65dcRomain Guy var = env->GetMethodID(clazz, methodName, methodDescriptor); \ 950163935113919a184122b8b3bd672ef08c8df65dcRomain Guy LOG_FATAL_IF(! var, "Unable to find method " methodName); 951163935113919a184122b8b3bd672ef08c8df65dcRomain Guy#else 952163935113919a184122b8b3bd672ef08c8df65dcRomain Guy #define FIND_CLASS(var, className) 953163935113919a184122b8b3bd672ef08c8df65dcRomain Guy #define GET_METHOD_ID(var, clazz, methodName, methodDescriptor) 954163935113919a184122b8b3bd672ef08c8df65dcRomain Guy#endif 9559d5316e3f56d138504565ff311145ac01621dff4Romain Guy 956e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guyint register_android_view_GLES20Canvas(JNIEnv* env) { 95717cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro jclass clazz; 95817cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro FIND_CLASS(clazz, "android/graphics/Rect"); 95917cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro GET_METHOD_ID(gRectClassInfo.set, clazz, "set", "(IIII)V"); 9609d5316e3f56d138504565ff311145ac01621dff4Romain Guy 961e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy return AndroidRuntime::registerNativeMethods(env, kClassPathName, gMethods, NELEM(gMethods)); 962e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy} 963e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy 9649c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haaseconst char* const kActivityThreadPathName = "android/app/ActivityThread"; 9659c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase 9666be3d5561cbeccf0a8257a4acb155657f868e548Romain Guyint register_android_app_ActivityThread(JNIEnv* env) { 9676be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy return AndroidRuntime::registerNativeMethods(env, kActivityThreadPathName, 9689c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase gActivityThreadMethods, NELEM(gActivityThreadMethods)); 9699c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase} 9709c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase 971e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy}; 972