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