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