blob: 591ff77b2c943be916e20ff243e66123e64dfec1 [file] [log] [blame]
Romain Guye4d01122010-06-16 18:44:05 -07001/*
2 * Copyright (C) 2010 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Romain Guya1db5742010-07-20 13:09:13 -070017#define LOG_TAG "OpenGLRenderer"
18
Romain Guye4d01122010-06-16 18:44:05 -070019#include "jni.h"
Patrick Dubroye4ac2d62010-12-01 11:23:13 -080020#include "GraphicsJNI.h"
Romain Guye4d01122010-06-16 18:44:05 -070021#include <nativehelper/JNIHelp.h>
Romain Guy65549432012-03-26 16:45:05 -070022
Romain Guy3b748a42013-04-17 18:54:38 -070023#include "android_view_GraphicBuffer.h"
24
Romain Guye4d01122010-06-16 18:44:05 -070025#include <android_runtime/AndroidRuntime.h>
Romain Guye5e0c502011-06-15 15:18:31 -070026#include <android_runtime/android_graphics_SurfaceTexture.h>
Romain Guy65549432012-03-26 16:45:05 -070027
Mathias Agopianb13b9bd2012-02-17 18:27:36 -080028#include <androidfw/ResourceTypes.h>
Romain Guye4d01122010-06-16 18:44:05 -070029
Romain Guy3b748a42013-04-17 18:54:38 -070030#include <gui/GLConsumer.h>
31
Romain Guy65549432012-03-26 16:45:05 -070032#include <private/hwui/DrawGlInfo.h>
33
34#include <cutils/properties.h>
Romain Guy8f0095c2011-05-02 17:24:22 -070035
Romain Guyce0537b2010-06-29 21:05:21 -070036#include <SkBitmap.h>
Romain Guyc7d53492010-06-25 13:41:57 -070037#include <SkCanvas.h>
Romain Guyf6a11b82010-06-23 17:47:49 -070038#include <SkMatrix.h>
Romain Guyc7d53492010-06-25 13:41:57 -070039#include <SkPaint.h>
Romain Guy079ba2c2010-07-16 14:12:24 -070040#include <SkRegion.h>
Romain Guya1db5742010-07-20 13:09:13 -070041#include <SkScalerContext.h>
Romain Guy61c8c9c2010-08-09 20:48:09 -070042#include <SkTemplates.h>
Romain Guy85bf02f2010-06-22 13:11:24 -070043#include <SkXfermode.h>
Romain Guye4d01122010-06-16 18:44:05 -070044
Romain Guy52036b12013-02-14 18:03:37 -080045#include <DisplayList.h>
Romain Guyb051e892010-09-28 19:09:36 -070046#include <DisplayListRenderer.h>
Romain Guy6c319ca2011-01-11 14:29:25 -080047#include <LayerRenderer.h>
Romain Guy85bf02f2010-06-22 13:11:24 -070048#include <OpenGLRenderer.h>
Romain Guy06f96e22010-07-30 19:18:16 -070049#include <SkiaShader.h>
Romain Guydb1938e2010-08-02 18:50:22 -070050#include <SkiaColorFilter.h>
Romain Guy0baaac52012-08-31 20:31:01 -070051#include <Stencil.h>
Romain Guy9d5316e2010-06-24 19:30:36 -070052#include <Rect.h>
Romain Guy85bf02f2010-06-22 13:11:24 -070053
Romain Guyd1d4bb72012-01-17 17:31:27 -080054#include <TextLayout.h>
Fabrice Di Megliob02d0ca2011-12-08 14:05:44 -080055#include <TextLayoutCache.h>
Romain Guye8e62a42010-07-23 18:55:21 -070056
Romain Guye4d01122010-06-16 18:44:05 -070057namespace android {
58
Romain Guy9d5316e2010-06-24 19:30:36 -070059using namespace uirenderer;
60
Romain Guy16393512010-08-08 00:14:31 -070061/**
62 * Note: OpenGLRenderer JNI layer is generated and compiled only on supported
63 * devices. This means all the logic must be compiled only when the
64 * preprocessor variable USE_OPENGL_RENDERER is defined.
65 */
66#ifdef USE_OPENGL_RENDERER
67
Romain Guy244ada12012-03-28 16:41:26 -070068// ----------------------------------------------------------------------------
Romain Guybdb801ca2010-10-04 17:22:29 -070069// Defines
Romain Guy244ada12012-03-28 16:41:26 -070070// ----------------------------------------------------------------------------
Romain Guybdb801ca2010-10-04 17:22:29 -070071
72// Debug
Romain Guye2d345e2010-09-24 18:39:22 -070073#define DEBUG_RENDERER 0
Romain Guybdb801ca2010-10-04 17:22:29 -070074
75// Debug
76#if DEBUG_RENDERER
Steve Block5baa3a62011-12-20 16:23:08 +000077 #define RENDERER_LOGD(...) ALOGD(__VA_ARGS__)
Romain Guybdb801ca2010-10-04 17:22:29 -070078#else
79 #define RENDERER_LOGD(...)
80#endif
Romain Guye2d345e2010-09-24 18:39:22 -070081
Romain Guya168d732011-03-18 16:50:13 -070082#define MODIFIER_SHADOW 1
83#define MODIFIER_SHADER 2
84#define MODIFIER_COLOR_FILTER 4
85
Romain Guy9d5316e2010-06-24 19:30:36 -070086// ----------------------------------------------------------------------------
Romain Guy9d5316e2010-06-24 19:30:36 -070087
88static struct {
Romain Guy7ae7ac42010-06-25 13:46:18 -070089 jmethodID set;
Romain Guy9d5316e2010-06-24 19:30:36 -070090} gRectClassInfo;
91
Romain Guye4d01122010-06-16 18:44:05 -070092// ----------------------------------------------------------------------------
Romain Guy244ada12012-03-28 16:41:26 -070093// Caching
Romain Guy7d7b5492011-01-24 16:33:45 -080094// ----------------------------------------------------------------------------
95
Romain Guybdf76092011-07-18 15:00:43 -070096static void android_view_GLES20Canvas_flushCaches(JNIEnv* env, jobject clazz,
Ashok Bhata0398432014-01-20 20:08:01 +000097 jint mode) {
Romain Guybdf76092011-07-18 15:00:43 -070098 if (Caches::hasInstance()) {
Ashok Bhata0398432014-01-20 20:08:01 +000099 Caches::getInstance().flush(static_cast<Caches::FlushMode>(mode));
Romain Guybdf76092011-07-18 15:00:43 -0700100 }
101}
102
Ashok Bhata0398432014-01-20 20:08:01 +0000103static jboolean android_view_GLES20Canvas_initCaches(JNIEnv* env, jobject clazz) {
Romain Guy8ff6b9e2011-11-09 20:10:18 -0800104 if (Caches::hasInstance()) {
Ashok Bhata0398432014-01-20 20:08:01 +0000105 return Caches::getInstance().init() ? JNI_TRUE : JNI_FALSE;
Romain Guy8ff6b9e2011-11-09 20:10:18 -0800106 }
Ashok Bhata0398432014-01-20 20:08:01 +0000107 return JNI_FALSE;
Romain Guy8ff6b9e2011-11-09 20:10:18 -0800108}
109
110static void android_view_GLES20Canvas_terminateCaches(JNIEnv* env, jobject clazz) {
111 if (Caches::hasInstance()) {
112 Caches::getInstance().terminate();
113 }
114}
115
Romain Guy7d7b5492011-01-24 16:33:45 -0800116// ----------------------------------------------------------------------------
Romain Guy3b748a42013-04-17 18:54:38 -0700117// Caching
118// ----------------------------------------------------------------------------
119
120static void android_view_GLES20Canvas_initAtlas(JNIEnv* env, jobject clazz,
Ashok Bhat4de3f482014-01-27 16:00:23 +0000121 jobject graphicBuffer, jlongArray atlasMapArray, jint count) {
Romain Guy3b748a42013-04-17 18:54:38 -0700122
123 sp<GraphicBuffer> buffer = graphicBufferForJavaObject(env, graphicBuffer);
Ashok Bhat4de3f482014-01-27 16:00:23 +0000124 jlong* jAtlasMap = env->GetLongArrayElements(atlasMapArray, NULL);
125 Caches::getInstance().assetAtlas.init(buffer, jAtlasMap, count);
126 env->ReleaseLongArrayElements(atlasMapArray, jAtlasMap, 0);
Romain Guy3b748a42013-04-17 18:54:38 -0700127}
128
129// ----------------------------------------------------------------------------
Romain Guye4d01122010-06-16 18:44:05 -0700130// Constructors
131// ----------------------------------------------------------------------------
132
Ashok Bhata0398432014-01-20 20:08:01 +0000133static jlong android_view_GLES20Canvas_createRenderer(JNIEnv* env, jobject clazz) {
Romain Guybdb801ca2010-10-04 17:22:29 -0700134 RENDERER_LOGD("Create OpenGLRenderer");
Romain Guy87e2f7572012-09-24 11:37:12 -0700135 OpenGLRenderer* renderer = new OpenGLRenderer();
136 renderer->initProperties();
Ashok Bhata0398432014-01-20 20:08:01 +0000137 return reinterpret_cast<jlong>(renderer);
Romain Guye4d01122010-06-16 18:44:05 -0700138}
139
Chet Haase5c13d892010-10-08 08:37:55 -0700140static void android_view_GLES20Canvas_destroyRenderer(JNIEnv* env, jobject clazz,
Ashok Bhata0398432014-01-20 20:08:01 +0000141 jlong rendererHandle) {
142 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererHandle);
Romain Guybdb801ca2010-10-04 17:22:29 -0700143 RENDERER_LOGD("Destroy OpenGLRenderer");
Romain Guyf6a11b82010-06-23 17:47:49 -0700144 delete renderer;
Romain Guye4d01122010-06-16 18:44:05 -0700145}
146
147// ----------------------------------------------------------------------------
148// Setup
149// ----------------------------------------------------------------------------
150
Romain Guy7d7b5492011-01-24 16:33:45 -0800151static void android_view_GLES20Canvas_setViewport(JNIEnv* env, jobject clazz,
Ashok Bhata0398432014-01-20 20:08:01 +0000152 jlong rendererHandle, jint width, jint height) {
153 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererHandle);
Romain Guyf6a11b82010-06-23 17:47:49 -0700154 renderer->setViewport(width, height);
Romain Guye4d01122010-06-16 18:44:05 -0700155}
156
Ashok Bhata0398432014-01-20 20:08:01 +0000157static jint android_view_GLES20Canvas_prepare(JNIEnv* env, jobject clazz,
158 jlong rendererHandle, jboolean opaque) {
159 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererHandle);
Chet Haase44b2fe32012-06-06 19:03:58 -0700160 return renderer->prepare(opaque);
Romain Guye4d01122010-06-16 18:44:05 -0700161}
162
Ashok Bhata0398432014-01-20 20:08:01 +0000163static jint android_view_GLES20Canvas_prepareDirty(JNIEnv* env, jobject clazz,
164 jlong rendererHandle, jint left, jint top, jint right, jint bottom,
Romain Guy7d7b5492011-01-24 16:33:45 -0800165 jboolean opaque) {
Ashok Bhata0398432014-01-20 20:08:01 +0000166 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererHandle);
Chet Haase44b2fe32012-06-06 19:03:58 -0700167 return renderer->prepareDirty(left, top, right, bottom, opaque);
Romain Guy7d7b5492011-01-24 16:33:45 -0800168}
169
170static void android_view_GLES20Canvas_finish(JNIEnv* env, jobject clazz,
Ashok Bhata0398432014-01-20 20:08:01 +0000171 jlong rendererHandle) {
172 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererHandle);
Romain Guyb025b9c2010-09-16 14:16:48 -0700173 renderer->finish();
174}
175
Romain Guy530041d2012-01-25 18:56:29 -0800176static jint android_view_GLES20Canvas_getStencilSize(JNIEnv* env, jobject clazz) {
Romain Guy0baaac52012-08-31 20:31:01 -0700177 return Stencil::getStencilSize();
Romain Guy530041d2012-01-25 18:56:29 -0800178}
179
Romain Guyef359272013-01-31 19:07:29 -0800180static void android_view_GLES20Canvas_setName(JNIEnv* env,
Ashok Bhata0398432014-01-20 20:08:01 +0000181 jobject clazz, jlong rendererHandle, jstring name) {
182 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererHandle);
Romain Guyef359272013-01-31 19:07:29 -0800183 if (name != NULL) {
184 const char* textArray = env->GetStringUTFChars(name, NULL);
185 renderer->setName(textArray);
186 env->ReleaseStringUTFChars(name, textArray);
187 } else {
188 renderer->setName(NULL);
189 }
190}
191
Romain Guy78dd96d2013-05-03 14:24:16 -0700192static void android_view_GLES20Canvas_setCountOverdrawEnabled(JNIEnv* env, jobject clazz,
Ashok Bhata0398432014-01-20 20:08:01 +0000193 jlong rendererHandle, jboolean enabled) {
194 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererHandle);
Romain Guy78dd96d2013-05-03 14:24:16 -0700195 renderer->setCountOverdrawEnabled(enabled);
196}
197
198static jfloat android_view_GLES20Canvas_getOverdraw(JNIEnv* env, jobject clazz,
Ashok Bhata0398432014-01-20 20:08:01 +0000199 jlong rendererHandle) {
200 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererHandle);
Romain Guy78dd96d2013-05-03 14:24:16 -0700201 return renderer->getOverdraw();
202}
203
Romain Guy530041d2012-01-25 18:56:29 -0800204// ----------------------------------------------------------------------------
205// Functor
206// ----------------------------------------------------------------------------
207
Romain Guy65549432012-03-26 16:45:05 -0700208static jint android_view_GLES20Canvas_callDrawGLFunction(JNIEnv* env, jobject clazz,
Ashok Bhata0398432014-01-20 20:08:01 +0000209 jlong rendererHandle, jlong functorHandle) {
210 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererHandle);
211 Functor* functor = reinterpret_cast<Functor*>(functorHandle);
Romain Guycabfcc12011-03-07 18:06:46 -0800212 android::uirenderer::Rect dirty;
213 return renderer->callDrawGLFunction(functor, dirty);
Chet Haasedaf98e92011-01-10 14:10:36 -0800214}
215
Romain Guyba6be8a2012-04-23 18:22:09 -0700216static void android_view_GLES20Canvas_detachFunctor(JNIEnv* env,
Narayan Kamath047b9382014-02-06 11:50:31 +0000217 jobject clazz, jlong rendererPtr, jlong functorPtr) {
218 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererPtr);
219 Functor* functor = reinterpret_cast<Functor*>(functorPtr);
Romain Guyba6be8a2012-04-23 18:22:09 -0700220 renderer->detachFunctor(functor);
221}
222
223static void android_view_GLES20Canvas_attachFunctor(JNIEnv* env,
Ashok Bhata0398432014-01-20 20:08:01 +0000224 jobject clazz, jlong rendererHandle, jlong functorHandle) {
225 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererHandle);
226 Functor* functor = reinterpret_cast<Functor*>(functorHandle);
Romain Guyba6be8a2012-04-23 18:22:09 -0700227 renderer->attachFunctor(functor);
228}
229
Romain Guy8f3b8e32012-03-27 16:33:45 -0700230static jint android_view_GLES20Canvas_invokeFunctors(JNIEnv* env,
Ashok Bhata0398432014-01-20 20:08:01 +0000231 jobject clazz, jlong rendererHandle, jobject dirty) {
232 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererHandle);
Romain Guy8f3b8e32012-03-27 16:33:45 -0700233 android::uirenderer::Rect bounds;
234 status_t status = renderer->invokeFunctors(bounds);
235 if (status != DrawGlInfo::kStatusDone && dirty != NULL) {
236 env->CallVoidMethod(dirty, gRectClassInfo.set,
237 int(bounds.left), int(bounds.top), int(bounds.right), int(bounds.bottom));
238 }
239 return status;
240}
241
242// ----------------------------------------------------------------------------
243// Misc
244// ----------------------------------------------------------------------------
245
Romain Guyf61970fc2011-07-07 14:10:06 -0700246static jint android_view_GLES20Canvas_getMaxTextureWidth(JNIEnv* env, jobject clazz) {
247 return Caches::getInstance().maxTextureSize;
248}
249
250static jint android_view_GLES20Canvas_getMaxTextureHeight(JNIEnv* env, jobject clazz) {
251 return Caches::getInstance().maxTextureSize;
252}
253
Romain Guye4d01122010-06-16 18:44:05 -0700254// ----------------------------------------------------------------------------
Romain Guybb9524b2010-06-22 18:56:38 -0700255// State
256// ----------------------------------------------------------------------------
257
Ashok Bhata0398432014-01-20 20:08:01 +0000258static jint android_view_GLES20Canvas_save(JNIEnv* env, jobject clazz, jlong rendererHandle,
Romain Guybb9524b2010-06-22 18:56:38 -0700259 jint flags) {
Ashok Bhata0398432014-01-20 20:08:01 +0000260 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererHandle);
Romain Guyf6a11b82010-06-23 17:47:49 -0700261 return renderer->save(flags);
Romain Guybb9524b2010-06-22 18:56:38 -0700262}
263
Romain Guy7d7b5492011-01-24 16:33:45 -0800264static jint android_view_GLES20Canvas_getSaveCount(JNIEnv* env, jobject clazz,
Ashok Bhata0398432014-01-20 20:08:01 +0000265 jlong rendererHandle) {
266 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererHandle);
Romain Guyf6a11b82010-06-23 17:47:49 -0700267 return renderer->getSaveCount();
Romain Guybb9524b2010-06-22 18:56:38 -0700268}
269
Romain Guy7d7b5492011-01-24 16:33:45 -0800270static void android_view_GLES20Canvas_restore(JNIEnv* env, jobject clazz,
Ashok Bhata0398432014-01-20 20:08:01 +0000271 jlong rendererHandle) {
272 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererHandle);
Romain Guyf6a11b82010-06-23 17:47:49 -0700273 renderer->restore();
Romain Guybb9524b2010-06-22 18:56:38 -0700274}
275
Romain Guy7d7b5492011-01-24 16:33:45 -0800276static void android_view_GLES20Canvas_restoreToCount(JNIEnv* env, jobject clazz,
Ashok Bhata0398432014-01-20 20:08:01 +0000277 jlong rendererHandle, jint saveCount) {
278 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererHandle);
Romain Guyf6a11b82010-06-23 17:47:49 -0700279 renderer->restoreToCount(saveCount);
Romain Guybb9524b2010-06-22 18:56:38 -0700280}
281
282// ----------------------------------------------------------------------------
Romain Guybd6b79b2010-06-26 00:13:53 -0700283// Layers
284// ----------------------------------------------------------------------------
285
Romain Guy7d7b5492011-01-24 16:33:45 -0800286static jint android_view_GLES20Canvas_saveLayer(JNIEnv* env, jobject clazz,
Ashok Bhata0398432014-01-20 20:08:01 +0000287 jlong rendererHandle, jfloat left, jfloat top, jfloat right, jfloat bottom,
288 jlong paintHandle, jint saveFlags) {
289 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererHandle);
290 SkPaint* paint = reinterpret_cast<SkPaint*>(paintHandle);
Romain Guybd6b79b2010-06-26 00:13:53 -0700291 return renderer->saveLayer(left, top, right, bottom, paint, saveFlags);
292}
293
Romain Guy189887e2011-08-25 11:45:13 -0700294static jint android_view_GLES20Canvas_saveLayerClip(JNIEnv* env, jobject clazz,
Ashok Bhata0398432014-01-20 20:08:01 +0000295 jlong rendererHandle, jlong paintHandle, jint saveFlags) {
296 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererHandle);
297 SkPaint* paint = reinterpret_cast<SkPaint*>(paintHandle);
Romain Guy189887e2011-08-25 11:45:13 -0700298 const android::uirenderer::Rect& bounds(renderer->getClipBounds());
299 return renderer->saveLayer(bounds.left, bounds.top, bounds.right, bounds.bottom,
300 paint, saveFlags);
301}
302
Romain Guy7d7b5492011-01-24 16:33:45 -0800303static jint android_view_GLES20Canvas_saveLayerAlpha(JNIEnv* env, jobject clazz,
Ashok Bhata0398432014-01-20 20:08:01 +0000304 jlong rendererHandle, jfloat left, jfloat top, jfloat right, jfloat bottom,
Romain Guybd6b79b2010-06-26 00:13:53 -0700305 jint alpha, jint saveFlags) {
Ashok Bhata0398432014-01-20 20:08:01 +0000306 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererHandle);
Romain Guybd6b79b2010-06-26 00:13:53 -0700307 return renderer->saveLayerAlpha(left, top, right, bottom, alpha, saveFlags);
308}
309
Romain Guy189887e2011-08-25 11:45:13 -0700310static jint android_view_GLES20Canvas_saveLayerAlphaClip(JNIEnv* env, jobject clazz,
Ashok Bhata0398432014-01-20 20:08:01 +0000311 jlong rendererHandle, jint alpha, jint saveFlags) {
312 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererHandle);
Romain Guy189887e2011-08-25 11:45:13 -0700313 const android::uirenderer::Rect& bounds(renderer->getClipBounds());
314 return renderer->saveLayerAlpha(bounds.left, bounds.top, bounds.right, bounds.bottom,
315 alpha, saveFlags);
316}
317
Romain Guybd6b79b2010-06-26 00:13:53 -0700318// ----------------------------------------------------------------------------
Romain Guybb9524b2010-06-22 18:56:38 -0700319// Clipping
320// ----------------------------------------------------------------------------
321
Ashok Bhata0398432014-01-20 20:08:01 +0000322static jboolean android_view_GLES20Canvas_quickReject(JNIEnv* env, jobject clazz,
323 jlong rendererHandle, jfloat left, jfloat top, jfloat right, jfloat bottom) {
324 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererHandle);
325 bool result = renderer->quickRejectNoScissor(left, top, right, bottom);
326 return result ? JNI_TRUE : JNI_FALSE;
Romain Guyc7d53492010-06-25 13:41:57 -0700327}
328
Ashok Bhata0398432014-01-20 20:08:01 +0000329static jboolean android_view_GLES20Canvas_clipRectF(JNIEnv* env, jobject clazz,
330 jlong rendererHandle, jfloat left, jfloat top, jfloat right, jfloat bottom,
331 jint opHandle) {
332 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererHandle);
333 SkRegion::Op op = static_cast<SkRegion::Op>(opHandle);
334 bool result;
335 result = renderer->clipRect(left, top, right, bottom, op);
336 return result ? JNI_TRUE : JNI_FALSE;
Romain Guybb9524b2010-06-22 18:56:38 -0700337}
338
Ashok Bhata0398432014-01-20 20:08:01 +0000339static jboolean android_view_GLES20Canvas_clipRect(JNIEnv* env, jobject clazz,
340 jlong rendererHandle, jint left, jint top, jint right, jint bottom,
341 jint opHandle) {
342 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererHandle);
343 SkRegion::Op op = static_cast<SkRegion::Op>(opHandle);
344 bool result = renderer->clipRect(float(left), float(top), float(right), float(bottom), op);
345 return result ? JNI_TRUE : JNI_FALSE;
Romain Guyf6a11b82010-06-23 17:47:49 -0700346}
Romain Guybb9524b2010-06-22 18:56:38 -0700347
Ashok Bhata0398432014-01-20 20:08:01 +0000348static jboolean android_view_GLES20Canvas_clipPath(JNIEnv* env, jobject clazz,
349 jlong rendererHandle, jlong pathHandle, jint opHandle) {
350 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererHandle);
351 SkPath* path = reinterpret_cast<SkPath*>(pathHandle);
352 SkRegion::Op op = static_cast<SkRegion::Op>(opHandle);
353 return renderer->clipPath(path, op) ? JNI_TRUE : JNI_FALSE;
Romain Guy735738c2012-12-03 12:34:51 -0800354}
355
Ashok Bhata0398432014-01-20 20:08:01 +0000356static jboolean android_view_GLES20Canvas_clipRegion(JNIEnv* env, jobject clazz,
357 jlong rendererHandle, jlong regionHandle, jint opHandle) {
358 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererHandle);
359 SkRegion* region = reinterpret_cast<SkRegion*>(regionHandle);
360 SkRegion::Op op = static_cast<SkRegion::Op>(opHandle);
361 return renderer->clipRegion(region, op) ? JNI_TRUE : JNI_FALSE;
Romain Guy735738c2012-12-03 12:34:51 -0800362}
363
Ashok Bhata0398432014-01-20 20:08:01 +0000364static jboolean android_view_GLES20Canvas_getClipBounds(JNIEnv* env, jobject clazz,
365 jlong rendererHandle, jobject rect) {
366 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererHandle);
Romain Guy7ae7ac42010-06-25 13:46:18 -0700367 const android::uirenderer::Rect& bounds(renderer->getClipBounds());
Romain Guy9d5316e2010-06-24 19:30:36 -0700368
Romain Guy7ae7ac42010-06-25 13:46:18 -0700369 env->CallVoidMethod(rect, gRectClassInfo.set,
370 int(bounds.left), int(bounds.top), int(bounds.right), int(bounds.bottom));
Romain Guy9d5316e2010-06-24 19:30:36 -0700371
Ashok Bhata0398432014-01-20 20:08:01 +0000372 return !bounds.isEmpty() ? JNI_TRUE : JNI_FALSE;
Romain Guy9d5316e2010-06-24 19:30:36 -0700373}
374
Romain Guyf6a11b82010-06-23 17:47:49 -0700375// ----------------------------------------------------------------------------
376// Transforms
377// ----------------------------------------------------------------------------
378
Romain Guy7d7b5492011-01-24 16:33:45 -0800379static void android_view_GLES20Canvas_translate(JNIEnv* env, jobject clazz,
Ashok Bhata0398432014-01-20 20:08:01 +0000380 jlong rendererHandle, jfloat dx, jfloat dy) {
381 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererHandle);
Romain Guy7ae7ac42010-06-25 13:46:18 -0700382 renderer->translate(dx, dy);
Romain Guyf6a11b82010-06-23 17:47:49 -0700383}
384
Romain Guy7d7b5492011-01-24 16:33:45 -0800385static void android_view_GLES20Canvas_rotate(JNIEnv* env, jobject clazz,
Ashok Bhata0398432014-01-20 20:08:01 +0000386 jlong rendererHandle, jfloat degrees) {
387 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererHandle);
Romain Guy7ae7ac42010-06-25 13:46:18 -0700388 renderer->rotate(degrees);
Romain Guyf6a11b82010-06-23 17:47:49 -0700389}
390
Romain Guy7d7b5492011-01-24 16:33:45 -0800391static void android_view_GLES20Canvas_scale(JNIEnv* env, jobject clazz,
Ashok Bhata0398432014-01-20 20:08:01 +0000392 jlong rendererHandle, jfloat sx, jfloat sy) {
393 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererHandle);
Romain Guy7ae7ac42010-06-25 13:46:18 -0700394 renderer->scale(sx, sy);
Romain Guyf6a11b82010-06-23 17:47:49 -0700395}
396
Romain Guy7d7b5492011-01-24 16:33:45 -0800397static void android_view_GLES20Canvas_skew(JNIEnv* env, jobject clazz,
Ashok Bhata0398432014-01-20 20:08:01 +0000398 jlong rendererHandle, jfloat sx, jfloat sy) {
399 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererHandle);
Romain Guy807daf72011-01-18 11:19:19 -0800400 renderer->skew(sx, sy);
401}
402
Romain Guy7d7b5492011-01-24 16:33:45 -0800403static void android_view_GLES20Canvas_setMatrix(JNIEnv* env, jobject clazz,
Ashok Bhata0398432014-01-20 20:08:01 +0000404 jlong rendererHandle, jlong matrixHandle) {
405 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererHandle);
406 SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixHandle);
Romain Guy7ae7ac42010-06-25 13:46:18 -0700407 renderer->setMatrix(matrix);
Romain Guyf6a11b82010-06-23 17:47:49 -0700408}
409
Romain Guy7d7b5492011-01-24 16:33:45 -0800410static void android_view_GLES20Canvas_getMatrix(JNIEnv* env, jobject clazz,
Ashok Bhata0398432014-01-20 20:08:01 +0000411 jlong rendererHandle, jlong matrixHandle) {
412 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererHandle);
413 SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixHandle);
Romain Guy7ae7ac42010-06-25 13:46:18 -0700414 renderer->getMatrix(matrix);
Romain Guyf6a11b82010-06-23 17:47:49 -0700415}
416
Romain Guy7d7b5492011-01-24 16:33:45 -0800417static void android_view_GLES20Canvas_concatMatrix(JNIEnv* env, jobject clazz,
Ashok Bhata0398432014-01-20 20:08:01 +0000418 jlong rendererHandle, jlong matrixHandle) {
419 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererHandle);
420 SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixHandle);
Romain Guy7ae7ac42010-06-25 13:46:18 -0700421 renderer->concatMatrix(matrix);
Romain Guybb9524b2010-06-22 18:56:38 -0700422}
423
424// ----------------------------------------------------------------------------
425// Drawing
Romain Guy85bf02f2010-06-22 13:11:24 -0700426// ----------------------------------------------------------------------------
427
Romain Guy7d7b5492011-01-24 16:33:45 -0800428static void android_view_GLES20Canvas_drawBitmap(JNIEnv* env, jobject clazz,
Ashok Bhata0398432014-01-20 20:08:01 +0000429 jlong rendererHandle, jlong bitmapHandle, jbyteArray buffer,
430 jfloat left, jfloat top, jlong paintHandle) {
431 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererHandle);
432 SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapHandle);
433 SkPaint* paint = reinterpret_cast<SkPaint*>(paintHandle);
Chris Craik0c20c382013-07-02 10:48:54 -0700434 // This object allows the renderer to allocate a global JNI ref to the buffer object.
435 JavaHeapBitmapRef bitmapRef(env, bitmap, buffer);
436
Romain Guydbd77cd2010-07-09 10:36:05 -0700437 renderer->drawBitmap(bitmap, left, top, paint);
Romain Guy85bf02f2010-06-22 13:11:24 -0700438}
439
Romain Guy7d7b5492011-01-24 16:33:45 -0800440static void android_view_GLES20Canvas_drawBitmapRect(JNIEnv* env, jobject clazz,
Ashok Bhata0398432014-01-20 20:08:01 +0000441 jlong rendererHandle, jlong bitmapHandle, jbyteArray buffer,
442 jfloat srcLeft, jfloat srcTop, jfloat srcRight, jfloat srcBottom,
443 jfloat dstLeft, jfloat dstTop, jfloat dstRight, jfloat dstBottom, jlong paintHandle) {
444 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererHandle);
445 SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapHandle);
446 SkPaint* paint = reinterpret_cast<SkPaint*>(paintHandle);
Chris Craik0c20c382013-07-02 10:48:54 -0700447 // This object allows the renderer to allocate a global JNI ref to the buffer object.
448 JavaHeapBitmapRef bitmapRef(env, bitmap, buffer);
449
Romain Guydbd77cd2010-07-09 10:36:05 -0700450 renderer->drawBitmap(bitmap, srcLeft, srcTop, srcRight, srcBottom,
451 dstLeft, dstTop, dstRight, dstBottom, paint);
Romain Guyf86ef572010-07-01 11:05:42 -0700452}
Romain Guy8ba548f2010-06-30 19:21:21 -0700453
Romain Guy7d7b5492011-01-24 16:33:45 -0800454static void android_view_GLES20Canvas_drawBitmapMatrix(JNIEnv* env, jobject clazz,
Ashok Bhata0398432014-01-20 20:08:01 +0000455 jlong rendererHandle, jlong bitmapHandle, jbyteArray buffer,
456 jlong matrixHandle, jlong paintHandle) {
457 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererHandle);
458 SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapHandle);
459 SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixHandle);
460 SkPaint* paint = reinterpret_cast<SkPaint*>(paintHandle);
Chris Craik0c20c382013-07-02 10:48:54 -0700461 // This object allows the renderer to allocate a global JNI ref to the buffer object.
462 JavaHeapBitmapRef bitmapRef(env, bitmap, buffer);
463
Romain Guydbd77cd2010-07-09 10:36:05 -0700464 renderer->drawBitmap(bitmap, matrix, paint);
Romain Guyce0537b2010-06-29 21:05:21 -0700465}
466
Romain Guye651cc62012-05-14 19:44:40 -0700467static void android_view_GLES20Canvas_drawBitmapData(JNIEnv* env, jobject clazz,
Ashok Bhata0398432014-01-20 20:08:01 +0000468 jlong rendererHandle, jintArray colors, jint offset, jint stride,
469 jfloat left, jfloat top, jint width, jint height, jboolean hasAlpha, jlong paintHandle) {
470 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererHandle);
471 SkPaint* paint = reinterpret_cast<SkPaint*>(paintHandle);
Romain Guy49c5fc02012-05-15 11:10:01 -0700472 SkBitmap* bitmap = new SkBitmap;
473 bitmap->setConfig(hasAlpha ? SkBitmap::kARGB_8888_Config : SkBitmap::kRGB_565_Config,
474 width, height);
Romain Guye651cc62012-05-14 19:44:40 -0700475
Romain Guy49c5fc02012-05-15 11:10:01 -0700476 if (!bitmap->allocPixels()) {
477 delete bitmap;
Romain Guye651cc62012-05-14 19:44:40 -0700478 return;
479 }
480
Chris Craik1abf5d62013-08-16 12:47:03 -0700481 if (!GraphicsJNI::SetPixels(env, colors, offset, stride, 0, 0, width, height, *bitmap, true)) {
Romain Guy49c5fc02012-05-15 11:10:01 -0700482 delete bitmap;
Romain Guye651cc62012-05-14 19:44:40 -0700483 return;
484 }
485
Romain Guy49c5fc02012-05-15 11:10:01 -0700486 renderer->drawBitmapData(bitmap, left, top, paint);
487
488 // If the renderer is a deferred renderer it will own the bitmap
489 if (!renderer->isDeferred()) {
490 delete bitmap;
491 }
Romain Guye651cc62012-05-14 19:44:40 -0700492}
493
Romain Guy7d7b5492011-01-24 16:33:45 -0800494static void android_view_GLES20Canvas_drawBitmapMesh(JNIEnv* env, jobject clazz,
Ashok Bhata0398432014-01-20 20:08:01 +0000495 jlong rendererHandle, jlong bitmapHandle, jbyteArray buffer,
Chris Craik0c20c382013-07-02 10:48:54 -0700496 jint meshWidth, jint meshHeight, jfloatArray vertices, jint offset, jintArray colors,
Ashok Bhata0398432014-01-20 20:08:01 +0000497 jint colorOffset, jlong paintHandle) {
498 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererHandle);
499 SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapHandle);
500 SkPaint* paint = reinterpret_cast<SkPaint*>(paintHandle);
Chris Craik0c20c382013-07-02 10:48:54 -0700501 // This object allows the renderer to allocate a global JNI ref to the buffer object.
502 JavaHeapBitmapRef bitmapRef(env, bitmap, buffer);
503
Romain Guy5a7b4662011-01-20 19:09:30 -0800504 jfloat* verticesArray = vertices ? env->GetFloatArrayElements(vertices, NULL) + offset : NULL;
505 jint* colorsArray = colors ? env->GetIntArrayElements(colors, NULL) + colorOffset : NULL;
506
507 renderer->drawBitmapMesh(bitmap, meshWidth, meshHeight, verticesArray, colorsArray, paint);
508
509 if (vertices) env->ReleaseFloatArrayElements(vertices, verticesArray, 0);
510 if (colors) env->ReleaseIntArrayElements(colors, colorsArray, 0);
511}
512
Romain Guy7d7b5492011-01-24 16:33:45 -0800513static void android_view_GLES20Canvas_drawPatch(JNIEnv* env, jobject clazz,
Ashok Bhata0398432014-01-20 20:08:01 +0000514 jlong rendererHandle, jlong bitmapHandle, jbyteArray buffer, jlong patchHandle,
515 jfloat left, jfloat top, jfloat right, jfloat bottom, jlong paintHandle) {
516 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererHandle);
517 SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapHandle);
518 Res_png_9patch* patch = reinterpret_cast<Res_png_9patch*>(patchHandle);
519 SkPaint* paint = reinterpret_cast<SkPaint*>(paintHandle);
520
Chris Craik0c20c382013-07-02 10:48:54 -0700521 // This object allows the renderer to allocate a global JNI ref to the buffer object.
522 JavaHeapBitmapRef bitmapRef(env, bitmap, buffer);
523
Romain Guy3b748a42013-04-17 18:54:38 -0700524 renderer->drawPatch(bitmap, patch, left, top, right, bottom, paint);
Romain Guydeba7852010-07-07 17:54:48 -0700525}
526
Romain Guy7d7b5492011-01-24 16:33:45 -0800527static void android_view_GLES20Canvas_drawColor(JNIEnv* env, jobject clazz,
Ashok Bhata0398432014-01-20 20:08:01 +0000528 jlong rendererHandle, jint color, SkXfermode::Mode mode) {
529 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererHandle);
Romain Guyce0537b2010-06-29 21:05:21 -0700530 renderer->drawColor(color, mode);
531}
532
Romain Guy7d7b5492011-01-24 16:33:45 -0800533static void android_view_GLES20Canvas_drawRect(JNIEnv* env, jobject clazz,
Ashok Bhata0398432014-01-20 20:08:01 +0000534 jlong rendererHandle, jfloat left, jfloat top, jfloat right, jfloat bottom,
535 jlong paintHandle) {
536 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererHandle);
537 SkPaint* paint = reinterpret_cast<SkPaint*>(paintHandle);
Romain Guyc7d53492010-06-25 13:41:57 -0700538 renderer->drawRect(left, top, right, bottom, paint);
539}
540
Romain Guy7d7b5492011-01-24 16:33:45 -0800541static void android_view_GLES20Canvas_drawRoundRect(JNIEnv* env, jobject clazz,
Ashok Bhata0398432014-01-20 20:08:01 +0000542 jlong rendererHandle, jfloat left, jfloat top, jfloat right, jfloat bottom,
543 jfloat rx, jfloat ry, jlong paintHandle) {
544 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererHandle);
545 SkPaint* paint = reinterpret_cast<SkPaint*>(paintHandle);
Romain Guy01d58e42011-01-19 21:54:02 -0800546 renderer->drawRoundRect(left, top, right, bottom, rx, ry, paint);
547}
548
Romain Guy7d7b5492011-01-24 16:33:45 -0800549static void android_view_GLES20Canvas_drawCircle(JNIEnv* env, jobject clazz,
Ashok Bhata0398432014-01-20 20:08:01 +0000550 jlong rendererHandle, jfloat x, jfloat y, jfloat radius, jlong paintHandle) {
551 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererHandle);
552 SkPaint* paint = reinterpret_cast<SkPaint*>(paintHandle);
Romain Guy01d58e42011-01-19 21:54:02 -0800553 renderer->drawCircle(x, y, radius, paint);
554}
555
Romain Guy7d7b5492011-01-24 16:33:45 -0800556static void android_view_GLES20Canvas_drawOval(JNIEnv* env, jobject clazz,
Ashok Bhata0398432014-01-20 20:08:01 +0000557 jlong rendererHandle, jfloat left, jfloat top, jfloat right, jfloat bottom,
558 jlong paintHandle) {
559 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererHandle);
560 SkPaint* paint = reinterpret_cast<SkPaint*>(paintHandle);
Romain Guyc1cd9ba32011-01-23 14:18:41 -0800561 renderer->drawOval(left, top, right, bottom, paint);
562}
563
Romain Guy7d7b5492011-01-24 16:33:45 -0800564static void android_view_GLES20Canvas_drawArc(JNIEnv* env, jobject clazz,
Ashok Bhata0398432014-01-20 20:08:01 +0000565 jlong rendererHandle, jfloat left, jfloat top, jfloat right, jfloat bottom,
566 jfloat startAngle, jfloat sweepAngle, jboolean useCenter, jlong paintHandle) {
567 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererHandle);
568 SkPaint* paint = reinterpret_cast<SkPaint*>(paintHandle);
Romain Guy8b2f5262011-01-23 16:15:02 -0800569 renderer->drawArc(left, top, right, bottom, startAngle, sweepAngle, useCenter, paint);
570}
571
Romain Guy672433d2013-01-04 19:05:13 -0800572static void android_view_GLES20Canvas_drawRegionAsRects(JNIEnv* env, jobject clazz,
Ashok Bhata0398432014-01-20 20:08:01 +0000573 jlong rendererHandle, jlong regionHandle, jlong paintHandle) {
574 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererHandle);
575 SkRegion* region = reinterpret_cast<SkRegion*>(regionHandle);
576 SkPaint* paint = reinterpret_cast<SkPaint*>(paintHandle);
577
Romain Guy672433d2013-01-04 19:05:13 -0800578 if (paint->getStyle() != SkPaint::kFill_Style ||
579 (paint->isAntiAlias() && !renderer->isCurrentTransformSimple())) {
580 SkRegion::Iterator it(*region);
581 while (!it.done()) {
582 const SkIRect& r = it.rect();
583 renderer->drawRect(r.fLeft, r.fTop, r.fRight, r.fBottom, paint);
584 it.next();
585 }
586 } else {
587 int count = 0;
588 Vector<float> rects;
589 SkRegion::Iterator it(*region);
590 while (!it.done()) {
591 const SkIRect& r = it.rect();
592 rects.push(r.fLeft);
593 rects.push(r.fTop);
594 rects.push(r.fRight);
595 rects.push(r.fBottom);
Chris Craik2af46352012-11-26 18:30:17 -0800596 count += 4;
Romain Guy672433d2013-01-04 19:05:13 -0800597 it.next();
598 }
599 renderer->drawRects(rects.array(), count, paint);
Romain Guya48a1a82010-08-10 14:59:15 -0700600 }
601}
602
Romain Guy672433d2013-01-04 19:05:13 -0800603static void android_view_GLES20Canvas_drawRects(JNIEnv* env, jobject clazz,
Ashok Bhata0398432014-01-20 20:08:01 +0000604 jlong rendererHandle, jfloatArray rects, jint count, jlong paintHandle) {
605 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererHandle);
606 SkPaint* paint = reinterpret_cast<SkPaint*>(paintHandle);
Romain Guy672433d2013-01-04 19:05:13 -0800607 jfloat* storage = env->GetFloatArrayElements(rects, NULL);
608 renderer->drawRects(storage, count, paint);
609 env->ReleaseFloatArrayElements(rects, storage, 0);
610}
611
Romain Guyed6fcb02011-03-21 13:11:28 -0700612static void android_view_GLES20Canvas_drawPoints(JNIEnv* env, jobject clazz,
Ashok Bhata0398432014-01-20 20:08:01 +0000613 jlong rendererHandle, jfloatArray points, jint offset, jint count, jlong paintHandle) {
614 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererHandle);
615 SkPaint* paint = reinterpret_cast<SkPaint*>(paintHandle);
Romain Guyed6fcb02011-03-21 13:11:28 -0700616 jfloat* storage = env->GetFloatArrayElements(points, NULL);
617 renderer->drawPoints(storage + offset, count, paint);
618 env->ReleaseFloatArrayElements(points, storage, 0);
619}
620
Romain Guy7d7b5492011-01-24 16:33:45 -0800621static void android_view_GLES20Canvas_drawPath(JNIEnv* env, jobject clazz,
Ashok Bhata0398432014-01-20 20:08:01 +0000622 jlong rendererHandle, jlong pathHandle, jlong paintHandle) {
623 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererHandle);
624 SkPath* path = reinterpret_cast<SkPath*>(pathHandle);
625 SkPaint* paint = reinterpret_cast<SkPaint*>(paintHandle);
Romain Guy7fbcc042010-08-04 15:40:07 -0700626 renderer->drawPath(path, paint);
627}
628
Romain Guy7d7b5492011-01-24 16:33:45 -0800629static void android_view_GLES20Canvas_drawLines(JNIEnv* env, jobject clazz,
Ashok Bhata0398432014-01-20 20:08:01 +0000630 jlong rendererHandle, jfloatArray points, jint offset, jint count, jlong paintHandle) {
631 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererHandle);
632 SkPaint* paint = reinterpret_cast<SkPaint*>(paintHandle);
Romain Guy759ea802010-09-16 20:49:46 -0700633 jfloat* storage = env->GetFloatArrayElements(points, NULL);
Romain Guy759ea802010-09-16 20:49:46 -0700634 renderer->drawLines(storage + offset, count, paint);
Romain Guy759ea802010-09-16 20:49:46 -0700635 env->ReleaseFloatArrayElements(points, storage, 0);
636}
637
Romain Guy85bf02f2010-06-22 13:11:24 -0700638// ----------------------------------------------------------------------------
Romain Guydb1938e2010-08-02 18:50:22 -0700639// Shaders and color filters
Romain Guyd27977d2010-07-14 19:18:51 -0700640// ----------------------------------------------------------------------------
641
Romain Guy7d7b5492011-01-24 16:33:45 -0800642static void android_view_GLES20Canvas_resetModifiers(JNIEnv* env, jobject clazz,
Ashok Bhata0398432014-01-20 20:08:01 +0000643 jlong rendererHandle, jint modifiers) {
644 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererHandle);
Romain Guya168d732011-03-18 16:50:13 -0700645 if (modifiers & MODIFIER_SHADOW) renderer->resetShadow();
646 if (modifiers & MODIFIER_SHADER) renderer->resetShader();
647 if (modifiers & MODIFIER_COLOR_FILTER) renderer->resetColorFilter();
Romain Guyd27977d2010-07-14 19:18:51 -0700648}
649
Romain Guy7d7b5492011-01-24 16:33:45 -0800650static void android_view_GLES20Canvas_setupShader(JNIEnv* env, jobject clazz,
Ashok Bhata0398432014-01-20 20:08:01 +0000651 jlong rendererHandle, jlong shaderHandle) {
652 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererHandle);
653 SkiaShader* shader = reinterpret_cast<SkiaShader*>(shaderHandle);
Romain Guy06f96e22010-07-30 19:18:16 -0700654 renderer->setupShader(shader);
Romain Guy7fac2e12010-07-16 17:10:13 -0700655}
656
Romain Guy7d7b5492011-01-24 16:33:45 -0800657static void android_view_GLES20Canvas_setupColorFilter(JNIEnv* env, jobject clazz,
Ashok Bhata0398432014-01-20 20:08:01 +0000658 jlong rendererHandle, jlong filterHandle) {
659 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererHandle);
660 SkiaColorFilter* filter = reinterpret_cast<SkiaColorFilter*>(filterHandle);
Romain Guydb1938e2010-08-02 18:50:22 -0700661 renderer->setupColorFilter(filter);
662}
663
Romain Guy7d7b5492011-01-24 16:33:45 -0800664static void android_view_GLES20Canvas_setupShadow(JNIEnv* env, jobject clazz,
Ashok Bhata0398432014-01-20 20:08:01 +0000665 jlong rendererHandle, jfloat radius, jfloat dx, jfloat dy, jint color) {
666 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererHandle);
Romain Guy1e45aae2010-08-13 19:39:53 -0700667 renderer->setupShadow(radius, dx, dy, color);
668}
669
Romain Guyd27977d2010-07-14 19:18:51 -0700670// ----------------------------------------------------------------------------
Romain Guy5ff9df62012-01-23 17:09:05 -0800671// Draw filters
672// ----------------------------------------------------------------------------
673
674static void android_view_GLES20Canvas_setupPaintFilter(JNIEnv* env, jobject clazz,
Ashok Bhata0398432014-01-20 20:08:01 +0000675 jlong rendererHandle, jint clearBits, jint setBits) {
676 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererHandle);
Romain Guy5ff9df62012-01-23 17:09:05 -0800677 renderer->setupPaintFilter(clearBits, setBits);
678}
679
680static void android_view_GLES20Canvas_resetPaintFilter(JNIEnv* env, jobject clazz,
Ashok Bhata0398432014-01-20 20:08:01 +0000681 jlong rendererHandle) {
682 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererHandle);
Romain Guy5ff9df62012-01-23 17:09:05 -0800683 renderer->resetPaintFilter();
684}
685
686// ----------------------------------------------------------------------------
Romain Guya1db5742010-07-20 13:09:13 -0700687// Text
688// ----------------------------------------------------------------------------
689
Chris Craik41541822013-05-03 16:35:54 -0700690static float xOffsetForTextAlign(SkPaint* paint, float totalAdvance) {
691 switch (paint->getTextAlign()) {
692 case SkPaint::kCenter_Align:
693 return -totalAdvance / 2.0f;
694 break;
695 case SkPaint::kRight_Align:
696 return -totalAdvance;
697 break;
698 default:
699 break;
700 }
701 return 0;
702}
703
Romain Guye8e62a42010-07-23 18:55:21 -0700704static void renderText(OpenGLRenderer* renderer, const jchar* text, int count,
Fabrice Di Meglioda12f382013-03-15 11:26:56 -0700705 jfloat x, jfloat y, int flags, SkPaint* paint) {
Fabrice Di Meglioa731b082012-01-23 18:18:45 -0800706 sp<TextLayoutValue> value = TextLayoutEngine::getInstance().getValue(paint,
Fabrice Di Meglioda12f382013-03-15 11:26:56 -0700707 text, 0, count, count, flags);
Fabrice Di Meglio2ea758802011-05-12 17:42:06 -0700708 if (value == NULL) {
Fabrice Di Megliob02d0ca2011-12-08 14:05:44 -0800709 return;
Fabrice Di Meglio2ea758802011-05-12 17:42:06 -0700710 }
Fabrice Di Meglio5c863f72011-10-05 18:11:59 -0700711 const jchar* glyphs = value->getGlyphs();
712 size_t glyphsCount = value->getGlyphsCount();
Raph Levien996e57c2012-07-23 15:22:52 -0700713 jfloat totalAdvance = value->getTotalAdvance();
Romain Guyb15b4462013-08-12 13:25:29 -0700714 x += xOffsetForTextAlign(paint, totalAdvance);
Raph Levien996e57c2012-07-23 15:22:52 -0700715 const float* positions = value->getPos();
Fabrice Di Meglio79df5322011-09-19 15:17:56 -0700716 int bytesCount = glyphsCount * sizeof(jchar);
Chris Craik41541822013-05-03 16:35:54 -0700717 const SkRect& r = value->getBounds();
718 android::uirenderer::Rect bounds(r.fLeft, r.fTop, r.fRight, r.fBottom);
Chris Craikf09b7462013-06-17 15:17:11 -0700719 bounds.translate(x, y);
Chris Craik41541822013-05-03 16:35:54 -0700720
721 renderer->drawText((const char*) glyphs, bytesCount, glyphsCount,
Romain Guyb15b4462013-08-12 13:25:29 -0700722 x, y, positions, paint, totalAdvance, bounds);
Romain Guye8e62a42010-07-23 18:55:21 -0700723}
724
Romain Guy325740f2012-02-24 16:48:34 -0800725static void renderTextOnPath(OpenGLRenderer* renderer, const jchar* text, int count,
Fabrice Di Meglioda12f382013-03-15 11:26:56 -0700726 SkPath* path, jfloat hOffset, jfloat vOffset, int flags, SkPaint* paint) {
Romain Guy325740f2012-02-24 16:48:34 -0800727 sp<TextLayoutValue> value = TextLayoutEngine::getInstance().getValue(paint,
Fabrice Di Meglioda12f382013-03-15 11:26:56 -0700728 text, 0, count, count, flags);
Romain Guy325740f2012-02-24 16:48:34 -0800729 if (value == NULL) {
730 return;
731 }
732 const jchar* glyphs = value->getGlyphs();
733 size_t glyphsCount = value->getGlyphsCount();
734 int bytesCount = glyphsCount * sizeof(jchar);
735 renderer->drawTextOnPath((const char*) glyphs, bytesCount, glyphsCount, path,
736 hOffset, vOffset, paint);
737}
738
Romain Guy61c8c9c2010-08-09 20:48:09 -0700739static void renderTextRun(OpenGLRenderer* renderer, const jchar* text,
740 jint start, jint count, jint contextCount, jfloat x, jfloat y,
Fabrice Di Meglioda12f382013-03-15 11:26:56 -0700741 int flags, SkPaint* paint) {
Fabrice Di Meglioa731b082012-01-23 18:18:45 -0800742 sp<TextLayoutValue> value = TextLayoutEngine::getInstance().getValue(paint,
Fabrice Di Meglioda12f382013-03-15 11:26:56 -0700743 text, start, count, contextCount, flags);
Fabrice Di Meglio2ea758802011-05-12 17:42:06 -0700744 if (value == NULL) {
Fabrice Di Megliob02d0ca2011-12-08 14:05:44 -0800745 return;
Fabrice Di Meglio2ea758802011-05-12 17:42:06 -0700746 }
Fabrice Di Meglio5c863f72011-10-05 18:11:59 -0700747 const jchar* glyphs = value->getGlyphs();
748 size_t glyphsCount = value->getGlyphsCount();
Raph Levien996e57c2012-07-23 15:22:52 -0700749 jfloat totalAdvance = value->getTotalAdvance();
Romain Guyb15b4462013-08-12 13:25:29 -0700750 x += xOffsetForTextAlign(paint, totalAdvance);
Raph Levien996e57c2012-07-23 15:22:52 -0700751 const float* positions = value->getPos();
Fabrice Di Meglio79df5322011-09-19 15:17:56 -0700752 int bytesCount = glyphsCount * sizeof(jchar);
Chris Craik41541822013-05-03 16:35:54 -0700753 const SkRect& r = value->getBounds();
754 android::uirenderer::Rect bounds(r.fLeft, r.fTop, r.fRight, r.fBottom);
Chris Craikf09b7462013-06-17 15:17:11 -0700755 bounds.translate(x, y);
Chris Craik41541822013-05-03 16:35:54 -0700756
757 renderer->drawText((const char*) glyphs, bytesCount, glyphsCount,
Romain Guyb15b4462013-08-12 13:25:29 -0700758 x, y, positions, paint, totalAdvance, bounds);
Romain Guy61c8c9c2010-08-09 20:48:09 -0700759}
760
Romain Guy7d7b5492011-01-24 16:33:45 -0800761static void android_view_GLES20Canvas_drawTextArray(JNIEnv* env, jobject clazz,
Ashok Bhata0398432014-01-20 20:08:01 +0000762 jlong rendererHandle, jcharArray text, jint index, jint count,
763 jfloat x, jfloat y, jint flags, jlong paintHandle) {
764 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererHandle);
765 SkPaint* paint = reinterpret_cast<SkPaint*>(paintHandle);
Romain Guya1db5742010-07-20 13:09:13 -0700766 jchar* textArray = env->GetCharArrayElements(text, NULL);
Fabrice Di Meglioda12f382013-03-15 11:26:56 -0700767 renderText(renderer, textArray + index, count, x, y, flags, paint);
Romain Guya1db5742010-07-20 13:09:13 -0700768 env->ReleaseCharArrayElements(text, textArray, JNI_ABORT);
769}
770
Romain Guy7d7b5492011-01-24 16:33:45 -0800771static void android_view_GLES20Canvas_drawText(JNIEnv* env, jobject clazz,
Ashok Bhata0398432014-01-20 20:08:01 +0000772 jlong rendererHandle, jstring text, jint start, jint end,
773 jfloat x, jfloat y, jint flags, jlong paintHandle) {
774 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererHandle);
775 SkPaint* paint = reinterpret_cast<SkPaint*>(paintHandle);
Romain Guya1db5742010-07-20 13:09:13 -0700776 const jchar* textArray = env->GetStringChars(text, NULL);
Fabrice Di Meglioda12f382013-03-15 11:26:56 -0700777 renderText(renderer, textArray + start, end - start, x, y, flags, paint);
Romain Guya1db5742010-07-20 13:09:13 -0700778 env->ReleaseStringChars(text, textArray);
779}
780
Romain Guy325740f2012-02-24 16:48:34 -0800781static void android_view_GLES20Canvas_drawTextArrayOnPath(JNIEnv* env, jobject clazz,
Ashok Bhata0398432014-01-20 20:08:01 +0000782 jlong rendererHandle, jcharArray text, jint index, jint count,
783 jlong pathHandle, jfloat hOffset, jfloat vOffset, jint flags, jlong paintHandle) {
784 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererHandle);
785 SkPath* path = reinterpret_cast<SkPath*>(pathHandle);
786 SkPaint* paint = reinterpret_cast<SkPaint*>(paintHandle);
Romain Guy325740f2012-02-24 16:48:34 -0800787 jchar* textArray = env->GetCharArrayElements(text, NULL);
788 renderTextOnPath(renderer, textArray + index, count, path,
Fabrice Di Meglioda12f382013-03-15 11:26:56 -0700789 hOffset, vOffset, flags, paint);
Romain Guy325740f2012-02-24 16:48:34 -0800790 env->ReleaseCharArrayElements(text, textArray, JNI_ABORT);
791}
792
793static void android_view_GLES20Canvas_drawTextOnPath(JNIEnv* env, jobject clazz,
Ashok Bhata0398432014-01-20 20:08:01 +0000794 jlong rendererHandle, jstring text, jint start, jint end,
795 jlong pathHandle, jfloat hOffset, jfloat vOffset, jint flags, jlong paintHandle) {
796 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererHandle);
797 SkPath* path = reinterpret_cast<SkPath*>(pathHandle);
798 SkPaint* paint = reinterpret_cast<SkPaint*>(paintHandle);
Romain Guy325740f2012-02-24 16:48:34 -0800799 const jchar* textArray = env->GetStringChars(text, NULL);
800 renderTextOnPath(renderer, textArray + start, end - start, path,
Fabrice Di Meglioda12f382013-03-15 11:26:56 -0700801 hOffset, vOffset, flags, paint);
Romain Guy325740f2012-02-24 16:48:34 -0800802 env->ReleaseStringChars(text, textArray);
803}
804
Romain Guy7d7b5492011-01-24 16:33:45 -0800805static void android_view_GLES20Canvas_drawTextRunArray(JNIEnv* env, jobject clazz,
Ashok Bhata0398432014-01-20 20:08:01 +0000806 jlong rendererHandle, jcharArray text, jint index, jint count,
Fabrice Di Meglioda12f382013-03-15 11:26:56 -0700807 jint contextIndex, jint contextCount, jfloat x, jfloat y, jint dirFlags,
Ashok Bhata0398432014-01-20 20:08:01 +0000808 jlong paintHandle) {
809 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererHandle);
810 SkPaint* paint = reinterpret_cast<SkPaint*>(paintHandle);
Romain Guy61c8c9c2010-08-09 20:48:09 -0700811 jchar* textArray = env->GetCharArrayElements(text, NULL);
812 renderTextRun(renderer, textArray + contextIndex, index - contextIndex,
Fabrice Di Meglioda12f382013-03-15 11:26:56 -0700813 count, contextCount, x, y, dirFlags, paint);
Romain Guy61c8c9c2010-08-09 20:48:09 -0700814 env->ReleaseCharArrayElements(text, textArray, JNI_ABORT);
815 }
816
Romain Guy7d7b5492011-01-24 16:33:45 -0800817static void android_view_GLES20Canvas_drawTextRun(JNIEnv* env, jobject clazz,
Ashok Bhata0398432014-01-20 20:08:01 +0000818 jlong rendererHandle, jstring text, jint start, jint end,
819 jint contextStart, jint contextEnd, jfloat x, jfloat y, jint dirFlags,
820 jlong paintHandle) {
821 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererHandle);
822 SkPaint* paint = reinterpret_cast<SkPaint*>(paintHandle);
Romain Guy61c8c9c2010-08-09 20:48:09 -0700823 const jchar* textArray = env->GetStringChars(text, NULL);
824 jint count = end - start;
825 jint contextCount = contextEnd - contextStart;
826 renderTextRun(renderer, textArray + contextStart, start - contextStart,
Fabrice Di Meglioda12f382013-03-15 11:26:56 -0700827 count, contextCount, x, y, dirFlags, paint);
Romain Guy61c8c9c2010-08-09 20:48:09 -0700828 env->ReleaseStringChars(text, textArray);
829}
830
Romain Guyeb9a5362012-01-17 17:39:26 -0800831static void renderPosText(OpenGLRenderer* renderer, const jchar* text, int count,
Fabrice Di Meglioda12f382013-03-15 11:26:56 -0700832 const jfloat* positions, jint dirFlags, SkPaint* paint) {
Fabrice Di Meglioa731b082012-01-23 18:18:45 -0800833 sp<TextLayoutValue> value = TextLayoutEngine::getInstance().getValue(paint,
Fabrice Di Meglioda12f382013-03-15 11:26:56 -0700834 text, 0, count, count, dirFlags);
Romain Guyeb9a5362012-01-17 17:39:26 -0800835 if (value == NULL) {
Romain Guyeb9a5362012-01-17 17:39:26 -0800836 return;
837 }
Romain Guyeb9a5362012-01-17 17:39:26 -0800838 const jchar* glyphs = value->getGlyphs();
839 size_t glyphsCount = value->getGlyphsCount();
Romain Guy671d6cf2012-01-18 12:39:17 -0800840 if (count < int(glyphsCount)) glyphsCount = count;
Romain Guyeb9a5362012-01-17 17:39:26 -0800841 int bytesCount = glyphsCount * sizeof(jchar);
842
Romain Guy671d6cf2012-01-18 12:39:17 -0800843 renderer->drawPosText((const char*) glyphs, bytesCount, glyphsCount, positions, paint);
Romain Guyeb9a5362012-01-17 17:39:26 -0800844}
845
846static void android_view_GLES20Canvas_drawPosTextArray(JNIEnv* env, jobject clazz,
Ashok Bhata0398432014-01-20 20:08:01 +0000847 jlong rendererHandle, jcharArray text, jint index, jint count,
848 jfloatArray pos, jlong paintHandle) {
849 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererHandle);
850 SkPaint* paint = reinterpret_cast<SkPaint*>(paintHandle);
Romain Guyeb9a5362012-01-17 17:39:26 -0800851 jchar* textArray = env->GetCharArrayElements(text, NULL);
852 jfloat* positions = env->GetFloatArrayElements(pos, NULL);
853
Fabrice Di Meglioda12f382013-03-15 11:26:56 -0700854 renderPosText(renderer, textArray + index, count, positions, kBidi_LTR, paint);
Romain Guyeb9a5362012-01-17 17:39:26 -0800855
856 env->ReleaseFloatArrayElements(pos, positions, JNI_ABORT);
857 env->ReleaseCharArrayElements(text, textArray, JNI_ABORT);
858}
859
860static void android_view_GLES20Canvas_drawPosText(JNIEnv* env, jobject clazz,
Ashok Bhata0398432014-01-20 20:08:01 +0000861 jlong rendererHandle, jstring text, jint start, jint end,
862 jfloatArray pos, jlong paintHandle) {
863 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererHandle);
864 SkPaint* paint = reinterpret_cast<SkPaint*>(paintHandle);
Romain Guyeb9a5362012-01-17 17:39:26 -0800865 const jchar* textArray = env->GetStringChars(text, NULL);
866 jfloat* positions = env->GetFloatArrayElements(pos, NULL);
867
Fabrice Di Meglioda12f382013-03-15 11:26:56 -0700868 renderPosText(renderer, textArray + start, end - start, positions, kBidi_LTR, paint);
Romain Guyeb9a5362012-01-17 17:39:26 -0800869
870 env->ReleaseFloatArrayElements(pos, positions, JNI_ABORT);
871 env->ReleaseStringChars(text, textArray);
872}
873
Romain Guyb051e892010-09-28 19:09:36 -0700874// ----------------------------------------------------------------------------
875// Display lists
876// ----------------------------------------------------------------------------
877
Ashok Bhata0398432014-01-20 20:08:01 +0000878static jlong android_view_GLES20Canvas_getDisplayList(JNIEnv* env,
879 jobject clazz, jlong rendererHandle, jlong displayListHandle) {
880 DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererHandle);
881 DisplayList* displayList = reinterpret_cast<DisplayList*>(displayListHandle);
882 DisplayList* list = renderer->getDisplayList(displayList);
883 return reinterpret_cast<jlong>(list);
Romain Guyb051e892010-09-28 19:09:36 -0700884}
885
Ashok Bhata0398432014-01-20 20:08:01 +0000886static jlong android_view_GLES20Canvas_createDisplayListRenderer(JNIEnv* env,
Jeff Brown162a0212011-07-21 17:02:54 -0700887 jobject clazz) {
Ashok Bhata0398432014-01-20 20:08:01 +0000888 OpenGLRenderer* renderer = new DisplayListRenderer;
889 return reinterpret_cast<jlong>(renderer);
Jeff Brown162a0212011-07-21 17:02:54 -0700890}
891
892static void android_view_GLES20Canvas_resetDisplayListRenderer(JNIEnv* env,
Ashok Bhata0398432014-01-20 20:08:01 +0000893 jobject clazz, jlong rendererHandle) {
894 DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererHandle);
Jeff Brown162a0212011-07-21 17:02:54 -0700895 renderer->reset();
Chet Haase5977baa2011-01-05 18:01:22 -0800896}
897
Romain Guy65549432012-03-26 16:45:05 -0700898static jint android_view_GLES20Canvas_drawDisplayList(JNIEnv* env,
Ashok Bhata0398432014-01-20 20:08:01 +0000899 jobject clazz, jlong rendererHandle, jlong displayListHandle,
Chet Haase1271e2c2012-04-20 09:54:27 -0700900 jobject dirty, jint flags) {
Ashok Bhata0398432014-01-20 20:08:01 +0000901 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererHandle);
902 DisplayList* displayList = reinterpret_cast<DisplayList*>(displayListHandle);
Romain Guycabfcc12011-03-07 18:06:46 -0800903 android::uirenderer::Rect bounds;
Chet Haase1271e2c2012-04-20 09:54:27 -0700904 status_t status = renderer->drawDisplayList(displayList, bounds, flags);
Romain Guy65549432012-03-26 16:45:05 -0700905 if (status != DrawGlInfo::kStatusDone && dirty != NULL) {
Romain Guycabfcc12011-03-07 18:06:46 -0800906 env->CallVoidMethod(dirty, gRectClassInfo.set,
907 int(bounds.left), int(bounds.top), int(bounds.right), int(bounds.bottom));
908 }
Romain Guy65549432012-03-26 16:45:05 -0700909 return status;
Romain Guyb051e892010-09-28 19:09:36 -0700910}
911
Chet Haaseed30fd82011-04-22 16:18:45 -0700912static void android_view_GLES20Canvas_outputDisplayList(JNIEnv* env,
Ashok Bhata0398432014-01-20 20:08:01 +0000913 jobject clazz, jlong rendererHandle, jlong displayListHandle) {
914 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererHandle);
915 DisplayList* displayList = reinterpret_cast<DisplayList*>(displayListHandle);
Chet Haaseed30fd82011-04-22 16:18:45 -0700916 renderer->outputDisplayList(displayList);
917}
918
Romain Guy6c319ca2011-01-11 14:29:25 -0800919// ----------------------------------------------------------------------------
920// Layers
921// ----------------------------------------------------------------------------
922
Romain Guyc89b14b2012-08-08 14:53:48 -0700923static void android_view_GLES20Canvas_interrupt(JNIEnv* env, jobject clazz,
Ashok Bhata0398432014-01-20 20:08:01 +0000924 jlong rendererHandle) {
925 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererHandle);
Romain Guyc89b14b2012-08-08 14:53:48 -0700926 renderer->interrupt();
927}
928
929static void android_view_GLES20Canvas_resume(JNIEnv* env, jobject clazz,
Ashok Bhata0398432014-01-20 20:08:01 +0000930 jlong rendererHandle) {
931 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererHandle);
Romain Guyc89b14b2012-08-08 14:53:48 -0700932 renderer->resume();
933}
934
Ashok Bhata0398432014-01-20 20:08:01 +0000935static jlong android_view_GLES20Canvas_createLayerRenderer(JNIEnv* env,
936 jobject clazz, jlong layerHandle) {
937 Layer* layer = reinterpret_cast<Layer*>(layerHandle);
Romain Guyada830f2011-01-13 12:13:20 -0800938 if (layer) {
Romain Guy87e2f7572012-09-24 11:37:12 -0700939 OpenGLRenderer* renderer = new LayerRenderer(layer);
940 renderer->initProperties();
Ashok Bhata0398432014-01-20 20:08:01 +0000941 return reinterpret_cast<jlong>(renderer);
Romain Guyada830f2011-01-13 12:13:20 -0800942 }
943 return NULL;
Romain Guy6c319ca2011-01-11 14:29:25 -0800944}
945
Ashok Bhata0398432014-01-20 20:08:01 +0000946static jlong android_view_GLES20Canvas_createTextureLayer(JNIEnv* env, jobject clazz,
Romain Guya9489272011-06-22 20:58:11 -0700947 jboolean isOpaque, jintArray layerInfo) {
948 Layer* layer = LayerRenderer::createTextureLayer(isOpaque);
Romain Guyaa6c24c2011-04-28 18:40:04 -0700949
950 if (layer) {
951 jint* storage = env->GetIntArrayElements(layerInfo, NULL);
Romain Guy9ace8f52011-07-07 20:50:11 -0700952 storage[0] = layer->getTexture();
Romain Guyaa6c24c2011-04-28 18:40:04 -0700953 env->ReleaseIntArrayElements(layerInfo, storage, 0);
954 }
955
Ashok Bhata0398432014-01-20 20:08:01 +0000956 return reinterpret_cast<jlong>(layer);
Romain Guyaa6c24c2011-04-28 18:40:04 -0700957}
958
Ashok Bhata0398432014-01-20 20:08:01 +0000959static jlong android_view_GLES20Canvas_createLayer(JNIEnv* env, jobject clazz,
Romain Guyada830f2011-01-13 12:13:20 -0800960 jint width, jint height, jboolean isOpaque, jintArray layerInfo) {
961 Layer* layer = LayerRenderer::createLayer(width, height, isOpaque);
Romain Guy6c319ca2011-01-11 14:29:25 -0800962
Romain Guyada830f2011-01-13 12:13:20 -0800963 if (layer) {
Romain Guy6c319ca2011-01-11 14:29:25 -0800964 jint* storage = env->GetIntArrayElements(layerInfo, NULL);
Romain Guy9ace8f52011-07-07 20:50:11 -0700965 storage[0] = layer->getWidth();
966 storage[1] = layer->getHeight();
Romain Guy6c319ca2011-01-11 14:29:25 -0800967 env->ReleaseIntArrayElements(layerInfo, storage, 0);
968 }
969
Ashok Bhata0398432014-01-20 20:08:01 +0000970 return reinterpret_cast<jlong>(layer);
Romain Guy6c319ca2011-01-11 14:29:25 -0800971}
972
Ashok Bhata0398432014-01-20 20:08:01 +0000973static jboolean android_view_GLES20Canvas_resizeLayer(JNIEnv* env, jobject clazz,
974 jlong layerHandle, jint width, jint height, jintArray layerInfo) {
975 Layer* layer = reinterpret_cast<Layer*>(layerHandle);
Chet Haase603f6de2012-09-14 15:31:25 -0700976 if (LayerRenderer::resizeLayer(layer, width, height)) {
977 jint* storage = env->GetIntArrayElements(layerInfo, NULL);
978 storage[0] = layer->getWidth();
979 storage[1] = layer->getHeight();
980 env->ReleaseIntArrayElements(layerInfo, storage, 0);
Ashok Bhata0398432014-01-20 20:08:01 +0000981 return JNI_TRUE;
Chet Haase603f6de2012-09-14 15:31:25 -0700982 }
Ashok Bhata0398432014-01-20 20:08:01 +0000983 return JNI_FALSE;
Romain Guy6c319ca2011-01-11 14:29:25 -0800984}
985
Chet Haased15ebf22012-09-05 11:40:29 -0700986static void android_view_GLES20Canvas_setLayerPaint(JNIEnv* env, jobject clazz,
Ashok Bhata0398432014-01-20 20:08:01 +0000987 jlong layerHandle, jlong paintHandle) {
988 Layer* layer = reinterpret_cast<Layer*>(layerHandle);
989 SkPaint* paint = reinterpret_cast<SkPaint*>(paintHandle);
Chet Haased15ebf22012-09-05 11:40:29 -0700990 if (layer) {
991 layer->setPaint(paint);
992 }
993}
994
995static void android_view_GLES20Canvas_setLayerColorFilter(JNIEnv* env, jobject clazz,
Ashok Bhata0398432014-01-20 20:08:01 +0000996 jlong layerHandle, jlong colorFilterHandle) {
997 Layer* layer = reinterpret_cast<Layer*>(layerHandle);
998 SkiaColorFilter* colorFilter = reinterpret_cast<SkiaColorFilter*>(colorFilterHandle);
Chet Haased15ebf22012-09-05 11:40:29 -0700999 if (layer) {
1000 layer->setColorFilter(colorFilter);
1001 }
1002}
1003
Romain Guy846a5332012-07-11 17:44:57 -07001004static void android_view_GLES20Canvas_setOpaqueLayer(JNIEnv* env, jobject clazz,
Ashok Bhata0398432014-01-20 20:08:01 +00001005 jlong layerHandle, jboolean isOpaque) {
1006 Layer* layer = reinterpret_cast<Layer*>(layerHandle);
Romain Guy846a5332012-07-11 17:44:57 -07001007 if (layer) {
1008 layer->setBlend(!isOpaque);
1009 }
1010}
1011
Romain Guyaa6c24c2011-04-28 18:40:04 -07001012static void android_view_GLES20Canvas_updateTextureLayer(JNIEnv* env, jobject clazz,
Ashok Bhata0398432014-01-20 20:08:01 +00001013 jlong layerHandle, jint width, jint height, jboolean isOpaque, jobject surface) {
1014 Layer* layer = reinterpret_cast<Layer*>(layerHandle);
Romain Guy8f0095c2011-05-02 17:24:22 -07001015 float transform[16];
Andy McFaddend47f7d82012-12-18 09:48:38 -08001016 sp<GLConsumer> surfaceTexture(SurfaceTexture_getSurfaceTexture(env, surface));
Romain Guye5e0c502011-06-15 15:18:31 -07001017
Mathias Agopiandf071482012-05-18 16:58:00 -07001018 if (surfaceTexture->updateTexImage() == NO_ERROR) {
Eino-Ville Talvalaa3402c32013-09-19 12:49:13 -07001019 int64_t frameNumber = surfaceTexture->getFrameNumber();
1020 // If the GLConsumer queue is in synchronous mode, need to discard all
1021 // but latest frame, using the frame number to tell when we no longer
1022 // have newer frames to target. Since we can't tell which mode it is in,
1023 // do this unconditionally.
1024 int dropCounter = 0;
1025 while (surfaceTexture->updateTexImage() == NO_ERROR) {
1026 int64_t newFrameNumber = surfaceTexture->getFrameNumber();
1027 if (newFrameNumber == frameNumber) break;
1028 frameNumber = newFrameNumber;
1029 dropCounter++;
1030 }
1031 #if DEBUG_RENDERER
1032 if (dropCounter > 0) {
1033 RENDERER_LOGD("Dropped %d frames on texture layer update", dropCounter);
1034 }
1035 #endif
Mathias Agopiandf071482012-05-18 16:58:00 -07001036 surfaceTexture->getTransformMatrix(transform);
1037 GLenum renderTarget = surfaceTexture->getCurrentTextureTarget();
Romain Guy8f0095c2011-05-02 17:24:22 -07001038
Mathias Agopiandf071482012-05-18 16:58:00 -07001039 LayerRenderer::updateTextureLayer(layer, width, height, isOpaque, renderTarget, transform);
1040 }
Romain Guyaa6c24c2011-04-28 18:40:04 -07001041}
1042
Romain Guy2bf68f02012-03-02 13:37:47 -08001043static void android_view_GLES20Canvas_updateRenderLayer(JNIEnv* env, jobject clazz,
Ashok Bhata0398432014-01-20 20:08:01 +00001044 jlong layerHandle, jlong rendererHandle, jlong displayListHandle,
Romain Guy2bf68f02012-03-02 13:37:47 -08001045 jint left, jint top, jint right, jint bottom) {
Ashok Bhata0398432014-01-20 20:08:01 +00001046 Layer* layer = reinterpret_cast<Layer*>(layerHandle);
1047 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererHandle);
1048 DisplayList* displayList = reinterpret_cast<DisplayList*>(displayListHandle);
Romain Guy2bf68f02012-03-02 13:37:47 -08001049 layer->updateDeferred(renderer, displayList, left, top, right, bottom);
1050}
1051
Romain Guyef09a212012-09-25 12:17:14 -07001052static void android_view_GLES20Canvas_clearLayerTexture(JNIEnv* env, jobject clazz,
Ashok Bhata0398432014-01-20 20:08:01 +00001053 jlong layerHandle) {
1054 Layer* layer = reinterpret_cast<Layer*>(layerHandle);
Romain Guyef09a212012-09-25 12:17:14 -07001055 layer->clearTexture();
1056}
1057
Romain Guy302a9df2011-08-16 13:55:02 -07001058static void android_view_GLES20Canvas_setTextureLayerTransform(JNIEnv* env, jobject clazz,
Ashok Bhata0398432014-01-20 20:08:01 +00001059 jlong layerHandle, jlong matrixHandle) {
1060 Layer* layer = reinterpret_cast<Layer*>(layerHandle);
1061 SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixHandle);
Romain Guy302a9df2011-08-16 13:55:02 -07001062 layer->getTransform().load(*matrix);
1063}
1064
Ashok Bhata0398432014-01-20 20:08:01 +00001065static void android_view_GLES20Canvas_destroyLayer(JNIEnv* env, jobject clazz, jlong layerHandle) {
1066 Layer* layer = reinterpret_cast<Layer*>(layerHandle);
Romain Guyada830f2011-01-13 12:13:20 -08001067 LayerRenderer::destroyLayer(layer);
Romain Guy6c319ca2011-01-11 14:29:25 -08001068}
1069
Romain Guy57066eb2011-01-12 12:53:32 -08001070static void android_view_GLES20Canvas_destroyLayerDeferred(JNIEnv* env,
Ashok Bhata0398432014-01-20 20:08:01 +00001071 jobject clazz, jlong layerHandle) {
1072 Layer* layer = reinterpret_cast<Layer*>(layerHandle);
Romain Guyada830f2011-01-13 12:13:20 -08001073 LayerRenderer::destroyLayerDeferred(layer);
Romain Guy57066eb2011-01-12 12:53:32 -08001074}
1075
Romain Guy7d7b5492011-01-24 16:33:45 -08001076static void android_view_GLES20Canvas_drawLayer(JNIEnv* env, jobject clazz,
Ashok Bhata0398432014-01-20 20:08:01 +00001077 jlong rendererHandle, jlong layerHandle, jfloat x, jfloat y) {
1078 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererHandle);
1079 Layer* layer = reinterpret_cast<Layer*>(layerHandle);
Chris Craika08f95c2013-03-15 17:24:33 -07001080 renderer->drawLayer(layer, x, y);
Romain Guy6c319ca2011-01-11 14:29:25 -08001081}
1082
Romain Guy77a81162011-06-14 16:45:55 -07001083static jboolean android_view_GLES20Canvas_copyLayer(JNIEnv* env, jobject clazz,
Ashok Bhata0398432014-01-20 20:08:01 +00001084 jlong layerHandle, jlong bitmapHandle) {
1085 Layer* layer = reinterpret_cast<Layer*>(layerHandle);
1086 SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapHandle);
Romain Guy77a81162011-06-14 16:45:55 -07001087 return LayerRenderer::copyLayer(layer, bitmap);
1088}
1089
Romain Guy11cb6422012-09-21 00:39:43 -07001090static void android_view_GLES20Canvas_pushLayerUpdate(JNIEnv* env, jobject clazz,
Ashok Bhata0398432014-01-20 20:08:01 +00001091 jlong rendererHandle, jlong layerHandle) {
1092 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererHandle);
1093 Layer* layer = reinterpret_cast<Layer*>(layerHandle);
Romain Guy11cb6422012-09-21 00:39:43 -07001094 renderer->pushLayerUpdate(layer);
1095}
1096
Romain Guye93482f2013-06-17 13:14:51 -07001097static void android_view_GLES20Canvas_cancelLayerUpdate(JNIEnv* env, jobject clazz,
Ashok Bhata0398432014-01-20 20:08:01 +00001098 jlong rendererHandle, jlong layerHandle) {
1099 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererHandle);
1100 Layer* layer = reinterpret_cast<Layer*>(layerHandle);
Romain Guye93482f2013-06-17 13:14:51 -07001101 renderer->cancelLayerUpdate(layer);
1102}
1103
Romain Guy11cb6422012-09-21 00:39:43 -07001104static void android_view_GLES20Canvas_clearLayerUpdates(JNIEnv* env, jobject clazz,
Ashok Bhata0398432014-01-20 20:08:01 +00001105 jlong rendererHandle) {
1106 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererHandle);
Romain Guy11cb6422012-09-21 00:39:43 -07001107 renderer->clearLayerUpdates();
1108}
1109
Romain Guy40543602013-06-12 15:31:28 -07001110static void android_view_GLES20Canvas_flushLayerUpdates(JNIEnv* env, jobject clazz,
Ashok Bhata0398432014-01-20 20:08:01 +00001111 jlong rendererHandle) {
1112 OpenGLRenderer* renderer = reinterpret_cast<OpenGLRenderer*>(rendererHandle);
Romain Guy40543602013-06-12 15:31:28 -07001113 renderer->flushLayerUpdates();
1114}
1115
Romain Guy16393512010-08-08 00:14:31 -07001116#endif // USE_OPENGL_RENDERER
1117
1118// ----------------------------------------------------------------------------
1119// Common
1120// ----------------------------------------------------------------------------
1121
1122static jboolean android_view_GLES20Canvas_isAvailable(JNIEnv* env, jobject clazz) {
1123#ifdef USE_OPENGL_RENDERER
Jesse Hall44063452011-12-01 11:27:45 -08001124 char prop[PROPERTY_VALUE_MAX];
1125 if (property_get("ro.kernel.qemu", prop, NULL) == 0) {
1126 // not in the emulator
1127 return JNI_TRUE;
1128 }
1129 // In the emulator this property will be set to 1 when hardware GLES is
1130 // enabled, 0 otherwise. On old emulator versions it will be undefined.
1131 property_get("ro.kernel.qemu.gles", prop, "0");
1132 return atoi(prop) == 1 ? JNI_TRUE : JNI_FALSE;
Romain Guy16393512010-08-08 00:14:31 -07001133#else
1134 return JNI_FALSE;
1135#endif
1136}
1137
Romain Guya1db5742010-07-20 13:09:13 -07001138// ----------------------------------------------------------------------------
Chet Haase9c1e23b2011-03-24 10:51:31 -07001139// Logging
1140// ----------------------------------------------------------------------------
1141
Chet Haase9c1e23b2011-03-24 10:51:31 -07001142static void
Romain Guy65b345f2011-07-27 18:51:50 -07001143android_app_ActivityThread_dumpGraphics(JNIEnv* env, jobject clazz, jobject javaFileDescriptor) {
Chet Haase905787a2011-04-01 14:33:02 -07001144#ifdef USE_OPENGL_RENDERER
Elliott Hughesa3804cf2011-04-11 16:50:19 -07001145 int fd = jniGetFDFromFileDescriptor(env, javaFileDescriptor);
Chet Haase0865d332011-04-01 14:33:02 -07001146 android::uirenderer::DisplayList::outputLogBuffer(fd);
Chet Haase905787a2011-04-01 14:33:02 -07001147#endif // USE_OPENGL_RENDERER
Chet Haase9c1e23b2011-03-24 10:51:31 -07001148}
1149
1150// ----------------------------------------------------------------------------
Romain Guye4d01122010-06-16 18:44:05 -07001151// JNI Glue
1152// ----------------------------------------------------------------------------
1153
1154const char* const kClassPathName = "android/view/GLES20Canvas";
1155
1156static JNINativeMethod gMethods[] = {
Romain Guy61c8c9c2010-08-09 20:48:09 -07001157 { "nIsAvailable", "()Z", (void*) android_view_GLES20Canvas_isAvailable },
1158
Romain Guy16393512010-08-08 00:14:31 -07001159#ifdef USE_OPENGL_RENDERER
Romain Guyba6be8a2012-04-23 18:22:09 -07001160 { "nFlushCaches", "(I)V", (void*) android_view_GLES20Canvas_flushCaches },
Romain Guy3b748a42013-04-17 18:54:38 -07001161 { "nInitCaches", "()Z", (void*) android_view_GLES20Canvas_initCaches },
Romain Guyba6be8a2012-04-23 18:22:09 -07001162 { "nTerminateCaches", "()V", (void*) android_view_GLES20Canvas_terminateCaches },
Romain Guy7d7b5492011-01-24 16:33:45 -08001163
Ashok Bhat4de3f482014-01-27 16:00:23 +00001164 { "nInitAtlas", "(Landroid/view/GraphicBuffer;[JI)V",
Romain Guy3b748a42013-04-17 18:54:38 -07001165 (void*) android_view_GLES20Canvas_initAtlas },
1166
Ashok Bhata0398432014-01-20 20:08:01 +00001167 { "nCreateRenderer", "()J", (void*) android_view_GLES20Canvas_createRenderer },
1168 { "nDestroyRenderer", "(J)V", (void*) android_view_GLES20Canvas_destroyRenderer },
1169 { "nSetViewport", "(JII)V", (void*) android_view_GLES20Canvas_setViewport },
1170 { "nPrepare", "(JZ)I", (void*) android_view_GLES20Canvas_prepare },
1171 { "nPrepareDirty", "(JIIIIZ)I", (void*) android_view_GLES20Canvas_prepareDirty },
1172 { "nFinish", "(J)V", (void*) android_view_GLES20Canvas_finish },
1173 { "nSetName", "(JLjava/lang/String;)V",
Romain Guyef359272013-01-31 19:07:29 -08001174 (void*) android_view_GLES20Canvas_setName },
Romain Guy16393512010-08-08 00:14:31 -07001175
Ashok Bhata0398432014-01-20 20:08:01 +00001176 { "nSetCountOverdrawEnabled", "(JZ)V", (void*) android_view_GLES20Canvas_setCountOverdrawEnabled },
1177 { "nGetOverdraw", "(J)F", (void*) android_view_GLES20Canvas_getOverdraw },
Romain Guy78dd96d2013-05-03 14:24:16 -07001178
Romain Guy530041d2012-01-25 18:56:29 -08001179 { "nGetStencilSize", "()I", (void*) android_view_GLES20Canvas_getStencilSize },
1180
Ashok Bhata0398432014-01-20 20:08:01 +00001181 { "nCallDrawGLFunction", "(JJ)I", (void*) android_view_GLES20Canvas_callDrawGLFunction },
1182 { "nDetachFunctor", "(JJ)V", (void*) android_view_GLES20Canvas_detachFunctor },
1183 { "nAttachFunctor", "(JJ)V", (void*) android_view_GLES20Canvas_attachFunctor },
1184 { "nInvokeFunctors", "(JLandroid/graphics/Rect;)I",
Romain Guy8f3b8e32012-03-27 16:33:45 -07001185 (void*) android_view_GLES20Canvas_invokeFunctors },
Romain Guy7d7b5492011-01-24 16:33:45 -08001186
Ashok Bhata0398432014-01-20 20:08:01 +00001187 { "nSave", "(JI)I", (void*) android_view_GLES20Canvas_save },
1188 { "nRestore", "(J)V", (void*) android_view_GLES20Canvas_restore },
1189 { "nRestoreToCount", "(JI)V", (void*) android_view_GLES20Canvas_restoreToCount },
1190 { "nGetSaveCount", "(J)I", (void*) android_view_GLES20Canvas_getSaveCount },
Romain Guy85bf02f2010-06-22 13:11:24 -07001191
Ashok Bhata0398432014-01-20 20:08:01 +00001192 { "nSaveLayer", "(JFFFFJI)I", (void*) android_view_GLES20Canvas_saveLayer },
1193 { "nSaveLayer", "(JJI)I", (void*) android_view_GLES20Canvas_saveLayerClip },
1194 { "nSaveLayerAlpha", "(JFFFFII)I", (void*) android_view_GLES20Canvas_saveLayerAlpha },
1195 { "nSaveLayerAlpha", "(JII)I", (void*) android_view_GLES20Canvas_saveLayerAlphaClip },
Romain Guybb9524b2010-06-22 18:56:38 -07001196
Ashok Bhata0398432014-01-20 20:08:01 +00001197 { "nQuickReject", "(JFFFF)Z", (void*) android_view_GLES20Canvas_quickReject },
1198 { "nClipRect", "(JFFFFI)Z", (void*) android_view_GLES20Canvas_clipRectF },
1199 { "nClipRect", "(JIIIII)Z", (void*) android_view_GLES20Canvas_clipRect },
1200 { "nClipPath", "(JJI)Z", (void*) android_view_GLES20Canvas_clipPath },
1201 { "nClipRegion", "(JJI)Z", (void*) android_view_GLES20Canvas_clipRegion },
Romain Guyc7d53492010-06-25 13:41:57 -07001202
Ashok Bhata0398432014-01-20 20:08:01 +00001203 { "nTranslate", "(JFF)V", (void*) android_view_GLES20Canvas_translate },
1204 { "nRotate", "(JF)V", (void*) android_view_GLES20Canvas_rotate },
1205 { "nScale", "(JFF)V", (void*) android_view_GLES20Canvas_scale },
1206 { "nSkew", "(JFF)V", (void*) android_view_GLES20Canvas_skew },
Romain Guyc7d53492010-06-25 13:41:57 -07001207
Ashok Bhata0398432014-01-20 20:08:01 +00001208 { "nSetMatrix", "(JJ)V", (void*) android_view_GLES20Canvas_setMatrix },
1209 { "nGetMatrix", "(JJ)V", (void*) android_view_GLES20Canvas_getMatrix },
1210 { "nConcatMatrix", "(JJ)V", (void*) android_view_GLES20Canvas_concatMatrix },
Romain Guyc7d53492010-06-25 13:41:57 -07001211
Ashok Bhata0398432014-01-20 20:08:01 +00001212 { "nDrawBitmap", "(JJ[BFFJ)V", (void*) android_view_GLES20Canvas_drawBitmap },
1213 { "nDrawBitmap", "(JJ[BFFFFFFFFJ)V",(void*) android_view_GLES20Canvas_drawBitmapRect },
1214 { "nDrawBitmap", "(JJ[BJJ)V", (void*) android_view_GLES20Canvas_drawBitmapMatrix },
1215 { "nDrawBitmap", "(J[IIIFFIIZJ)V", (void*) android_view_GLES20Canvas_drawBitmapData },
Romain Guy5a7b4662011-01-20 19:09:30 -08001216
Ashok Bhata0398432014-01-20 20:08:01 +00001217 { "nDrawBitmapMesh", "(JJ[BII[FI[IIJ)V",(void*) android_view_GLES20Canvas_drawBitmapMesh },
Romain Guy5a7b4662011-01-20 19:09:30 -08001218
Ashok Bhata0398432014-01-20 20:08:01 +00001219 { "nDrawPatch", "(JJ[BJFFFFJ)V", (void*) android_view_GLES20Canvas_drawPatch },
Patrick Dubroye4ac2d62010-12-01 11:23:13 -08001220
Ashok Bhata0398432014-01-20 20:08:01 +00001221 { "nDrawColor", "(JII)V", (void*) android_view_GLES20Canvas_drawColor },
1222 { "nDrawRect", "(JFFFFJ)V", (void*) android_view_GLES20Canvas_drawRect },
1223 { "nDrawRects", "(JJJ)V", (void*) android_view_GLES20Canvas_drawRegionAsRects },
1224 { "nDrawRects", "(J[FIJ)V", (void*) android_view_GLES20Canvas_drawRects },
1225 { "nDrawRoundRect", "(JFFFFFFJ)V", (void*) android_view_GLES20Canvas_drawRoundRect },
1226 { "nDrawCircle", "(JFFFJ)V", (void*) android_view_GLES20Canvas_drawCircle },
1227 { "nDrawOval", "(JFFFFJ)V", (void*) android_view_GLES20Canvas_drawOval },
1228 { "nDrawArc", "(JFFFFFFZJ)V", (void*) android_view_GLES20Canvas_drawArc },
1229 { "nDrawPoints", "(J[FIIJ)V", (void*) android_view_GLES20Canvas_drawPoints },
Romain Guy8b2f5262011-01-23 16:15:02 -08001230
Ashok Bhata0398432014-01-20 20:08:01 +00001231 { "nDrawPath", "(JJJ)V", (void*) android_view_GLES20Canvas_drawPath },
1232 { "nDrawLines", "(J[FIIJ)V", (void*) android_view_GLES20Canvas_drawLines },
Romain Guybd6b79b2010-06-26 00:13:53 -07001233
Ashok Bhata0398432014-01-20 20:08:01 +00001234 { "nResetModifiers", "(JI)V", (void*) android_view_GLES20Canvas_resetModifiers },
1235 { "nSetupShader", "(JJ)V", (void*) android_view_GLES20Canvas_setupShader },
1236 { "nSetupColorFilter", "(JJ)V", (void*) android_view_GLES20Canvas_setupColorFilter },
1237 { "nSetupShadow", "(JFFFI)V", (void*) android_view_GLES20Canvas_setupShadow },
Romain Guybb9524b2010-06-22 18:56:38 -07001238
Ashok Bhata0398432014-01-20 20:08:01 +00001239 { "nSetupPaintFilter", "(JII)V", (void*) android_view_GLES20Canvas_setupPaintFilter },
1240 { "nResetPaintFilter", "(J)V", (void*) android_view_GLES20Canvas_resetPaintFilter },
Romain Guy5ff9df62012-01-23 17:09:05 -08001241
Ashok Bhata0398432014-01-20 20:08:01 +00001242 { "nDrawText", "(J[CIIFFIJ)V", (void*) android_view_GLES20Canvas_drawTextArray },
1243 { "nDrawText", "(JLjava/lang/String;IIFFIJ)V",
Romain Guya1db5742010-07-20 13:09:13 -07001244 (void*) android_view_GLES20Canvas_drawText },
1245
Ashok Bhata0398432014-01-20 20:08:01 +00001246 { "nDrawTextOnPath", "(J[CIIJFFIJ)V", (void*) android_view_GLES20Canvas_drawTextArrayOnPath },
1247 { "nDrawTextOnPath", "(JLjava/lang/String;IIJFFIJ)V",
Romain Guy325740f2012-02-24 16:48:34 -08001248 (void*) android_view_GLES20Canvas_drawTextOnPath },
1249
Ashok Bhata0398432014-01-20 20:08:01 +00001250 { "nDrawTextRun", "(J[CIIIIFFIJ)V", (void*) android_view_GLES20Canvas_drawTextRunArray },
1251 { "nDrawTextRun", "(JLjava/lang/String;IIIIFFIJ)V",
Romain Guy61c8c9c2010-08-09 20:48:09 -07001252 (void*) android_view_GLES20Canvas_drawTextRun },
1253
Ashok Bhata0398432014-01-20 20:08:01 +00001254 { "nDrawPosText", "(J[CII[FJ)V", (void*) android_view_GLES20Canvas_drawPosTextArray },
1255 { "nDrawPosText", "(JLjava/lang/String;II[FJ)V",
Romain Guyeb9a5362012-01-17 17:39:26 -08001256 (void*) android_view_GLES20Canvas_drawPosText },
1257
Ashok Bhata0398432014-01-20 20:08:01 +00001258 { "nGetClipBounds", "(JLandroid/graphics/Rect;)Z",
Romain Guyce0537b2010-06-29 21:05:21 -07001259 (void*) android_view_GLES20Canvas_getClipBounds },
Romain Guyb051e892010-09-28 19:09:36 -07001260
Ashok Bhata0398432014-01-20 20:08:01 +00001261 { "nGetDisplayList", "(JJ)J", (void*) android_view_GLES20Canvas_getDisplayList },
1262 { "nOutputDisplayList", "(JJ)V", (void*) android_view_GLES20Canvas_outputDisplayList },
1263 { "nDrawDisplayList", "(JJLandroid/graphics/Rect;I)I",
Romain Guy8f3b8e32012-03-27 16:33:45 -07001264 (void*) android_view_GLES20Canvas_drawDisplayList },
Romain Guy13631f32012-01-30 17:41:55 -08001265
Ashok Bhata0398432014-01-20 20:08:01 +00001266 { "nCreateDisplayListRenderer", "()J", (void*) android_view_GLES20Canvas_createDisplayListRenderer },
1267 { "nResetDisplayListRenderer", "(J)V", (void*) android_view_GLES20Canvas_resetDisplayListRenderer },
Romain Guy13631f32012-01-30 17:41:55 -08001268
Ashok Bhata0398432014-01-20 20:08:01 +00001269 { "nInterrupt", "(J)V", (void*) android_view_GLES20Canvas_interrupt },
1270 { "nResume", "(J)V", (void*) android_view_GLES20Canvas_resume },
Romain Guy6c319ca2011-01-11 14:29:25 -08001271
Ashok Bhata0398432014-01-20 20:08:01 +00001272 { "nCreateLayerRenderer", "(J)J", (void*) android_view_GLES20Canvas_createLayerRenderer },
1273 { "nCreateLayer", "(IIZ[I)J", (void*) android_view_GLES20Canvas_createLayer },
1274 { "nResizeLayer", "(JII[I)Z" , (void*) android_view_GLES20Canvas_resizeLayer },
1275 { "nSetLayerPaint", "(JJ)V", (void*) android_view_GLES20Canvas_setLayerPaint },
1276 { "nSetLayerColorFilter", "(JJ)V", (void*) android_view_GLES20Canvas_setLayerColorFilter },
1277 { "nSetOpaqueLayer", "(JZ)V", (void*) android_view_GLES20Canvas_setOpaqueLayer },
1278 { "nCreateTextureLayer", "(Z[I)J", (void*) android_view_GLES20Canvas_createTextureLayer },
1279 { "nUpdateTextureLayer", "(JIIZLandroid/graphics/SurfaceTexture;)V",
Romain Guy244ada12012-03-28 16:41:26 -07001280 (void*) android_view_GLES20Canvas_updateTextureLayer },
Ashok Bhata0398432014-01-20 20:08:01 +00001281 { "nUpdateRenderLayer", "(JJJIIII)V", (void*) android_view_GLES20Canvas_updateRenderLayer },
1282 { "nClearLayerTexture", "(J)V", (void*) android_view_GLES20Canvas_clearLayerTexture },
1283 { "nDestroyLayer", "(J)V", (void*) android_view_GLES20Canvas_destroyLayer },
1284 { "nDestroyLayerDeferred", "(J)V", (void*) android_view_GLES20Canvas_destroyLayerDeferred },
1285 { "nDrawLayer", "(JJFF)V", (void*) android_view_GLES20Canvas_drawLayer },
1286 { "nCopyLayer", "(JJ)Z", (void*) android_view_GLES20Canvas_copyLayer },
1287 { "nClearLayerUpdates", "(J)V", (void*) android_view_GLES20Canvas_clearLayerUpdates },
1288 { "nFlushLayerUpdates", "(J)V", (void*) android_view_GLES20Canvas_flushLayerUpdates },
1289 { "nPushLayerUpdate", "(JJ)V", (void*) android_view_GLES20Canvas_pushLayerUpdate },
1290 { "nCancelLayerUpdate", "(JJ)V", (void*) android_view_GLES20Canvas_cancelLayerUpdate },
Romain Guyb051e892010-09-28 19:09:36 -07001291
Ashok Bhata0398432014-01-20 20:08:01 +00001292 { "nSetTextureLayerTransform", "(JJ)V", (void*) android_view_GLES20Canvas_setTextureLayerTransform },
Romain Guy2bf68f02012-03-02 13:37:47 -08001293
Romain Guyf61970fc2011-07-07 14:10:06 -07001294 { "nGetMaximumTextureWidth", "()I", (void*) android_view_GLES20Canvas_getMaxTextureWidth },
1295 { "nGetMaximumTextureHeight", "()I", (void*) android_view_GLES20Canvas_getMaxTextureHeight },
1296
Romain Guy16393512010-08-08 00:14:31 -07001297#endif
Romain Guye4d01122010-06-16 18:44:05 -07001298};
1299
Chet Haase9c1e23b2011-03-24 10:51:31 -07001300static JNINativeMethod gActivityThreadMethods[] = {
1301 { "dumpGraphicsInfo", "(Ljava/io/FileDescriptor;)V",
1302 (void*) android_app_ActivityThread_dumpGraphics }
1303};
1304
1305
Romain Guy16393512010-08-08 00:14:31 -07001306#ifdef USE_OPENGL_RENDERER
1307 #define FIND_CLASS(var, className) \
1308 var = env->FindClass(className); \
Carl Shapiro17cc33a2011-03-05 20:53:16 -08001309 LOG_FATAL_IF(! var, "Unable to find class " className);
1310
Romain Guy16393512010-08-08 00:14:31 -07001311 #define GET_METHOD_ID(var, clazz, methodName, methodDescriptor) \
1312 var = env->GetMethodID(clazz, methodName, methodDescriptor); \
1313 LOG_FATAL_IF(! var, "Unable to find method " methodName);
1314#else
1315 #define FIND_CLASS(var, className)
1316 #define GET_METHOD_ID(var, clazz, methodName, methodDescriptor)
1317#endif
Romain Guy9d5316e2010-06-24 19:30:36 -07001318
Romain Guye4d01122010-06-16 18:44:05 -07001319int register_android_view_GLES20Canvas(JNIEnv* env) {
Carl Shapiro17cc33a2011-03-05 20:53:16 -08001320 jclass clazz;
1321 FIND_CLASS(clazz, "android/graphics/Rect");
1322 GET_METHOD_ID(gRectClassInfo.set, clazz, "set", "(IIII)V");
Romain Guy9d5316e2010-06-24 19:30:36 -07001323
Romain Guye4d01122010-06-16 18:44:05 -07001324 return AndroidRuntime::registerNativeMethods(env, kClassPathName, gMethods, NELEM(gMethods));
1325}
1326
Chet Haase9c1e23b2011-03-24 10:51:31 -07001327const char* const kActivityThreadPathName = "android/app/ActivityThread";
1328
Romain Guy6be3d552011-07-14 18:08:37 -07001329int register_android_app_ActivityThread(JNIEnv* env) {
1330 return AndroidRuntime::registerNativeMethods(env, kActivityThreadPathName,
Chet Haase9c1e23b2011-03-24 10:51:31 -07001331 gActivityThreadMethods, NELEM(gActivityThreadMethods));
1332}
1333
Romain Guye4d01122010-06-16 18:44:05 -07001334};