• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2014 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 
17 #define LOG_TAG "OpenGLRenderer"
18 
19 #include "jni.h"
20 #include "GraphicsJNI.h"
21 #include <nativehelper/JNIHelp.h>
22 
23 #include "core_jni_helpers.h"
24 #include <android_runtime/android_graphics_SurfaceTexture.h>
25 
26 #include <gui/GLConsumer.h>
27 #include <hwui/Paint.h>
28 
29 #include <SkBitmap.h>
30 #include <SkCanvas.h>
31 #include <SkMatrix.h>
32 #include <SkBlendMode.h>
33 
34 #include <DeferredLayerUpdater.h>
35 #include <SkiaShader.h>
36 #include <Rect.h>
37 #include <RenderNode.h>
38 
39 namespace android {
40 
41 using namespace uirenderer;
42 
android_view_HardwareLayer_prepare(JNIEnv * env,jobject clazz,jlong layerUpdaterPtr,jint width,jint height,jboolean isOpaque)43 static jboolean android_view_HardwareLayer_prepare(JNIEnv* env, jobject clazz,
44         jlong layerUpdaterPtr, jint width, jint height, jboolean isOpaque) {
45     DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(layerUpdaterPtr);
46     bool changed = false;
47     changed |= layer->setSize(width, height);
48     changed |= layer->setBlend(!isOpaque);
49     return changed;
50 }
51 
android_view_HardwareLayer_setLayerPaint(JNIEnv * env,jobject clazz,jlong layerUpdaterPtr,jlong paintPtr)52 static void android_view_HardwareLayer_setLayerPaint(JNIEnv* env, jobject clazz,
53         jlong layerUpdaterPtr, jlong paintPtr) {
54     DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(layerUpdaterPtr);
55     if (layer) {
56         Paint* paint = reinterpret_cast<Paint*>(paintPtr);
57         layer->setPaint(paint);
58     }
59 }
60 
android_view_HardwareLayer_setTransform(JNIEnv * env,jobject clazz,jlong layerUpdaterPtr,jlong matrixPtr)61 static void android_view_HardwareLayer_setTransform(JNIEnv* env, jobject clazz,
62         jlong layerUpdaterPtr, jlong matrixPtr) {
63     DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(layerUpdaterPtr);
64     SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixPtr);
65     layer->setTransform(matrix);
66 }
67 
android_view_HardwareLayer_setSurfaceTexture(JNIEnv * env,jobject clazz,jlong layerUpdaterPtr,jobject surface)68 static void android_view_HardwareLayer_setSurfaceTexture(JNIEnv* env, jobject clazz,
69         jlong layerUpdaterPtr, jobject surface) {
70     DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(layerUpdaterPtr);
71     sp<GLConsumer> surfaceTexture(SurfaceTexture_getSurfaceTexture(env, surface));
72     layer->setSurfaceTexture(surfaceTexture);
73 }
74 
android_view_HardwareLayer_updateSurfaceTexture(JNIEnv * env,jobject clazz,jlong layerUpdaterPtr)75 static void android_view_HardwareLayer_updateSurfaceTexture(JNIEnv* env, jobject clazz,
76         jlong layerUpdaterPtr) {
77     DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(layerUpdaterPtr);
78     layer->updateTexImage();
79 }
80 
81 // ----------------------------------------------------------------------------
82 // JNI Glue
83 // ----------------------------------------------------------------------------
84 
85 const char* const kClassPathName = "android/view/HardwareLayer";
86 
87 static const JNINativeMethod gMethods[] = {
88     { "nPrepare",                "(JIIZ)Z",    (void*) android_view_HardwareLayer_prepare },
89     { "nSetLayerPaint",          "(JJ)V",      (void*) android_view_HardwareLayer_setLayerPaint },
90     { "nSetTransform",           "(JJ)V",      (void*) android_view_HardwareLayer_setTransform },
91     { "nSetSurfaceTexture",      "(JLandroid/graphics/SurfaceTexture;)V",
92             (void*) android_view_HardwareLayer_setSurfaceTexture },
93     { "nUpdateSurfaceTexture",   "(J)V",       (void*) android_view_HardwareLayer_updateSurfaceTexture },
94 };
95 
register_android_view_HardwareLayer(JNIEnv * env)96 int register_android_view_HardwareLayer(JNIEnv* env) {
97     return RegisterMethodsOrDie(env, kClassPathName, gMethods, NELEM(gMethods));
98 }
99 
100 };
101