blob: b87fe274af7e91c62a23b63a5d29669cc4657299 [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 Guy7d7b5492011-01-24 16:33:45 -080019#include <EGL/egl.h>
20
Romain Guye4d01122010-06-16 18:44:05 -070021#include "jni.h"
Patrick Dubroye4ac2d62010-12-01 11:23:13 -080022#include "GraphicsJNI.h"
Romain Guye4d01122010-06-16 18:44:05 -070023#include <nativehelper/JNIHelp.h>
Romain Guy65549432012-03-26 16:45:05 -070024
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>
Andy McFaddend47f7d82012-12-18 09:48:38 -080027#include <gui/GLConsumer.h>
Romain Guy65549432012-03-26 16:45:05 -070028
Mathias Agopianb13b9bd2012-02-17 18:27:36 -080029#include <androidfw/ResourceTypes.h>
Romain Guye4d01122010-06-16 18:44:05 -070030
Romain Guy65549432012-03-26 16:45:05 -070031#include <private/hwui/DrawGlInfo.h>
32
33#include <cutils/properties.h>
Romain Guy8f0095c2011-05-02 17:24:22 -070034
Romain Guyce0537b2010-06-29 21:05:21 -070035#include <SkBitmap.h>
Romain Guyc7d53492010-06-25 13:41:57 -070036#include <SkCanvas.h>
Romain Guyf6a11b82010-06-23 17:47:49 -070037#include <SkMatrix.h>
Romain Guyc7d53492010-06-25 13:41:57 -070038#include <SkPaint.h>
Romain Guy079ba2c2010-07-16 14:12:24 -070039#include <SkRegion.h>
Romain Guya1db5742010-07-20 13:09:13 -070040#include <SkScalerContext.h>
Romain Guy61c8c9c2010-08-09 20:48:09 -070041#include <SkTemplates.h>
Romain Guy85bf02f2010-06-22 13:11:24 -070042#include <SkXfermode.h>
Romain Guye4d01122010-06-16 18:44:05 -070043
Romain Guy52036b12013-02-14 18:03:37 -080044#include <DisplayList.h>
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 Guydb1938e2010-08-02 18:50:22 -070049#include <SkiaColorFilter.h>
Romain Guy0baaac52012-08-31 20:31:01 -070050#include <Stencil.h>
Romain Guy9d5316e2010-06-24 19:30:36 -070051#include <Rect.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
83#define MODIFIER_COLOR_FILTER 4
84
Romain Guy9d5316e2010-06-24 19:30:36 -070085// ----------------------------------------------------------------------------
Romain Guy9d5316e2010-06-24 19:30:36 -070086
87static struct {
Romain Guy7ae7ac42010-06-25 13:46:18 -070088 jmethodID set;
Romain Guy9d5316e2010-06-24 19:30:36 -070089} gRectClassInfo;
90
Romain Guye4d01122010-06-16 18:44:05 -070091// ----------------------------------------------------------------------------
Romain Guy244ada12012-03-28 16:41:26 -070092// Caching
Romain Guy7d7b5492011-01-24 16:33:45 -080093// ----------------------------------------------------------------------------
94
Romain Guybdf76092011-07-18 15:00:43 -070095static void android_view_GLES20Canvas_flushCaches(JNIEnv* env, jobject clazz,
96 Caches::FlushMode mode) {
97 if (Caches::hasInstance()) {
98 Caches::getInstance().flush(mode);
99 }
100}
101
Romain Guy8ff6b9e2011-11-09 20:10:18 -0800102static void android_view_GLES20Canvas_initCaches(JNIEnv* env, jobject clazz) {
103 if (Caches::hasInstance()) {
104 Caches::getInstance().init();
105 }
106}
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 Guye4d01122010-06-16 18:44:05 -0700115// Constructors
116// ----------------------------------------------------------------------------
117
Romain Guy6c319ca2011-01-11 14:29:25 -0800118static OpenGLRenderer* android_view_GLES20Canvas_createRenderer(JNIEnv* env, jobject clazz) {
Romain Guybdb801ca2010-10-04 17:22:29 -0700119 RENDERER_LOGD("Create OpenGLRenderer");
Romain Guy87e2f7572012-09-24 11:37:12 -0700120 OpenGLRenderer* renderer = new OpenGLRenderer();
121 renderer->initProperties();
122 return renderer;
Romain Guye4d01122010-06-16 18:44:05 -0700123}
124
Chet Haase5c13d892010-10-08 08:37:55 -0700125static void android_view_GLES20Canvas_destroyRenderer(JNIEnv* env, jobject clazz,
Romain Guyf6a11b82010-06-23 17:47:49 -0700126 OpenGLRenderer* renderer) {
Romain Guybdb801ca2010-10-04 17:22:29 -0700127 RENDERER_LOGD("Destroy OpenGLRenderer");
Romain Guyf6a11b82010-06-23 17:47:49 -0700128 delete renderer;
Romain Guye4d01122010-06-16 18:44:05 -0700129}
130
131// ----------------------------------------------------------------------------
132// Setup
133// ----------------------------------------------------------------------------
134
Romain Guy7d7b5492011-01-24 16:33:45 -0800135static void android_view_GLES20Canvas_setViewport(JNIEnv* env, jobject clazz,
Romain Guyf6a11b82010-06-23 17:47:49 -0700136 OpenGLRenderer* renderer, jint width, jint height) {
137 renderer->setViewport(width, height);
Romain Guye4d01122010-06-16 18:44:05 -0700138}
139
Chet Haase44b2fe32012-06-06 19:03:58 -0700140static int android_view_GLES20Canvas_prepare(JNIEnv* env, jobject clazz,
Romain Guy6b7bd242010-10-06 19:49:23 -0700141 OpenGLRenderer* renderer, jboolean opaque) {
Chet Haase44b2fe32012-06-06 19:03:58 -0700142 return renderer->prepare(opaque);
Romain Guye4d01122010-06-16 18:44:05 -0700143}
144
Chet Haase44b2fe32012-06-06 19:03:58 -0700145static int android_view_GLES20Canvas_prepareDirty(JNIEnv* env, jobject clazz,
Romain Guy7d7b5492011-01-24 16:33:45 -0800146 OpenGLRenderer* renderer, jint left, jint top, jint right, jint bottom,
147 jboolean opaque) {
Chet Haase44b2fe32012-06-06 19:03:58 -0700148 return renderer->prepareDirty(left, top, right, bottom, opaque);
Romain Guy7d7b5492011-01-24 16:33:45 -0800149}
150
151static void android_view_GLES20Canvas_finish(JNIEnv* env, jobject clazz,
Romain Guyb025b9c2010-09-16 14:16:48 -0700152 OpenGLRenderer* renderer) {
153 renderer->finish();
154}
155
Romain Guy530041d2012-01-25 18:56:29 -0800156static jint android_view_GLES20Canvas_getStencilSize(JNIEnv* env, jobject clazz) {
Romain Guy0baaac52012-08-31 20:31:01 -0700157 return Stencil::getStencilSize();
Romain Guy530041d2012-01-25 18:56:29 -0800158}
159
Romain Guyef359272013-01-31 19:07:29 -0800160static void android_view_GLES20Canvas_setName(JNIEnv* env,
161 jobject clazz, OpenGLRenderer* renderer, jstring name) {
162 if (name != NULL) {
163 const char* textArray = env->GetStringUTFChars(name, NULL);
164 renderer->setName(textArray);
165 env->ReleaseStringUTFChars(name, textArray);
166 } else {
167 renderer->setName(NULL);
168 }
169}
170
Romain Guy530041d2012-01-25 18:56:29 -0800171// ----------------------------------------------------------------------------
172// Functor
173// ----------------------------------------------------------------------------
174
Romain Guy65549432012-03-26 16:45:05 -0700175static jint android_view_GLES20Canvas_callDrawGLFunction(JNIEnv* env, jobject clazz,
Romain Guyba6be8a2012-04-23 18:22:09 -0700176 OpenGLRenderer* renderer, Functor* functor) {
Romain Guycabfcc12011-03-07 18:06:46 -0800177 android::uirenderer::Rect dirty;
178 return renderer->callDrawGLFunction(functor, dirty);
Chet Haasedaf98e92011-01-10 14:10:36 -0800179}
180
Romain Guyba6be8a2012-04-23 18:22:09 -0700181static void android_view_GLES20Canvas_detachFunctor(JNIEnv* env,
182 jobject clazz, OpenGLRenderer* renderer, Functor* functor) {
183 renderer->detachFunctor(functor);
184}
185
186static void android_view_GLES20Canvas_attachFunctor(JNIEnv* env,
187 jobject clazz, OpenGLRenderer* renderer, Functor* functor) {
188 renderer->attachFunctor(functor);
189}
190
Romain Guy8f3b8e32012-03-27 16:33:45 -0700191static jint android_view_GLES20Canvas_invokeFunctors(JNIEnv* env,
192 jobject clazz, OpenGLRenderer* renderer, jobject dirty) {
193 android::uirenderer::Rect bounds;
194 status_t status = renderer->invokeFunctors(bounds);
195 if (status != DrawGlInfo::kStatusDone && dirty != NULL) {
196 env->CallVoidMethod(dirty, gRectClassInfo.set,
197 int(bounds.left), int(bounds.top), int(bounds.right), int(bounds.bottom));
198 }
199 return status;
200}
201
202// ----------------------------------------------------------------------------
203// Misc
204// ----------------------------------------------------------------------------
205
Romain Guyf61970fc2011-07-07 14:10:06 -0700206static jint android_view_GLES20Canvas_getMaxTextureWidth(JNIEnv* env, jobject clazz) {
207 return Caches::getInstance().maxTextureSize;
208}
209
210static jint android_view_GLES20Canvas_getMaxTextureHeight(JNIEnv* env, jobject clazz) {
211 return Caches::getInstance().maxTextureSize;
212}
213
Romain Guye4d01122010-06-16 18:44:05 -0700214// ----------------------------------------------------------------------------
Romain Guybb9524b2010-06-22 18:56:38 -0700215// State
216// ----------------------------------------------------------------------------
217
Romain Guy7d7b5492011-01-24 16:33:45 -0800218static jint android_view_GLES20Canvas_save(JNIEnv* env, jobject clazz, OpenGLRenderer* renderer,
Romain Guybb9524b2010-06-22 18:56:38 -0700219 jint flags) {
Romain Guyf6a11b82010-06-23 17:47:49 -0700220 return renderer->save(flags);
Romain Guybb9524b2010-06-22 18:56:38 -0700221}
222
Romain Guy7d7b5492011-01-24 16:33:45 -0800223static jint android_view_GLES20Canvas_getSaveCount(JNIEnv* env, jobject clazz,
Romain Guyf6a11b82010-06-23 17:47:49 -0700224 OpenGLRenderer* renderer) {
225 return renderer->getSaveCount();
Romain Guybb9524b2010-06-22 18:56:38 -0700226}
227
Romain Guy7d7b5492011-01-24 16:33:45 -0800228static void android_view_GLES20Canvas_restore(JNIEnv* env, jobject clazz,
Romain Guyf6a11b82010-06-23 17:47:49 -0700229 OpenGLRenderer* renderer) {
230 renderer->restore();
Romain Guybb9524b2010-06-22 18:56:38 -0700231}
232
Romain Guy7d7b5492011-01-24 16:33:45 -0800233static void android_view_GLES20Canvas_restoreToCount(JNIEnv* env, jobject clazz,
Romain Guyf6a11b82010-06-23 17:47:49 -0700234 OpenGLRenderer* renderer, jint saveCount) {
235 renderer->restoreToCount(saveCount);
Romain Guybb9524b2010-06-22 18:56:38 -0700236}
237
238// ----------------------------------------------------------------------------
Romain Guybd6b79b2010-06-26 00:13:53 -0700239// Layers
240// ----------------------------------------------------------------------------
241
Romain Guy7d7b5492011-01-24 16:33:45 -0800242static jint android_view_GLES20Canvas_saveLayer(JNIEnv* env, jobject clazz,
Romain Guybd6b79b2010-06-26 00:13:53 -0700243 OpenGLRenderer* renderer, jfloat left, jfloat top, jfloat right, jfloat bottom,
244 SkPaint* paint, jint saveFlags) {
245 return renderer->saveLayer(left, top, right, bottom, paint, saveFlags);
246}
247
Romain Guy189887e2011-08-25 11:45:13 -0700248static jint android_view_GLES20Canvas_saveLayerClip(JNIEnv* env, jobject clazz,
249 OpenGLRenderer* renderer, SkPaint* paint, jint saveFlags) {
250 const android::uirenderer::Rect& bounds(renderer->getClipBounds());
251 return renderer->saveLayer(bounds.left, bounds.top, bounds.right, bounds.bottom,
252 paint, saveFlags);
253}
254
Romain Guy7d7b5492011-01-24 16:33:45 -0800255static jint android_view_GLES20Canvas_saveLayerAlpha(JNIEnv* env, jobject clazz,
Romain Guybd6b79b2010-06-26 00:13:53 -0700256 OpenGLRenderer* renderer, jfloat left, jfloat top, jfloat right, jfloat bottom,
257 jint alpha, jint saveFlags) {
258 return renderer->saveLayerAlpha(left, top, right, bottom, alpha, saveFlags);
259}
260
Romain Guy189887e2011-08-25 11:45:13 -0700261static jint android_view_GLES20Canvas_saveLayerAlphaClip(JNIEnv* env, jobject clazz,
262 OpenGLRenderer* renderer, jint alpha, jint saveFlags) {
263 const android::uirenderer::Rect& bounds(renderer->getClipBounds());
264 return renderer->saveLayerAlpha(bounds.left, bounds.top, bounds.right, bounds.bottom,
265 alpha, saveFlags);
266}
267
Romain Guybd6b79b2010-06-26 00:13:53 -0700268// ----------------------------------------------------------------------------
Romain Guybb9524b2010-06-22 18:56:38 -0700269// Clipping
270// ----------------------------------------------------------------------------
271
Romain Guy7d7b5492011-01-24 16:33:45 -0800272static bool android_view_GLES20Canvas_quickReject(JNIEnv* env, jobject clazz,
Derek Sollenbergerca79cf62012-08-14 16:44:52 -0400273 OpenGLRenderer* renderer, jfloat left, jfloat top, jfloat right, jfloat bottom) {
Romain Guyc7d53492010-06-25 13:41:57 -0700274 return renderer->quickReject(left, top, right, bottom);
275}
276
Romain Guy7d7b5492011-01-24 16:33:45 -0800277static bool android_view_GLES20Canvas_clipRectF(JNIEnv* env, jobject clazz,
Romain Guy079ba2c2010-07-16 14:12:24 -0700278 OpenGLRenderer* renderer, jfloat left, jfloat top, jfloat right, jfloat bottom,
279 SkRegion::Op op) {
280 return renderer->clipRect(left, top, right, bottom, op);
Romain Guybb9524b2010-06-22 18:56:38 -0700281}
282
Romain Guy7d7b5492011-01-24 16:33:45 -0800283static bool android_view_GLES20Canvas_clipRect(JNIEnv* env, jobject clazz,
Romain Guy079ba2c2010-07-16 14:12:24 -0700284 OpenGLRenderer* renderer, jint left, jint top, jint right, jint bottom,
285 SkRegion::Op op) {
286 return renderer->clipRect(float(left), float(top), float(right), float(bottom), op);
Romain Guyf6a11b82010-06-23 17:47:49 -0700287}
Romain Guybb9524b2010-06-22 18:56:38 -0700288
Romain Guy735738c2012-12-03 12:34:51 -0800289static bool android_view_GLES20Canvas_clipPath(JNIEnv* env, jobject clazz,
290 OpenGLRenderer* renderer, SkPath* path, SkRegion::Op op) {
291 return renderer->clipPath(path, op);
292}
293
294static bool android_view_GLES20Canvas_clipRegion(JNIEnv* env, jobject clazz,
295 OpenGLRenderer* renderer, SkRegion* region, SkRegion::Op op) {
296 return renderer->clipRegion(region, op);
297}
298
Romain Guy7d7b5492011-01-24 16:33:45 -0800299static bool android_view_GLES20Canvas_getClipBounds(JNIEnv* env, jobject clazz,
Romain Guy9d5316e2010-06-24 19:30:36 -0700300 OpenGLRenderer* renderer, jobject rect) {
Romain Guy7ae7ac42010-06-25 13:46:18 -0700301 const android::uirenderer::Rect& bounds(renderer->getClipBounds());
Romain Guy9d5316e2010-06-24 19:30:36 -0700302
Romain Guy7ae7ac42010-06-25 13:46:18 -0700303 env->CallVoidMethod(rect, gRectClassInfo.set,
304 int(bounds.left), int(bounds.top), int(bounds.right), int(bounds.bottom));
Romain Guy9d5316e2010-06-24 19:30:36 -0700305
Romain Guy7ae7ac42010-06-25 13:46:18 -0700306 return !bounds.isEmpty();
Romain Guy9d5316e2010-06-24 19:30:36 -0700307}
308
Romain Guyf6a11b82010-06-23 17:47:49 -0700309// ----------------------------------------------------------------------------
310// Transforms
311// ----------------------------------------------------------------------------
312
Romain Guy7d7b5492011-01-24 16:33:45 -0800313static void android_view_GLES20Canvas_translate(JNIEnv* env, jobject clazz,
Romain Guyf6a11b82010-06-23 17:47:49 -0700314 OpenGLRenderer* renderer, jfloat dx, jfloat dy) {
Romain Guy7ae7ac42010-06-25 13:46:18 -0700315 renderer->translate(dx, dy);
Romain Guyf6a11b82010-06-23 17:47:49 -0700316}
317
Romain Guy7d7b5492011-01-24 16:33:45 -0800318static void android_view_GLES20Canvas_rotate(JNIEnv* env, jobject clazz,
Romain Guyf6a11b82010-06-23 17:47:49 -0700319 OpenGLRenderer* renderer, jfloat degrees) {
Romain Guy7ae7ac42010-06-25 13:46:18 -0700320 renderer->rotate(degrees);
Romain Guyf6a11b82010-06-23 17:47:49 -0700321}
322
Romain Guy7d7b5492011-01-24 16:33:45 -0800323static void android_view_GLES20Canvas_scale(JNIEnv* env, jobject clazz,
Romain Guyf6a11b82010-06-23 17:47:49 -0700324 OpenGLRenderer* renderer, jfloat sx, jfloat sy) {
Romain Guy7ae7ac42010-06-25 13:46:18 -0700325 renderer->scale(sx, sy);
Romain Guyf6a11b82010-06-23 17:47:49 -0700326}
327
Romain Guy7d7b5492011-01-24 16:33:45 -0800328static void android_view_GLES20Canvas_skew(JNIEnv* env, jobject clazz,
Romain Guy807daf72011-01-18 11:19:19 -0800329 OpenGLRenderer* renderer, jfloat sx, jfloat sy) {
330 renderer->skew(sx, sy);
331}
332
Romain Guy7d7b5492011-01-24 16:33:45 -0800333static void android_view_GLES20Canvas_setMatrix(JNIEnv* env, jobject clazz,
Romain Guyf6a11b82010-06-23 17:47:49 -0700334 OpenGLRenderer* renderer, SkMatrix* matrix) {
Romain Guy7ae7ac42010-06-25 13:46:18 -0700335 renderer->setMatrix(matrix);
Romain Guyf6a11b82010-06-23 17:47:49 -0700336}
337
Romain Guy7d7b5492011-01-24 16:33:45 -0800338static void android_view_GLES20Canvas_getMatrix(JNIEnv* env, jobject clazz,
Romain Guyf6a11b82010-06-23 17:47:49 -0700339 OpenGLRenderer* renderer, SkMatrix* matrix) {
Romain Guy7ae7ac42010-06-25 13:46:18 -0700340 renderer->getMatrix(matrix);
Romain Guyf6a11b82010-06-23 17:47:49 -0700341}
342
Romain Guy7d7b5492011-01-24 16:33:45 -0800343static void android_view_GLES20Canvas_concatMatrix(JNIEnv* env, jobject clazz,
Romain Guyf6a11b82010-06-23 17:47:49 -0700344 OpenGLRenderer* renderer, SkMatrix* matrix) {
Romain Guy7ae7ac42010-06-25 13:46:18 -0700345 renderer->concatMatrix(matrix);
Romain Guybb9524b2010-06-22 18:56:38 -0700346}
347
348// ----------------------------------------------------------------------------
349// Drawing
Romain Guy85bf02f2010-06-22 13:11:24 -0700350// ----------------------------------------------------------------------------
351
Romain Guy7d7b5492011-01-24 16:33:45 -0800352static void android_view_GLES20Canvas_drawBitmap(JNIEnv* env, jobject clazz,
Romain Guye651cc62012-05-14 19:44:40 -0700353 OpenGLRenderer* renderer, SkBitmap* bitmap, jbyteArray buffer,
354 jfloat left, jfloat top, SkPaint* paint) {
Patrick Dubroye4ac2d62010-12-01 11:23:13 -0800355 // This object allows the renderer to allocate a global JNI ref to the buffer object.
356 JavaHeapBitmapRef bitmapRef(env, bitmap, buffer);
357
Romain Guydbd77cd2010-07-09 10:36:05 -0700358 renderer->drawBitmap(bitmap, left, top, paint);
Romain Guy85bf02f2010-06-22 13:11:24 -0700359}
360
Romain Guy7d7b5492011-01-24 16:33:45 -0800361static void android_view_GLES20Canvas_drawBitmapRect(JNIEnv* env, jobject clazz,
Patrick Dubroye4ac2d62010-12-01 11:23:13 -0800362 OpenGLRenderer* renderer, SkBitmap* bitmap, jbyteArray buffer,
Romain Guyce0537b2010-06-29 21:05:21 -0700363 float srcLeft, float srcTop, float srcRight, float srcBottom,
Romain Guydbd77cd2010-07-09 10:36:05 -0700364 float dstLeft, float dstTop, float dstRight, float dstBottom, SkPaint* paint) {
Patrick Dubroye4ac2d62010-12-01 11:23:13 -0800365 // This object allows the renderer to allocate a global JNI ref to the buffer object.
366 JavaHeapBitmapRef bitmapRef(env, bitmap, buffer);
367
Romain Guydbd77cd2010-07-09 10:36:05 -0700368 renderer->drawBitmap(bitmap, srcLeft, srcTop, srcRight, srcBottom,
369 dstLeft, dstTop, dstRight, dstBottom, paint);
Romain Guyf86ef572010-07-01 11:05:42 -0700370}
Romain Guy8ba548f2010-06-30 19:21:21 -0700371
Romain Guy7d7b5492011-01-24 16:33:45 -0800372static void android_view_GLES20Canvas_drawBitmapMatrix(JNIEnv* env, jobject clazz,
Patrick Dubroye4ac2d62010-12-01 11:23:13 -0800373 OpenGLRenderer* renderer, SkBitmap* bitmap, jbyteArray buffer, SkMatrix* matrix,
374 SkPaint* paint) {
375 // This object allows the renderer to allocate a global JNI ref to the buffer object.
376 JavaHeapBitmapRef bitmapRef(env, bitmap, buffer);
377
Romain Guydbd77cd2010-07-09 10:36:05 -0700378 renderer->drawBitmap(bitmap, matrix, paint);
Romain Guyce0537b2010-06-29 21:05:21 -0700379}
380
Romain Guye651cc62012-05-14 19:44:40 -0700381static void android_view_GLES20Canvas_drawBitmapData(JNIEnv* env, jobject clazz,
382 OpenGLRenderer* renderer, jintArray colors, jint offset, jint stride,
383 jfloat left, jfloat top, jint width, jint height, jboolean hasAlpha, SkPaint* paint) {
Romain Guy49c5fc02012-05-15 11:10:01 -0700384 SkBitmap* bitmap = new SkBitmap;
385 bitmap->setConfig(hasAlpha ? SkBitmap::kARGB_8888_Config : SkBitmap::kRGB_565_Config,
386 width, height);
Romain Guye651cc62012-05-14 19:44:40 -0700387
Romain Guy49c5fc02012-05-15 11:10:01 -0700388 if (!bitmap->allocPixels()) {
389 delete bitmap;
Romain Guye651cc62012-05-14 19:44:40 -0700390 return;
391 }
392
Romain Guy49c5fc02012-05-15 11:10:01 -0700393 if (!GraphicsJNI::SetPixels(env, colors, offset, stride, 0, 0, width, height, *bitmap)) {
394 delete bitmap;
Romain Guye651cc62012-05-14 19:44:40 -0700395 return;
396 }
397
Romain Guy49c5fc02012-05-15 11:10:01 -0700398 renderer->drawBitmapData(bitmap, left, top, paint);
399
400 // If the renderer is a deferred renderer it will own the bitmap
401 if (!renderer->isDeferred()) {
402 delete bitmap;
403 }
Romain Guye651cc62012-05-14 19:44:40 -0700404}
405
Romain Guy7d7b5492011-01-24 16:33:45 -0800406static void android_view_GLES20Canvas_drawBitmapMesh(JNIEnv* env, jobject clazz,
Romain Guy5a7b4662011-01-20 19:09:30 -0800407 OpenGLRenderer* renderer, SkBitmap* bitmap, jbyteArray buffer,
408 jint meshWidth, jint meshHeight, jfloatArray vertices, jint offset,
409 jintArray colors, jint colorOffset, SkPaint* paint) {
410 // This object allows the renderer to allocate a global JNI ref to the buffer object.
411 JavaHeapBitmapRef bitmapRef(env, bitmap, buffer);
412
413 jfloat* verticesArray = vertices ? env->GetFloatArrayElements(vertices, NULL) + offset : NULL;
414 jint* colorsArray = colors ? env->GetIntArrayElements(colors, NULL) + colorOffset : NULL;
415
416 renderer->drawBitmapMesh(bitmap, meshWidth, meshHeight, verticesArray, colorsArray, paint);
417
418 if (vertices) env->ReleaseFloatArrayElements(vertices, verticesArray, 0);
419 if (colors) env->ReleaseIntArrayElements(colors, colorsArray, 0);
420}
421
Romain Guy7d7b5492011-01-24 16:33:45 -0800422static void android_view_GLES20Canvas_drawPatch(JNIEnv* env, jobject clazz,
Patrick Dubroye4ac2d62010-12-01 11:23:13 -0800423 OpenGLRenderer* renderer, SkBitmap* bitmap, jbyteArray buffer, jbyteArray chunks,
Romain Guydbd77cd2010-07-09 10:36:05 -0700424 float left, float top, float right, float bottom, SkPaint* paint) {
Patrick Dubroye4ac2d62010-12-01 11:23:13 -0800425 // This object allows the renderer to allocate a global JNI ref to the buffer object.
426 JavaHeapBitmapRef bitmapRef(env, bitmap, buffer);
427
Romain Guydeba7852010-07-07 17:54:48 -0700428 jbyte* storage = env->GetByteArrayElements(chunks, NULL);
429 Res_png_9patch* patch = reinterpret_cast<Res_png_9patch*>(storage);
430 Res_png_9patch::deserialize(patch);
431
Patrick Dubroye4ac2d62010-12-01 11:23:13 -0800432 renderer->drawPatch(bitmap, &patch->xDivs[0], &patch->yDivs[0],
433 &patch->colors[0], patch->numXDivs, patch->numYDivs, patch->numColors,
Romain Guy4bb94202010-10-12 15:59:26 -0700434 left, top, right, bottom, paint);
Romain Guydeba7852010-07-07 17:54:48 -0700435
Romain Guydeba7852010-07-07 17:54:48 -0700436 env->ReleaseByteArrayElements(chunks, storage, 0);
437}
438
Romain Guy7d7b5492011-01-24 16:33:45 -0800439static void android_view_GLES20Canvas_drawColor(JNIEnv* env, jobject clazz,
Romain Guyce0537b2010-06-29 21:05:21 -0700440 OpenGLRenderer* renderer, jint color, SkXfermode::Mode mode) {
441 renderer->drawColor(color, mode);
442}
443
Romain Guy7d7b5492011-01-24 16:33:45 -0800444static void android_view_GLES20Canvas_drawRect(JNIEnv* env, jobject clazz,
Romain Guyc7d53492010-06-25 13:41:57 -0700445 OpenGLRenderer* renderer, jfloat left, jfloat top, jfloat right, jfloat bottom,
446 SkPaint* paint) {
447 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,
Romain Guy01d58e42011-01-19 21:54:02 -0800451 OpenGLRenderer* renderer, jfloat left, jfloat top, jfloat right, jfloat bottom,
452 jfloat rx, jfloat ry, SkPaint* paint) {
453 renderer->drawRoundRect(left, top, right, bottom, rx, ry, paint);
454}
455
Romain Guy7d7b5492011-01-24 16:33:45 -0800456static void android_view_GLES20Canvas_drawCircle(JNIEnv* env, jobject clazz,
Romain Guy01d58e42011-01-19 21:54:02 -0800457 OpenGLRenderer* renderer, jfloat x, jfloat y, jfloat radius, SkPaint* paint) {
458 renderer->drawCircle(x, y, radius, paint);
459}
460
Romain Guy7d7b5492011-01-24 16:33:45 -0800461static void android_view_GLES20Canvas_drawOval(JNIEnv* env, jobject clazz,
Romain Guyc1cd9ba32011-01-23 14:18:41 -0800462 OpenGLRenderer* renderer, jfloat left, jfloat top, jfloat right, jfloat bottom,
463 SkPaint* paint) {
464 renderer->drawOval(left, top, right, bottom, paint);
465}
466
Romain Guy7d7b5492011-01-24 16:33:45 -0800467static void android_view_GLES20Canvas_drawArc(JNIEnv* env, jobject clazz,
Romain Guy8b2f5262011-01-23 16:15:02 -0800468 OpenGLRenderer* renderer, jfloat left, jfloat top, jfloat right, jfloat bottom,
469 jfloat startAngle, jfloat sweepAngle, jboolean useCenter, SkPaint* paint) {
470 renderer->drawArc(left, top, right, bottom, startAngle, sweepAngle, useCenter, paint);
471}
472
Romain Guy672433d2013-01-04 19:05:13 -0800473static void android_view_GLES20Canvas_drawRegionAsRects(JNIEnv* env, jobject clazz,
Romain Guya48a1a82010-08-10 14:59:15 -0700474 OpenGLRenderer* renderer, SkRegion* region, SkPaint* paint) {
Romain Guy672433d2013-01-04 19:05:13 -0800475 if (paint->getStyle() != SkPaint::kFill_Style ||
476 (paint->isAntiAlias() && !renderer->isCurrentTransformSimple())) {
477 SkRegion::Iterator it(*region);
478 while (!it.done()) {
479 const SkIRect& r = it.rect();
480 renderer->drawRect(r.fLeft, r.fTop, r.fRight, r.fBottom, paint);
481 it.next();
482 }
483 } else {
484 int count = 0;
485 Vector<float> rects;
486 SkRegion::Iterator it(*region);
487 while (!it.done()) {
488 const SkIRect& r = it.rect();
489 rects.push(r.fLeft);
490 rects.push(r.fTop);
491 rects.push(r.fRight);
492 rects.push(r.fBottom);
Chris Craik2af46352012-11-26 18:30:17 -0800493 count += 4;
Romain Guy672433d2013-01-04 19:05:13 -0800494 it.next();
495 }
496 renderer->drawRects(rects.array(), count, paint);
Romain Guya48a1a82010-08-10 14:59:15 -0700497 }
498}
499
Romain Guy672433d2013-01-04 19:05:13 -0800500static void android_view_GLES20Canvas_drawRects(JNIEnv* env, jobject clazz,
501 OpenGLRenderer* renderer, jfloatArray rects, jint count, SkPaint* paint) {
502 jfloat* storage = env->GetFloatArrayElements(rects, NULL);
503 renderer->drawRects(storage, count, paint);
504 env->ReleaseFloatArrayElements(rects, storage, 0);
505}
506
Romain Guyed6fcb02011-03-21 13:11:28 -0700507static void android_view_GLES20Canvas_drawPoints(JNIEnv* env, jobject clazz,
508 OpenGLRenderer* renderer, jfloatArray points, jint offset, jint count, SkPaint* paint) {
509 jfloat* storage = env->GetFloatArrayElements(points, NULL);
510 renderer->drawPoints(storage + offset, count, paint);
511 env->ReleaseFloatArrayElements(points, storage, 0);
512}
513
Romain Guy7d7b5492011-01-24 16:33:45 -0800514static void android_view_GLES20Canvas_drawPath(JNIEnv* env, jobject clazz,
Romain Guy7fbcc042010-08-04 15:40:07 -0700515 OpenGLRenderer* renderer, SkPath* path, SkPaint* paint) {
516 renderer->drawPath(path, paint);
517}
518
Romain Guy7d7b5492011-01-24 16:33:45 -0800519static void android_view_GLES20Canvas_drawLines(JNIEnv* env, jobject clazz,
Romain Guy759ea802010-09-16 20:49:46 -0700520 OpenGLRenderer* renderer, jfloatArray points, jint offset, jint count, SkPaint* paint) {
521 jfloat* storage = env->GetFloatArrayElements(points, NULL);
Romain Guy759ea802010-09-16 20:49:46 -0700522 renderer->drawLines(storage + offset, count, paint);
Romain Guy759ea802010-09-16 20:49:46 -0700523 env->ReleaseFloatArrayElements(points, storage, 0);
524}
525
Romain Guy85bf02f2010-06-22 13:11:24 -0700526// ----------------------------------------------------------------------------
Romain Guydb1938e2010-08-02 18:50:22 -0700527// Shaders and color filters
Romain Guyd27977d2010-07-14 19:18:51 -0700528// ----------------------------------------------------------------------------
529
Romain Guy7d7b5492011-01-24 16:33:45 -0800530static void android_view_GLES20Canvas_resetModifiers(JNIEnv* env, jobject clazz,
Romain Guya168d732011-03-18 16:50:13 -0700531 OpenGLRenderer* renderer, jint modifiers) {
532 if (modifiers & MODIFIER_SHADOW) renderer->resetShadow();
533 if (modifiers & MODIFIER_SHADER) renderer->resetShader();
534 if (modifiers & MODIFIER_COLOR_FILTER) renderer->resetColorFilter();
Romain Guyd27977d2010-07-14 19:18:51 -0700535}
536
Romain Guy7d7b5492011-01-24 16:33:45 -0800537static void android_view_GLES20Canvas_setupShader(JNIEnv* env, jobject clazz,
Romain Guy06f96e22010-07-30 19:18:16 -0700538 OpenGLRenderer* renderer, SkiaShader* shader) {
539 renderer->setupShader(shader);
Romain Guy7fac2e12010-07-16 17:10:13 -0700540}
541
Romain Guy7d7b5492011-01-24 16:33:45 -0800542static void android_view_GLES20Canvas_setupColorFilter(JNIEnv* env, jobject clazz,
Romain Guydb1938e2010-08-02 18:50:22 -0700543 OpenGLRenderer* renderer, SkiaColorFilter* filter) {
544 renderer->setupColorFilter(filter);
545}
546
Romain Guy7d7b5492011-01-24 16:33:45 -0800547static void android_view_GLES20Canvas_setupShadow(JNIEnv* env, jobject clazz,
Romain Guy1e45aae2010-08-13 19:39:53 -0700548 OpenGLRenderer* renderer, jfloat radius, jfloat dx, jfloat dy, jint color) {
549 renderer->setupShadow(radius, dx, dy, color);
550}
551
Romain Guyd27977d2010-07-14 19:18:51 -0700552// ----------------------------------------------------------------------------
Romain Guy5ff9df62012-01-23 17:09:05 -0800553// Draw filters
554// ----------------------------------------------------------------------------
555
556static void android_view_GLES20Canvas_setupPaintFilter(JNIEnv* env, jobject clazz,
557 OpenGLRenderer* renderer, jint clearBits, jint setBits) {
558 renderer->setupPaintFilter(clearBits, setBits);
559}
560
561static void android_view_GLES20Canvas_resetPaintFilter(JNIEnv* env, jobject clazz,
562 OpenGLRenderer* renderer) {
563 renderer->resetPaintFilter();
564}
565
566// ----------------------------------------------------------------------------
Romain Guya1db5742010-07-20 13:09:13 -0700567// Text
568// ----------------------------------------------------------------------------
569
Romain Guye8e62a42010-07-23 18:55:21 -0700570static void renderText(OpenGLRenderer* renderer, const jchar* text, int count,
Fabrice Di Meglioda12f382013-03-15 11:26:56 -0700571 jfloat x, jfloat y, int flags, SkPaint* paint) {
Fabrice Di Meglioa731b082012-01-23 18:18:45 -0800572 sp<TextLayoutValue> value = TextLayoutEngine::getInstance().getValue(paint,
Fabrice Di Meglioda12f382013-03-15 11:26:56 -0700573 text, 0, count, count, flags);
Fabrice Di Meglio2ea758802011-05-12 17:42:06 -0700574 if (value == NULL) {
Fabrice Di Megliob02d0ca2011-12-08 14:05:44 -0800575 return;
Fabrice Di Meglio2ea758802011-05-12 17:42:06 -0700576 }
Fabrice Di Meglio5c863f72011-10-05 18:11:59 -0700577 const jchar* glyphs = value->getGlyphs();
578 size_t glyphsCount = value->getGlyphsCount();
Raph Levien996e57c2012-07-23 15:22:52 -0700579 jfloat totalAdvance = value->getTotalAdvance();
580 const float* positions = value->getPos();
Fabrice Di Meglio79df5322011-09-19 15:17:56 -0700581 int bytesCount = glyphsCount * sizeof(jchar);
Romain Guyc2525952012-07-27 16:41:22 -0700582 renderer->drawText((const char*) glyphs, bytesCount, glyphsCount, x, y,
Raph Levien996e57c2012-07-23 15:22:52 -0700583 positions, paint, totalAdvance);
Romain Guye8e62a42010-07-23 18:55:21 -0700584}
585
Romain Guy325740f2012-02-24 16:48:34 -0800586static void renderTextOnPath(OpenGLRenderer* renderer, const jchar* text, int count,
Fabrice Di Meglioda12f382013-03-15 11:26:56 -0700587 SkPath* path, jfloat hOffset, jfloat vOffset, int flags, SkPaint* paint) {
Romain Guy325740f2012-02-24 16:48:34 -0800588 sp<TextLayoutValue> value = TextLayoutEngine::getInstance().getValue(paint,
Fabrice Di Meglioda12f382013-03-15 11:26:56 -0700589 text, 0, count, count, flags);
Romain Guy325740f2012-02-24 16:48:34 -0800590 if (value == NULL) {
591 return;
592 }
593 const jchar* glyphs = value->getGlyphs();
594 size_t glyphsCount = value->getGlyphsCount();
595 int bytesCount = glyphsCount * sizeof(jchar);
596 renderer->drawTextOnPath((const char*) glyphs, bytesCount, glyphsCount, path,
597 hOffset, vOffset, paint);
598}
599
Romain Guy61c8c9c2010-08-09 20:48:09 -0700600static void renderTextRun(OpenGLRenderer* renderer, const jchar* text,
601 jint start, jint count, jint contextCount, jfloat x, jfloat y,
Fabrice Di Meglioda12f382013-03-15 11:26:56 -0700602 int flags, SkPaint* paint) {
Fabrice Di Meglioa731b082012-01-23 18:18:45 -0800603 sp<TextLayoutValue> value = TextLayoutEngine::getInstance().getValue(paint,
Fabrice Di Meglioda12f382013-03-15 11:26:56 -0700604 text, start, count, contextCount, flags);
Fabrice Di Meglio2ea758802011-05-12 17:42:06 -0700605 if (value == NULL) {
Fabrice Di Megliob02d0ca2011-12-08 14:05:44 -0800606 return;
Fabrice Di Meglio2ea758802011-05-12 17:42:06 -0700607 }
Fabrice Di Meglio5c863f72011-10-05 18:11:59 -0700608 const jchar* glyphs = value->getGlyphs();
609 size_t glyphsCount = value->getGlyphsCount();
Raph Levien996e57c2012-07-23 15:22:52 -0700610 jfloat totalAdvance = value->getTotalAdvance();
611 const float* positions = value->getPos();
Fabrice Di Meglio79df5322011-09-19 15:17:56 -0700612 int bytesCount = glyphsCount * sizeof(jchar);
Romain Guyc2525952012-07-27 16:41:22 -0700613 renderer->drawText((const char*) glyphs, bytesCount, glyphsCount, x, y,
Raph Levien996e57c2012-07-23 15:22:52 -0700614 positions, paint, totalAdvance);
Romain Guy61c8c9c2010-08-09 20:48:09 -0700615}
616
Romain Guy7d7b5492011-01-24 16:33:45 -0800617static void android_view_GLES20Canvas_drawTextArray(JNIEnv* env, jobject clazz,
Romain Guy5a7b4662011-01-20 19:09:30 -0800618 OpenGLRenderer* renderer, jcharArray text, jint index, jint count,
Fabrice Di Meglioda12f382013-03-15 11:26:56 -0700619 jfloat x, jfloat y, jint flags, SkPaint* paint) {
Romain Guya1db5742010-07-20 13:09:13 -0700620 jchar* textArray = env->GetCharArrayElements(text, NULL);
Fabrice Di Meglioda12f382013-03-15 11:26:56 -0700621 renderText(renderer, textArray + index, count, x, y, flags, paint);
Romain Guya1db5742010-07-20 13:09:13 -0700622 env->ReleaseCharArrayElements(text, textArray, JNI_ABORT);
623}
624
Romain Guy7d7b5492011-01-24 16:33:45 -0800625static void android_view_GLES20Canvas_drawText(JNIEnv* env, jobject clazz,
Romain Guy5a7b4662011-01-20 19:09:30 -0800626 OpenGLRenderer* renderer, jstring text, jint start, jint end,
Fabrice Di Meglioda12f382013-03-15 11:26:56 -0700627 jfloat x, jfloat y, jint flags, SkPaint* paint) {
Romain Guya1db5742010-07-20 13:09:13 -0700628 const jchar* textArray = env->GetStringChars(text, NULL);
Fabrice Di Meglioda12f382013-03-15 11:26:56 -0700629 renderText(renderer, textArray + start, end - start, x, y, flags, paint);
Romain Guya1db5742010-07-20 13:09:13 -0700630 env->ReleaseStringChars(text, textArray);
631}
632
Romain Guy325740f2012-02-24 16:48:34 -0800633static void android_view_GLES20Canvas_drawTextArrayOnPath(JNIEnv* env, jobject clazz,
634 OpenGLRenderer* renderer, jcharArray text, jint index, jint count,
Fabrice Di Meglioda12f382013-03-15 11:26:56 -0700635 SkPath* path, jfloat hOffset, jfloat vOffset, jint flags, SkPaint* paint) {
Romain Guy325740f2012-02-24 16:48:34 -0800636 jchar* textArray = env->GetCharArrayElements(text, NULL);
637 renderTextOnPath(renderer, textArray + index, count, path,
Fabrice Di Meglioda12f382013-03-15 11:26:56 -0700638 hOffset, vOffset, flags, paint);
Romain Guy325740f2012-02-24 16:48:34 -0800639 env->ReleaseCharArrayElements(text, textArray, JNI_ABORT);
640}
641
642static void android_view_GLES20Canvas_drawTextOnPath(JNIEnv* env, jobject clazz,
643 OpenGLRenderer* renderer, jstring text, jint start, jint end,
Fabrice Di Meglioda12f382013-03-15 11:26:56 -0700644 SkPath* path, jfloat hOffset, jfloat vOffset, jint flags, SkPaint* paint) {
Romain Guy325740f2012-02-24 16:48:34 -0800645 const jchar* textArray = env->GetStringChars(text, NULL);
646 renderTextOnPath(renderer, textArray + start, end - start, path,
Fabrice Di Meglioda12f382013-03-15 11:26:56 -0700647 hOffset, vOffset, flags, paint);
Romain Guy325740f2012-02-24 16:48:34 -0800648 env->ReleaseStringChars(text, textArray);
649}
650
Romain Guy7d7b5492011-01-24 16:33:45 -0800651static void android_view_GLES20Canvas_drawTextRunArray(JNIEnv* env, jobject clazz,
Romain Guy5a7b4662011-01-20 19:09:30 -0800652 OpenGLRenderer* renderer, jcharArray text, jint index, jint count,
Fabrice Di Meglioda12f382013-03-15 11:26:56 -0700653 jint contextIndex, jint contextCount, jfloat x, jfloat y, jint dirFlags,
654 SkPaint* paint) {
Romain Guy61c8c9c2010-08-09 20:48:09 -0700655 jchar* textArray = env->GetCharArrayElements(text, NULL);
656 renderTextRun(renderer, textArray + contextIndex, index - contextIndex,
Fabrice Di Meglioda12f382013-03-15 11:26:56 -0700657 count, contextCount, x, y, dirFlags, paint);
Romain Guy61c8c9c2010-08-09 20:48:09 -0700658 env->ReleaseCharArrayElements(text, textArray, JNI_ABORT);
659 }
660
Romain Guy7d7b5492011-01-24 16:33:45 -0800661static void android_view_GLES20Canvas_drawTextRun(JNIEnv* env, jobject clazz,
Romain Guy5a7b4662011-01-20 19:09:30 -0800662 OpenGLRenderer* renderer, jstring text, jint start, jint end,
Fabrice Di Meglioda12f382013-03-15 11:26:56 -0700663 jint contextStart, int contextEnd, jfloat x, jfloat y, jint dirFlags,
664 SkPaint* paint) {
Romain Guy61c8c9c2010-08-09 20:48:09 -0700665 const jchar* textArray = env->GetStringChars(text, NULL);
666 jint count = end - start;
667 jint contextCount = contextEnd - contextStart;
668 renderTextRun(renderer, textArray + contextStart, start - contextStart,
Fabrice Di Meglioda12f382013-03-15 11:26:56 -0700669 count, contextCount, x, y, dirFlags, paint);
Romain Guy61c8c9c2010-08-09 20:48:09 -0700670 env->ReleaseStringChars(text, textArray);
671}
672
Romain Guyeb9a5362012-01-17 17:39:26 -0800673static void renderPosText(OpenGLRenderer* renderer, const jchar* text, int count,
Fabrice Di Meglioda12f382013-03-15 11:26:56 -0700674 const jfloat* positions, jint dirFlags, SkPaint* paint) {
Fabrice Di Meglioa731b082012-01-23 18:18:45 -0800675 sp<TextLayoutValue> value = TextLayoutEngine::getInstance().getValue(paint,
Fabrice Di Meglioda12f382013-03-15 11:26:56 -0700676 text, 0, count, count, dirFlags);
Romain Guyeb9a5362012-01-17 17:39:26 -0800677 if (value == NULL) {
Romain Guyeb9a5362012-01-17 17:39:26 -0800678 return;
679 }
Romain Guyeb9a5362012-01-17 17:39:26 -0800680 const jchar* glyphs = value->getGlyphs();
681 size_t glyphsCount = value->getGlyphsCount();
Romain Guy671d6cf2012-01-18 12:39:17 -0800682 if (count < int(glyphsCount)) glyphsCount = count;
Romain Guyeb9a5362012-01-17 17:39:26 -0800683 int bytesCount = glyphsCount * sizeof(jchar);
684
Romain Guy671d6cf2012-01-18 12:39:17 -0800685 renderer->drawPosText((const char*) glyphs, bytesCount, glyphsCount, positions, paint);
Romain Guyeb9a5362012-01-17 17:39:26 -0800686}
687
688static void android_view_GLES20Canvas_drawPosTextArray(JNIEnv* env, jobject clazz,
689 OpenGLRenderer* renderer, jcharArray text, jint index, jint count,
690 jfloatArray pos, SkPaint* paint) {
691 jchar* textArray = env->GetCharArrayElements(text, NULL);
692 jfloat* positions = env->GetFloatArrayElements(pos, NULL);
693
Fabrice Di Meglioda12f382013-03-15 11:26:56 -0700694 renderPosText(renderer, textArray + index, count, positions, kBidi_LTR, paint);
Romain Guyeb9a5362012-01-17 17:39:26 -0800695
696 env->ReleaseFloatArrayElements(pos, positions, JNI_ABORT);
697 env->ReleaseCharArrayElements(text, textArray, JNI_ABORT);
698}
699
700static void android_view_GLES20Canvas_drawPosText(JNIEnv* env, jobject clazz,
701 OpenGLRenderer* renderer, jstring text, jint start, jint end,
702 jfloatArray pos, SkPaint* paint) {
703 const jchar* textArray = env->GetStringChars(text, NULL);
704 jfloat* positions = env->GetFloatArrayElements(pos, NULL);
705
Fabrice Di Meglioda12f382013-03-15 11:26:56 -0700706 renderPosText(renderer, textArray + start, end - start, positions, kBidi_LTR, paint);
Romain Guyeb9a5362012-01-17 17:39:26 -0800707
708 env->ReleaseFloatArrayElements(pos, positions, JNI_ABORT);
709 env->ReleaseStringChars(text, textArray);
710}
711
Romain Guyb051e892010-09-28 19:09:36 -0700712// ----------------------------------------------------------------------------
713// Display lists
714// ----------------------------------------------------------------------------
715
Chet Haase5977baa2011-01-05 18:01:22 -0800716static DisplayList* android_view_GLES20Canvas_getDisplayList(JNIEnv* env,
Jeff Brown162a0212011-07-21 17:02:54 -0700717 jobject clazz, DisplayListRenderer* renderer, DisplayList* displayList) {
718 return renderer->getDisplayList(displayList);
Romain Guyb051e892010-09-28 19:09:36 -0700719}
720
Jeff Brown162a0212011-07-21 17:02:54 -0700721static OpenGLRenderer* android_view_GLES20Canvas_createDisplayListRenderer(JNIEnv* env,
722 jobject clazz) {
723 return new DisplayListRenderer;
724}
725
726static void android_view_GLES20Canvas_resetDisplayListRenderer(JNIEnv* env,
Chet Haase5977baa2011-01-05 18:01:22 -0800727 jobject clazz, DisplayListRenderer* renderer) {
Jeff Brown162a0212011-07-21 17:02:54 -0700728 renderer->reset();
Chet Haase5977baa2011-01-05 18:01:22 -0800729}
730
Romain Guy65549432012-03-26 16:45:05 -0700731static jint android_view_GLES20Canvas_drawDisplayList(JNIEnv* env,
Romain Guy7b5b6ab2011-03-14 18:05:08 -0700732 jobject clazz, OpenGLRenderer* renderer, DisplayList* displayList,
Chet Haase1271e2c2012-04-20 09:54:27 -0700733 jobject dirty, jint flags) {
Romain Guycabfcc12011-03-07 18:06:46 -0800734 android::uirenderer::Rect bounds;
Chet Haase1271e2c2012-04-20 09:54:27 -0700735 status_t status = renderer->drawDisplayList(displayList, bounds, flags);
Romain Guy65549432012-03-26 16:45:05 -0700736 if (status != DrawGlInfo::kStatusDone && dirty != NULL) {
Romain Guycabfcc12011-03-07 18:06:46 -0800737 env->CallVoidMethod(dirty, gRectClassInfo.set,
738 int(bounds.left), int(bounds.top), int(bounds.right), int(bounds.bottom));
739 }
Romain Guy65549432012-03-26 16:45:05 -0700740 return status;
Romain Guyb051e892010-09-28 19:09:36 -0700741}
742
Chet Haaseed30fd82011-04-22 16:18:45 -0700743static void android_view_GLES20Canvas_outputDisplayList(JNIEnv* env,
744 jobject clazz, OpenGLRenderer* renderer, DisplayList* displayList) {
745 renderer->outputDisplayList(displayList);
746}
747
Romain Guy6c319ca2011-01-11 14:29:25 -0800748// ----------------------------------------------------------------------------
749// Layers
750// ----------------------------------------------------------------------------
751
Romain Guyc89b14b2012-08-08 14:53:48 -0700752static void android_view_GLES20Canvas_interrupt(JNIEnv* env, jobject clazz,
753 OpenGLRenderer* renderer) {
754 renderer->interrupt();
755}
756
757static void android_view_GLES20Canvas_resume(JNIEnv* env, jobject clazz,
758 OpenGLRenderer* renderer) {
759 renderer->resume();
760}
761
Romain Guy6c319ca2011-01-11 14:29:25 -0800762static OpenGLRenderer* android_view_GLES20Canvas_createLayerRenderer(JNIEnv* env,
Romain Guyada830f2011-01-13 12:13:20 -0800763 jobject clazz, Layer* layer) {
764 if (layer) {
Romain Guy87e2f7572012-09-24 11:37:12 -0700765 OpenGLRenderer* renderer = new LayerRenderer(layer);
766 renderer->initProperties();
767 return renderer;
Romain Guyada830f2011-01-13 12:13:20 -0800768 }
769 return NULL;
Romain Guy6c319ca2011-01-11 14:29:25 -0800770}
771
Romain Guyaa6c24c2011-04-28 18:40:04 -0700772static Layer* android_view_GLES20Canvas_createTextureLayer(JNIEnv* env, jobject clazz,
Romain Guya9489272011-06-22 20:58:11 -0700773 jboolean isOpaque, jintArray layerInfo) {
774 Layer* layer = LayerRenderer::createTextureLayer(isOpaque);
Romain Guyaa6c24c2011-04-28 18:40:04 -0700775
776 if (layer) {
777 jint* storage = env->GetIntArrayElements(layerInfo, NULL);
Romain Guy9ace8f52011-07-07 20:50:11 -0700778 storage[0] = layer->getTexture();
Romain Guyaa6c24c2011-04-28 18:40:04 -0700779 env->ReleaseIntArrayElements(layerInfo, storage, 0);
780 }
781
782 return layer;
783}
784
Romain Guyada830f2011-01-13 12:13:20 -0800785static Layer* android_view_GLES20Canvas_createLayer(JNIEnv* env, jobject clazz,
786 jint width, jint height, jboolean isOpaque, jintArray layerInfo) {
787 Layer* layer = LayerRenderer::createLayer(width, height, isOpaque);
Romain Guy6c319ca2011-01-11 14:29:25 -0800788
Romain Guyada830f2011-01-13 12:13:20 -0800789 if (layer) {
Romain Guy6c319ca2011-01-11 14:29:25 -0800790 jint* storage = env->GetIntArrayElements(layerInfo, NULL);
Romain Guy9ace8f52011-07-07 20:50:11 -0700791 storage[0] = layer->getWidth();
792 storage[1] = layer->getHeight();
Romain Guy6c319ca2011-01-11 14:29:25 -0800793 env->ReleaseIntArrayElements(layerInfo, storage, 0);
794 }
795
Romain Guyada830f2011-01-13 12:13:20 -0800796 return layer;
Romain Guy6c319ca2011-01-11 14:29:25 -0800797}
798
Chet Haase603f6de2012-09-14 15:31:25 -0700799static bool android_view_GLES20Canvas_resizeLayer(JNIEnv* env, jobject clazz,
Romain Guyada830f2011-01-13 12:13:20 -0800800 Layer* layer, jint width, jint height, jintArray layerInfo) {
Chet Haase603f6de2012-09-14 15:31:25 -0700801 if (LayerRenderer::resizeLayer(layer, width, height)) {
802 jint* storage = env->GetIntArrayElements(layerInfo, NULL);
803 storage[0] = layer->getWidth();
804 storage[1] = layer->getHeight();
805 env->ReleaseIntArrayElements(layerInfo, storage, 0);
806 return true;
807 }
808 return false;
Romain Guy6c319ca2011-01-11 14:29:25 -0800809}
810
Chet Haased15ebf22012-09-05 11:40:29 -0700811static void android_view_GLES20Canvas_setLayerPaint(JNIEnv* env, jobject clazz,
812 Layer* layer, SkPaint* paint) {
813 if (layer) {
814 layer->setPaint(paint);
815 }
816}
817
818static void android_view_GLES20Canvas_setLayerColorFilter(JNIEnv* env, jobject clazz,
819 Layer* layer, SkiaColorFilter* colorFilter) {
820 if (layer) {
821 layer->setColorFilter(colorFilter);
822 }
823}
824
Romain Guy846a5332012-07-11 17:44:57 -0700825static void android_view_GLES20Canvas_setOpaqueLayer(JNIEnv* env, jobject clazz,
826 Layer* layer, jboolean isOpaque) {
827 if (layer) {
828 layer->setBlend(!isOpaque);
829 }
830}
831
Romain Guyaa6c24c2011-04-28 18:40:04 -0700832static void android_view_GLES20Canvas_updateTextureLayer(JNIEnv* env, jobject clazz,
Romain Guya9489272011-06-22 20:58:11 -0700833 Layer* layer, jint width, jint height, jboolean isOpaque, jobject surface) {
Romain Guy8f0095c2011-05-02 17:24:22 -0700834 float transform[16];
Andy McFaddend47f7d82012-12-18 09:48:38 -0800835 sp<GLConsumer> surfaceTexture(SurfaceTexture_getSurfaceTexture(env, surface));
Romain Guye5e0c502011-06-15 15:18:31 -0700836
Mathias Agopiandf071482012-05-18 16:58:00 -0700837 if (surfaceTexture->updateTexImage() == NO_ERROR) {
838 surfaceTexture->getTransformMatrix(transform);
839 GLenum renderTarget = surfaceTexture->getCurrentTextureTarget();
Romain Guy8f0095c2011-05-02 17:24:22 -0700840
Mathias Agopiandf071482012-05-18 16:58:00 -0700841 LayerRenderer::updateTextureLayer(layer, width, height, isOpaque, renderTarget, transform);
842 }
Romain Guyaa6c24c2011-04-28 18:40:04 -0700843}
844
Romain Guy2bf68f02012-03-02 13:37:47 -0800845static void android_view_GLES20Canvas_updateRenderLayer(JNIEnv* env, jobject clazz,
846 Layer* layer, OpenGLRenderer* renderer, DisplayList* displayList,
847 jint left, jint top, jint right, jint bottom) {
848 layer->updateDeferred(renderer, displayList, left, top, right, bottom);
849}
850
Romain Guyef09a212012-09-25 12:17:14 -0700851static void android_view_GLES20Canvas_clearLayerTexture(JNIEnv* env, jobject clazz,
852 Layer* layer) {
853 layer->clearTexture();
854}
855
Romain Guy302a9df2011-08-16 13:55:02 -0700856static void android_view_GLES20Canvas_setTextureLayerTransform(JNIEnv* env, jobject clazz,
857 Layer* layer, SkMatrix* matrix) {
Romain Guy302a9df2011-08-16 13:55:02 -0700858 layer->getTransform().load(*matrix);
859}
860
Romain Guyada830f2011-01-13 12:13:20 -0800861static void android_view_GLES20Canvas_destroyLayer(JNIEnv* env, jobject clazz, Layer* layer) {
862 LayerRenderer::destroyLayer(layer);
Romain Guy6c319ca2011-01-11 14:29:25 -0800863}
864
Romain Guy57066eb2011-01-12 12:53:32 -0800865static void android_view_GLES20Canvas_destroyLayerDeferred(JNIEnv* env,
Romain Guyada830f2011-01-13 12:13:20 -0800866 jobject clazz, Layer* layer) {
867 LayerRenderer::destroyLayerDeferred(layer);
Romain Guy57066eb2011-01-12 12:53:32 -0800868}
869
Romain Guy7d7b5492011-01-24 16:33:45 -0800870static void android_view_GLES20Canvas_drawLayer(JNIEnv* env, jobject clazz,
Chris Craika4e16c52013-03-22 10:00:48 -0700871 OpenGLRenderer* renderer, Layer* layer, jfloat x, jfloat y) {
Chris Craika08f95c2013-03-15 17:24:33 -0700872 renderer->drawLayer(layer, x, y);
Romain Guy6c319ca2011-01-11 14:29:25 -0800873}
874
Romain Guy77a81162011-06-14 16:45:55 -0700875static jboolean android_view_GLES20Canvas_copyLayer(JNIEnv* env, jobject clazz,
876 Layer* layer, SkBitmap* bitmap) {
877 return LayerRenderer::copyLayer(layer, bitmap);
878}
879
Romain Guy11cb6422012-09-21 00:39:43 -0700880static void android_view_GLES20Canvas_pushLayerUpdate(JNIEnv* env, jobject clazz,
881 OpenGLRenderer* renderer, Layer* layer) {
882 renderer->pushLayerUpdate(layer);
883}
884
885static void android_view_GLES20Canvas_clearLayerUpdates(JNIEnv* env, jobject clazz,
886 OpenGLRenderer* renderer) {
887 renderer->clearLayerUpdates();
888}
889
Romain Guy16393512010-08-08 00:14:31 -0700890#endif // USE_OPENGL_RENDERER
891
892// ----------------------------------------------------------------------------
893// Common
894// ----------------------------------------------------------------------------
895
896static jboolean android_view_GLES20Canvas_isAvailable(JNIEnv* env, jobject clazz) {
897#ifdef USE_OPENGL_RENDERER
Jesse Hall44063452011-12-01 11:27:45 -0800898 char prop[PROPERTY_VALUE_MAX];
899 if (property_get("ro.kernel.qemu", prop, NULL) == 0) {
900 // not in the emulator
901 return JNI_TRUE;
902 }
903 // In the emulator this property will be set to 1 when hardware GLES is
904 // enabled, 0 otherwise. On old emulator versions it will be undefined.
905 property_get("ro.kernel.qemu.gles", prop, "0");
906 return atoi(prop) == 1 ? JNI_TRUE : JNI_FALSE;
Romain Guy16393512010-08-08 00:14:31 -0700907#else
908 return JNI_FALSE;
909#endif
910}
911
Romain Guya1db5742010-07-20 13:09:13 -0700912// ----------------------------------------------------------------------------
Chet Haase9c1e23b2011-03-24 10:51:31 -0700913// Logging
914// ----------------------------------------------------------------------------
915
Chet Haase9c1e23b2011-03-24 10:51:31 -0700916static void
Romain Guy65b345f2011-07-27 18:51:50 -0700917android_app_ActivityThread_dumpGraphics(JNIEnv* env, jobject clazz, jobject javaFileDescriptor) {
Chet Haase905787a2011-04-01 14:33:02 -0700918#ifdef USE_OPENGL_RENDERER
Elliott Hughesa3804cf2011-04-11 16:50:19 -0700919 int fd = jniGetFDFromFileDescriptor(env, javaFileDescriptor);
Chet Haase0865d332011-04-01 14:33:02 -0700920 android::uirenderer::DisplayList::outputLogBuffer(fd);
Chet Haase905787a2011-04-01 14:33:02 -0700921#endif // USE_OPENGL_RENDERER
Chet Haase9c1e23b2011-03-24 10:51:31 -0700922}
923
924// ----------------------------------------------------------------------------
Romain Guye4d01122010-06-16 18:44:05 -0700925// JNI Glue
926// ----------------------------------------------------------------------------
927
928const char* const kClassPathName = "android/view/GLES20Canvas";
929
930static JNINativeMethod gMethods[] = {
Romain Guy61c8c9c2010-08-09 20:48:09 -0700931 { "nIsAvailable", "()Z", (void*) android_view_GLES20Canvas_isAvailable },
932
Romain Guy16393512010-08-08 00:14:31 -0700933#ifdef USE_OPENGL_RENDERER
Romain Guyba6be8a2012-04-23 18:22:09 -0700934 { "nFlushCaches", "(I)V", (void*) android_view_GLES20Canvas_flushCaches },
935 { "nInitCaches", "()V", (void*) android_view_GLES20Canvas_initCaches },
936 { "nTerminateCaches", "()V", (void*) android_view_GLES20Canvas_terminateCaches },
Romain Guy7d7b5492011-01-24 16:33:45 -0800937
Romain Guy61c8c9c2010-08-09 20:48:09 -0700938 { "nCreateRenderer", "()I", (void*) android_view_GLES20Canvas_createRenderer },
939 { "nDestroyRenderer", "(I)V", (void*) android_view_GLES20Canvas_destroyRenderer },
940 { "nSetViewport", "(III)V", (void*) android_view_GLES20Canvas_setViewport },
Chet Haase44b2fe32012-06-06 19:03:58 -0700941 { "nPrepare", "(IZ)I", (void*) android_view_GLES20Canvas_prepare },
942 { "nPrepareDirty", "(IIIIIZ)I", (void*) android_view_GLES20Canvas_prepareDirty },
Romain Guyb025b9c2010-09-16 14:16:48 -0700943 { "nFinish", "(I)V", (void*) android_view_GLES20Canvas_finish },
Romain Guyef359272013-01-31 19:07:29 -0800944 { "nSetName", "(ILjava/lang/String;)V",
945 (void*) android_view_GLES20Canvas_setName },
Romain Guy16393512010-08-08 00:14:31 -0700946
Romain Guy530041d2012-01-25 18:56:29 -0800947 { "nGetStencilSize", "()I", (void*) android_view_GLES20Canvas_getStencilSize },
948
Romain Guy244ada12012-03-28 16:41:26 -0700949 { "nCallDrawGLFunction", "(II)I", (void*) android_view_GLES20Canvas_callDrawGLFunction },
Romain Guyba6be8a2012-04-23 18:22:09 -0700950 { "nDetachFunctor", "(II)V", (void*) android_view_GLES20Canvas_detachFunctor },
951 { "nAttachFunctor", "(II)V", (void*) android_view_GLES20Canvas_attachFunctor },
952 { "nInvokeFunctors", "(ILandroid/graphics/Rect;)I",
Romain Guy8f3b8e32012-03-27 16:33:45 -0700953 (void*) android_view_GLES20Canvas_invokeFunctors },
Romain Guy7d7b5492011-01-24 16:33:45 -0800954
Romain Guy61c8c9c2010-08-09 20:48:09 -0700955 { "nSave", "(II)I", (void*) android_view_GLES20Canvas_save },
956 { "nRestore", "(I)V", (void*) android_view_GLES20Canvas_restore },
957 { "nRestoreToCount", "(II)V", (void*) android_view_GLES20Canvas_restoreToCount },
958 { "nGetSaveCount", "(I)I", (void*) android_view_GLES20Canvas_getSaveCount },
Romain Guy85bf02f2010-06-22 13:11:24 -0700959
Romain Guy61c8c9c2010-08-09 20:48:09 -0700960 { "nSaveLayer", "(IFFFFII)I", (void*) android_view_GLES20Canvas_saveLayer },
Romain Guy189887e2011-08-25 11:45:13 -0700961 { "nSaveLayer", "(III)I", (void*) android_view_GLES20Canvas_saveLayerClip },
Romain Guy61c8c9c2010-08-09 20:48:09 -0700962 { "nSaveLayerAlpha", "(IFFFFII)I", (void*) android_view_GLES20Canvas_saveLayerAlpha },
Romain Guy189887e2011-08-25 11:45:13 -0700963 { "nSaveLayerAlpha", "(III)I", (void*) android_view_GLES20Canvas_saveLayerAlphaClip },
Romain Guybb9524b2010-06-22 18:56:38 -0700964
Derek Sollenbergerca79cf62012-08-14 16:44:52 -0400965 { "nQuickReject", "(IFFFF)Z", (void*) android_view_GLES20Canvas_quickReject },
Romain Guy61c8c9c2010-08-09 20:48:09 -0700966 { "nClipRect", "(IFFFFI)Z", (void*) android_view_GLES20Canvas_clipRectF },
967 { "nClipRect", "(IIIIII)Z", (void*) android_view_GLES20Canvas_clipRect },
Romain Guy735738c2012-12-03 12:34:51 -0800968 { "nClipPath", "(III)Z", (void*) android_view_GLES20Canvas_clipPath },
969 { "nClipRegion", "(III)Z", (void*) android_view_GLES20Canvas_clipRegion },
Romain Guyc7d53492010-06-25 13:41:57 -0700970
Romain Guy61c8c9c2010-08-09 20:48:09 -0700971 { "nTranslate", "(IFF)V", (void*) android_view_GLES20Canvas_translate },
972 { "nRotate", "(IF)V", (void*) android_view_GLES20Canvas_rotate },
973 { "nScale", "(IFF)V", (void*) android_view_GLES20Canvas_scale },
Romain Guy807daf72011-01-18 11:19:19 -0800974 { "nSkew", "(IFF)V", (void*) android_view_GLES20Canvas_skew },
Romain Guyc7d53492010-06-25 13:41:57 -0700975
Romain Guy61c8c9c2010-08-09 20:48:09 -0700976 { "nSetMatrix", "(II)V", (void*) android_view_GLES20Canvas_setMatrix },
977 { "nGetMatrix", "(II)V", (void*) android_view_GLES20Canvas_getMatrix },
978 { "nConcatMatrix", "(II)V", (void*) android_view_GLES20Canvas_concatMatrix },
Romain Guyc7d53492010-06-25 13:41:57 -0700979
Romain Guy5a7b4662011-01-20 19:09:30 -0800980 { "nDrawBitmap", "(II[BFFI)V", (void*) android_view_GLES20Canvas_drawBitmap },
981 { "nDrawBitmap", "(II[BFFFFFFFFI)V",(void*) android_view_GLES20Canvas_drawBitmapRect },
982 { "nDrawBitmap", "(II[BII)V", (void*) android_view_GLES20Canvas_drawBitmapMatrix },
Romain Guye651cc62012-05-14 19:44:40 -0700983 { "nDrawBitmap", "(I[IIIFFIIZI)V", (void*) android_view_GLES20Canvas_drawBitmapData },
Romain Guy5a7b4662011-01-20 19:09:30 -0800984
985 { "nDrawBitmapMesh", "(II[BII[FI[III)V",(void*) android_view_GLES20Canvas_drawBitmapMesh },
986
987 { "nDrawPatch", "(II[B[BFFFFI)V", (void*) android_view_GLES20Canvas_drawPatch },
Patrick Dubroye4ac2d62010-12-01 11:23:13 -0800988
Romain Guy61c8c9c2010-08-09 20:48:09 -0700989 { "nDrawColor", "(III)V", (void*) android_view_GLES20Canvas_drawColor },
990 { "nDrawRect", "(IFFFFI)V", (void*) android_view_GLES20Canvas_drawRect },
Romain Guy672433d2013-01-04 19:05:13 -0800991 { "nDrawRects", "(III)V", (void*) android_view_GLES20Canvas_drawRegionAsRects },
992 { "nDrawRects", "(I[FII)V", (void*) android_view_GLES20Canvas_drawRects },
Romain Guy01d58e42011-01-19 21:54:02 -0800993 { "nDrawRoundRect", "(IFFFFFFI)V", (void*) android_view_GLES20Canvas_drawRoundRect },
994 { "nDrawCircle", "(IFFFI)V", (void*) android_view_GLES20Canvas_drawCircle },
Romain Guyc1cd9ba32011-01-23 14:18:41 -0800995 { "nDrawOval", "(IFFFFI)V", (void*) android_view_GLES20Canvas_drawOval },
Romain Guy8b2f5262011-01-23 16:15:02 -0800996 { "nDrawArc", "(IFFFFFFZI)V", (void*) android_view_GLES20Canvas_drawArc },
Romain Guyed6fcb02011-03-21 13:11:28 -0700997 { "nDrawPoints", "(I[FIII)V", (void*) android_view_GLES20Canvas_drawPoints },
Romain Guy8b2f5262011-01-23 16:15:02 -0800998
Romain Guy61c8c9c2010-08-09 20:48:09 -0700999 { "nDrawPath", "(III)V", (void*) android_view_GLES20Canvas_drawPath },
Romain Guy759ea802010-09-16 20:49:46 -07001000 { "nDrawLines", "(I[FIII)V", (void*) android_view_GLES20Canvas_drawLines },
Romain Guybd6b79b2010-06-26 00:13:53 -07001001
Romain Guya168d732011-03-18 16:50:13 -07001002 { "nResetModifiers", "(II)V", (void*) android_view_GLES20Canvas_resetModifiers },
Romain Guy61c8c9c2010-08-09 20:48:09 -07001003 { "nSetupShader", "(II)V", (void*) android_view_GLES20Canvas_setupShader },
1004 { "nSetupColorFilter", "(II)V", (void*) android_view_GLES20Canvas_setupColorFilter },
Romain Guy1e45aae2010-08-13 19:39:53 -07001005 { "nSetupShadow", "(IFFFI)V", (void*) android_view_GLES20Canvas_setupShadow },
Romain Guybb9524b2010-06-22 18:56:38 -07001006
Romain Guy5ff9df62012-01-23 17:09:05 -08001007 { "nSetupPaintFilter", "(III)V", (void*) android_view_GLES20Canvas_setupPaintFilter },
1008 { "nResetPaintFilter", "(I)V", (void*) android_view_GLES20Canvas_resetPaintFilter },
1009
Fabrice Di Meglioda12f382013-03-15 11:26:56 -07001010 { "nDrawText", "(I[CIIFFII)V", (void*) android_view_GLES20Canvas_drawTextArray },
1011 { "nDrawText", "(ILjava/lang/String;IIFFII)V",
Romain Guya1db5742010-07-20 13:09:13 -07001012 (void*) android_view_GLES20Canvas_drawText },
1013
Fabrice Di Meglioda12f382013-03-15 11:26:56 -07001014 { "nDrawTextOnPath", "(I[CIIIFFII)V", (void*) android_view_GLES20Canvas_drawTextArrayOnPath },
1015 { "nDrawTextOnPath", "(ILjava/lang/String;IIIFFII)V",
Romain Guy325740f2012-02-24 16:48:34 -08001016 (void*) android_view_GLES20Canvas_drawTextOnPath },
1017
Fabrice Di Meglioda12f382013-03-15 11:26:56 -07001018 { "nDrawTextRun", "(I[CIIIIFFII)V", (void*) android_view_GLES20Canvas_drawTextRunArray },
1019 { "nDrawTextRun", "(ILjava/lang/String;IIIIFFII)V",
Romain Guy61c8c9c2010-08-09 20:48:09 -07001020 (void*) android_view_GLES20Canvas_drawTextRun },
1021
Romain Guyeb9a5362012-01-17 17:39:26 -08001022 { "nDrawPosText", "(I[CII[FI)V", (void*) android_view_GLES20Canvas_drawPosTextArray },
1023 { "nDrawPosText", "(ILjava/lang/String;II[FI)V",
1024 (void*) android_view_GLES20Canvas_drawPosText },
1025
Romain Guyfb8b7632010-08-23 21:05:08 -07001026 { "nGetClipBounds", "(ILandroid/graphics/Rect;)Z",
Romain Guyce0537b2010-06-29 21:05:21 -07001027 (void*) android_view_GLES20Canvas_getClipBounds },
Romain Guyb051e892010-09-28 19:09:36 -07001028
Jeff Brown162a0212011-07-21 17:02:54 -07001029 { "nGetDisplayList", "(II)I", (void*) android_view_GLES20Canvas_getDisplayList },
Romain Guy52036b12013-02-14 18:03:37 -08001030 { "nOutputDisplayList", "(II)V", (void*) android_view_GLES20Canvas_outputDisplayList },
Chet Haase1271e2c2012-04-20 09:54:27 -07001031 { "nDrawDisplayList", "(IILandroid/graphics/Rect;I)I",
Romain Guy8f3b8e32012-03-27 16:33:45 -07001032 (void*) android_view_GLES20Canvas_drawDisplayList },
Romain Guy13631f32012-01-30 17:41:55 -08001033
1034 { "nCreateDisplayListRenderer", "()I", (void*) android_view_GLES20Canvas_createDisplayListRenderer },
1035 { "nResetDisplayListRenderer", "(I)V", (void*) android_view_GLES20Canvas_resetDisplayListRenderer },
1036
Romain Guyc89b14b2012-08-08 14:53:48 -07001037 { "nInterrupt", "(I)V", (void*) android_view_GLES20Canvas_interrupt },
1038 { "nResume", "(I)V", (void*) android_view_GLES20Canvas_resume },
Romain Guy6c319ca2011-01-11 14:29:25 -08001039
1040 { "nCreateLayerRenderer", "(I)I", (void*) android_view_GLES20Canvas_createLayerRenderer },
Romain Guyada830f2011-01-13 12:13:20 -08001041 { "nCreateLayer", "(IIZ[I)I", (void*) android_view_GLES20Canvas_createLayer },
Chet Haase603f6de2012-09-14 15:31:25 -07001042 { "nResizeLayer", "(III[I)Z" , (void*) android_view_GLES20Canvas_resizeLayer },
Chet Haased15ebf22012-09-05 11:40:29 -07001043 { "nSetLayerPaint", "(II)V", (void*) android_view_GLES20Canvas_setLayerPaint },
1044 { "nSetLayerColorFilter", "(II)V", (void*) android_view_GLES20Canvas_setLayerColorFilter },
Romain Guy846a5332012-07-11 17:44:57 -07001045 { "nSetOpaqueLayer", "(IZ)V", (void*) android_view_GLES20Canvas_setOpaqueLayer },
Romain Guya9489272011-06-22 20:58:11 -07001046 { "nCreateTextureLayer", "(Z[I)I", (void*) android_view_GLES20Canvas_createTextureLayer },
1047 { "nUpdateTextureLayer", "(IIIZLandroid/graphics/SurfaceTexture;)V",
Romain Guy244ada12012-03-28 16:41:26 -07001048 (void*) android_view_GLES20Canvas_updateTextureLayer },
Romain Guy2bf68f02012-03-02 13:37:47 -08001049 { "nUpdateRenderLayer", "(IIIIIII)V", (void*) android_view_GLES20Canvas_updateRenderLayer },
Romain Guyef09a212012-09-25 12:17:14 -07001050 { "nClearLayerTexture", "(I)V", (void*) android_view_GLES20Canvas_clearLayerTexture },
Romain Guyada830f2011-01-13 12:13:20 -08001051 { "nDestroyLayer", "(I)V", (void*) android_view_GLES20Canvas_destroyLayer },
1052 { "nDestroyLayerDeferred", "(I)V", (void*) android_view_GLES20Canvas_destroyLayerDeferred },
Chris Craika4e16c52013-03-22 10:00:48 -07001053 { "nDrawLayer", "(IIFF)V", (void*) android_view_GLES20Canvas_drawLayer },
Romain Guy77a81162011-06-14 16:45:55 -07001054 { "nCopyLayer", "(II)Z", (void*) android_view_GLES20Canvas_copyLayer },
Romain Guy11cb6422012-09-21 00:39:43 -07001055 { "nClearLayerUpdates", "(I)V", (void*) android_view_GLES20Canvas_clearLayerUpdates },
1056 { "nPushLayerUpdate", "(II)V", (void*) android_view_GLES20Canvas_pushLayerUpdate },
Romain Guyb051e892010-09-28 19:09:36 -07001057
Romain Guy2bf68f02012-03-02 13:37:47 -08001058 { "nSetTextureLayerTransform", "(II)V", (void*) android_view_GLES20Canvas_setTextureLayerTransform },
1059
Romain Guyf61970fc2011-07-07 14:10:06 -07001060 { "nGetMaximumTextureWidth", "()I", (void*) android_view_GLES20Canvas_getMaxTextureWidth },
1061 { "nGetMaximumTextureHeight", "()I", (void*) android_view_GLES20Canvas_getMaxTextureHeight },
1062
Romain Guy16393512010-08-08 00:14:31 -07001063#endif
Romain Guye4d01122010-06-16 18:44:05 -07001064};
1065
Chet Haase9c1e23b2011-03-24 10:51:31 -07001066static JNINativeMethod gActivityThreadMethods[] = {
1067 { "dumpGraphicsInfo", "(Ljava/io/FileDescriptor;)V",
1068 (void*) android_app_ActivityThread_dumpGraphics }
1069};
1070
1071
Romain Guy16393512010-08-08 00:14:31 -07001072#ifdef USE_OPENGL_RENDERER
1073 #define FIND_CLASS(var, className) \
1074 var = env->FindClass(className); \
Carl Shapiro17cc33a2011-03-05 20:53:16 -08001075 LOG_FATAL_IF(! var, "Unable to find class " className);
1076
Romain Guy16393512010-08-08 00:14:31 -07001077 #define GET_METHOD_ID(var, clazz, methodName, methodDescriptor) \
1078 var = env->GetMethodID(clazz, methodName, methodDescriptor); \
1079 LOG_FATAL_IF(! var, "Unable to find method " methodName);
1080#else
1081 #define FIND_CLASS(var, className)
1082 #define GET_METHOD_ID(var, clazz, methodName, methodDescriptor)
1083#endif
Romain Guy9d5316e2010-06-24 19:30:36 -07001084
Romain Guye4d01122010-06-16 18:44:05 -07001085int register_android_view_GLES20Canvas(JNIEnv* env) {
Carl Shapiro17cc33a2011-03-05 20:53:16 -08001086 jclass clazz;
1087 FIND_CLASS(clazz, "android/graphics/Rect");
1088 GET_METHOD_ID(gRectClassInfo.set, clazz, "set", "(IIII)V");
Romain Guy9d5316e2010-06-24 19:30:36 -07001089
Romain Guye4d01122010-06-16 18:44:05 -07001090 return AndroidRuntime::registerNativeMethods(env, kClassPathName, gMethods, NELEM(gMethods));
1091}
1092
Chet Haase9c1e23b2011-03-24 10:51:31 -07001093const char* const kActivityThreadPathName = "android/app/ActivityThread";
1094
Romain Guy6be3d552011-07-14 18:08:37 -07001095int register_android_app_ActivityThread(JNIEnv* env) {
1096 return AndroidRuntime::registerNativeMethods(env, kActivityThreadPathName,
Chet Haase9c1e23b2011-03-24 10:51:31 -07001097 gActivityThreadMethods, NELEM(gActivityThreadMethods));
1098}
1099
Romain Guye4d01122010-06-16 18:44:05 -07001100};