blob: e72aff95871ae2fb2d3e0ae82d9c08de46d8cd77 [file] [log] [blame]
Romain Guye4d01122010-06-16 18:44:05 -07001/*
2 * Copyright (C) 2010 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Romain Guya1db5742010-07-20 13:09:13 -070017#define LOG_TAG "OpenGLRenderer"
18
Romain Guye4d01122010-06-16 18:44:05 -070019#include "jni.h"
Patrick Dubroye4ac2d62010-12-01 11:23:13 -080020#include "GraphicsJNI.h"
Romain Guye4d01122010-06-16 18:44:05 -070021#include <nativehelper/JNIHelp.h>
Romain Guy65549432012-03-26 16:45:05 -070022
Romain Guy3b748a42013-04-17 18:54:38 -070023#include "android_view_GraphicBuffer.h"
24
Romain Guye4d01122010-06-16 18:44:05 -070025#include <android_runtime/AndroidRuntime.h>
Romain Guye5e0c502011-06-15 15:18:31 -070026#include <android_runtime/android_graphics_SurfaceTexture.h>
Romain Guy65549432012-03-26 16:45:05 -070027
Mathias Agopianb13b9bd2012-02-17 18:27:36 -080028#include <androidfw/ResourceTypes.h>
Romain Guye4d01122010-06-16 18:44:05 -070029
Romain Guy3b748a42013-04-17 18:54:38 -070030#include <gui/GLConsumer.h>
31
Romain Guy65549432012-03-26 16:45:05 -070032#include <private/hwui/DrawGlInfo.h>
33
34#include <cutils/properties.h>
Romain Guy8f0095c2011-05-02 17:24:22 -070035
Romain Guyce0537b2010-06-29 21:05:21 -070036#include <SkBitmap.h>
Romain Guyc7d53492010-06-25 13:41:57 -070037#include <SkCanvas.h>
Romain Guyf6a11b82010-06-23 17:47:49 -070038#include <SkMatrix.h>
Romain Guyc7d53492010-06-25 13:41:57 -070039#include <SkPaint.h>
Romain Guy079ba2c2010-07-16 14:12:24 -070040#include <SkRegion.h>
Romain Guya1db5742010-07-20 13:09:13 -070041#include <SkScalerContext.h>
Romain Guy61c8c9c2010-08-09 20:48:09 -070042#include <SkTemplates.h>
Romain Guy85bf02f2010-06-22 13:11:24 -070043#include <SkXfermode.h>
Romain Guye4d01122010-06-16 18:44:05 -070044
Romain Guyb051e892010-09-28 19:09:36 -070045#include <DisplayListRenderer.h>
Romain Guy6c319ca2011-01-11 14:29:25 -080046#include <LayerRenderer.h>
Romain Guy85bf02f2010-06-22 13:11:24 -070047#include <OpenGLRenderer.h>
Romain Guy06f96e22010-07-30 19:18:16 -070048#include <SkiaShader.h>
Romain Guy0baaac52012-08-31 20:31:01 -070049#include <Stencil.h>
Romain Guy9d5316e2010-06-24 19:30:36 -070050#include <Rect.h>
John Reck113e0822014-03-18 09:22:59 -070051#include <RenderNode.h>
Romain Guy85bf02f2010-06-22 13:11:24 -070052
Romain Guyd1d4bb72012-01-17 17:31:27 -080053#include <TextLayout.h>
Fabrice Di Megliob02d0ca2011-12-08 14:05:44 -080054#include <TextLayoutCache.h>
Romain Guye8e62a42010-07-23 18:55:21 -070055
Romain Guye4d01122010-06-16 18:44:05 -070056namespace android {
57
Romain Guy9d5316e2010-06-24 19:30:36 -070058using namespace uirenderer;
59
Romain Guy16393512010-08-08 00:14:31 -070060/**
61 * Note: OpenGLRenderer JNI layer is generated and compiled only on supported
62 * devices. This means all the logic must be compiled only when the
63 * preprocessor variable USE_OPENGL_RENDERER is defined.
64 */
65#ifdef USE_OPENGL_RENDERER
66
Romain Guy244ada12012-03-28 16:41:26 -070067// ----------------------------------------------------------------------------
Romain Guybdb801ca2010-10-04 17:22:29 -070068// Defines
Romain Guy244ada12012-03-28 16:41:26 -070069// ----------------------------------------------------------------------------
Romain Guybdb801ca2010-10-04 17:22:29 -070070
71// Debug
Romain Guye2d345e2010-09-24 18:39:22 -070072#define DEBUG_RENDERER 0
Romain Guybdb801ca2010-10-04 17:22:29 -070073
74// Debug
75#if DEBUG_RENDERER
Steve Block5baa3a62011-12-20 16:23:08 +000076 #define RENDERER_LOGD(...) ALOGD(__VA_ARGS__)
Romain Guybdb801ca2010-10-04 17:22:29 -070077#else
78 #define RENDERER_LOGD(...)
79#endif
Romain Guye2d345e2010-09-24 18:39:22 -070080
Romain Guya168d732011-03-18 16:50:13 -070081#define MODIFIER_SHADOW 1
82#define MODIFIER_SHADER 2
Romain Guya168d732011-03-18 16:50:13 -070083
Romain Guy9d5316e2010-06-24 19:30:36 -070084// ----------------------------------------------------------------------------
Romain Guy9d5316e2010-06-24 19:30:36 -070085
86static struct {
Romain Guy7ae7ac42010-06-25 13:46:18 -070087 jmethodID set;
Romain Guy9d5316e2010-06-24 19:30:36 -070088} gRectClassInfo;
89
Romain Guye4d01122010-06-16 18:44:05 -070090// ----------------------------------------------------------------------------
Romain Guy244ada12012-03-28 16:41:26 -070091// Caching
Romain Guy7d7b5492011-01-24 16:33:45 -080092// ----------------------------------------------------------------------------
93
Romain Guybdf76092011-07-18 15:00:43 -070094static void android_view_GLES20Canvas_flushCaches(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +000095 jint mode) {
Romain Guybdf76092011-07-18 15:00:43 -070096 if (Caches::hasInstance()) {
Ashok Bhat36bef0b2014-01-20 20:08:01 +000097 Caches::getInstance().flush(static_cast<Caches::FlushMode>(mode));
Romain Guybdf76092011-07-18 15:00:43 -070098 }
99}
100
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000101static jboolean android_view_GLES20Canvas_initCaches(JNIEnv* env, jobject clazz) {
Romain Guy8ff6b9e2011-11-09 20:10:18 -0800102 if (Caches::hasInstance()) {
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000103 return Caches::getInstance().init() ? JNI_TRUE : JNI_FALSE;
Romain Guy8ff6b9e2011-11-09 20:10:18 -0800104 }
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000105 return JNI_FALSE;
Romain Guy8ff6b9e2011-11-09 20:10:18 -0800106}
107
108static void android_view_GLES20Canvas_terminateCaches(JNIEnv* env, jobject clazz) {
109 if (Caches::hasInstance()) {
110 Caches::getInstance().terminate();
111 }
112}
113
Romain Guy7d7b5492011-01-24 16:33:45 -0800114// ----------------------------------------------------------------------------
Romain Guy3b748a42013-04-17 18:54:38 -0700115// Caching
116// ----------------------------------------------------------------------------
117
118static void android_view_GLES20Canvas_initAtlas(JNIEnv* env, jobject clazz,
Ashok Bhat17ab38f2014-01-27 16:00:23 +0000119 jobject graphicBuffer, jlongArray atlasMapArray, jint count) {
Romain Guy3b748a42013-04-17 18:54:38 -0700120
121 sp<GraphicBuffer> buffer = graphicBufferForJavaObject(env, graphicBuffer);
Ashok Bhat17ab38f2014-01-27 16:00:23 +0000122 jlong* jAtlasMap = env->GetLongArrayElements(atlasMapArray, NULL);
123 Caches::getInstance().assetAtlas.init(buffer, jAtlasMap, count);
124 env->ReleaseLongArrayElements(atlasMapArray, jAtlasMap, 0);
Romain Guy3b748a42013-04-17 18:54:38 -0700125}
126
127// ----------------------------------------------------------------------------
Romain Guye4d01122010-06-16 18:44:05 -0700128// Constructors
129// ----------------------------------------------------------------------------
130
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000131static jlong android_view_GLES20Canvas_createRenderer(JNIEnv* env, jobject clazz) {
Romain Guybdb801ca2010-10-04 17:22:29 -0700132 RENDERER_LOGD("Create OpenGLRenderer");
Romain Guy87e2f7572012-09-24 11:37:12 -0700133 OpenGLRenderer* renderer = new OpenGLRenderer();
134 renderer->initProperties();
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000135 return reinterpret_cast<jlong>(renderer);
Romain Guye4d01122010-06-16 18:44:05 -0700136}
137
Chet Haase5c13d892010-10-08 08:37:55 -0700138static void android_view_GLES20Canvas_destroyRenderer(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000139 jlong rendererPtr) {
Chris Craik9f66ea02013-12-27 15:15:55 -0800140 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
Romain Guybdb801ca2010-10-04 17:22:29 -0700141 RENDERER_LOGD("Destroy OpenGLRenderer");
Romain Guyf6a11b82010-06-23 17:47:49 -0700142 delete renderer;
Romain Guye4d01122010-06-16 18:44:05 -0700143}
144
145// ----------------------------------------------------------------------------
146// Setup
147// ----------------------------------------------------------------------------
148
Romain Guy7d7b5492011-01-24 16:33:45 -0800149static void android_view_GLES20Canvas_setViewport(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000150 jlong rendererPtr, jint width, jint height) {
Chris Craik9f66ea02013-12-27 15:15:55 -0800151 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
Romain Guyf6a11b82010-06-23 17:47:49 -0700152 renderer->setViewport(width, height);
Romain Guye4d01122010-06-16 18:44:05 -0700153}
154
Chet Haase44b2fe32012-06-06 19:03:58 -0700155static int android_view_GLES20Canvas_prepare(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000156 jlong rendererPtr, jboolean opaque) {
Chris Craik9f66ea02013-12-27 15:15:55 -0800157 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
Chet Haase44b2fe32012-06-06 19:03:58 -0700158 return renderer->prepare(opaque);
Romain Guye4d01122010-06-16 18:44:05 -0700159}
160
Chet Haase44b2fe32012-06-06 19:03:58 -0700161static int android_view_GLES20Canvas_prepareDirty(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000162 jlong rendererPtr, jint left, jint top, jint right, jint bottom,
Romain Guy7d7b5492011-01-24 16:33:45 -0800163 jboolean opaque) {
Chris Craik9f66ea02013-12-27 15:15:55 -0800164 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
Chet Haase44b2fe32012-06-06 19:03:58 -0700165 return renderer->prepareDirty(left, top, right, bottom, opaque);
Romain Guy7d7b5492011-01-24 16:33:45 -0800166}
167
168static void android_view_GLES20Canvas_finish(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000169 jlong rendererPtr) {
Chris Craik9f66ea02013-12-27 15:15:55 -0800170 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
Romain Guyb025b9c2010-09-16 14:16:48 -0700171 renderer->finish();
172}
173
Romain Guy530041d2012-01-25 18:56:29 -0800174static jint android_view_GLES20Canvas_getStencilSize(JNIEnv* env, jobject clazz) {
Romain Guy0baaac52012-08-31 20:31:01 -0700175 return Stencil::getStencilSize();
Romain Guy530041d2012-01-25 18:56:29 -0800176}
177
Chris Craikba9b6132013-12-15 17:10:19 -0800178static void android_view_GLES20Canvas_setProperty(JNIEnv* env,
179 jobject clazz, jstring name, jstring value) {
180 if (!Caches::hasInstance()) {
181 ALOGW("can't set property, no Caches instance");
182 return;
183 }
184
185 if (name == NULL || value == NULL) {
186 ALOGW("can't set prop, null passed");
187 }
188
189 const char* nameCharArray = env->GetStringUTFChars(name, NULL);
190 const char* valueCharArray = env->GetStringUTFChars(value, NULL);
191 Caches::getInstance().setTempProperty(nameCharArray, valueCharArray);
192 env->ReleaseStringUTFChars(name, nameCharArray);
193 env->ReleaseStringUTFChars(name, valueCharArray);
194}
195
Romain Guy530041d2012-01-25 18:56:29 -0800196// ----------------------------------------------------------------------------
197// Functor
198// ----------------------------------------------------------------------------
199
Romain Guy65549432012-03-26 16:45:05 -0700200static jint android_view_GLES20Canvas_callDrawGLFunction(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000201 jlong rendererPtr, jlong functorPtr) {
Chris Craik9f66ea02013-12-27 15:15:55 -0800202 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
203 Functor* functor = reinterpret_cast<Functor*>(functorPtr);
Romain Guycabfcc12011-03-07 18:06:46 -0800204 android::uirenderer::Rect dirty;
205 return renderer->callDrawGLFunction(functor, dirty);
Chet Haasedaf98e92011-01-10 14:10:36 -0800206}
207
Romain Guyba6be8a2012-04-23 18:22:09 -0700208static void android_view_GLES20Canvas_detachFunctor(JNIEnv* env,
Narayan Kamath017546e2014-02-06 11:50:31 +0000209 jobject clazz, jlong rendererPtr, jlong functorPtr) {
Chris Craik9f66ea02013-12-27 15:15:55 -0800210 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
211 Functor* functor = reinterpret_cast<Functor*>(functorPtr);
Romain Guyba6be8a2012-04-23 18:22:09 -0700212 renderer->detachFunctor(functor);
213}
214
215static void android_view_GLES20Canvas_attachFunctor(JNIEnv* env,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000216 jobject clazz, jlong rendererPtr, jlong functorPtr) {
Chris Craik9f66ea02013-12-27 15:15:55 -0800217 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
218 Functor* functor = reinterpret_cast<Functor*>(functorPtr);
Romain Guyba6be8a2012-04-23 18:22:09 -0700219 renderer->attachFunctor(functor);
220}
221
Romain Guy8f3b8e32012-03-27 16:33:45 -0700222static jint android_view_GLES20Canvas_invokeFunctors(JNIEnv* env,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000223 jobject clazz, jlong rendererPtr, jobject dirty) {
Chris Craik9f66ea02013-12-27 15:15:55 -0800224 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
Romain Guy8f3b8e32012-03-27 16:33:45 -0700225 android::uirenderer::Rect bounds;
226 status_t status = renderer->invokeFunctors(bounds);
227 if (status != DrawGlInfo::kStatusDone && dirty != NULL) {
228 env->CallVoidMethod(dirty, gRectClassInfo.set,
229 int(bounds.left), int(bounds.top), int(bounds.right), int(bounds.bottom));
230 }
231 return status;
232}
233
234// ----------------------------------------------------------------------------
235// Misc
236// ----------------------------------------------------------------------------
237
Romain Guyf61970fc2011-07-07 14:10:06 -0700238static jint android_view_GLES20Canvas_getMaxTextureWidth(JNIEnv* env, jobject clazz) {
239 return Caches::getInstance().maxTextureSize;
240}
241
242static jint android_view_GLES20Canvas_getMaxTextureHeight(JNIEnv* env, jobject clazz) {
243 return Caches::getInstance().maxTextureSize;
244}
245
Romain Guye4d01122010-06-16 18:44:05 -0700246// ----------------------------------------------------------------------------
Romain Guybb9524b2010-06-22 18:56:38 -0700247// State
248// ----------------------------------------------------------------------------
249
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000250static jint android_view_GLES20Canvas_save(JNIEnv* env, jobject clazz, jlong rendererPtr,
Romain Guybb9524b2010-06-22 18:56:38 -0700251 jint flags) {
Chris Craik9f66ea02013-12-27 15:15:55 -0800252 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
Romain Guyf6a11b82010-06-23 17:47:49 -0700253 return renderer->save(flags);
Romain Guybb9524b2010-06-22 18:56:38 -0700254}
255
Romain Guy7d7b5492011-01-24 16:33:45 -0800256static jint android_view_GLES20Canvas_getSaveCount(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000257 jlong rendererPtr) {
Chris Craik9f66ea02013-12-27 15:15:55 -0800258 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
Romain Guyf6a11b82010-06-23 17:47:49 -0700259 return renderer->getSaveCount();
Romain Guybb9524b2010-06-22 18:56:38 -0700260}
261
Romain Guy7d7b5492011-01-24 16:33:45 -0800262static void android_view_GLES20Canvas_restore(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000263 jlong rendererPtr) {
Chris Craik9f66ea02013-12-27 15:15:55 -0800264 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
Romain Guyf6a11b82010-06-23 17:47:49 -0700265 renderer->restore();
Romain Guybb9524b2010-06-22 18:56:38 -0700266}
267
Romain Guy7d7b5492011-01-24 16:33:45 -0800268static void android_view_GLES20Canvas_restoreToCount(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000269 jlong rendererPtr, jint saveCount) {
Chris Craik9f66ea02013-12-27 15:15:55 -0800270 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
Romain Guyf6a11b82010-06-23 17:47:49 -0700271 renderer->restoreToCount(saveCount);
Romain Guybb9524b2010-06-22 18:56:38 -0700272}
273
274// ----------------------------------------------------------------------------
Romain Guybd6b79b2010-06-26 00:13:53 -0700275// Layers
276// ----------------------------------------------------------------------------
277
Romain Guy7d7b5492011-01-24 16:33:45 -0800278static jint android_view_GLES20Canvas_saveLayer(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000279 jlong rendererPtr, jfloat left, jfloat top, jfloat right, jfloat bottom,
280 jlong paintPtr, jint saveFlags) {
Chris Craik9f66ea02013-12-27 15:15:55 -0800281 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
282 SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
Romain Guybd6b79b2010-06-26 00:13:53 -0700283 return renderer->saveLayer(left, top, right, bottom, paint, saveFlags);
284}
285
Romain Guy189887e2011-08-25 11:45:13 -0700286static jint android_view_GLES20Canvas_saveLayerClip(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000287 jlong rendererPtr, jlong paintPtr, jint saveFlags) {
Chris Craik9f66ea02013-12-27 15:15:55 -0800288 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
289 SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
Romain Guy189887e2011-08-25 11:45:13 -0700290 const android::uirenderer::Rect& bounds(renderer->getClipBounds());
291 return renderer->saveLayer(bounds.left, bounds.top, bounds.right, bounds.bottom,
292 paint, saveFlags);
293}
294
Romain Guy7d7b5492011-01-24 16:33:45 -0800295static jint android_view_GLES20Canvas_saveLayerAlpha(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000296 jlong rendererPtr, jfloat left, jfloat top, jfloat right, jfloat bottom,
Romain Guybd6b79b2010-06-26 00:13:53 -0700297 jint alpha, jint saveFlags) {
Chris Craik9f66ea02013-12-27 15:15:55 -0800298 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
Romain Guybd6b79b2010-06-26 00:13:53 -0700299 return renderer->saveLayerAlpha(left, top, right, bottom, alpha, saveFlags);
300}
301
Romain Guy189887e2011-08-25 11:45:13 -0700302static jint android_view_GLES20Canvas_saveLayerAlphaClip(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000303 jlong rendererPtr, jint alpha, jint saveFlags) {
Chris Craik9f66ea02013-12-27 15:15:55 -0800304 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
Romain Guy189887e2011-08-25 11:45:13 -0700305 const android::uirenderer::Rect& bounds(renderer->getClipBounds());
306 return renderer->saveLayerAlpha(bounds.left, bounds.top, bounds.right, bounds.bottom,
307 alpha, saveFlags);
308}
309
Romain Guybd6b79b2010-06-26 00:13:53 -0700310// ----------------------------------------------------------------------------
Romain Guybb9524b2010-06-22 18:56:38 -0700311// Clipping
312// ----------------------------------------------------------------------------
313
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000314static jboolean android_view_GLES20Canvas_quickReject(JNIEnv* env, jobject clazz,
315 jlong rendererPtr, jfloat left, jfloat top, jfloat right, jfloat bottom) {
Chris Craik9f66ea02013-12-27 15:15:55 -0800316 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000317 const bool result = renderer->quickRejectConservative(left, top, right, bottom);
318 return result ? JNI_TRUE : JNI_FALSE;
Romain Guyc7d53492010-06-25 13:41:57 -0700319}
320
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000321static jboolean android_view_GLES20Canvas_clipRectF(JNIEnv* env, jobject clazz,
322 jlong rendererPtr, jfloat left, jfloat top, jfloat right, jfloat bottom,
323 jint op) {
Chris Craik9f66ea02013-12-27 15:15:55 -0800324 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000325 const bool result = renderer->clipRect(left, top, right, bottom,
326 static_cast<SkRegion::Op>(op));
327 return result ? JNI_TRUE : JNI_FALSE;
Romain Guybb9524b2010-06-22 18:56:38 -0700328}
329
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000330static jboolean android_view_GLES20Canvas_clipRect(JNIEnv* env, jobject clazz,
331 jlong rendererPtr, jint left, jint top, jint right, jint bottom,
332 jint op) {
Chris Craik9f66ea02013-12-27 15:15:55 -0800333 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000334 const bool result = renderer->clipRect(float(left), float(top), float(right),
335 float(bottom),
336 static_cast<SkRegion::Op>(op));
337 return result ? JNI_TRUE : JNI_FALSE;
Romain Guyf6a11b82010-06-23 17:47:49 -0700338}
Romain Guybb9524b2010-06-22 18:56:38 -0700339
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000340static jboolean android_view_GLES20Canvas_clipPath(JNIEnv* env, jobject clazz,
341 jlong rendererPtr, jlong pathPtr, jint op) {
Chris Craik9f66ea02013-12-27 15:15:55 -0800342 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
343 SkPath* path = reinterpret_cast<SkPath*>(pathPtr);
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000344 const bool result = renderer->clipPath(path, static_cast<SkRegion::Op>(op));
345 return result ? JNI_TRUE : JNI_FALSE;
Romain Guy735738c2012-12-03 12:34:51 -0800346}
347
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000348static jboolean android_view_GLES20Canvas_clipRegion(JNIEnv* env, jobject clazz,
349 jlong rendererPtr, jlong regionPtr, jint op) {
Chris Craik9f66ea02013-12-27 15:15:55 -0800350 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
351 SkRegion* region = reinterpret_cast<SkRegion*>(regionPtr);
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000352 const bool result = renderer->clipRegion(region, static_cast<SkRegion::Op>(op));
353 return result ? JNI_TRUE : JNI_FALSE;
Romain Guy735738c2012-12-03 12:34:51 -0800354}
355
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000356static jboolean android_view_GLES20Canvas_getClipBounds(JNIEnv* env, jobject clazz,
357 jlong rendererPtr, jobject rect) {
Chris Craik9f66ea02013-12-27 15:15:55 -0800358 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
Romain Guy7ae7ac42010-06-25 13:46:18 -0700359 const android::uirenderer::Rect& bounds(renderer->getClipBounds());
Romain Guy9d5316e2010-06-24 19:30:36 -0700360
Romain Guy7ae7ac42010-06-25 13:46:18 -0700361 env->CallVoidMethod(rect, gRectClassInfo.set,
362 int(bounds.left), int(bounds.top), int(bounds.right), int(bounds.bottom));
Romain Guy9d5316e2010-06-24 19:30:36 -0700363
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000364 return !bounds.isEmpty() ? JNI_TRUE : JNI_FALSE;
Romain Guy9d5316e2010-06-24 19:30:36 -0700365}
366
Romain Guyf6a11b82010-06-23 17:47:49 -0700367// ----------------------------------------------------------------------------
368// Transforms
369// ----------------------------------------------------------------------------
370
Romain Guy7d7b5492011-01-24 16:33:45 -0800371static void android_view_GLES20Canvas_translate(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000372 jlong rendererPtr, jfloat dx, jfloat dy) {
Chris Craik9f66ea02013-12-27 15:15:55 -0800373 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
Romain Guy7ae7ac42010-06-25 13:46:18 -0700374 renderer->translate(dx, dy);
Romain Guyf6a11b82010-06-23 17:47:49 -0700375}
376
Romain Guy7d7b5492011-01-24 16:33:45 -0800377static void android_view_GLES20Canvas_rotate(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000378 jlong rendererPtr, jfloat degrees) {
Chris Craik9f66ea02013-12-27 15:15:55 -0800379 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
Romain Guy7ae7ac42010-06-25 13:46:18 -0700380 renderer->rotate(degrees);
Romain Guyf6a11b82010-06-23 17:47:49 -0700381}
382
Romain Guy7d7b5492011-01-24 16:33:45 -0800383static void android_view_GLES20Canvas_scale(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000384 jlong rendererPtr, jfloat sx, jfloat sy) {
Chris Craik9f66ea02013-12-27 15:15:55 -0800385 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
Romain Guy7ae7ac42010-06-25 13:46:18 -0700386 renderer->scale(sx, sy);
Romain Guyf6a11b82010-06-23 17:47:49 -0700387}
388
Romain Guy7d7b5492011-01-24 16:33:45 -0800389static void android_view_GLES20Canvas_skew(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000390 jlong rendererPtr, jfloat sx, jfloat sy) {
Chris Craik9f66ea02013-12-27 15:15:55 -0800391 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
Romain Guy807daf72011-01-18 11:19:19 -0800392 renderer->skew(sx, sy);
393}
394
Romain Guy7d7b5492011-01-24 16:33:45 -0800395static void android_view_GLES20Canvas_setMatrix(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000396 jlong rendererPtr, jlong matrixPtr) {
Chris Craik9f66ea02013-12-27 15:15:55 -0800397 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
398 SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixPtr);
Romain Guy7ae7ac42010-06-25 13:46:18 -0700399 renderer->setMatrix(matrix);
Romain Guyf6a11b82010-06-23 17:47:49 -0700400}
401
Romain Guy7d7b5492011-01-24 16:33:45 -0800402static void android_view_GLES20Canvas_getMatrix(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000403 jlong rendererPtr, jlong matrixPtr) {
Chris Craik9f66ea02013-12-27 15:15:55 -0800404 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
405 SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixPtr);
Romain Guy7ae7ac42010-06-25 13:46:18 -0700406 renderer->getMatrix(matrix);
Romain Guyf6a11b82010-06-23 17:47:49 -0700407}
408
Romain Guy7d7b5492011-01-24 16:33:45 -0800409static void android_view_GLES20Canvas_concatMatrix(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000410 jlong rendererPtr, jlong matrixPtr) {
Chris Craik9f66ea02013-12-27 15:15:55 -0800411 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
412 SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixPtr);
Romain Guy7ae7ac42010-06-25 13:46:18 -0700413 renderer->concatMatrix(matrix);
Romain Guybb9524b2010-06-22 18:56:38 -0700414}
415
416// ----------------------------------------------------------------------------
417// Drawing
Romain Guy85bf02f2010-06-22 13:11:24 -0700418// ----------------------------------------------------------------------------
419
Romain Guy7d7b5492011-01-24 16:33:45 -0800420static void android_view_GLES20Canvas_drawBitmap(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000421 jlong rendererPtr, jlong bitmapPtr, jbyteArray buffer,
422 jfloat left, jfloat top, jlong paintPtr) {
Chris Craik9f66ea02013-12-27 15:15:55 -0800423 SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapPtr);
Chris Craik0c20c382013-07-02 10:48:54 -0700424 // This object allows the renderer to allocate a global JNI ref to the buffer object.
425 JavaHeapBitmapRef bitmapRef(env, bitmap, buffer);
426
Chris Craik9f66ea02013-12-27 15:15:55 -0800427 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
428 SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
Romain Guydbd77cd2010-07-09 10:36:05 -0700429 renderer->drawBitmap(bitmap, left, top, paint);
Romain Guy85bf02f2010-06-22 13:11:24 -0700430}
431
Romain Guy7d7b5492011-01-24 16:33:45 -0800432static void android_view_GLES20Canvas_drawBitmapRect(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000433 jlong rendererPtr, jlong bitmapPtr, jbyteArray buffer,
Romain Guyce0537b2010-06-29 21:05:21 -0700434 float srcLeft, float srcTop, float srcRight, float srcBottom,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000435 float dstLeft, float dstTop, float dstRight, float dstBottom, jlong paintPtr) {
Chris Craik9f66ea02013-12-27 15:15:55 -0800436 SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapPtr);
Chris Craik0c20c382013-07-02 10:48:54 -0700437 // This object allows the renderer to allocate a global JNI ref to the buffer object.
438 JavaHeapBitmapRef bitmapRef(env, bitmap, buffer);
439
Chris Craik9f66ea02013-12-27 15:15:55 -0800440 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
441 SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
Romain Guydbd77cd2010-07-09 10:36:05 -0700442 renderer->drawBitmap(bitmap, srcLeft, srcTop, srcRight, srcBottom,
443 dstLeft, dstTop, dstRight, dstBottom, paint);
Romain Guyf86ef572010-07-01 11:05:42 -0700444}
Romain Guy8ba548f2010-06-30 19:21:21 -0700445
Romain Guy7d7b5492011-01-24 16:33:45 -0800446static void android_view_GLES20Canvas_drawBitmapMatrix(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000447 jlong rendererPtr, jlong bitmapPtr, jbyteArray buffer,
448 jlong matrixPtr, jlong paintPtr) {
Chris Craik9f66ea02013-12-27 15:15:55 -0800449 SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapPtr);
Chris Craik0c20c382013-07-02 10:48:54 -0700450 // This object allows the renderer to allocate a global JNI ref to the buffer object.
451 JavaHeapBitmapRef bitmapRef(env, bitmap, buffer);
452
Chris Craik9f66ea02013-12-27 15:15:55 -0800453 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
454 SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixPtr);
455 SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
Romain Guydbd77cd2010-07-09 10:36:05 -0700456 renderer->drawBitmap(bitmap, matrix, paint);
Romain Guyce0537b2010-06-29 21:05:21 -0700457}
458
Romain Guye651cc62012-05-14 19:44:40 -0700459static void android_view_GLES20Canvas_drawBitmapData(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000460 jlong rendererPtr, jintArray colors, jint offset, jint stride,
461 jfloat left, jfloat top, jint width, jint height, jboolean hasAlpha, jlong paintPtr) {
Romain Guy49c5fc02012-05-15 11:10:01 -0700462 SkBitmap* bitmap = new SkBitmap;
463 bitmap->setConfig(hasAlpha ? SkBitmap::kARGB_8888_Config : SkBitmap::kRGB_565_Config,
464 width, height);
Romain Guye651cc62012-05-14 19:44:40 -0700465
Romain Guy49c5fc02012-05-15 11:10:01 -0700466 if (!bitmap->allocPixels()) {
467 delete bitmap;
Romain Guye651cc62012-05-14 19:44:40 -0700468 return;
469 }
470
Chris Craik1abf5d62013-08-16 12:47:03 -0700471 if (!GraphicsJNI::SetPixels(env, colors, offset, stride, 0, 0, width, height, *bitmap, true)) {
Romain Guy49c5fc02012-05-15 11:10:01 -0700472 delete bitmap;
Romain Guye651cc62012-05-14 19:44:40 -0700473 return;
474 }
475
Chris Craik9f66ea02013-12-27 15:15:55 -0800476 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
477 SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
Romain Guy49c5fc02012-05-15 11:10:01 -0700478 renderer->drawBitmapData(bitmap, left, top, paint);
479
480 // If the renderer is a deferred renderer it will own the bitmap
Chris Craikb4589422013-12-26 15:13:13 -0800481 if (!renderer->isRecording()) {
Romain Guy49c5fc02012-05-15 11:10:01 -0700482 delete bitmap;
483 }
Romain Guye651cc62012-05-14 19:44:40 -0700484}
485
Romain Guy7d7b5492011-01-24 16:33:45 -0800486static void android_view_GLES20Canvas_drawBitmapMesh(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000487 jlong rendererPtr, jlong bitmapPtr, jbyteArray buffer,
Chris Craik0c20c382013-07-02 10:48:54 -0700488 jint meshWidth, jint meshHeight, jfloatArray vertices, jint offset, jintArray colors,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000489 jint colorOffset, jlong paintPtr) {
Chris Craik9f66ea02013-12-27 15:15:55 -0800490 SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapPtr);
Chris Craik0c20c382013-07-02 10:48:54 -0700491 // This object allows the renderer to allocate a global JNI ref to the buffer object.
492 JavaHeapBitmapRef bitmapRef(env, bitmap, buffer);
493
Romain Guy5a7b4662011-01-20 19:09:30 -0800494 jfloat* verticesArray = vertices ? env->GetFloatArrayElements(vertices, NULL) + offset : NULL;
495 jint* colorsArray = colors ? env->GetIntArrayElements(colors, NULL) + colorOffset : NULL;
496
Chris Craik9f66ea02013-12-27 15:15:55 -0800497 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
498 SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
Romain Guy5a7b4662011-01-20 19:09:30 -0800499 renderer->drawBitmapMesh(bitmap, meshWidth, meshHeight, verticesArray, colorsArray, paint);
500
501 if (vertices) env->ReleaseFloatArrayElements(vertices, verticesArray, 0);
502 if (colors) env->ReleaseIntArrayElements(colors, colorsArray, 0);
503}
504
Romain Guy7d7b5492011-01-24 16:33:45 -0800505static void android_view_GLES20Canvas_drawPatch(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000506 jlong rendererPtr, jlong bitmapPtr, jbyteArray buffer, jlong patchPtr,
507 float left, float top, float right, float bottom, jlong paintPtr) {
Chris Craik9f66ea02013-12-27 15:15:55 -0800508 SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapPtr);
Chris Craik0c20c382013-07-02 10:48:54 -0700509 // This object allows the renderer to allocate a global JNI ref to the buffer object.
510 JavaHeapBitmapRef bitmapRef(env, bitmap, buffer);
511
Chris Craik9f66ea02013-12-27 15:15:55 -0800512 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
513 Res_png_9patch* patch = reinterpret_cast<Res_png_9patch*>(patchPtr);
514 SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
Romain Guy3b748a42013-04-17 18:54:38 -0700515 renderer->drawPatch(bitmap, patch, left, top, right, bottom, paint);
Romain Guydeba7852010-07-07 17:54:48 -0700516}
517
Romain Guy7d7b5492011-01-24 16:33:45 -0800518static void android_view_GLES20Canvas_drawColor(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000519 jlong rendererPtr, jint color, jint mode) {
Chris Craik9f66ea02013-12-27 15:15:55 -0800520 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000521 renderer->drawColor(color, static_cast<SkXfermode::Mode>(mode));
Romain Guyce0537b2010-06-29 21:05:21 -0700522}
523
Romain Guy7d7b5492011-01-24 16:33:45 -0800524static void android_view_GLES20Canvas_drawRect(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000525 jlong rendererPtr, jfloat left, jfloat top, jfloat right, jfloat bottom,
526 jlong paintPtr) {
Chris Craik9f66ea02013-12-27 15:15:55 -0800527 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
528 SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
Romain Guyc7d53492010-06-25 13:41:57 -0700529 renderer->drawRect(left, top, right, bottom, paint);
530}
531
Romain Guy7d7b5492011-01-24 16:33:45 -0800532static void android_view_GLES20Canvas_drawRoundRect(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000533 jlong rendererPtr, jfloat left, jfloat top, jfloat right, jfloat bottom,
534 jfloat rx, jfloat ry, jlong paintPtr) {
Chris Craik9f66ea02013-12-27 15:15:55 -0800535 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
536 SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
Romain Guy01d58e42011-01-19 21:54:02 -0800537 renderer->drawRoundRect(left, top, right, bottom, rx, ry, paint);
538}
539
Romain Guy7d7b5492011-01-24 16:33:45 -0800540static void android_view_GLES20Canvas_drawCircle(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000541 jlong rendererPtr, jfloat x, jfloat y, jfloat radius, jlong paintPtr) {
Chris Craik9f66ea02013-12-27 15:15:55 -0800542 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
543 SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
Romain Guy01d58e42011-01-19 21:54:02 -0800544 renderer->drawCircle(x, y, radius, paint);
545}
546
Romain Guy7d7b5492011-01-24 16:33:45 -0800547static void android_view_GLES20Canvas_drawOval(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000548 jlong rendererPtr, jfloat left, jfloat top, jfloat right, jfloat bottom,
549 jlong paintPtr) {
Chris Craik9f66ea02013-12-27 15:15:55 -0800550 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
551 SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
Romain Guyc1cd9ba32011-01-23 14:18:41 -0800552 renderer->drawOval(left, top, right, bottom, paint);
553}
554
Romain Guy7d7b5492011-01-24 16:33:45 -0800555static void android_view_GLES20Canvas_drawArc(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000556 jlong rendererPtr, jfloat left, jfloat top, jfloat right, jfloat bottom,
557 jfloat startAngle, jfloat sweepAngle, jboolean useCenter, jlong paintPtr) {
Chris Craik9f66ea02013-12-27 15:15:55 -0800558 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
559 SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
Romain Guy8b2f5262011-01-23 16:15:02 -0800560 renderer->drawArc(left, top, right, bottom, startAngle, sweepAngle, useCenter, paint);
561}
562
Romain Guy672433d2013-01-04 19:05:13 -0800563static void android_view_GLES20Canvas_drawRegionAsRects(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000564 jlong rendererPtr, jlong regionPtr, jlong paintPtr) {
Chris Craik9f66ea02013-12-27 15:15:55 -0800565 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
566 SkRegion* region = reinterpret_cast<SkRegion*>(regionPtr);
567 SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
Romain Guy672433d2013-01-04 19:05:13 -0800568 if (paint->getStyle() != SkPaint::kFill_Style ||
569 (paint->isAntiAlias() && !renderer->isCurrentTransformSimple())) {
570 SkRegion::Iterator it(*region);
571 while (!it.done()) {
572 const SkIRect& r = it.rect();
573 renderer->drawRect(r.fLeft, r.fTop, r.fRight, r.fBottom, paint);
574 it.next();
575 }
576 } else {
577 int count = 0;
578 Vector<float> rects;
579 SkRegion::Iterator it(*region);
580 while (!it.done()) {
581 const SkIRect& r = it.rect();
582 rects.push(r.fLeft);
583 rects.push(r.fTop);
584 rects.push(r.fRight);
585 rects.push(r.fBottom);
Chris Craik2af46352012-11-26 18:30:17 -0800586 count += 4;
Romain Guy672433d2013-01-04 19:05:13 -0800587 it.next();
588 }
589 renderer->drawRects(rects.array(), count, paint);
Romain Guya48a1a82010-08-10 14:59:15 -0700590 }
591}
592
Romain Guy672433d2013-01-04 19:05:13 -0800593static void android_view_GLES20Canvas_drawRects(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000594 jlong rendererPtr, jfloatArray rects, jint count, jlong paintPtr) {
Chris Craik9f66ea02013-12-27 15:15:55 -0800595 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
Romain Guy672433d2013-01-04 19:05:13 -0800596 jfloat* storage = env->GetFloatArrayElements(rects, NULL);
Chris Craik9f66ea02013-12-27 15:15:55 -0800597 SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
Romain Guy672433d2013-01-04 19:05:13 -0800598 renderer->drawRects(storage, count, paint);
599 env->ReleaseFloatArrayElements(rects, storage, 0);
600}
601
Romain Guyed6fcb02011-03-21 13:11:28 -0700602static void android_view_GLES20Canvas_drawPoints(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000603 jlong rendererPtr, jfloatArray points, jint offset, jint count, jlong paintPtr) {
Chris Craik9f66ea02013-12-27 15:15:55 -0800604 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
Romain Guyed6fcb02011-03-21 13:11:28 -0700605 jfloat* storage = env->GetFloatArrayElements(points, NULL);
Chris Craik9f66ea02013-12-27 15:15:55 -0800606 SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
Romain Guyed6fcb02011-03-21 13:11:28 -0700607 renderer->drawPoints(storage + offset, count, paint);
608 env->ReleaseFloatArrayElements(points, storage, 0);
609}
610
Romain Guy7d7b5492011-01-24 16:33:45 -0800611static void android_view_GLES20Canvas_drawPath(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000612 jlong rendererPtr, jlong pathPtr, jlong paintPtr) {
Chris Craik9f66ea02013-12-27 15:15:55 -0800613 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
614 SkPath* path = reinterpret_cast<SkPath*>(pathPtr);
615 SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
Romain Guy7fbcc042010-08-04 15:40:07 -0700616 renderer->drawPath(path, paint);
617}
618
Romain Guy7d7b5492011-01-24 16:33:45 -0800619static void android_view_GLES20Canvas_drawLines(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000620 jlong rendererPtr, jfloatArray points, jint offset, jint count, jlong paintPtr) {
Chris Craik9f66ea02013-12-27 15:15:55 -0800621 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
Romain Guy759ea802010-09-16 20:49:46 -0700622 jfloat* storage = env->GetFloatArrayElements(points, NULL);
Chris Craik9f66ea02013-12-27 15:15:55 -0800623 SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
Romain Guy759ea802010-09-16 20:49:46 -0700624 renderer->drawLines(storage + offset, count, paint);
Romain Guy759ea802010-09-16 20:49:46 -0700625 env->ReleaseFloatArrayElements(points, storage, 0);
626}
627
Romain Guy85bf02f2010-06-22 13:11:24 -0700628// ----------------------------------------------------------------------------
Romain Guydb1938e2010-08-02 18:50:22 -0700629// Shaders and color filters
Romain Guyd27977d2010-07-14 19:18:51 -0700630// ----------------------------------------------------------------------------
631
Romain Guy7d7b5492011-01-24 16:33:45 -0800632static void android_view_GLES20Canvas_resetModifiers(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000633 jlong rendererPtr, jint modifiers) {
Chris Craik9f66ea02013-12-27 15:15:55 -0800634 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
Romain Guya168d732011-03-18 16:50:13 -0700635 if (modifiers & MODIFIER_SHADOW) renderer->resetShadow();
636 if (modifiers & MODIFIER_SHADER) renderer->resetShader();
Romain Guyd27977d2010-07-14 19:18:51 -0700637}
638
Romain Guy7d7b5492011-01-24 16:33:45 -0800639static void android_view_GLES20Canvas_setupShader(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000640 jlong rendererPtr, jlong shaderPtr) {
Chris Craik9f66ea02013-12-27 15:15:55 -0800641 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
642 SkiaShader* shader = reinterpret_cast<SkiaShader*>(shaderPtr);
Romain Guy06f96e22010-07-30 19:18:16 -0700643 renderer->setupShader(shader);
Romain Guy7fac2e12010-07-16 17:10:13 -0700644}
645
Romain Guydb1938e2010-08-02 18:50:22 -0700646
Romain Guy7d7b5492011-01-24 16:33:45 -0800647static void android_view_GLES20Canvas_setupShadow(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000648 jlong rendererPtr, jfloat radius, jfloat dx, jfloat dy, jint color) {
Chris Craik9f66ea02013-12-27 15:15:55 -0800649 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
Romain Guy1e45aae2010-08-13 19:39:53 -0700650 renderer->setupShadow(radius, dx, dy, color);
651}
652
Romain Guyd27977d2010-07-14 19:18:51 -0700653// ----------------------------------------------------------------------------
Romain Guy5ff9df62012-01-23 17:09:05 -0800654// Draw filters
655// ----------------------------------------------------------------------------
656
657static void android_view_GLES20Canvas_setupPaintFilter(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000658 jlong rendererPtr, jint clearBits, jint setBits) {
Chris Craik9f66ea02013-12-27 15:15:55 -0800659 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
Romain Guy5ff9df62012-01-23 17:09:05 -0800660 renderer->setupPaintFilter(clearBits, setBits);
661}
662
663static void android_view_GLES20Canvas_resetPaintFilter(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000664 jlong rendererPtr) {
Chris Craik9f66ea02013-12-27 15:15:55 -0800665 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
Romain Guy5ff9df62012-01-23 17:09:05 -0800666 renderer->resetPaintFilter();
667}
668
669// ----------------------------------------------------------------------------
Romain Guya1db5742010-07-20 13:09:13 -0700670// Text
671// ----------------------------------------------------------------------------
672
Chris Craik41541822013-05-03 16:35:54 -0700673static float xOffsetForTextAlign(SkPaint* paint, float totalAdvance) {
674 switch (paint->getTextAlign()) {
675 case SkPaint::kCenter_Align:
676 return -totalAdvance / 2.0f;
677 break;
678 case SkPaint::kRight_Align:
679 return -totalAdvance;
680 break;
681 default:
682 break;
683 }
684 return 0;
685}
686
Romain Guye8e62a42010-07-23 18:55:21 -0700687static void renderText(OpenGLRenderer* renderer, const jchar* text, int count,
Fabrice Di Meglioda12f382013-03-15 11:26:56 -0700688 jfloat x, jfloat y, int flags, SkPaint* paint) {
Fabrice Di Meglioa731b082012-01-23 18:18:45 -0800689 sp<TextLayoutValue> value = TextLayoutEngine::getInstance().getValue(paint,
Fabrice Di Meglioda12f382013-03-15 11:26:56 -0700690 text, 0, count, count, flags);
Fabrice Di Meglio2ea758802011-05-12 17:42:06 -0700691 if (value == NULL) {
Fabrice Di Megliob02d0ca2011-12-08 14:05:44 -0800692 return;
Fabrice Di Meglio2ea758802011-05-12 17:42:06 -0700693 }
Fabrice Di Meglio5c863f72011-10-05 18:11:59 -0700694 const jchar* glyphs = value->getGlyphs();
695 size_t glyphsCount = value->getGlyphsCount();
Raph Levien996e57c2012-07-23 15:22:52 -0700696 jfloat totalAdvance = value->getTotalAdvance();
Romain Guyb15b4462013-08-12 13:25:29 -0700697 x += xOffsetForTextAlign(paint, totalAdvance);
Raph Levien996e57c2012-07-23 15:22:52 -0700698 const float* positions = value->getPos();
Fabrice Di Meglio79df5322011-09-19 15:17:56 -0700699 int bytesCount = glyphsCount * sizeof(jchar);
Chris Craik41541822013-05-03 16:35:54 -0700700 const SkRect& r = value->getBounds();
701 android::uirenderer::Rect bounds(r.fLeft, r.fTop, r.fRight, r.fBottom);
Chris Craikf09b7462013-06-17 15:17:11 -0700702 bounds.translate(x, y);
Chris Craik41541822013-05-03 16:35:54 -0700703
704 renderer->drawText((const char*) glyphs, bytesCount, glyphsCount,
Romain Guyb15b4462013-08-12 13:25:29 -0700705 x, y, positions, paint, totalAdvance, bounds);
Romain Guye8e62a42010-07-23 18:55:21 -0700706}
707
Romain Guy325740f2012-02-24 16:48:34 -0800708static void renderTextOnPath(OpenGLRenderer* renderer, const jchar* text, int count,
Fabrice Di Meglioda12f382013-03-15 11:26:56 -0700709 SkPath* path, jfloat hOffset, jfloat vOffset, int flags, SkPaint* paint) {
Romain Guy325740f2012-02-24 16:48:34 -0800710 sp<TextLayoutValue> value = TextLayoutEngine::getInstance().getValue(paint,
Fabrice Di Meglioda12f382013-03-15 11:26:56 -0700711 text, 0, count, count, flags);
Romain Guy325740f2012-02-24 16:48:34 -0800712 if (value == NULL) {
713 return;
714 }
715 const jchar* glyphs = value->getGlyphs();
716 size_t glyphsCount = value->getGlyphsCount();
717 int bytesCount = glyphsCount * sizeof(jchar);
718 renderer->drawTextOnPath((const char*) glyphs, bytesCount, glyphsCount, path,
719 hOffset, vOffset, paint);
720}
721
Romain Guy61c8c9c2010-08-09 20:48:09 -0700722static void renderTextRun(OpenGLRenderer* renderer, const jchar* text,
723 jint start, jint count, jint contextCount, jfloat x, jfloat y,
Fabrice Di Meglioda12f382013-03-15 11:26:56 -0700724 int flags, SkPaint* paint) {
Fabrice Di Meglioa731b082012-01-23 18:18:45 -0800725 sp<TextLayoutValue> value = TextLayoutEngine::getInstance().getValue(paint,
Fabrice Di Meglioda12f382013-03-15 11:26:56 -0700726 text, start, count, contextCount, flags);
Fabrice Di Meglio2ea758802011-05-12 17:42:06 -0700727 if (value == NULL) {
Fabrice Di Megliob02d0ca2011-12-08 14:05:44 -0800728 return;
Fabrice Di Meglio2ea758802011-05-12 17:42:06 -0700729 }
Fabrice Di Meglio5c863f72011-10-05 18:11:59 -0700730 const jchar* glyphs = value->getGlyphs();
731 size_t glyphsCount = value->getGlyphsCount();
Raph Levien996e57c2012-07-23 15:22:52 -0700732 jfloat totalAdvance = value->getTotalAdvance();
Romain Guyb15b4462013-08-12 13:25:29 -0700733 x += xOffsetForTextAlign(paint, totalAdvance);
Raph Levien996e57c2012-07-23 15:22:52 -0700734 const float* positions = value->getPos();
Fabrice Di Meglio79df5322011-09-19 15:17:56 -0700735 int bytesCount = glyphsCount * sizeof(jchar);
Chris Craik41541822013-05-03 16:35:54 -0700736 const SkRect& r = value->getBounds();
737 android::uirenderer::Rect bounds(r.fLeft, r.fTop, r.fRight, r.fBottom);
Chris Craikf09b7462013-06-17 15:17:11 -0700738 bounds.translate(x, y);
Chris Craik41541822013-05-03 16:35:54 -0700739
740 renderer->drawText((const char*) glyphs, bytesCount, glyphsCount,
Romain Guyb15b4462013-08-12 13:25:29 -0700741 x, y, positions, paint, totalAdvance, bounds);
Romain Guy61c8c9c2010-08-09 20:48:09 -0700742}
743
Romain Guy7d7b5492011-01-24 16:33:45 -0800744static void android_view_GLES20Canvas_drawTextArray(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000745 jlong rendererPtr, jcharArray text, jint index, jint count,
746 jfloat x, jfloat y, jint flags, jlong paintPtr) {
Chris Craik9f66ea02013-12-27 15:15:55 -0800747 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
Romain Guya1db5742010-07-20 13:09:13 -0700748 jchar* textArray = env->GetCharArrayElements(text, NULL);
Chris Craik9f66ea02013-12-27 15:15:55 -0800749 SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
750
Fabrice Di Meglioda12f382013-03-15 11:26:56 -0700751 renderText(renderer, textArray + index, count, x, y, flags, paint);
Romain Guya1db5742010-07-20 13:09:13 -0700752 env->ReleaseCharArrayElements(text, textArray, JNI_ABORT);
753}
754
Romain Guy7d7b5492011-01-24 16:33:45 -0800755static void android_view_GLES20Canvas_drawText(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000756 jlong rendererPtr, jstring text, jint start, jint end,
757 jfloat x, jfloat y, jint flags, jlong paintPtr) {
Chris Craik9f66ea02013-12-27 15:15:55 -0800758 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
Romain Guya1db5742010-07-20 13:09:13 -0700759 const jchar* textArray = env->GetStringChars(text, NULL);
Chris Craik9f66ea02013-12-27 15:15:55 -0800760 SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
761
Fabrice Di Meglioda12f382013-03-15 11:26:56 -0700762 renderText(renderer, textArray + start, end - start, x, y, flags, paint);
Romain Guya1db5742010-07-20 13:09:13 -0700763 env->ReleaseStringChars(text, textArray);
764}
765
Romain Guy325740f2012-02-24 16:48:34 -0800766static void android_view_GLES20Canvas_drawTextArrayOnPath(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000767 jlong rendererPtr, jcharArray text, jint index, jint count,
768 jlong pathPtr, jfloat hOffset, jfloat vOffset, jint flags, jlong paintPtr) {
Chris Craik9f66ea02013-12-27 15:15:55 -0800769 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
Romain Guy325740f2012-02-24 16:48:34 -0800770 jchar* textArray = env->GetCharArrayElements(text, NULL);
Chris Craik9f66ea02013-12-27 15:15:55 -0800771 SkPath* path = reinterpret_cast<SkPath*>(pathPtr);
772 SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
773
Romain Guy325740f2012-02-24 16:48:34 -0800774 renderTextOnPath(renderer, textArray + index, count, path,
Fabrice Di Meglioda12f382013-03-15 11:26:56 -0700775 hOffset, vOffset, flags, paint);
Romain Guy325740f2012-02-24 16:48:34 -0800776 env->ReleaseCharArrayElements(text, textArray, JNI_ABORT);
777}
778
779static void android_view_GLES20Canvas_drawTextOnPath(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000780 jlong rendererPtr, jstring text, jint start, jint end,
781 jlong pathPtr, jfloat hOffset, jfloat vOffset, jint flags, jlong paintPtr) {
Chris Craik9f66ea02013-12-27 15:15:55 -0800782 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
Romain Guy325740f2012-02-24 16:48:34 -0800783 const jchar* textArray = env->GetStringChars(text, NULL);
Chris Craik9f66ea02013-12-27 15:15:55 -0800784 SkPath* path = reinterpret_cast<SkPath*>(pathPtr);
785 SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
786
Romain Guy325740f2012-02-24 16:48:34 -0800787 renderTextOnPath(renderer, textArray + start, end - start, path,
Fabrice Di Meglioda12f382013-03-15 11:26:56 -0700788 hOffset, vOffset, flags, paint);
Romain Guy325740f2012-02-24 16:48:34 -0800789 env->ReleaseStringChars(text, textArray);
790}
791
Romain Guy7d7b5492011-01-24 16:33:45 -0800792static void android_view_GLES20Canvas_drawTextRunArray(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000793 jlong rendererPtr, jcharArray text, jint index, jint count,
Fabrice Di Meglioda12f382013-03-15 11:26:56 -0700794 jint contextIndex, jint contextCount, jfloat x, jfloat y, jint dirFlags,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000795 jlong paintPtr) {
Chris Craik9f66ea02013-12-27 15:15:55 -0800796 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
Romain Guy61c8c9c2010-08-09 20:48:09 -0700797 jchar* textArray = env->GetCharArrayElements(text, NULL);
Chris Craik9f66ea02013-12-27 15:15:55 -0800798 SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
799
Romain Guy61c8c9c2010-08-09 20:48:09 -0700800 renderTextRun(renderer, textArray + contextIndex, index - contextIndex,
Fabrice Di Meglioda12f382013-03-15 11:26:56 -0700801 count, contextCount, x, y, dirFlags, paint);
Romain Guy61c8c9c2010-08-09 20:48:09 -0700802 env->ReleaseCharArrayElements(text, textArray, JNI_ABORT);
803 }
804
Romain Guy7d7b5492011-01-24 16:33:45 -0800805static void android_view_GLES20Canvas_drawTextRun(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000806 jlong rendererPtr, jstring text, jint start, jint end,
Fabrice Di Meglioda12f382013-03-15 11:26:56 -0700807 jint contextStart, int contextEnd, jfloat x, jfloat y, jint dirFlags,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000808 jlong paintPtr) {
Chris Craik9f66ea02013-12-27 15:15:55 -0800809 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
Romain Guy61c8c9c2010-08-09 20:48:09 -0700810 const jchar* textArray = env->GetStringChars(text, NULL);
811 jint count = end - start;
812 jint contextCount = contextEnd - contextStart;
Chris Craik9f66ea02013-12-27 15:15:55 -0800813 SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
814
Romain Guy61c8c9c2010-08-09 20:48:09 -0700815 renderTextRun(renderer, textArray + contextStart, start - contextStart,
Fabrice Di Meglioda12f382013-03-15 11:26:56 -0700816 count, contextCount, x, y, dirFlags, paint);
Romain Guy61c8c9c2010-08-09 20:48:09 -0700817 env->ReleaseStringChars(text, textArray);
818}
819
Romain Guyeb9a5362012-01-17 17:39:26 -0800820static void renderPosText(OpenGLRenderer* renderer, const jchar* text, int count,
Fabrice Di Meglioda12f382013-03-15 11:26:56 -0700821 const jfloat* positions, jint dirFlags, SkPaint* paint) {
Fabrice Di Meglioa731b082012-01-23 18:18:45 -0800822 sp<TextLayoutValue> value = TextLayoutEngine::getInstance().getValue(paint,
Fabrice Di Meglioda12f382013-03-15 11:26:56 -0700823 text, 0, count, count, dirFlags);
Romain Guyeb9a5362012-01-17 17:39:26 -0800824 if (value == NULL) {
Romain Guyeb9a5362012-01-17 17:39:26 -0800825 return;
826 }
Romain Guyeb9a5362012-01-17 17:39:26 -0800827 const jchar* glyphs = value->getGlyphs();
828 size_t glyphsCount = value->getGlyphsCount();
Romain Guy671d6cf2012-01-18 12:39:17 -0800829 if (count < int(glyphsCount)) glyphsCount = count;
Romain Guyeb9a5362012-01-17 17:39:26 -0800830 int bytesCount = glyphsCount * sizeof(jchar);
831
Romain Guy671d6cf2012-01-18 12:39:17 -0800832 renderer->drawPosText((const char*) glyphs, bytesCount, glyphsCount, positions, paint);
Romain Guyeb9a5362012-01-17 17:39:26 -0800833}
834
835static void android_view_GLES20Canvas_drawPosTextArray(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000836 jlong rendererPtr, jcharArray text, jint index, jint count,
837 jfloatArray pos, jlong paintPtr) {
Chris Craik9f66ea02013-12-27 15:15:55 -0800838 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
Romain Guyeb9a5362012-01-17 17:39:26 -0800839 jchar* textArray = env->GetCharArrayElements(text, NULL);
840 jfloat* positions = env->GetFloatArrayElements(pos, NULL);
Chris Craik9f66ea02013-12-27 15:15:55 -0800841 SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
Romain Guyeb9a5362012-01-17 17:39:26 -0800842
Fabrice Di Meglioda12f382013-03-15 11:26:56 -0700843 renderPosText(renderer, textArray + index, count, positions, kBidi_LTR, paint);
Romain Guyeb9a5362012-01-17 17:39:26 -0800844
845 env->ReleaseFloatArrayElements(pos, positions, JNI_ABORT);
846 env->ReleaseCharArrayElements(text, textArray, JNI_ABORT);
847}
848
849static void android_view_GLES20Canvas_drawPosText(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000850 jlong rendererPtr, jstring text, jint start, jint end,
851 jfloatArray pos, jlong paintPtr) {
Chris Craik9f66ea02013-12-27 15:15:55 -0800852 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
Romain Guyeb9a5362012-01-17 17:39:26 -0800853 const jchar* textArray = env->GetStringChars(text, NULL);
854 jfloat* positions = env->GetFloatArrayElements(pos, NULL);
Chris Craik9f66ea02013-12-27 15:15:55 -0800855 SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
Romain Guyeb9a5362012-01-17 17:39:26 -0800856
Fabrice Di Meglioda12f382013-03-15 11:26:56 -0700857 renderPosText(renderer, textArray + start, end - start, positions, kBidi_LTR, paint);
Romain Guyeb9a5362012-01-17 17:39:26 -0800858
859 env->ReleaseFloatArrayElements(pos, positions, JNI_ABORT);
860 env->ReleaseStringChars(text, textArray);
861}
862
Romain Guyb051e892010-09-28 19:09:36 -0700863// ----------------------------------------------------------------------------
864// Display lists
865// ----------------------------------------------------------------------------
866
John Reck44fd8d22014-02-26 11:00:11 -0800867static jlong android_view_GLES20Canvas_finishRecording(JNIEnv* env,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000868 jobject clazz, jlong rendererPtr) {
Chris Craik9f66ea02013-12-27 15:15:55 -0800869 DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
John Reck44fd8d22014-02-26 11:00:11 -0800870 return reinterpret_cast<jlong>(renderer->finishRecording());
871}
872
873static jlong android_view_GLES20Canvas_createDisplayListRenderer(JNIEnv* env,
874 jobject clazz) {
875 return reinterpret_cast<jlong>(new DisplayListRenderer);
Chet Haase5977baa2011-01-05 18:01:22 -0800876}
877
Romain Guy65549432012-03-26 16:45:05 -0700878static jint android_view_GLES20Canvas_drawDisplayList(JNIEnv* env,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000879 jobject clazz, jlong rendererPtr, jlong displayListPtr,
Chet Haase1271e2c2012-04-20 09:54:27 -0700880 jobject dirty, jint flags) {
Chris Craik9f66ea02013-12-27 15:15:55 -0800881 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
John Recke18264b2014-03-12 13:56:30 -0700882 RenderNode* displayList = reinterpret_cast<RenderNode*>(displayListPtr);
Romain Guycabfcc12011-03-07 18:06:46 -0800883 android::uirenderer::Rect bounds;
Chet Haase1271e2c2012-04-20 09:54:27 -0700884 status_t status = renderer->drawDisplayList(displayList, bounds, flags);
Romain Guy65549432012-03-26 16:45:05 -0700885 if (status != DrawGlInfo::kStatusDone && dirty != NULL) {
Romain Guycabfcc12011-03-07 18:06:46 -0800886 env->CallVoidMethod(dirty, gRectClassInfo.set,
887 int(bounds.left), int(bounds.top), int(bounds.right), int(bounds.bottom));
888 }
Romain Guy65549432012-03-26 16:45:05 -0700889 return status;
Romain Guyb051e892010-09-28 19:09:36 -0700890}
891
Romain Guy6c319ca2011-01-11 14:29:25 -0800892// ----------------------------------------------------------------------------
893// Layers
894// ----------------------------------------------------------------------------
895
Romain Guyc89b14b2012-08-08 14:53:48 -0700896static void android_view_GLES20Canvas_interrupt(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000897 jlong rendererPtr) {
Chris Craik9f66ea02013-12-27 15:15:55 -0800898 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
Romain Guyc89b14b2012-08-08 14:53:48 -0700899 renderer->interrupt();
900}
901
902static void android_view_GLES20Canvas_resume(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000903 jlong rendererPtr) {
Chris Craik9f66ea02013-12-27 15:15:55 -0800904 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
Romain Guyc89b14b2012-08-08 14:53:48 -0700905 renderer->resume();
906}
907
Romain Guy7d7b5492011-01-24 16:33:45 -0800908static void android_view_GLES20Canvas_drawLayer(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000909 jlong rendererPtr, jlong layerPtr, jfloat x, jfloat y) {
Chris Craik9f66ea02013-12-27 15:15:55 -0800910 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
911 Layer* layer = reinterpret_cast<Layer*>(layerPtr);
Chris Craika08f95c2013-03-15 17:24:33 -0700912 renderer->drawLayer(layer, x, y);
Romain Guy6c319ca2011-01-11 14:29:25 -0800913}
914
Romain Guy77a81162011-06-14 16:45:55 -0700915static jboolean android_view_GLES20Canvas_copyLayer(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000916 jlong layerPtr, jlong bitmapPtr) {
Chris Craik9f66ea02013-12-27 15:15:55 -0800917 Layer* layer = reinterpret_cast<Layer*>(layerPtr);
918 SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapPtr);
Romain Guy77a81162011-06-14 16:45:55 -0700919 return LayerRenderer::copyLayer(layer, bitmap);
920}
921
Romain Guy11cb6422012-09-21 00:39:43 -0700922static void android_view_GLES20Canvas_pushLayerUpdate(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000923 jlong rendererPtr, jlong layerPtr) {
Chris Craik9f66ea02013-12-27 15:15:55 -0800924 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
925 Layer* layer = reinterpret_cast<Layer*>(layerPtr);
Romain Guy11cb6422012-09-21 00:39:43 -0700926 renderer->pushLayerUpdate(layer);
927}
928
Romain Guye93482f2013-06-17 13:14:51 -0700929static void android_view_GLES20Canvas_cancelLayerUpdate(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000930 jlong rendererPtr, jlong layerPtr) {
Chris Craik9f66ea02013-12-27 15:15:55 -0800931 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
932 Layer* layer = reinterpret_cast<Layer*>(layerPtr);
Romain Guye93482f2013-06-17 13:14:51 -0700933 renderer->cancelLayerUpdate(layer);
934}
935
Romain Guy11cb6422012-09-21 00:39:43 -0700936static void android_view_GLES20Canvas_clearLayerUpdates(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000937 jlong rendererPtr) {
Chris Craik9f66ea02013-12-27 15:15:55 -0800938 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
Romain Guy11cb6422012-09-21 00:39:43 -0700939 renderer->clearLayerUpdates();
940}
941
Romain Guy40543602013-06-12 15:31:28 -0700942static void android_view_GLES20Canvas_flushLayerUpdates(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000943 jlong rendererPtr) {
Chris Craik9f66ea02013-12-27 15:15:55 -0800944 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
Romain Guy40543602013-06-12 15:31:28 -0700945 renderer->flushLayerUpdates();
946}
947
Romain Guy16393512010-08-08 00:14:31 -0700948#endif // USE_OPENGL_RENDERER
949
950// ----------------------------------------------------------------------------
951// Common
952// ----------------------------------------------------------------------------
953
954static jboolean android_view_GLES20Canvas_isAvailable(JNIEnv* env, jobject clazz) {
955#ifdef USE_OPENGL_RENDERER
Jesse Hall44063452011-12-01 11:27:45 -0800956 char prop[PROPERTY_VALUE_MAX];
957 if (property_get("ro.kernel.qemu", prop, NULL) == 0) {
958 // not in the emulator
959 return JNI_TRUE;
960 }
961 // In the emulator this property will be set to 1 when hardware GLES is
962 // enabled, 0 otherwise. On old emulator versions it will be undefined.
963 property_get("ro.kernel.qemu.gles", prop, "0");
964 return atoi(prop) == 1 ? JNI_TRUE : JNI_FALSE;
Romain Guy16393512010-08-08 00:14:31 -0700965#else
966 return JNI_FALSE;
967#endif
968}
969
Romain Guya1db5742010-07-20 13:09:13 -0700970// ----------------------------------------------------------------------------
Chet Haase9c1e23b2011-03-24 10:51:31 -0700971// Logging
972// ----------------------------------------------------------------------------
973
Chet Haase9c1e23b2011-03-24 10:51:31 -0700974static void
Romain Guy65b345f2011-07-27 18:51:50 -0700975android_app_ActivityThread_dumpGraphics(JNIEnv* env, jobject clazz, jobject javaFileDescriptor) {
Chet Haase905787a2011-04-01 14:33:02 -0700976#ifdef USE_OPENGL_RENDERER
Elliott Hughesa3804cf2011-04-11 16:50:19 -0700977 int fd = jniGetFDFromFileDescriptor(env, javaFileDescriptor);
John Recke18264b2014-03-12 13:56:30 -0700978 android::uirenderer::RenderNode::outputLogBuffer(fd);
Chet Haase905787a2011-04-01 14:33:02 -0700979#endif // USE_OPENGL_RENDERER
Chet Haase9c1e23b2011-03-24 10:51:31 -0700980}
981
982// ----------------------------------------------------------------------------
Romain Guye4d01122010-06-16 18:44:05 -0700983// JNI Glue
984// ----------------------------------------------------------------------------
985
986const char* const kClassPathName = "android/view/GLES20Canvas";
987
988static JNINativeMethod gMethods[] = {
Romain Guy61c8c9c2010-08-09 20:48:09 -0700989 { "nIsAvailable", "()Z", (void*) android_view_GLES20Canvas_isAvailable },
990
Romain Guy16393512010-08-08 00:14:31 -0700991#ifdef USE_OPENGL_RENDERER
Romain Guyba6be8a2012-04-23 18:22:09 -0700992 { "nFlushCaches", "(I)V", (void*) android_view_GLES20Canvas_flushCaches },
Romain Guy3b748a42013-04-17 18:54:38 -0700993 { "nInitCaches", "()Z", (void*) android_view_GLES20Canvas_initCaches },
Romain Guyba6be8a2012-04-23 18:22:09 -0700994 { "nTerminateCaches", "()V", (void*) android_view_GLES20Canvas_terminateCaches },
Romain Guy7d7b5492011-01-24 16:33:45 -0800995
Ashok Bhat17ab38f2014-01-27 16:00:23 +0000996 { "nInitAtlas", "(Landroid/view/GraphicBuffer;[JI)V",
Romain Guy3b748a42013-04-17 18:54:38 -0700997 (void*) android_view_GLES20Canvas_initAtlas },
998
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000999 { "nCreateRenderer", "()J", (void*) android_view_GLES20Canvas_createRenderer },
1000 { "nDestroyRenderer", "(J)V", (void*) android_view_GLES20Canvas_destroyRenderer },
1001 { "nSetViewport", "(JII)V", (void*) android_view_GLES20Canvas_setViewport },
1002 { "nPrepare", "(JZ)I", (void*) android_view_GLES20Canvas_prepare },
1003 { "nPrepareDirty", "(JIIIIZ)I", (void*) android_view_GLES20Canvas_prepareDirty },
1004 { "nFinish", "(J)V", (void*) android_view_GLES20Canvas_finish },
Chris Craikba9b6132013-12-15 17:10:19 -08001005 { "nSetProperty", "(Ljava/lang/String;Ljava/lang/String;)V",
1006 (void*) android_view_GLES20Canvas_setProperty },
Romain Guy16393512010-08-08 00:14:31 -07001007
Romain Guy78dd96d2013-05-03 14:24:16 -07001008
Romain Guy530041d2012-01-25 18:56:29 -08001009 { "nGetStencilSize", "()I", (void*) android_view_GLES20Canvas_getStencilSize },
1010
Ashok Bhat36bef0b2014-01-20 20:08:01 +00001011 { "nCallDrawGLFunction", "(JJ)I", (void*) android_view_GLES20Canvas_callDrawGLFunction },
1012 { "nDetachFunctor", "(JJ)V", (void*) android_view_GLES20Canvas_detachFunctor },
1013 { "nAttachFunctor", "(JJ)V", (void*) android_view_GLES20Canvas_attachFunctor },
1014 { "nInvokeFunctors", "(JLandroid/graphics/Rect;)I",
Romain Guy8f3b8e32012-03-27 16:33:45 -07001015 (void*) android_view_GLES20Canvas_invokeFunctors },
Romain Guy7d7b5492011-01-24 16:33:45 -08001016
Ashok Bhat36bef0b2014-01-20 20:08:01 +00001017 { "nSave", "(JI)I", (void*) android_view_GLES20Canvas_save },
1018 { "nRestore", "(J)V", (void*) android_view_GLES20Canvas_restore },
1019 { "nRestoreToCount", "(JI)V", (void*) android_view_GLES20Canvas_restoreToCount },
1020 { "nGetSaveCount", "(J)I", (void*) android_view_GLES20Canvas_getSaveCount },
Romain Guy85bf02f2010-06-22 13:11:24 -07001021
Ashok Bhat36bef0b2014-01-20 20:08:01 +00001022 { "nSaveLayer", "(JFFFFJI)I", (void*) android_view_GLES20Canvas_saveLayer },
1023 { "nSaveLayer", "(JJI)I", (void*) android_view_GLES20Canvas_saveLayerClip },
1024 { "nSaveLayerAlpha", "(JFFFFII)I", (void*) android_view_GLES20Canvas_saveLayerAlpha },
1025 { "nSaveLayerAlpha", "(JII)I", (void*) android_view_GLES20Canvas_saveLayerAlphaClip },
Romain Guybb9524b2010-06-22 18:56:38 -07001026
Ashok Bhat36bef0b2014-01-20 20:08:01 +00001027 { "nQuickReject", "(JFFFF)Z", (void*) android_view_GLES20Canvas_quickReject },
1028 { "nClipRect", "(JFFFFI)Z", (void*) android_view_GLES20Canvas_clipRectF },
1029 { "nClipRect", "(JIIIII)Z", (void*) android_view_GLES20Canvas_clipRect },
1030 { "nClipPath", "(JJI)Z", (void*) android_view_GLES20Canvas_clipPath },
1031 { "nClipRegion", "(JJI)Z", (void*) android_view_GLES20Canvas_clipRegion },
Romain Guyc7d53492010-06-25 13:41:57 -07001032
Ashok Bhat36bef0b2014-01-20 20:08:01 +00001033 { "nTranslate", "(JFF)V", (void*) android_view_GLES20Canvas_translate },
1034 { "nRotate", "(JF)V", (void*) android_view_GLES20Canvas_rotate },
1035 { "nScale", "(JFF)V", (void*) android_view_GLES20Canvas_scale },
1036 { "nSkew", "(JFF)V", (void*) android_view_GLES20Canvas_skew },
Romain Guyc7d53492010-06-25 13:41:57 -07001037
Ashok Bhat36bef0b2014-01-20 20:08:01 +00001038 { "nSetMatrix", "(JJ)V", (void*) android_view_GLES20Canvas_setMatrix },
1039 { "nGetMatrix", "(JJ)V", (void*) android_view_GLES20Canvas_getMatrix },
1040 { "nConcatMatrix", "(JJ)V", (void*) android_view_GLES20Canvas_concatMatrix },
Romain Guyc7d53492010-06-25 13:41:57 -07001041
Ashok Bhat36bef0b2014-01-20 20:08:01 +00001042 { "nDrawBitmap", "(JJ[BFFJ)V", (void*) android_view_GLES20Canvas_drawBitmap },
1043 { "nDrawBitmap", "(JJ[BFFFFFFFFJ)V",(void*) android_view_GLES20Canvas_drawBitmapRect },
1044 { "nDrawBitmap", "(JJ[BJJ)V", (void*) android_view_GLES20Canvas_drawBitmapMatrix },
1045 { "nDrawBitmap", "(J[IIIFFIIZJ)V", (void*) android_view_GLES20Canvas_drawBitmapData },
Romain Guy5a7b4662011-01-20 19:09:30 -08001046
Ashok Bhat36bef0b2014-01-20 20:08:01 +00001047 { "nDrawBitmapMesh", "(JJ[BII[FI[IIJ)V",(void*) android_view_GLES20Canvas_drawBitmapMesh },
Romain Guy5a7b4662011-01-20 19:09:30 -08001048
Ashok Bhat36bef0b2014-01-20 20:08:01 +00001049 { "nDrawPatch", "(JJ[BJFFFFJ)V", (void*) android_view_GLES20Canvas_drawPatch },
Patrick Dubroye4ac2d62010-12-01 11:23:13 -08001050
Ashok Bhat36bef0b2014-01-20 20:08:01 +00001051 { "nDrawColor", "(JII)V", (void*) android_view_GLES20Canvas_drawColor },
1052 { "nDrawRect", "(JFFFFJ)V", (void*) android_view_GLES20Canvas_drawRect },
1053 { "nDrawRects", "(JJJ)V", (void*) android_view_GLES20Canvas_drawRegionAsRects },
1054 { "nDrawRects", "(J[FIJ)V", (void*) android_view_GLES20Canvas_drawRects },
1055 { "nDrawRoundRect", "(JFFFFFFJ)V", (void*) android_view_GLES20Canvas_drawRoundRect },
1056 { "nDrawCircle", "(JFFFJ)V", (void*) android_view_GLES20Canvas_drawCircle },
1057 { "nDrawOval", "(JFFFFJ)V", (void*) android_view_GLES20Canvas_drawOval },
1058 { "nDrawArc", "(JFFFFFFZJ)V", (void*) android_view_GLES20Canvas_drawArc },
1059 { "nDrawPoints", "(J[FIIJ)V", (void*) android_view_GLES20Canvas_drawPoints },
Romain Guy8b2f5262011-01-23 16:15:02 -08001060
Ashok Bhat36bef0b2014-01-20 20:08:01 +00001061 { "nDrawPath", "(JJJ)V", (void*) android_view_GLES20Canvas_drawPath },
1062 { "nDrawLines", "(J[FIIJ)V", (void*) android_view_GLES20Canvas_drawLines },
Romain Guybd6b79b2010-06-26 00:13:53 -07001063
Ashok Bhat36bef0b2014-01-20 20:08:01 +00001064 { "nResetModifiers", "(JI)V", (void*) android_view_GLES20Canvas_resetModifiers },
1065 { "nSetupShader", "(JJ)V", (void*) android_view_GLES20Canvas_setupShader },
Ashok Bhat36bef0b2014-01-20 20:08:01 +00001066 { "nSetupShadow", "(JFFFI)V", (void*) android_view_GLES20Canvas_setupShadow },
Romain Guybb9524b2010-06-22 18:56:38 -07001067
Ashok Bhat36bef0b2014-01-20 20:08:01 +00001068 { "nSetupPaintFilter", "(JII)V", (void*) android_view_GLES20Canvas_setupPaintFilter },
1069 { "nResetPaintFilter", "(J)V", (void*) android_view_GLES20Canvas_resetPaintFilter },
Romain Guy5ff9df62012-01-23 17:09:05 -08001070
Ashok Bhat36bef0b2014-01-20 20:08:01 +00001071 { "nDrawText", "(J[CIIFFIJ)V", (void*) android_view_GLES20Canvas_drawTextArray },
1072 { "nDrawText", "(JLjava/lang/String;IIFFIJ)V",
Romain Guya1db5742010-07-20 13:09:13 -07001073 (void*) android_view_GLES20Canvas_drawText },
1074
Ashok Bhat36bef0b2014-01-20 20:08:01 +00001075 { "nDrawTextOnPath", "(J[CIIJFFIJ)V", (void*) android_view_GLES20Canvas_drawTextArrayOnPath },
1076 { "nDrawTextOnPath", "(JLjava/lang/String;IIJFFIJ)V",
Romain Guy325740f2012-02-24 16:48:34 -08001077 (void*) android_view_GLES20Canvas_drawTextOnPath },
1078
Ashok Bhat36bef0b2014-01-20 20:08:01 +00001079 { "nDrawTextRun", "(J[CIIIIFFIJ)V", (void*) android_view_GLES20Canvas_drawTextRunArray },
1080 { "nDrawTextRun", "(JLjava/lang/String;IIIIFFIJ)V",
Romain Guy61c8c9c2010-08-09 20:48:09 -07001081 (void*) android_view_GLES20Canvas_drawTextRun },
1082
Ashok Bhat36bef0b2014-01-20 20:08:01 +00001083 { "nDrawPosText", "(J[CII[FJ)V", (void*) android_view_GLES20Canvas_drawPosTextArray },
1084 { "nDrawPosText", "(JLjava/lang/String;II[FJ)V",
Romain Guyeb9a5362012-01-17 17:39:26 -08001085 (void*) android_view_GLES20Canvas_drawPosText },
1086
Ashok Bhat36bef0b2014-01-20 20:08:01 +00001087 { "nGetClipBounds", "(JLandroid/graphics/Rect;)Z",
Romain Guyce0537b2010-06-29 21:05:21 -07001088 (void*) android_view_GLES20Canvas_getClipBounds },
Romain Guyb051e892010-09-28 19:09:36 -07001089
John Reck44fd8d22014-02-26 11:00:11 -08001090 { "nFinishRecording", "(J)J", (void*) android_view_GLES20Canvas_finishRecording },
Ashok Bhat36bef0b2014-01-20 20:08:01 +00001091 { "nDrawDisplayList", "(JJLandroid/graphics/Rect;I)I",
Romain Guy8f3b8e32012-03-27 16:33:45 -07001092 (void*) android_view_GLES20Canvas_drawDisplayList },
Romain Guy13631f32012-01-30 17:41:55 -08001093
Ashok Bhat36bef0b2014-01-20 20:08:01 +00001094 { "nCreateDisplayListRenderer", "()J", (void*) android_view_GLES20Canvas_createDisplayListRenderer },
Romain Guy13631f32012-01-30 17:41:55 -08001095
Ashok Bhat36bef0b2014-01-20 20:08:01 +00001096 { "nInterrupt", "(J)V", (void*) android_view_GLES20Canvas_interrupt },
1097 { "nResume", "(J)V", (void*) android_view_GLES20Canvas_resume },
Romain Guy6c319ca2011-01-11 14:29:25 -08001098
Ashok Bhat36bef0b2014-01-20 20:08:01 +00001099 { "nDrawLayer", "(JJFF)V", (void*) android_view_GLES20Canvas_drawLayer },
1100 { "nCopyLayer", "(JJ)Z", (void*) android_view_GLES20Canvas_copyLayer },
1101 { "nClearLayerUpdates", "(J)V", (void*) android_view_GLES20Canvas_clearLayerUpdates },
1102 { "nFlushLayerUpdates", "(J)V", (void*) android_view_GLES20Canvas_flushLayerUpdates },
1103 { "nPushLayerUpdate", "(JJ)V", (void*) android_view_GLES20Canvas_pushLayerUpdate },
1104 { "nCancelLayerUpdate", "(JJ)V", (void*) android_view_GLES20Canvas_cancelLayerUpdate },
Romain Guyb051e892010-09-28 19:09:36 -07001105
Romain Guyf61970fc2011-07-07 14:10:06 -07001106 { "nGetMaximumTextureWidth", "()I", (void*) android_view_GLES20Canvas_getMaxTextureWidth },
1107 { "nGetMaximumTextureHeight", "()I", (void*) android_view_GLES20Canvas_getMaxTextureHeight },
1108
Romain Guy16393512010-08-08 00:14:31 -07001109#endif
Romain Guye4d01122010-06-16 18:44:05 -07001110};
1111
Chet Haase9c1e23b2011-03-24 10:51:31 -07001112static JNINativeMethod gActivityThreadMethods[] = {
1113 { "dumpGraphicsInfo", "(Ljava/io/FileDescriptor;)V",
1114 (void*) android_app_ActivityThread_dumpGraphics }
1115};
1116
1117
Romain Guy16393512010-08-08 00:14:31 -07001118#ifdef USE_OPENGL_RENDERER
1119 #define FIND_CLASS(var, className) \
1120 var = env->FindClass(className); \
Carl Shapiro17cc33a2011-03-05 20:53:16 -08001121 LOG_FATAL_IF(! var, "Unable to find class " className);
1122
Romain Guy16393512010-08-08 00:14:31 -07001123 #define GET_METHOD_ID(var, clazz, methodName, methodDescriptor) \
1124 var = env->GetMethodID(clazz, methodName, methodDescriptor); \
1125 LOG_FATAL_IF(! var, "Unable to find method " methodName);
1126#else
1127 #define FIND_CLASS(var, className)
1128 #define GET_METHOD_ID(var, clazz, methodName, methodDescriptor)
1129#endif
Romain Guy9d5316e2010-06-24 19:30:36 -07001130
Romain Guye4d01122010-06-16 18:44:05 -07001131int register_android_view_GLES20Canvas(JNIEnv* env) {
Carl Shapiro17cc33a2011-03-05 20:53:16 -08001132 jclass clazz;
1133 FIND_CLASS(clazz, "android/graphics/Rect");
1134 GET_METHOD_ID(gRectClassInfo.set, clazz, "set", "(IIII)V");
Romain Guy9d5316e2010-06-24 19:30:36 -07001135
Romain Guye4d01122010-06-16 18:44:05 -07001136 return AndroidRuntime::registerNativeMethods(env, kClassPathName, gMethods, NELEM(gMethods));
1137}
1138
Chet Haase9c1e23b2011-03-24 10:51:31 -07001139const char* const kActivityThreadPathName = "android/app/ActivityThread";
1140
Romain Guy6be3d552011-07-14 18:08:37 -07001141int register_android_app_ActivityThread(JNIEnv* env) {
1142 return AndroidRuntime::registerNativeMethods(env, kActivityThreadPathName,
Chet Haase9c1e23b2011-03-24 10:51:31 -07001143 gActivityThreadMethods, NELEM(gActivityThreadMethods));
1144}
1145
Romain Guye4d01122010-06-16 18:44:05 -07001146};