104fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck/*
204fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck * Copyright (C) 2014 The Android Open Source Project
304fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck *
404fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck * Licensed under the Apache License, Version 2.0 (the "License");
504fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck * you may not use this file except in compliance with the License.
604fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck * You may obtain a copy of the License at
704fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck *
804fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck *      http://www.apache.org/licenses/LICENSE-2.0
904fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck *
1004fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck * Unless required by applicable law or agreed to in writing, software
1104fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck * distributed under the License is distributed on an "AS IS" BASIS,
1204fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1304fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck * See the License for the specific language governing permissions and
1404fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck * limitations under the License.
1504fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck */
1604fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck
1704fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck#define LOG_TAG "OpenGLRenderer"
1804fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck
1904fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck#include "jni.h"
2004fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck#include "GraphicsJNI.h"
2104fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck#include <nativehelper/JNIHelp.h>
2204fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck
23ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe#include "core_jni_helpers.h"
2404fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck#include <android_runtime/android_graphics_SurfaceTexture.h>
2504fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck
2604fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck#include <gui/GLConsumer.h>
27dccca44ffda4836b56a21da95a046c9708ffd49csergeyv#include <hwui/Paint.h>
2804fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck
2904fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck#include <SkBitmap.h>
3004fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck#include <SkCanvas.h>
3104fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck#include <SkMatrix.h>
32c2f31df8b3b9a237e9abffc59c61804ad8495073Mike Reed#include <SkBlendMode.h>
3304fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck
3404fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck#include <DeferredLayerUpdater.h>
3504fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck#include <SkiaShader.h>
3604fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck#include <Rect.h>
37113e0824d6bddf4376240681f9cf6a2deded9498John Reck#include <RenderNode.h>
3804fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck
3904fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Recknamespace android {
4004fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck
4104fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reckusing namespace uirenderer;
4204fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck
4304fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reckstatic jboolean android_view_HardwareLayer_prepare(JNIEnv* env, jobject clazz,
4404fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck        jlong layerUpdaterPtr, jint width, jint height, jboolean isOpaque) {
4504fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck    DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(layerUpdaterPtr);
4604fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck    bool changed = false;
4704fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck    changed |= layer->setSize(width, height);
4804fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck    changed |= layer->setBlend(!isOpaque);
4904fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck    return changed;
5004fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck}
5104fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck
5204fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reckstatic void android_view_HardwareLayer_setLayerPaint(JNIEnv* env, jobject clazz,
53674554fc36932ca50b15bba41ac6f650254d4e72Derek Sollenberger        jlong layerUpdaterPtr, jlong paintPtr) {
5404fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck    DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(layerUpdaterPtr);
5504fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck    if (layer) {
566ba30b85ddfbe37c338ee8dde3dd33322eb38d47Behdad Esfahbod        Paint* paint = reinterpret_cast<Paint*>(paintPtr);
5704fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck        layer->setPaint(paint);
5804fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck    }
5904fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck}
6004fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck
6104fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reckstatic void android_view_HardwareLayer_setTransform(JNIEnv* env, jobject clazz,
6204fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck        jlong layerUpdaterPtr, jlong matrixPtr) {
6304fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck    DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(layerUpdaterPtr);
6404fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck    SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixPtr);
6504fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck    layer->setTransform(matrix);
6604fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck}
6704fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck
6804fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reckstatic void android_view_HardwareLayer_setSurfaceTexture(JNIEnv* env, jobject clazz,
6900eb43dbc04083eab85fbb1a9589e2548f2004edsergeyv        jlong layerUpdaterPtr, jobject surface) {
7004fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck    DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(layerUpdaterPtr);
7104fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck    sp<GLConsumer> surfaceTexture(SurfaceTexture_getSurfaceTexture(env, surface));
7200eb43dbc04083eab85fbb1a9589e2548f2004edsergeyv    layer->setSurfaceTexture(surfaceTexture);
7304fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck}
7404fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck
7504fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reckstatic void android_view_HardwareLayer_updateSurfaceTexture(JNIEnv* env, jobject clazz,
7604fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck        jlong layerUpdaterPtr) {
7704fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck    DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(layerUpdaterPtr);
7804fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck    layer->updateTexImage();
7904fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck}
8004fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck
8104fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck// ----------------------------------------------------------------------------
8204fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck// JNI Glue
8304fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck// ----------------------------------------------------------------------------
8404fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck
8504fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reckconst char* const kClassPathName = "android/view/HardwareLayer";
8604fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck
8776f6a86de25e1bf74717e047e55fd44b089673f3Daniel Micaystatic const JNINativeMethod gMethods[] = {
8804fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck    { "nPrepare",                "(JIIZ)Z",    (void*) android_view_HardwareLayer_prepare },
89674554fc36932ca50b15bba41ac6f650254d4e72Derek Sollenberger    { "nSetLayerPaint",          "(JJ)V",      (void*) android_view_HardwareLayer_setLayerPaint },
9004fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck    { "nSetTransform",           "(JJ)V",      (void*) android_view_HardwareLayer_setTransform },
9100eb43dbc04083eab85fbb1a9589e2548f2004edsergeyv    { "nSetSurfaceTexture",      "(JLandroid/graphics/SurfaceTexture;)V",
9204fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck            (void*) android_view_HardwareLayer_setSurfaceTexture },
9304fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck    { "nUpdateSurfaceTexture",   "(J)V",       (void*) android_view_HardwareLayer_updateSurfaceTexture },
9404fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck};
9504fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck
9604fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reckint register_android_view_HardwareLayer(JNIEnv* env) {
97ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    return RegisterMethodsOrDie(env, kClassPathName, gMethods, NELEM(gMethods));
9804fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck}
9904fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck
10004fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck};
101