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