blob: b7cd4963a64eb08249653291496865c2d5ef7fd4 [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 Guye4d01122010-06-16 18:44:05 -070023#include <android_runtime/AndroidRuntime.h>
Romain Guy65549432012-03-26 16:45:05 -070024
Mathias Agopianb13b9bd2012-02-17 18:27:36 -080025#include <androidfw/ResourceTypes.h>
Romain Guye4d01122010-06-16 18:44:05 -070026
Romain Guy65549432012-03-26 16:45:05 -070027#include <private/hwui/DrawGlInfo.h>
28
29#include <cutils/properties.h>
Romain Guy8f0095c2011-05-02 17:24:22 -070030
Romain Guyce0537b2010-06-29 21:05:21 -070031#include <SkBitmap.h>
Romain Guyc7d53492010-06-25 13:41:57 -070032#include <SkCanvas.h>
Leon Scroggins III57ee6202014-06-04 18:51:07 -040033#include <SkImageInfo.h>
Romain Guyf6a11b82010-06-23 17:47:49 -070034#include <SkMatrix.h>
Chris Craik2ce93282014-06-23 17:48:09 -070035#include <SkPorterDuff.h>
Romain Guy079ba2c2010-07-16 14:12:24 -070036#include <SkRegion.h>
Romain Guya1db5742010-07-20 13:09:13 -070037#include <SkScalerContext.h>
Romain Guy61c8c9c2010-08-09 20:48:09 -070038#include <SkTemplates.h>
Romain Guy85bf02f2010-06-22 13:11:24 -070039#include <SkXfermode.h>
Romain Guye4d01122010-06-16 18:44:05 -070040
Romain Guyb051e892010-09-28 19:09:36 -070041#include <DisplayListRenderer.h>
Romain Guy9d5316e2010-06-24 19:30:36 -070042#include <Rect.h>
John Reck113e0822014-03-18 09:22:59 -070043#include <RenderNode.h>
John Reck52244ff2014-05-01 21:27:37 -070044#include <CanvasProperty.h>
Behdad Esfahbod6ba30b82014-07-15 16:22:32 -040045#include <Paint.h>
John Reck0e89e2b2014-10-31 14:49:06 -070046#include <renderthread/RenderProxy.h>
Romain Guy85bf02f2010-06-22 13:11:24 -070047
Raph Levien1a73f7322014-01-30 16:06:28 -080048#include "MinikinUtils.h"
Romain Guye8e62a42010-07-23 18:55:21 -070049
Andreas Gampe987f79f2014-11-18 17:29:46 -080050#include "core_jni_helpers.h"
51
Romain Guye4d01122010-06-16 18:44:05 -070052namespace android {
53
Romain Guy9d5316e2010-06-24 19:30:36 -070054using namespace uirenderer;
55
Andreas Gampeed6b9df2014-11-20 22:02:20 -080056static struct {
57 jmethodID set;
58} gRectClassInfo;
59
Romain Guy244ada12012-03-28 16:41:26 -070060// ----------------------------------------------------------------------------
Romain Guybdb801ca2010-10-04 17:22:29 -070061// Defines
Romain Guy244ada12012-03-28 16:41:26 -070062// ----------------------------------------------------------------------------
Romain Guybdb801ca2010-10-04 17:22:29 -070063
Andreas Gampeed6b9df2014-11-20 22:02:20 -080064static const bool kDebugRenderer = false;
Romain Guy9d5316e2010-06-24 19:30:36 -070065
Romain Guye4d01122010-06-16 18:44:05 -070066// ----------------------------------------------------------------------------
67// Constructors
68// ----------------------------------------------------------------------------
69
Chet Haase5c13d892010-10-08 08:37:55 -070070static void android_view_GLES20Canvas_destroyRenderer(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +000071 jlong rendererPtr) {
John Reck3b202512014-06-23 13:13:08 -070072 DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
Andreas Gampeed6b9df2014-11-20 22:02:20 -080073 if (kDebugRenderer) {
74 ALOGD("Destroy DisplayListRenderer");
75 }
Romain Guyf6a11b82010-06-23 17:47:49 -070076 delete renderer;
Romain Guye4d01122010-06-16 18:44:05 -070077}
78
79// ----------------------------------------------------------------------------
80// Setup
81// ----------------------------------------------------------------------------
82
Romain Guy7d7b5492011-01-24 16:33:45 -080083static void android_view_GLES20Canvas_setViewport(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +000084 jlong rendererPtr, jint width, jint height) {
John Reck3b202512014-06-23 13:13:08 -070085 DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
Romain Guyf6a11b82010-06-23 17:47:49 -070086 renderer->setViewport(width, height);
Romain Guye4d01122010-06-16 18:44:05 -070087}
88
Chris Craikcce47eb2014-07-16 15:12:15 -070089static void android_view_GLES20Canvas_setHighContrastText(JNIEnv* env, jobject clazz,
90 jlong rendererPtr, jboolean highContrastText) {
91 DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
92 renderer->setHighContrastText(highContrastText);
93}
94
Chris Craik8afd0f22014-08-21 17:41:57 -070095static void android_view_GLES20Canvas_insertReorderBarrier(JNIEnv* env, jobject clazz,
96 jlong rendererPtr, jboolean reorderEnable) {
97 DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
98 renderer->insertReorderBarrier(reorderEnable);
99}
100
Tom Hudson107843d2014-09-08 11:26:26 -0400101static void android_view_GLES20Canvas_prepare(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000102 jlong rendererPtr, jboolean opaque) {
John Reck3b202512014-06-23 13:13:08 -0700103 DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
Tom Hudson107843d2014-09-08 11:26:26 -0400104 renderer->prepare(opaque);
Romain Guye4d01122010-06-16 18:44:05 -0700105}
106
Tom Hudson107843d2014-09-08 11:26:26 -0400107static void android_view_GLES20Canvas_prepareDirty(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000108 jlong rendererPtr, jint left, jint top, jint right, jint bottom,
Romain Guy7d7b5492011-01-24 16:33:45 -0800109 jboolean opaque) {
John Reck3b202512014-06-23 13:13:08 -0700110 DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
Tom Hudson107843d2014-09-08 11:26:26 -0400111 renderer->prepareDirty(left, top, right, bottom, opaque);
Romain Guy7d7b5492011-01-24 16:33:45 -0800112}
113
114static void android_view_GLES20Canvas_finish(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000115 jlong rendererPtr) {
John Reck3b202512014-06-23 13:13:08 -0700116 DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
Romain Guyb025b9c2010-09-16 14:16:48 -0700117 renderer->finish();
118}
119
Chris Craikba9b6132013-12-15 17:10:19 -0800120static void android_view_GLES20Canvas_setProperty(JNIEnv* env,
121 jobject clazz, jstring name, jstring value) {
122 if (!Caches::hasInstance()) {
123 ALOGW("can't set property, no Caches instance");
124 return;
125 }
126
127 if (name == NULL || value == NULL) {
128 ALOGW("can't set prop, null passed");
129 }
130
131 const char* nameCharArray = env->GetStringUTFChars(name, NULL);
132 const char* valueCharArray = env->GetStringUTFChars(value, NULL);
133 Caches::getInstance().setTempProperty(nameCharArray, valueCharArray);
134 env->ReleaseStringUTFChars(name, nameCharArray);
135 env->ReleaseStringUTFChars(name, valueCharArray);
136}
137
Romain Guy530041d2012-01-25 18:56:29 -0800138// ----------------------------------------------------------------------------
139// Functor
140// ----------------------------------------------------------------------------
141
Tom Hudson107843d2014-09-08 11:26:26 -0400142static void android_view_GLES20Canvas_callDrawGLFunction(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000143 jlong rendererPtr, jlong functorPtr) {
John Reck3b202512014-06-23 13:13:08 -0700144 DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
Chris Craik9f66ea02013-12-27 15:15:55 -0800145 Functor* functor = reinterpret_cast<Functor*>(functorPtr);
Romain Guycabfcc12011-03-07 18:06:46 -0800146 android::uirenderer::Rect dirty;
Tom Hudson107843d2014-09-08 11:26:26 -0400147 renderer->callDrawGLFunction(functor, dirty);
Chet Haasedaf98e92011-01-10 14:10:36 -0800148}
149
Romain Guy8f3b8e32012-03-27 16:33:45 -0700150// ----------------------------------------------------------------------------
151// Misc
152// ----------------------------------------------------------------------------
153
Romain Guyf61970fc2011-07-07 14:10:06 -0700154static jint android_view_GLES20Canvas_getMaxTextureWidth(JNIEnv* env, jobject clazz) {
155 return Caches::getInstance().maxTextureSize;
156}
157
158static jint android_view_GLES20Canvas_getMaxTextureHeight(JNIEnv* env, jobject clazz) {
159 return Caches::getInstance().maxTextureSize;
160}
161
Romain Guye4d01122010-06-16 18:44:05 -0700162// ----------------------------------------------------------------------------
Romain Guybb9524b2010-06-22 18:56:38 -0700163// State
164// ----------------------------------------------------------------------------
165
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000166static jint android_view_GLES20Canvas_save(JNIEnv* env, jobject clazz, jlong rendererPtr,
Romain Guybb9524b2010-06-22 18:56:38 -0700167 jint flags) {
John Reck3b202512014-06-23 13:13:08 -0700168 DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
Romain Guyf6a11b82010-06-23 17:47:49 -0700169 return renderer->save(flags);
Romain Guybb9524b2010-06-22 18:56:38 -0700170}
171
Romain Guy7d7b5492011-01-24 16:33:45 -0800172static jint android_view_GLES20Canvas_getSaveCount(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000173 jlong rendererPtr) {
John Reck3b202512014-06-23 13:13:08 -0700174 DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
Romain Guyf6a11b82010-06-23 17:47:49 -0700175 return renderer->getSaveCount();
Romain Guybb9524b2010-06-22 18:56:38 -0700176}
177
Romain Guy7d7b5492011-01-24 16:33:45 -0800178static void android_view_GLES20Canvas_restore(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000179 jlong rendererPtr) {
John Reck3b202512014-06-23 13:13:08 -0700180 DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
Romain Guyf6a11b82010-06-23 17:47:49 -0700181 renderer->restore();
Romain Guybb9524b2010-06-22 18:56:38 -0700182}
183
Romain Guy7d7b5492011-01-24 16:33:45 -0800184static void android_view_GLES20Canvas_restoreToCount(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000185 jlong rendererPtr, jint saveCount) {
John Reck3b202512014-06-23 13:13:08 -0700186 DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
Romain Guyf6a11b82010-06-23 17:47:49 -0700187 renderer->restoreToCount(saveCount);
Romain Guybb9524b2010-06-22 18:56:38 -0700188}
189
190// ----------------------------------------------------------------------------
Romain Guybd6b79b2010-06-26 00:13:53 -0700191// Layers
192// ----------------------------------------------------------------------------
193
Romain Guy7d7b5492011-01-24 16:33:45 -0800194static jint android_view_GLES20Canvas_saveLayer(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000195 jlong rendererPtr, jfloat left, jfloat top, jfloat right, jfloat bottom,
196 jlong paintPtr, jint saveFlags) {
John Reck3b202512014-06-23 13:13:08 -0700197 DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
Behdad Esfahbod6ba30b82014-07-15 16:22:32 -0400198 Paint* paint = reinterpret_cast<Paint*>(paintPtr);
Romain Guybd6b79b2010-06-26 00:13:53 -0700199 return renderer->saveLayer(left, top, right, bottom, paint, saveFlags);
200}
201
Romain Guy189887e2011-08-25 11:45:13 -0700202static jint android_view_GLES20Canvas_saveLayerClip(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000203 jlong rendererPtr, jlong paintPtr, jint saveFlags) {
John Reck3b202512014-06-23 13:13:08 -0700204 DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
Behdad Esfahbod6ba30b82014-07-15 16:22:32 -0400205 Paint* paint = reinterpret_cast<Paint*>(paintPtr);
Chris Craik3f0854292014-04-15 16:18:08 -0700206 const android::uirenderer::Rect& bounds(renderer->getLocalClipBounds());
Romain Guy189887e2011-08-25 11:45:13 -0700207 return renderer->saveLayer(bounds.left, bounds.top, bounds.right, bounds.bottom,
208 paint, saveFlags);
209}
210
Romain Guy7d7b5492011-01-24 16:33:45 -0800211static jint android_view_GLES20Canvas_saveLayerAlpha(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000212 jlong rendererPtr, jfloat left, jfloat top, jfloat right, jfloat bottom,
Romain Guybd6b79b2010-06-26 00:13:53 -0700213 jint alpha, jint saveFlags) {
John Reck3b202512014-06-23 13:13:08 -0700214 DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
Romain Guybd6b79b2010-06-26 00:13:53 -0700215 return renderer->saveLayerAlpha(left, top, right, bottom, alpha, saveFlags);
216}
217
Romain Guy189887e2011-08-25 11:45:13 -0700218static jint android_view_GLES20Canvas_saveLayerAlphaClip(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000219 jlong rendererPtr, jint alpha, jint saveFlags) {
John Reck3b202512014-06-23 13:13:08 -0700220 DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
Chris Craik3f0854292014-04-15 16:18:08 -0700221 const android::uirenderer::Rect& bounds(renderer->getLocalClipBounds());
Romain Guy189887e2011-08-25 11:45:13 -0700222 return renderer->saveLayerAlpha(bounds.left, bounds.top, bounds.right, bounds.bottom,
223 alpha, saveFlags);
224}
225
Romain Guybd6b79b2010-06-26 00:13:53 -0700226// ----------------------------------------------------------------------------
Romain Guybb9524b2010-06-22 18:56:38 -0700227// Clipping
228// ----------------------------------------------------------------------------
229
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000230static jboolean android_view_GLES20Canvas_quickReject(JNIEnv* env, jobject clazz,
231 jlong rendererPtr, jfloat left, jfloat top, jfloat right, jfloat bottom) {
John Reck3b202512014-06-23 13:13:08 -0700232 DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000233 const bool result = renderer->quickRejectConservative(left, top, right, bottom);
234 return result ? JNI_TRUE : JNI_FALSE;
Romain Guyc7d53492010-06-25 13:41:57 -0700235}
236
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000237static jboolean android_view_GLES20Canvas_clipRectF(JNIEnv* env, jobject clazz,
238 jlong rendererPtr, jfloat left, jfloat top, jfloat right, jfloat bottom,
239 jint op) {
John Reck3b202512014-06-23 13:13:08 -0700240 DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000241 const bool result = renderer->clipRect(left, top, right, bottom,
242 static_cast<SkRegion::Op>(op));
243 return result ? JNI_TRUE : JNI_FALSE;
Romain Guybb9524b2010-06-22 18:56:38 -0700244}
245
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000246static jboolean android_view_GLES20Canvas_clipRect(JNIEnv* env, jobject clazz,
247 jlong rendererPtr, jint left, jint top, jint right, jint bottom,
248 jint op) {
John Reck3b202512014-06-23 13:13:08 -0700249 DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000250 const bool result = renderer->clipRect(float(left), float(top), float(right),
251 float(bottom),
252 static_cast<SkRegion::Op>(op));
253 return result ? JNI_TRUE : JNI_FALSE;
Romain Guyf6a11b82010-06-23 17:47:49 -0700254}
Romain Guybb9524b2010-06-22 18:56:38 -0700255
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000256static jboolean android_view_GLES20Canvas_clipPath(JNIEnv* env, jobject clazz,
257 jlong rendererPtr, jlong pathPtr, jint op) {
John Reck3b202512014-06-23 13:13:08 -0700258 DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
Chris Craik9f66ea02013-12-27 15:15:55 -0800259 SkPath* path = reinterpret_cast<SkPath*>(pathPtr);
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000260 const bool result = renderer->clipPath(path, static_cast<SkRegion::Op>(op));
261 return result ? JNI_TRUE : JNI_FALSE;
Romain Guy735738c2012-12-03 12:34:51 -0800262}
263
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000264static jboolean android_view_GLES20Canvas_clipRegion(JNIEnv* env, jobject clazz,
265 jlong rendererPtr, jlong regionPtr, jint op) {
John Reck3b202512014-06-23 13:13:08 -0700266 DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
Chris Craik9f66ea02013-12-27 15:15:55 -0800267 SkRegion* region = reinterpret_cast<SkRegion*>(regionPtr);
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000268 const bool result = renderer->clipRegion(region, static_cast<SkRegion::Op>(op));
269 return result ? JNI_TRUE : JNI_FALSE;
Romain Guy735738c2012-12-03 12:34:51 -0800270}
271
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000272static jboolean android_view_GLES20Canvas_getClipBounds(JNIEnv* env, jobject clazz,
273 jlong rendererPtr, jobject rect) {
John Reck3b202512014-06-23 13:13:08 -0700274 DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
Chris Craik3f0854292014-04-15 16:18:08 -0700275 const android::uirenderer::Rect& bounds(renderer->getLocalClipBounds());
Romain Guy9d5316e2010-06-24 19:30:36 -0700276
Romain Guy7ae7ac42010-06-25 13:46:18 -0700277 env->CallVoidMethod(rect, gRectClassInfo.set,
278 int(bounds.left), int(bounds.top), int(bounds.right), int(bounds.bottom));
Romain Guy9d5316e2010-06-24 19:30:36 -0700279
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000280 return !bounds.isEmpty() ? JNI_TRUE : JNI_FALSE;
Romain Guy9d5316e2010-06-24 19:30:36 -0700281}
282
Romain Guyf6a11b82010-06-23 17:47:49 -0700283// ----------------------------------------------------------------------------
284// Transforms
285// ----------------------------------------------------------------------------
286
Romain Guy7d7b5492011-01-24 16:33:45 -0800287static void android_view_GLES20Canvas_translate(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000288 jlong rendererPtr, jfloat dx, jfloat dy) {
John Reck3b202512014-06-23 13:13:08 -0700289 DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
Romain Guy7ae7ac42010-06-25 13:46:18 -0700290 renderer->translate(dx, dy);
Romain Guyf6a11b82010-06-23 17:47:49 -0700291}
292
Romain Guy7d7b5492011-01-24 16:33:45 -0800293static void android_view_GLES20Canvas_rotate(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000294 jlong rendererPtr, jfloat degrees) {
John Reck3b202512014-06-23 13:13:08 -0700295 DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
Romain Guy7ae7ac42010-06-25 13:46:18 -0700296 renderer->rotate(degrees);
Romain Guyf6a11b82010-06-23 17:47:49 -0700297}
298
Romain Guy7d7b5492011-01-24 16:33:45 -0800299static void android_view_GLES20Canvas_scale(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000300 jlong rendererPtr, jfloat sx, jfloat sy) {
John Reck3b202512014-06-23 13:13:08 -0700301 DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
Romain Guy7ae7ac42010-06-25 13:46:18 -0700302 renderer->scale(sx, sy);
Romain Guyf6a11b82010-06-23 17:47:49 -0700303}
304
Romain Guy7d7b5492011-01-24 16:33:45 -0800305static void android_view_GLES20Canvas_skew(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000306 jlong rendererPtr, jfloat sx, jfloat sy) {
John Reck3b202512014-06-23 13:13:08 -0700307 DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
Romain Guy807daf72011-01-18 11:19:19 -0800308 renderer->skew(sx, sy);
309}
310
Romain Guy7d7b5492011-01-24 16:33:45 -0800311static void android_view_GLES20Canvas_setMatrix(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000312 jlong rendererPtr, jlong matrixPtr) {
John Reck3b202512014-06-23 13:13:08 -0700313 DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
Chris Craik9f66ea02013-12-27 15:15:55 -0800314 SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixPtr);
Derek Sollenberger13908822013-12-10 12:28:58 -0500315 renderer->setMatrix(matrix ? *matrix : SkMatrix::I());
Romain Guyf6a11b82010-06-23 17:47:49 -0700316}
317
Romain Guy7d7b5492011-01-24 16:33:45 -0800318static void android_view_GLES20Canvas_getMatrix(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000319 jlong rendererPtr, jlong matrixPtr) {
John Reck3b202512014-06-23 13:13:08 -0700320 DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
Chris Craik9f66ea02013-12-27 15:15:55 -0800321 SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixPtr);
Romain Guy7ae7ac42010-06-25 13:46:18 -0700322 renderer->getMatrix(matrix);
Romain Guyf6a11b82010-06-23 17:47:49 -0700323}
324
Romain Guy7d7b5492011-01-24 16:33:45 -0800325static void android_view_GLES20Canvas_concatMatrix(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000326 jlong rendererPtr, jlong matrixPtr) {
John Reck3b202512014-06-23 13:13:08 -0700327 DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
Chris Craik9f66ea02013-12-27 15:15:55 -0800328 SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixPtr);
Derek Sollenberger13908822013-12-10 12:28:58 -0500329 renderer->concatMatrix(*matrix);
Romain Guybb9524b2010-06-22 18:56:38 -0700330}
331
332// ----------------------------------------------------------------------------
333// Drawing
Romain Guy85bf02f2010-06-22 13:11:24 -0700334// ----------------------------------------------------------------------------
335
Romain Guy7d7b5492011-01-24 16:33:45 -0800336static void android_view_GLES20Canvas_drawBitmap(JNIEnv* env, jobject clazz,
Derek Sollenbergerf29d5a52014-12-03 09:55:32 -0500337 jlong rendererPtr, jlong bitmapPtr, jfloat left, jfloat top, jlong paintPtr) {
Chris Craik9f66ea02013-12-27 15:15:55 -0800338 SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapPtr);
Chris Craik0c20c382013-07-02 10:48:54 -0700339
John Reck3b202512014-06-23 13:13:08 -0700340 DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
Behdad Esfahbod6ba30b82014-07-15 16:22:32 -0400341 Paint* paint = reinterpret_cast<Paint*>(paintPtr);
Chris Craik79647502014-08-06 13:42:24 -0700342
343 // apply transform directly to canvas, so it affects shaders correctly
344 renderer->save(SkCanvas::kMatrix_SaveFlag);
345 renderer->translate(left, top);
346 renderer->drawBitmap(bitmap, paint);
347 renderer->restore();
Romain Guy85bf02f2010-06-22 13:11:24 -0700348}
349
Romain Guy7d7b5492011-01-24 16:33:45 -0800350static void android_view_GLES20Canvas_drawBitmapRect(JNIEnv* env, jobject clazz,
Derek Sollenbergerf29d5a52014-12-03 09:55:32 -0500351 jlong rendererPtr, jlong bitmapPtr,
Romain Guyce0537b2010-06-29 21:05:21 -0700352 float srcLeft, float srcTop, float srcRight, float srcBottom,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000353 float dstLeft, float dstTop, float dstRight, float dstBottom, jlong paintPtr) {
Chris Craik9f66ea02013-12-27 15:15:55 -0800354 SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapPtr);
Chris Craik0c20c382013-07-02 10:48:54 -0700355
John Reck3b202512014-06-23 13:13:08 -0700356 DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
Behdad Esfahbod6ba30b82014-07-15 16:22:32 -0400357 Paint* paint = reinterpret_cast<Paint*>(paintPtr);
Romain Guydbd77cd2010-07-09 10:36:05 -0700358 renderer->drawBitmap(bitmap, srcLeft, srcTop, srcRight, srcBottom,
359 dstLeft, dstTop, dstRight, dstBottom, paint);
Romain Guyf86ef572010-07-01 11:05:42 -0700360}
Romain Guy8ba548f2010-06-30 19:21:21 -0700361
Romain Guy7d7b5492011-01-24 16:33:45 -0800362static void android_view_GLES20Canvas_drawBitmapMatrix(JNIEnv* env, jobject clazz,
Derek Sollenbergerf29d5a52014-12-03 09:55:32 -0500363 jlong rendererPtr, jlong bitmapPtr, jlong matrixPtr, jlong paintPtr) {
Chris Craik9f66ea02013-12-27 15:15:55 -0800364 SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapPtr);
Chris Craik0c20c382013-07-02 10:48:54 -0700365
John Reck3b202512014-06-23 13:13:08 -0700366 DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
Chris Craik9f66ea02013-12-27 15:15:55 -0800367 SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixPtr);
Behdad Esfahbod6ba30b82014-07-15 16:22:32 -0400368 Paint* paint = reinterpret_cast<Paint*>(paintPtr);
Chris Craik79647502014-08-06 13:42:24 -0700369
370 // apply transform directly to canvas, so it affects shaders correctly
371 renderer->save(SkCanvas::kMatrix_SaveFlag);
372 renderer->concatMatrix(*matrix);
373 renderer->drawBitmap(bitmap, paint);
374 renderer->restore();
Romain Guyce0537b2010-06-29 21:05:21 -0700375}
376
Romain Guye651cc62012-05-14 19:44:40 -0700377static void android_view_GLES20Canvas_drawBitmapData(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000378 jlong rendererPtr, jintArray colors, jint offset, jint stride,
379 jfloat left, jfloat top, jint width, jint height, jboolean hasAlpha, jlong paintPtr) {
Leon Scroggins III57ee6202014-06-04 18:51:07 -0400380 // Note: If hasAlpha is false, kRGB_565_SkColorType will be used, which will
381 // correct the alphaType to kOpaque_SkAlphaType.
Mike Reedb9330552014-06-16 17:31:48 -0400382 const SkImageInfo info = SkImageInfo::Make(width, height,
383 hasAlpha ? kN32_SkColorType : kRGB_565_SkColorType,
384 kPremul_SkAlphaType);
Romain Guy49c5fc02012-05-15 11:10:01 -0700385 SkBitmap* bitmap = new SkBitmap;
Mike Reedb9330552014-06-16 17:31:48 -0400386 if (!bitmap->allocPixels(info)) {
Romain Guy49c5fc02012-05-15 11:10:01 -0700387 delete bitmap;
Romain Guye651cc62012-05-14 19:44:40 -0700388 return;
389 }
390
Leon Scroggins III57ee6202014-06-04 18:51:07 -0400391 if (!GraphicsJNI::SetPixels(env, colors, offset, stride, 0, 0, width, height, *bitmap)) {
Romain Guy49c5fc02012-05-15 11:10:01 -0700392 delete bitmap;
Romain Guye651cc62012-05-14 19:44:40 -0700393 return;
394 }
395
John Reck3b202512014-06-23 13:13:08 -0700396 DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
Behdad Esfahbod6ba30b82014-07-15 16:22:32 -0400397 Paint* paint = reinterpret_cast<Paint*>(paintPtr);
Chris Craik79647502014-08-06 13:42:24 -0700398
399 // apply transform directly to canvas, so it affects shaders correctly
400 renderer->save(SkCanvas::kMatrix_SaveFlag);
401 renderer->translate(left, top);
402 renderer->drawBitmapData(bitmap, paint);
403 renderer->restore();
Romain Guy49c5fc02012-05-15 11:10:01 -0700404
Chris Craikf23b25a2014-06-26 15:46:20 -0700405 // Note - bitmap isn't deleted as DisplayListRenderer owns it now
Romain Guye651cc62012-05-14 19:44:40 -0700406}
407
Romain Guy7d7b5492011-01-24 16:33:45 -0800408static void android_view_GLES20Canvas_drawBitmapMesh(JNIEnv* env, jobject clazz,
Derek Sollenbergerf29d5a52014-12-03 09:55:32 -0500409 jlong rendererPtr, jlong bitmapPtr, jint meshWidth, jint meshHeight,
410 jfloatArray vertices, jint offset, jintArray colors, jint colorOffset, jlong paintPtr) {
Chris Craik9f66ea02013-12-27 15:15:55 -0800411 SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapPtr);
Chris Craik0c20c382013-07-02 10:48:54 -0700412
Romain Guy5a7b4662011-01-20 19:09:30 -0800413 jfloat* verticesArray = vertices ? env->GetFloatArrayElements(vertices, NULL) + offset : NULL;
414 jint* colorsArray = colors ? env->GetIntArrayElements(colors, NULL) + colorOffset : NULL;
415
John Reck3b202512014-06-23 13:13:08 -0700416 DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
Behdad Esfahbod6ba30b82014-07-15 16:22:32 -0400417 Paint* paint = reinterpret_cast<Paint*>(paintPtr);
Romain Guy5a7b4662011-01-20 19:09:30 -0800418 renderer->drawBitmapMesh(bitmap, meshWidth, meshHeight, verticesArray, colorsArray, paint);
419
420 if (vertices) env->ReleaseFloatArrayElements(vertices, verticesArray, 0);
421 if (colors) env->ReleaseIntArrayElements(colors, colorsArray, 0);
422}
423
Romain Guy7d7b5492011-01-24 16:33:45 -0800424static void android_view_GLES20Canvas_drawPatch(JNIEnv* env, jobject clazz,
Derek Sollenbergerf29d5a52014-12-03 09:55:32 -0500425 jlong rendererPtr, jlong bitmapPtr, jlong patchPtr,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000426 float left, float top, float right, float bottom, jlong paintPtr) {
Chris Craik9f66ea02013-12-27 15:15:55 -0800427 SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapPtr);
Chris Craik0c20c382013-07-02 10:48:54 -0700428
John Reck3b202512014-06-23 13:13:08 -0700429 DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
Chris Craik9f66ea02013-12-27 15:15:55 -0800430 Res_png_9patch* patch = reinterpret_cast<Res_png_9patch*>(patchPtr);
Behdad Esfahbod6ba30b82014-07-15 16:22:32 -0400431 Paint* paint = reinterpret_cast<Paint*>(paintPtr);
Romain Guy3b748a42013-04-17 18:54:38 -0700432 renderer->drawPatch(bitmap, patch, left, top, right, bottom, paint);
Romain Guydeba7852010-07-07 17:54:48 -0700433}
434
Romain Guy7d7b5492011-01-24 16:33:45 -0800435static void android_view_GLES20Canvas_drawColor(JNIEnv* env, jobject clazz,
Chris Craik2ce93282014-06-23 17:48:09 -0700436 jlong rendererPtr, jint color, jint modeHandle) {
John Reck3b202512014-06-23 13:13:08 -0700437 DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
Chris Craik2ce93282014-06-23 17:48:09 -0700438 SkPorterDuff::Mode mode = static_cast<SkPorterDuff::Mode>(modeHandle);
439 renderer->drawColor(color, SkPorterDuff::ToXfermodeMode(mode));
Romain Guyce0537b2010-06-29 21:05:21 -0700440}
441
Romain Guy7d7b5492011-01-24 16:33:45 -0800442static void android_view_GLES20Canvas_drawRect(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000443 jlong rendererPtr, jfloat left, jfloat top, jfloat right, jfloat bottom,
444 jlong paintPtr) {
John Reck3b202512014-06-23 13:13:08 -0700445 DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
Behdad Esfahbod6ba30b82014-07-15 16:22:32 -0400446 Paint* paint = reinterpret_cast<Paint*>(paintPtr);
Romain Guyc7d53492010-06-25 13:41:57 -0700447 renderer->drawRect(left, top, right, bottom, paint);
448}
449
Romain Guy7d7b5492011-01-24 16:33:45 -0800450static void android_view_GLES20Canvas_drawRoundRect(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000451 jlong rendererPtr, jfloat left, jfloat top, jfloat right, jfloat bottom,
452 jfloat rx, jfloat ry, jlong paintPtr) {
John Reck3b202512014-06-23 13:13:08 -0700453 DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
Behdad Esfahbod6ba30b82014-07-15 16:22:32 -0400454 Paint* paint = reinterpret_cast<Paint*>(paintPtr);
Romain Guy01d58e42011-01-19 21:54:02 -0800455 renderer->drawRoundRect(left, top, right, bottom, rx, ry, paint);
456}
457
Jorim Jaggi072707d2014-09-15 17:20:08 +0200458static void android_view_GLES20Canvas_drawRoundRectProps(JNIEnv* env, jobject clazz,
459 jlong rendererPtr, jlong leftPropPtr, jlong topPropPtr, jlong rightPropPtr,
460 jlong bottomPropPtr, jlong rxPropPtr, jlong ryPropPtr, jlong paintPropPtr) {
461 DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
462 CanvasPropertyPrimitive* leftProp = reinterpret_cast<CanvasPropertyPrimitive*>(leftPropPtr);
463 CanvasPropertyPrimitive* topProp = reinterpret_cast<CanvasPropertyPrimitive*>(topPropPtr);
464 CanvasPropertyPrimitive* rightProp = reinterpret_cast<CanvasPropertyPrimitive*>(rightPropPtr);
465 CanvasPropertyPrimitive* bottomProp = reinterpret_cast<CanvasPropertyPrimitive*>(bottomPropPtr);
466 CanvasPropertyPrimitive* rxProp = reinterpret_cast<CanvasPropertyPrimitive*>(rxPropPtr);
467 CanvasPropertyPrimitive* ryProp = reinterpret_cast<CanvasPropertyPrimitive*>(ryPropPtr);
468 CanvasPropertyPaint* paintProp = reinterpret_cast<CanvasPropertyPaint*>(paintPropPtr);
469 renderer->drawRoundRect(leftProp, topProp, rightProp, bottomProp, rxProp, ryProp, paintProp);
470}
471
Romain Guy7d7b5492011-01-24 16:33:45 -0800472static void android_view_GLES20Canvas_drawCircle(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000473 jlong rendererPtr, jfloat x, jfloat y, jfloat radius, jlong paintPtr) {
John Reck3b202512014-06-23 13:13:08 -0700474 DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
Behdad Esfahbod6ba30b82014-07-15 16:22:32 -0400475 Paint* paint = reinterpret_cast<Paint*>(paintPtr);
Romain Guy01d58e42011-01-19 21:54:02 -0800476 renderer->drawCircle(x, y, radius, paint);
477}
478
John Reck52244ff2014-05-01 21:27:37 -0700479static void android_view_GLES20Canvas_drawCircleProps(JNIEnv* env, jobject clazz,
480 jlong rendererPtr, jlong xPropPtr, jlong yPropPtr, jlong radiusPropPtr, jlong paintPropPtr) {
John Reck3b202512014-06-23 13:13:08 -0700481 DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
John Reck52244ff2014-05-01 21:27:37 -0700482 CanvasPropertyPrimitive* xProp = reinterpret_cast<CanvasPropertyPrimitive*>(xPropPtr);
483 CanvasPropertyPrimitive* yProp = reinterpret_cast<CanvasPropertyPrimitive*>(yPropPtr);
484 CanvasPropertyPrimitive* radiusProp = reinterpret_cast<CanvasPropertyPrimitive*>(radiusPropPtr);
485 CanvasPropertyPaint* paintProp = reinterpret_cast<CanvasPropertyPaint*>(paintPropPtr);
486 renderer->drawCircle(xProp, yProp, radiusProp, paintProp);
487}
488
Romain Guy7d7b5492011-01-24 16:33:45 -0800489static void android_view_GLES20Canvas_drawOval(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000490 jlong rendererPtr, jfloat left, jfloat top, jfloat right, jfloat bottom,
491 jlong paintPtr) {
John Reck3b202512014-06-23 13:13:08 -0700492 DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
Behdad Esfahbod6ba30b82014-07-15 16:22:32 -0400493 Paint* paint = reinterpret_cast<Paint*>(paintPtr);
Romain Guyc1cd9ba32011-01-23 14:18:41 -0800494 renderer->drawOval(left, top, right, bottom, paint);
495}
496
Romain Guy7d7b5492011-01-24 16:33:45 -0800497static void android_view_GLES20Canvas_drawArc(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000498 jlong rendererPtr, jfloat left, jfloat top, jfloat right, jfloat bottom,
499 jfloat startAngle, jfloat sweepAngle, jboolean useCenter, jlong paintPtr) {
John Reck3b202512014-06-23 13:13:08 -0700500 DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
Behdad Esfahbod6ba30b82014-07-15 16:22:32 -0400501 Paint* paint = reinterpret_cast<Paint*>(paintPtr);
Romain Guy8b2f5262011-01-23 16:15:02 -0800502 renderer->drawArc(left, top, right, bottom, startAngle, sweepAngle, useCenter, paint);
503}
504
Romain Guy672433d2013-01-04 19:05:13 -0800505static void android_view_GLES20Canvas_drawRegionAsRects(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000506 jlong rendererPtr, jlong regionPtr, jlong paintPtr) {
John Reck3b202512014-06-23 13:13:08 -0700507 DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
Chris Craik9f66ea02013-12-27 15:15:55 -0800508 SkRegion* region = reinterpret_cast<SkRegion*>(regionPtr);
Behdad Esfahbod6ba30b82014-07-15 16:22:32 -0400509 Paint* paint = reinterpret_cast<Paint*>(paintPtr);
510 if (paint->getStyle() != Paint::kFill_Style ||
Romain Guy672433d2013-01-04 19:05:13 -0800511 (paint->isAntiAlias() && !renderer->isCurrentTransformSimple())) {
512 SkRegion::Iterator it(*region);
513 while (!it.done()) {
514 const SkIRect& r = it.rect();
515 renderer->drawRect(r.fLeft, r.fTop, r.fRight, r.fBottom, paint);
516 it.next();
517 }
518 } else {
519 int count = 0;
520 Vector<float> rects;
521 SkRegion::Iterator it(*region);
522 while (!it.done()) {
523 const SkIRect& r = it.rect();
524 rects.push(r.fLeft);
525 rects.push(r.fTop);
526 rects.push(r.fRight);
527 rects.push(r.fBottom);
Chris Craik2af46352012-11-26 18:30:17 -0800528 count += 4;
Romain Guy672433d2013-01-04 19:05:13 -0800529 it.next();
530 }
531 renderer->drawRects(rects.array(), count, paint);
Romain Guya48a1a82010-08-10 14:59:15 -0700532 }
533}
534
Romain Guyed6fcb02011-03-21 13:11:28 -0700535static void android_view_GLES20Canvas_drawPoints(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000536 jlong rendererPtr, jfloatArray points, jint offset, jint count, jlong paintPtr) {
John Reck3b202512014-06-23 13:13:08 -0700537 DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
Romain Guyed6fcb02011-03-21 13:11:28 -0700538 jfloat* storage = env->GetFloatArrayElements(points, NULL);
Behdad Esfahbod6ba30b82014-07-15 16:22:32 -0400539 Paint* paint = reinterpret_cast<Paint*>(paintPtr);
Romain Guyed6fcb02011-03-21 13:11:28 -0700540 renderer->drawPoints(storage + offset, count, paint);
541 env->ReleaseFloatArrayElements(points, storage, 0);
542}
543
Romain Guy7d7b5492011-01-24 16:33:45 -0800544static void android_view_GLES20Canvas_drawPath(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000545 jlong rendererPtr, jlong pathPtr, jlong paintPtr) {
John Reck3b202512014-06-23 13:13:08 -0700546 DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
Chris Craik9f66ea02013-12-27 15:15:55 -0800547 SkPath* path = reinterpret_cast<SkPath*>(pathPtr);
Behdad Esfahbod6ba30b82014-07-15 16:22:32 -0400548 Paint* paint = reinterpret_cast<Paint*>(paintPtr);
Romain Guy7fbcc042010-08-04 15:40:07 -0700549 renderer->drawPath(path, paint);
550}
551
Romain Guy7d7b5492011-01-24 16:33:45 -0800552static void android_view_GLES20Canvas_drawLines(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000553 jlong rendererPtr, jfloatArray points, jint offset, jint count, jlong paintPtr) {
John Reck3b202512014-06-23 13:13:08 -0700554 DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
Romain Guy759ea802010-09-16 20:49:46 -0700555 jfloat* storage = env->GetFloatArrayElements(points, NULL);
Behdad Esfahbod6ba30b82014-07-15 16:22:32 -0400556 Paint* paint = reinterpret_cast<Paint*>(paintPtr);
Romain Guy759ea802010-09-16 20:49:46 -0700557 renderer->drawLines(storage + offset, count, paint);
Romain Guy759ea802010-09-16 20:49:46 -0700558 env->ReleaseFloatArrayElements(points, storage, 0);
559}
560
Romain Guy85bf02f2010-06-22 13:11:24 -0700561// ----------------------------------------------------------------------------
Romain Guy5ff9df62012-01-23 17:09:05 -0800562// Draw filters
563// ----------------------------------------------------------------------------
564
Derek Sollenberger09c2d4f2014-10-15 09:21:10 -0400565static void android_view_GLES20Canvas_setDrawFilter(JNIEnv* env, jobject clazz,
566 jlong rendererPtr, jlong filterPtr) {
John Reck3b202512014-06-23 13:13:08 -0700567 DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
Derek Sollenberger09c2d4f2014-10-15 09:21:10 -0400568 SkDrawFilter* filter = reinterpret_cast<SkDrawFilter*>(filterPtr);
569 renderer->setDrawFilter(filter);
Romain Guy5ff9df62012-01-23 17:09:05 -0800570}
571
572// ----------------------------------------------------------------------------
Romain Guya1db5742010-07-20 13:09:13 -0700573// Text
574// ----------------------------------------------------------------------------
575
Raph Levienf2114d52014-06-01 15:54:47 -0700576class RenderTextFunctor {
577public:
John Reck3b202512014-06-23 13:13:08 -0700578 RenderTextFunctor(const Layout& layout, DisplayListRenderer* renderer, jfloat x, jfloat y,
Behdad Esfahbod6ba30b82014-07-15 16:22:32 -0400579 Paint* paint, uint16_t* glyphs, float* pos, float totalAdvance,
Raph Levienf2114d52014-06-01 15:54:47 -0700580 uirenderer::Rect& bounds)
581 : layout(layout), renderer(renderer), x(x), y(y), paint(paint), glyphs(glyphs),
582 pos(pos), totalAdvance(totalAdvance), bounds(bounds) { }
Raph Levien1fc0fa82014-06-06 18:05:22 -0700583 void operator()(size_t start, size_t end) {
Raph Levienf2114d52014-06-01 15:54:47 -0700584 for (size_t i = start; i < end; i++) {
585 glyphs[i] = layout.getGlyphId(i);
586 pos[2 * i] = layout.getX(i);
587 pos[2 * i + 1] = layout.getY(i);
588 }
Raph Levienf2114d52014-06-01 15:54:47 -0700589 size_t glyphsCount = end - start;
590 int bytesCount = glyphsCount * sizeof(jchar);
591 renderer->drawText((const char*) (glyphs + start), bytesCount, glyphsCount,
592 x, y, pos + 2 * start, paint, totalAdvance, bounds);
593 }
594private:
595 const Layout& layout;
John Reck3b202512014-06-23 13:13:08 -0700596 DisplayListRenderer* renderer;
Raph Levienf2114d52014-06-01 15:54:47 -0700597 jfloat x;
598 jfloat y;
Behdad Esfahbod6ba30b82014-07-15 16:22:32 -0400599 Paint* paint;
Raph Levienf2114d52014-06-01 15:54:47 -0700600 uint16_t* glyphs;
601 float* pos;
602 float totalAdvance;
603 uirenderer::Rect& bounds;
604};
605
John Reck3b202512014-06-23 13:13:08 -0700606static void renderTextLayout(DisplayListRenderer* renderer, Layout* layout,
Behdad Esfahbod6ba30b82014-07-15 16:22:32 -0400607 jfloat x, jfloat y, Paint* paint) {
Raph Levien1a73f7322014-01-30 16:06:28 -0800608 size_t nGlyphs = layout->nGlyphs();
609 float* pos = new float[nGlyphs * 2];
610 uint16_t* glyphs = new uint16_t[nGlyphs];
Raph Levien1a73f7322014-01-30 16:06:28 -0800611 MinikinRect b;
612 layout->getBounds(&b);
613 android::uirenderer::Rect bounds(b.mLeft, b.mTop, b.mRight, b.mBottom);
614 bounds.translate(x, y);
615 float totalAdvance = layout->getAdvance();
616
Raph Levienf2114d52014-06-01 15:54:47 -0700617 RenderTextFunctor f(*layout, renderer, x, y, paint, glyphs, pos, totalAdvance, bounds);
Raph Levien1fc0fa82014-06-06 18:05:22 -0700618 MinikinUtils::forFontRun(*layout, paint, f);
Raph Levien1a73f7322014-01-30 16:06:28 -0800619 delete[] glyphs;
620 delete[] pos;
621}
Raph Levien1a73f7322014-01-30 16:06:28 -0800622
John Reck3b202512014-06-23 13:13:08 -0700623static void renderText(DisplayListRenderer* renderer, const jchar* text, int count,
Behdad Esfahbod6ba30b82014-07-15 16:22:32 -0400624 jfloat x, jfloat y, int bidiFlags, Paint* paint, TypefaceImpl* typeface) {
Raph Levien1a73f7322014-01-30 16:06:28 -0800625 Layout layout;
Behdad Esfahbod63c5c782014-07-25 14:54:46 -0400626 MinikinUtils::doLayout(&layout, paint, bidiFlags, typeface, text, 0, count, count);
Raph Levien36607892014-06-25 16:32:13 -0700627 x += MinikinUtils::xOffsetForTextAlign(paint, layout);
Raph Levien1a73f7322014-01-30 16:06:28 -0800628 renderTextLayout(renderer, &layout, x, y, paint);
Romain Guye8e62a42010-07-23 18:55:21 -0700629}
630
Raph Levien9d2b5e12014-06-15 23:53:57 -0700631class RenderTextOnPathFunctor {
632public:
John Reck3b202512014-06-23 13:13:08 -0700633 RenderTextOnPathFunctor(const Layout& layout, DisplayListRenderer* renderer, float hOffset,
Behdad Esfahbod6ba30b82014-07-15 16:22:32 -0400634 float vOffset, Paint* paint, SkPath* path)
Raph Levien9d2b5e12014-06-15 23:53:57 -0700635 : layout(layout), renderer(renderer), hOffset(hOffset), vOffset(vOffset),
636 paint(paint), path(path) {
637 }
638 void operator()(size_t start, size_t end) {
639 uint16_t glyphs[1];
640 for (size_t i = start; i < end; i++) {
641 glyphs[0] = layout.getGlyphId(i);
642 float x = hOffset + layout.getX(i);
643 float y = vOffset + layout.getY(i);
644 renderer->drawTextOnPath((const char*) glyphs, sizeof(glyphs), 1, path, x, y, paint);
645 }
646 }
647private:
648 const Layout& layout;
John Reck3b202512014-06-23 13:13:08 -0700649 DisplayListRenderer* renderer;
Raph Levien9d2b5e12014-06-15 23:53:57 -0700650 float hOffset;
651 float vOffset;
Behdad Esfahbod6ba30b82014-07-15 16:22:32 -0400652 Paint* paint;
Raph Levien9d2b5e12014-06-15 23:53:57 -0700653 SkPath* path;
654};
Raph Levien9d2b5e12014-06-15 23:53:57 -0700655
John Reck3b202512014-06-23 13:13:08 -0700656static void renderTextOnPath(DisplayListRenderer* renderer, const jchar* text, int count,
Behdad Esfahbod6ba30b82014-07-15 16:22:32 -0400657 SkPath* path, jfloat hOffset, jfloat vOffset, int bidiFlags, Paint* paint,
Raph Levien9d2b5e12014-06-15 23:53:57 -0700658 TypefaceImpl* typeface) {
Raph Levien9d2b5e12014-06-15 23:53:57 -0700659 Layout layout;
Behdad Esfahbod63c5c782014-07-25 14:54:46 -0400660 MinikinUtils::doLayout(&layout, paint, bidiFlags, typeface, text, 0, count, count);
Raph Levien9d2b5e12014-06-15 23:53:57 -0700661 hOffset += MinikinUtils::hOffsetForTextAlign(paint, layout, *path);
Behdad Esfahbod6ba30b82014-07-15 16:22:32 -0400662 Paint::Align align = paint->getTextAlign();
663 paint->setTextAlign(Paint::kLeft_Align);
Raph Levien9d2b5e12014-06-15 23:53:57 -0700664
665 RenderTextOnPathFunctor f(layout, renderer, hOffset, vOffset, paint, path);
666 MinikinUtils::forFontRun(layout, paint, f);
667 paint->setTextAlign(align);
Romain Guy325740f2012-02-24 16:48:34 -0800668}
669
John Reck3b202512014-06-23 13:13:08 -0700670static void renderTextRun(DisplayListRenderer* renderer, const jchar* text,
Romain Guy61c8c9c2010-08-09 20:48:09 -0700671 jint start, jint count, jint contextCount, jfloat x, jfloat y,
Behdad Esfahbod6ba30b82014-07-15 16:22:32 -0400672 int bidiFlags, Paint* paint, TypefaceImpl* typeface) {
Raph Levien1a73f7322014-01-30 16:06:28 -0800673 Layout layout;
Behdad Esfahbod63c5c782014-07-25 14:54:46 -0400674 MinikinUtils::doLayout(&layout, paint, bidiFlags, typeface, text, start, count, contextCount);
Raph Levien36607892014-06-25 16:32:13 -0700675 x += MinikinUtils::xOffsetForTextAlign(paint, layout);
Raph Levien1a73f7322014-01-30 16:06:28 -0800676 renderTextLayout(renderer, &layout, x, y, paint);
Romain Guy61c8c9c2010-08-09 20:48:09 -0700677}
678
Romain Guy7d7b5492011-01-24 16:33:45 -0800679static void android_view_GLES20Canvas_drawTextArray(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000680 jlong rendererPtr, jcharArray text, jint index, jint count,
Raph Levien051910b2014-06-15 18:25:29 -0700681 jfloat x, jfloat y, jint bidiFlags, jlong paintPtr, jlong typefacePtr) {
John Reck3b202512014-06-23 13:13:08 -0700682 DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
Romain Guya1db5742010-07-20 13:09:13 -0700683 jchar* textArray = env->GetCharArrayElements(text, NULL);
Behdad Esfahbod6ba30b82014-07-15 16:22:32 -0400684 Paint* paint = reinterpret_cast<Paint*>(paintPtr);
Raph Levien1a73f7322014-01-30 16:06:28 -0800685 TypefaceImpl* typeface = reinterpret_cast<TypefaceImpl*>(typefacePtr);
Chris Craik9f66ea02013-12-27 15:15:55 -0800686
Raph Levien051910b2014-06-15 18:25:29 -0700687 renderText(renderer, textArray + index, count, x, y, bidiFlags, paint, typeface);
Romain Guya1db5742010-07-20 13:09:13 -0700688 env->ReleaseCharArrayElements(text, textArray, JNI_ABORT);
689}
690
Romain Guy7d7b5492011-01-24 16:33:45 -0800691static void android_view_GLES20Canvas_drawText(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000692 jlong rendererPtr, jstring text, jint start, jint end,
Raph Levien051910b2014-06-15 18:25:29 -0700693 jfloat x, jfloat y, jint bidiFlags, jlong paintPtr, jlong typefacePtr) {
John Reck3b202512014-06-23 13:13:08 -0700694 DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
Romain Guya1db5742010-07-20 13:09:13 -0700695 const jchar* textArray = env->GetStringChars(text, NULL);
Behdad Esfahbod6ba30b82014-07-15 16:22:32 -0400696 Paint* paint = reinterpret_cast<Paint*>(paintPtr);
Raph Levien1a73f7322014-01-30 16:06:28 -0800697 TypefaceImpl* typeface = reinterpret_cast<TypefaceImpl*>(typefacePtr);
Chris Craik9f66ea02013-12-27 15:15:55 -0800698
Raph Levien051910b2014-06-15 18:25:29 -0700699 renderText(renderer, textArray + start, end - start, x, y, bidiFlags, paint, typeface);
Romain Guya1db5742010-07-20 13:09:13 -0700700 env->ReleaseStringChars(text, textArray);
701}
702
Romain Guy325740f2012-02-24 16:48:34 -0800703static void android_view_GLES20Canvas_drawTextArrayOnPath(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000704 jlong rendererPtr, jcharArray text, jint index, jint count,
Raph Levien9d2b5e12014-06-15 23:53:57 -0700705 jlong pathPtr, jfloat hOffset, jfloat vOffset, jint bidiFlags, jlong paintPtr,
706 jlong typefacePtr) {
John Reck3b202512014-06-23 13:13:08 -0700707 DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
Romain Guy325740f2012-02-24 16:48:34 -0800708 jchar* textArray = env->GetCharArrayElements(text, NULL);
Chris Craik9f66ea02013-12-27 15:15:55 -0800709 SkPath* path = reinterpret_cast<SkPath*>(pathPtr);
Behdad Esfahbod6ba30b82014-07-15 16:22:32 -0400710 Paint* paint = reinterpret_cast<Paint*>(paintPtr);
Raph Levien9d2b5e12014-06-15 23:53:57 -0700711 TypefaceImpl* typeface = reinterpret_cast<TypefaceImpl*>(typefacePtr);
Chris Craik9f66ea02013-12-27 15:15:55 -0800712
Romain Guy325740f2012-02-24 16:48:34 -0800713 renderTextOnPath(renderer, textArray + index, count, path,
Raph Levien9d2b5e12014-06-15 23:53:57 -0700714 hOffset, vOffset, bidiFlags, paint, typeface);
Romain Guy325740f2012-02-24 16:48:34 -0800715 env->ReleaseCharArrayElements(text, textArray, JNI_ABORT);
716}
717
718static void android_view_GLES20Canvas_drawTextOnPath(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000719 jlong rendererPtr, jstring text, jint start, jint end,
Raph Levien9d2b5e12014-06-15 23:53:57 -0700720 jlong pathPtr, jfloat hOffset, jfloat vOffset, jint bidiFlags, jlong paintPtr,
721 jlong typefacePtr) {
John Reck3b202512014-06-23 13:13:08 -0700722 DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
Romain Guy325740f2012-02-24 16:48:34 -0800723 const jchar* textArray = env->GetStringChars(text, NULL);
Chris Craik9f66ea02013-12-27 15:15:55 -0800724 SkPath* path = reinterpret_cast<SkPath*>(pathPtr);
Behdad Esfahbod6ba30b82014-07-15 16:22:32 -0400725 Paint* paint = reinterpret_cast<Paint*>(paintPtr);
Raph Levien9d2b5e12014-06-15 23:53:57 -0700726 TypefaceImpl* typeface = reinterpret_cast<TypefaceImpl*>(typefacePtr);
Chris Craik9f66ea02013-12-27 15:15:55 -0800727
Romain Guy325740f2012-02-24 16:48:34 -0800728 renderTextOnPath(renderer, textArray + start, end - start, path,
Raph Levien9d2b5e12014-06-15 23:53:57 -0700729 hOffset, vOffset, bidiFlags, paint, typeface);
Romain Guy325740f2012-02-24 16:48:34 -0800730 env->ReleaseStringChars(text, textArray);
731}
732
Romain Guy7d7b5492011-01-24 16:33:45 -0800733static void android_view_GLES20Canvas_drawTextRunArray(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000734 jlong rendererPtr, jcharArray text, jint index, jint count,
Raph Levien051910b2014-06-15 18:25:29 -0700735 jint contextIndex, jint contextCount, jfloat x, jfloat y, jboolean isRtl,
Raph Levien1a73f7322014-01-30 16:06:28 -0800736 jlong paintPtr, jlong typefacePtr) {
John Reck3b202512014-06-23 13:13:08 -0700737 DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
Romain Guy61c8c9c2010-08-09 20:48:09 -0700738 jchar* textArray = env->GetCharArrayElements(text, NULL);
Behdad Esfahbod6ba30b82014-07-15 16:22:32 -0400739 Paint* paint = reinterpret_cast<Paint*>(paintPtr);
Raph Levien1a73f7322014-01-30 16:06:28 -0800740 TypefaceImpl* typeface = reinterpret_cast<TypefaceImpl*>(typefacePtr);
Chris Craik9f66ea02013-12-27 15:15:55 -0800741
Raph Levien051910b2014-06-15 18:25:29 -0700742 int bidiFlags = isRtl ? kBidi_Force_RTL : kBidi_Force_LTR;
Romain Guy61c8c9c2010-08-09 20:48:09 -0700743 renderTextRun(renderer, textArray + contextIndex, index - contextIndex,
Raph Levien051910b2014-06-15 18:25:29 -0700744 count, contextCount, x, y, bidiFlags, paint, typeface);
Romain Guy61c8c9c2010-08-09 20:48:09 -0700745 env->ReleaseCharArrayElements(text, textArray, JNI_ABORT);
746 }
747
Romain Guy7d7b5492011-01-24 16:33:45 -0800748static void android_view_GLES20Canvas_drawTextRun(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000749 jlong rendererPtr, jstring text, jint start, jint end,
Raph Levien051910b2014-06-15 18:25:29 -0700750 jint contextStart, int contextEnd, jfloat x, jfloat y, jboolean isRtl,
Raph Levien1a73f7322014-01-30 16:06:28 -0800751 jlong paintPtr, jlong typefacePtr) {
John Reck3b202512014-06-23 13:13:08 -0700752 DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
Romain Guy61c8c9c2010-08-09 20:48:09 -0700753 const jchar* textArray = env->GetStringChars(text, NULL);
754 jint count = end - start;
755 jint contextCount = contextEnd - contextStart;
Behdad Esfahbod6ba30b82014-07-15 16:22:32 -0400756 Paint* paint = reinterpret_cast<Paint*>(paintPtr);
Raph Levien1a73f7322014-01-30 16:06:28 -0800757 TypefaceImpl* typeface = reinterpret_cast<TypefaceImpl*>(typefacePtr);
Chris Craik9f66ea02013-12-27 15:15:55 -0800758
Raph Levien051910b2014-06-15 18:25:29 -0700759 int bidiFlags = isRtl ? kBidi_Force_RTL : kBidi_Force_LTR;
Romain Guy61c8c9c2010-08-09 20:48:09 -0700760 renderTextRun(renderer, textArray + contextStart, start - contextStart,
Raph Levien051910b2014-06-15 18:25:29 -0700761 count, contextCount, x, y, bidiFlags, paint, typeface);
Romain Guy61c8c9c2010-08-09 20:48:09 -0700762 env->ReleaseStringChars(text, textArray);
763}
764
Romain Guyb051e892010-09-28 19:09:36 -0700765// ----------------------------------------------------------------------------
766// Display lists
767// ----------------------------------------------------------------------------
768
John Reck44fd8d22014-02-26 11:00:11 -0800769static jlong android_view_GLES20Canvas_finishRecording(JNIEnv* env,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000770 jobject clazz, jlong rendererPtr) {
Chris Craik9f66ea02013-12-27 15:15:55 -0800771 DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
John Reck44fd8d22014-02-26 11:00:11 -0800772 return reinterpret_cast<jlong>(renderer->finishRecording());
773}
774
Chris Craik3f0854292014-04-15 16:18:08 -0700775static jlong android_view_GLES20Canvas_createDisplayListRenderer(JNIEnv* env, jobject clazz) {
John Reck44fd8d22014-02-26 11:00:11 -0800776 return reinterpret_cast<jlong>(new DisplayListRenderer);
Chet Haase5977baa2011-01-05 18:01:22 -0800777}
778
Tom Hudson107843d2014-09-08 11:26:26 -0400779static void android_view_GLES20Canvas_drawRenderNode(JNIEnv* env,
Chris Craika7090e02014-06-20 16:01:00 -0700780 jobject clazz, jlong rendererPtr, jlong renderNodePtr,
Tom Hudson107843d2014-09-08 11:26:26 -0400781 jint flags) {
John Reck3b202512014-06-23 13:13:08 -0700782 DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
Chris Craika7090e02014-06-20 16:01:00 -0700783 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
Romain Guycabfcc12011-03-07 18:06:46 -0800784 android::uirenderer::Rect bounds;
Tom Hudson107843d2014-09-08 11:26:26 -0400785 renderer->drawRenderNode(renderNode, bounds, flags);
Romain Guyb051e892010-09-28 19:09:36 -0700786}
787
Romain Guy6c319ca2011-01-11 14:29:25 -0800788// ----------------------------------------------------------------------------
789// Layers
790// ----------------------------------------------------------------------------
791
Romain Guy7d7b5492011-01-24 16:33:45 -0800792static void android_view_GLES20Canvas_drawLayer(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000793 jlong rendererPtr, jlong layerPtr, jfloat x, jfloat y) {
John Reck3b202512014-06-23 13:13:08 -0700794 DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
John Reck12f5e342014-11-07 07:53:43 -0800795 DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(layerPtr);
Chris Craika08f95c2013-03-15 17:24:33 -0700796 renderer->drawLayer(layer, x, y);
Romain Guy6c319ca2011-01-11 14:29:25 -0800797}
798
Romain Guy16393512010-08-08 00:14:31 -0700799// ----------------------------------------------------------------------------
800// Common
801// ----------------------------------------------------------------------------
802
803static jboolean android_view_GLES20Canvas_isAvailable(JNIEnv* env, jobject clazz) {
John Recka2732a22014-12-18 13:52:33 -0800804 char prop[PROPERTY_VALUE_MAX];
805 if (property_get("ro.kernel.qemu", prop, NULL) == 0) {
806 // not in the emulator
807 return JNI_TRUE;
Jesse Hall44063452011-12-01 11:27:45 -0800808 }
John Recka2732a22014-12-18 13:52:33 -0800809 // In the emulator this property will be set to 1 when hardware GLES is
810 // enabled, 0 otherwise. On old emulator versions it will be undefined.
811 property_get("ro.kernel.qemu.gles", prop, "0");
812 return atoi(prop) == 1 ? JNI_TRUE : JNI_FALSE;
Romain Guy16393512010-08-08 00:14:31 -0700813}
814
Romain Guya1db5742010-07-20 13:09:13 -0700815// ----------------------------------------------------------------------------
Chet Haase9c1e23b2011-03-24 10:51:31 -0700816// Logging
817// ----------------------------------------------------------------------------
818
Chet Haase9c1e23b2011-03-24 10:51:31 -0700819static void
Romain Guy65b345f2011-07-27 18:51:50 -0700820android_app_ActivityThread_dumpGraphics(JNIEnv* env, jobject clazz, jobject javaFileDescriptor) {
John Recka2732a22014-12-18 13:52:33 -0800821 int fd = jniGetFDFromFileDescriptor(env, javaFileDescriptor);
822 android::uirenderer::renderthread::RenderProxy::outputLogBuffer(fd);
Chet Haase9c1e23b2011-03-24 10:51:31 -0700823}
824
825// ----------------------------------------------------------------------------
Romain Guye4d01122010-06-16 18:44:05 -0700826// JNI Glue
827// ----------------------------------------------------------------------------
828
829const char* const kClassPathName = "android/view/GLES20Canvas";
830
831static JNINativeMethod gMethods[] = {
Romain Guy61c8c9c2010-08-09 20:48:09 -0700832 { "nIsAvailable", "()Z", (void*) android_view_GLES20Canvas_isAvailable },
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000833 { "nDestroyRenderer", "(J)V", (void*) android_view_GLES20Canvas_destroyRenderer },
834 { "nSetViewport", "(JII)V", (void*) android_view_GLES20Canvas_setViewport },
Chris Craikcce47eb2014-07-16 15:12:15 -0700835 { "nSetHighContrastText","(JZ)V", (void*) android_view_GLES20Canvas_setHighContrastText },
Chris Craik8afd0f22014-08-21 17:41:57 -0700836 { "nInsertReorderBarrier","(JZ)V", (void*) android_view_GLES20Canvas_insertReorderBarrier },
Tom Hudson107843d2014-09-08 11:26:26 -0400837 { "nPrepare", "(JZ)V", (void*) android_view_GLES20Canvas_prepare },
838 { "nPrepareDirty", "(JIIIIZ)V", (void*) android_view_GLES20Canvas_prepareDirty },
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000839 { "nFinish", "(J)V", (void*) android_view_GLES20Canvas_finish },
Chris Craikba9b6132013-12-15 17:10:19 -0800840 { "nSetProperty", "(Ljava/lang/String;Ljava/lang/String;)V",
841 (void*) android_view_GLES20Canvas_setProperty },
Romain Guy16393512010-08-08 00:14:31 -0700842
Tom Hudson107843d2014-09-08 11:26:26 -0400843 { "nCallDrawGLFunction", "(JJ)V", (void*) android_view_GLES20Canvas_callDrawGLFunction },
Romain Guy7d7b5492011-01-24 16:33:45 -0800844
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000845 { "nSave", "(JI)I", (void*) android_view_GLES20Canvas_save },
846 { "nRestore", "(J)V", (void*) android_view_GLES20Canvas_restore },
847 { "nRestoreToCount", "(JI)V", (void*) android_view_GLES20Canvas_restoreToCount },
848 { "nGetSaveCount", "(J)I", (void*) android_view_GLES20Canvas_getSaveCount },
Romain Guy85bf02f2010-06-22 13:11:24 -0700849
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000850 { "nSaveLayer", "(JFFFFJI)I", (void*) android_view_GLES20Canvas_saveLayer },
851 { "nSaveLayer", "(JJI)I", (void*) android_view_GLES20Canvas_saveLayerClip },
852 { "nSaveLayerAlpha", "(JFFFFII)I", (void*) android_view_GLES20Canvas_saveLayerAlpha },
853 { "nSaveLayerAlpha", "(JII)I", (void*) android_view_GLES20Canvas_saveLayerAlphaClip },
Romain Guybb9524b2010-06-22 18:56:38 -0700854
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000855 { "nQuickReject", "(JFFFF)Z", (void*) android_view_GLES20Canvas_quickReject },
856 { "nClipRect", "(JFFFFI)Z", (void*) android_view_GLES20Canvas_clipRectF },
857 { "nClipRect", "(JIIIII)Z", (void*) android_view_GLES20Canvas_clipRect },
858 { "nClipPath", "(JJI)Z", (void*) android_view_GLES20Canvas_clipPath },
859 { "nClipRegion", "(JJI)Z", (void*) android_view_GLES20Canvas_clipRegion },
Romain Guyc7d53492010-06-25 13:41:57 -0700860
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000861 { "nTranslate", "(JFF)V", (void*) android_view_GLES20Canvas_translate },
862 { "nRotate", "(JF)V", (void*) android_view_GLES20Canvas_rotate },
863 { "nScale", "(JFF)V", (void*) android_view_GLES20Canvas_scale },
864 { "nSkew", "(JFF)V", (void*) android_view_GLES20Canvas_skew },
Romain Guyc7d53492010-06-25 13:41:57 -0700865
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000866 { "nSetMatrix", "(JJ)V", (void*) android_view_GLES20Canvas_setMatrix },
867 { "nGetMatrix", "(JJ)V", (void*) android_view_GLES20Canvas_getMatrix },
868 { "nConcatMatrix", "(JJ)V", (void*) android_view_GLES20Canvas_concatMatrix },
Romain Guyc7d53492010-06-25 13:41:57 -0700869
Derek Sollenbergerf29d5a52014-12-03 09:55:32 -0500870 { "nDrawBitmap", "(JJFFJ)V", (void*) android_view_GLES20Canvas_drawBitmap },
871 { "nDrawBitmap", "(JJFFFFFFFFJ)V",(void*) android_view_GLES20Canvas_drawBitmapRect },
872 { "nDrawBitmap", "(JJJJ)V", (void*) android_view_GLES20Canvas_drawBitmapMatrix },
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000873 { "nDrawBitmap", "(J[IIIFFIIZJ)V", (void*) android_view_GLES20Canvas_drawBitmapData },
Romain Guy5a7b4662011-01-20 19:09:30 -0800874
Derek Sollenbergerf29d5a52014-12-03 09:55:32 -0500875 { "nDrawBitmapMesh", "(JJII[FI[IIJ)V",(void*) android_view_GLES20Canvas_drawBitmapMesh },
Romain Guy5a7b4662011-01-20 19:09:30 -0800876
Derek Sollenbergerf29d5a52014-12-03 09:55:32 -0500877 { "nDrawPatch", "(JJJFFFFJ)V", (void*) android_view_GLES20Canvas_drawPatch },
Patrick Dubroye4ac2d62010-12-01 11:23:13 -0800878
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000879 { "nDrawColor", "(JII)V", (void*) android_view_GLES20Canvas_drawColor },
880 { "nDrawRect", "(JFFFFJ)V", (void*) android_view_GLES20Canvas_drawRect },
881 { "nDrawRects", "(JJJ)V", (void*) android_view_GLES20Canvas_drawRegionAsRects },
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000882 { "nDrawRoundRect", "(JFFFFFFJ)V", (void*) android_view_GLES20Canvas_drawRoundRect },
Jorim Jaggi072707d2014-09-15 17:20:08 +0200883 { "nDrawRoundRect", "(JJJJJJJJ)V", (void*) android_view_GLES20Canvas_drawRoundRectProps },
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000884 { "nDrawCircle", "(JFFFJ)V", (void*) android_view_GLES20Canvas_drawCircle },
John Reck52244ff2014-05-01 21:27:37 -0700885 { "nDrawCircle", "(JJJJJ)V", (void*) android_view_GLES20Canvas_drawCircleProps },
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000886 { "nDrawOval", "(JFFFFJ)V", (void*) android_view_GLES20Canvas_drawOval },
887 { "nDrawArc", "(JFFFFFFZJ)V", (void*) android_view_GLES20Canvas_drawArc },
888 { "nDrawPoints", "(J[FIIJ)V", (void*) android_view_GLES20Canvas_drawPoints },
Romain Guy8b2f5262011-01-23 16:15:02 -0800889
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000890 { "nDrawPath", "(JJJ)V", (void*) android_view_GLES20Canvas_drawPath },
891 { "nDrawLines", "(J[FIIJ)V", (void*) android_view_GLES20Canvas_drawLines },
Romain Guybd6b79b2010-06-26 00:13:53 -0700892
Derek Sollenberger09c2d4f2014-10-15 09:21:10 -0400893 { "nSetDrawFilter", "(JJ)V", (void*) android_view_GLES20Canvas_setDrawFilter },
Romain Guy5ff9df62012-01-23 17:09:05 -0800894
Raph Levien1a73f7322014-01-30 16:06:28 -0800895 { "nDrawText", "(J[CIIFFIJJ)V", (void*) android_view_GLES20Canvas_drawTextArray },
896 { "nDrawText", "(JLjava/lang/String;IIFFIJJ)V",
Romain Guya1db5742010-07-20 13:09:13 -0700897 (void*) android_view_GLES20Canvas_drawText },
898
Raph Levien9d2b5e12014-06-15 23:53:57 -0700899 { "nDrawTextOnPath", "(J[CIIJFFIJJ)V", (void*) android_view_GLES20Canvas_drawTextArrayOnPath },
900 { "nDrawTextOnPath", "(JLjava/lang/String;IIJFFIJJ)V",
Romain Guy325740f2012-02-24 16:48:34 -0800901 (void*) android_view_GLES20Canvas_drawTextOnPath },
902
Tom Hudson107843d2014-09-08 11:26:26 -0400903 { "nDrawTextRun", "(J[CIIIIFFZJJ)V", (void*) android_view_GLES20Canvas_drawTextRunArray },
Raph Levien051910b2014-06-15 18:25:29 -0700904 { "nDrawTextRun", "(JLjava/lang/String;IIIIFFZJJ)V",
Romain Guy61c8c9c2010-08-09 20:48:09 -0700905 (void*) android_view_GLES20Canvas_drawTextRun },
906
Chris Craika7090e02014-06-20 16:01:00 -0700907 { "nGetClipBounds", "(JLandroid/graphics/Rect;)Z", (void*) android_view_GLES20Canvas_getClipBounds },
Romain Guyb051e892010-09-28 19:09:36 -0700908
Tom Hudson107843d2014-09-08 11:26:26 -0400909 { "nFinishRecording", "(J)J", (void*) android_view_GLES20Canvas_finishRecording },
910 { "nDrawRenderNode", "(JJI)V", (void*) android_view_GLES20Canvas_drawRenderNode },
Romain Guy13631f32012-01-30 17:41:55 -0800911
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000912 { "nCreateDisplayListRenderer", "()J", (void*) android_view_GLES20Canvas_createDisplayListRenderer },
Romain Guy13631f32012-01-30 17:41:55 -0800913
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000914 { "nDrawLayer", "(JJFF)V", (void*) android_view_GLES20Canvas_drawLayer },
Romain Guyb051e892010-09-28 19:09:36 -0700915
Romain Guyf61970fc2011-07-07 14:10:06 -0700916 { "nGetMaximumTextureWidth", "()I", (void*) android_view_GLES20Canvas_getMaxTextureWidth },
917 { "nGetMaximumTextureHeight", "()I", (void*) android_view_GLES20Canvas_getMaxTextureHeight },
Romain Guye4d01122010-06-16 18:44:05 -0700918};
919
Chet Haase9c1e23b2011-03-24 10:51:31 -0700920static JNINativeMethod gActivityThreadMethods[] = {
921 { "dumpGraphicsInfo", "(Ljava/io/FileDescriptor;)V",
922 (void*) android_app_ActivityThread_dumpGraphics }
923};
924
Andreas Gampe987f79f2014-11-18 17:29:46 -0800925int register_android_view_GLES20Canvas(JNIEnv* env) {
John Recka2732a22014-12-18 13:52:33 -0800926 jclass clazz = FindClassOrDie(env, "android/graphics/Rect");
927 gRectClassInfo.set = GetMethodIDOrDie(env, clazz, "set", "(IIII)V");
Romain Guy9d5316e2010-06-24 19:30:36 -0700928
Andreas Gampe987f79f2014-11-18 17:29:46 -0800929 return RegisterMethodsOrDie(env, kClassPathName, gMethods, NELEM(gMethods));
Romain Guye4d01122010-06-16 18:44:05 -0700930}
931
Romain Guy6be3d552011-07-14 18:08:37 -0700932int register_android_app_ActivityThread(JNIEnv* env) {
Andreas Gampeed6b9df2014-11-20 22:02:20 -0800933 return RegisterMethodsOrDie(env, "android/app/ActivityThread",
Chet Haase9c1e23b2011-03-24 10:51:31 -0700934 gActivityThreadMethods, NELEM(gActivityThreadMethods));
935}
936
Romain Guye4d01122010-06-16 18:44:05 -0700937};