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
2304fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck#include <android_runtime/AndroidRuntime.h>
2404fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck#include <android_runtime/android_graphics_SurfaceTexture.h>
2504fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck
2604fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck#include <gui/GLConsumer.h>
2704fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck
286ba30b85ddfbe37c338ee8dde3dd33322eb38d47Behdad Esfahbod#include <Paint.h>
2904fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck#include <SkBitmap.h>
3004fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck#include <SkCanvas.h>
3104fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck#include <SkMatrix.h>
3204fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck#include <SkXfermode.h>
3304fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck
3404fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck#include <DeferredLayerUpdater.h>
3504fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck#include <LayerRenderer.h>
3604fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck#include <SkiaShader.h>
3704fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck#include <Rect.h>
38113e0824d6bddf4376240681f9cf6a2deded9498John Reck#include <RenderNode.h>
3904fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck
4004fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Recknamespace android {
4104fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck
4204fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reckusing namespace uirenderer;
4304fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck
4404fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck#ifdef USE_OPENGL_RENDERER
4504fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck
4604fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reckstatic jboolean android_view_HardwareLayer_prepare(JNIEnv* env, jobject clazz,
4704fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck        jlong layerUpdaterPtr, jint width, jint height, jboolean isOpaque) {
4804fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck    DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(layerUpdaterPtr);
4904fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck    bool changed = false;
5004fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck    changed |= layer->setSize(width, height);
5104fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck    changed |= layer->setBlend(!isOpaque);
5204fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck    return changed;
5304fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck}
5404fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck
5504fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reckstatic void android_view_HardwareLayer_setLayerPaint(JNIEnv* env, jobject clazz,
56674554fc36932ca50b15bba41ac6f650254d4e72Derek Sollenberger        jlong layerUpdaterPtr, jlong paintPtr) {
5704fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck    DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(layerUpdaterPtr);
5804fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck    if (layer) {
596ba30b85ddfbe37c338ee8dde3dd33322eb38d47Behdad Esfahbod        Paint* paint = reinterpret_cast<Paint*>(paintPtr);
6004fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck        layer->setPaint(paint);
6104fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck    }
6204fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck}
6304fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck
6404fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reckstatic void android_view_HardwareLayer_setTransform(JNIEnv* env, jobject clazz,
6504fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck        jlong layerUpdaterPtr, jlong matrixPtr) {
6604fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck    DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(layerUpdaterPtr);
6704fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck    SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixPtr);
6804fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck    layer->setTransform(matrix);
6904fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck}
7004fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck
7104fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reckstatic void android_view_HardwareLayer_setSurfaceTexture(JNIEnv* env, jobject clazz,
7204fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck        jlong layerUpdaterPtr, jobject surface, jboolean isAlreadyAttached) {
7304fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck    DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(layerUpdaterPtr);
7404fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck    sp<GLConsumer> surfaceTexture(SurfaceTexture_getSurfaceTexture(env, surface));
7504fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck    layer->setSurfaceTexture(surfaceTexture, !isAlreadyAttached);
7604fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck}
7704fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck
7804fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reckstatic void android_view_HardwareLayer_updateSurfaceTexture(JNIEnv* env, jobject clazz,
7904fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck        jlong layerUpdaterPtr) {
8004fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck    DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(layerUpdaterPtr);
8104fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck    layer->updateTexImage();
8204fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck}
8304fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck
8404fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reckstatic jint android_view_HardwareLayer_getTexName(JNIEnv* env, jobject clazz,
8504fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck        jlong layerUpdaterPtr) {
8604fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck    DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(layerUpdaterPtr);
8704fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck    return layer->backingLayer()->getTexture();
8804fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck}
8904fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck
9004fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck#endif // USE_OPENGL_RENDERER
9104fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck
9204fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck// ----------------------------------------------------------------------------
9304fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck// JNI Glue
9404fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck// ----------------------------------------------------------------------------
9504fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck
9604fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reckconst char* const kClassPathName = "android/view/HardwareLayer";
9704fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck
9804fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reckstatic JNINativeMethod gMethods[] = {
9904fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck#ifdef USE_OPENGL_RENDERER
10004fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck
10104fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck    { "nPrepare",                "(JIIZ)Z",    (void*) android_view_HardwareLayer_prepare },
102674554fc36932ca50b15bba41ac6f650254d4e72Derek Sollenberger    { "nSetLayerPaint",          "(JJ)V",      (void*) android_view_HardwareLayer_setLayerPaint },
10304fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck    { "nSetTransform",           "(JJ)V",      (void*) android_view_HardwareLayer_setTransform },
10404fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck    { "nSetSurfaceTexture",      "(JLandroid/graphics/SurfaceTexture;Z)V",
10504fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck            (void*) android_view_HardwareLayer_setSurfaceTexture },
10604fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck    { "nUpdateSurfaceTexture",   "(J)V",       (void*) android_view_HardwareLayer_updateSurfaceTexture },
10704fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck
10804fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck    { "nGetTexName",             "(J)I",       (void*) android_view_HardwareLayer_getTexName },
10904fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck#endif
11004fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck};
11104fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck
11204fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reckint register_android_view_HardwareLayer(JNIEnv* env) {
11304fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck    return AndroidRuntime::registerNativeMethods(env, kClassPathName, gMethods, NELEM(gMethods));
11404fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck}
11504fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck
11604fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck};
117