19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17fae5cb2b356a1fef172b43066180a7ab4c32dbacMathias Agopian#define LOG_TAG "Surface" 18fae5cb2b356a1fef172b43066180a7ab4c32dbacMathias Agopian 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdio.h> 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 213866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian#include "jni.h" 223866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian#include "JNIHelp.h" 2364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown#include "android_os_Parcel.h" 24a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn#include "android/graphics/GraphicsJNI.h" 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe#include "core_jni_helpers.h" 273866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian#include <android_runtime/android_view_Surface.h> 283866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian#include <android_runtime/android_graphics_SurfaceTexture.h> 2987eac99a21772ae56018cb81db6966557b459554Ruben Brunk#include <android_runtime/Log.h> 308335f1ccccedb6655d96d9d5b697a7f0938235ddMathias Agopian 314a05f436989a49e06ec762aac9507ad13fcc5e23Mathias Agopian#include <binder/Parcel.h> 324a05f436989a49e06ec762aac9507ad13fcc5e23Mathias Agopian 338335f1ccccedb6655d96d9d5b697a7f0938235ddMathias Agopian#include <gui/Surface.h> 3452800617946c456e78ed010c82d0ec4358368164Mathias Agopian#include <gui/SurfaceControl.h> 35d47f7d8b5fe3a3861d7cbdc5f912235407823c8eAndy McFadden#include <gui/GLConsumer.h> 368335f1ccccedb6655d96d9d5b697a7f0938235ddMathias Agopian 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <ui/Rect.h> 388335f1ccccedb6655d96d9d5b697a7f0938235ddMathias Agopian#include <ui/Region.h> 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <SkCanvas.h> 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <SkBitmap.h> 428790be6de3644e332ec6a17c855da89ffc13a9bfLeon Scroggins III#include <SkImage.h> 436158b1bf0364da1582468a98ec09d004ba99deecMathias Agopian#include <SkRegion.h> 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/misc.h> 469e316a1a2a8d734315bbd56a85308f9657a92913Jeff Brown#include <utils/Log.h> 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown#include <ScopedUtfChars.h> 4964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown 50bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck#include <AnimationContext.h> 51ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck#include <FrameInfo.h> 52bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck#include <RenderNode.h> 53bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck#include <renderthread/RenderProxy.h> 54bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android { 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const char* const OutOfResourcesException = 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "android/view/Surface$OutOfResourcesException"; 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6264a55af0ac700baecb0877235eb42caac59a3560Jeff Brownstatic struct { 6364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown jclass clazz; 643866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian jfieldID mNativeObject; 65fc0ebd7d379ff63c00ebf78ca252fab5070213daJeff Brown jfieldID mLock; 66cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown jmethodID ctor; 6764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown} gSurfaceClassInfo; 6864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown 6964a55af0ac700baecb0877235eb42caac59a3560Jeff Brownstatic struct { 7064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown jfieldID left; 7164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown jfieldID top; 7264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown jfieldID right; 7364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown jfieldID bottom; 7464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown} gRectClassInfo; 7564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 78b1d90c8f60f71422196c337f1d078b68867f5710Mathias Agopian// this is just a pointer we use to pass to inc/decStrong 79b1d90c8f60f71422196c337f1d078b68867f5710Mathias Agopianstatic const void *sRefBaseOwner; 80b1d90c8f60f71422196c337f1d078b68867f5710Mathias Agopian 8164a55af0ac700baecb0877235eb42caac59a3560Jeff Brownbool android_view_Surface_isInstanceOf(JNIEnv* env, jobject obj) { 8264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown return env->IsInstanceOf(obj, gSurfaceClassInfo.clazz); 83050316184b01c0d1a01c46afae7429b89a27c31btedbo} 84050316184b01c0d1a01c46afae7429b89a27c31btedbo 853866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopiansp<ANativeWindow> android_view_Surface_getNativeWindow(JNIEnv* env, jobject surfaceObj) { 863866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian return android_view_Surface_getSurface(env, surfaceObj); 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 893866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopiansp<Surface> android_view_Surface_getSurface(JNIEnv* env, jobject surfaceObj) { 907c116b54b743cc3e92ac42abdbbe324d63b50a81Mathias Agopian sp<Surface> sur; 917c116b54b743cc3e92ac42abdbbe324d63b50a81Mathias Agopian jobject lock = env->GetObjectField(surfaceObj, 92fc0ebd7d379ff63c00ebf78ca252fab5070213daJeff Brown gSurfaceClassInfo.mLock); 937c116b54b743cc3e92ac42abdbbe324d63b50a81Mathias Agopian if (env->MonitorEnter(lock) == JNI_OK) { 947c116b54b743cc3e92ac42abdbbe324d63b50a81Mathias Agopian sur = reinterpret_cast<Surface *>( 9536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat env->GetLongField(surfaceObj, gSurfaceClassInfo.mNativeObject)); 967c116b54b743cc3e92ac42abdbbe324d63b50a81Mathias Agopian env->MonitorExit(lock); 977c116b54b743cc3e92ac42abdbbe324d63b50a81Mathias Agopian } 985ad3ab8a1639eb7feebca9cba2be634bde9dd362Andy McFadden env->DeleteLocalRef(lock); 997c116b54b743cc3e92ac42abdbbe324d63b50a81Mathias Agopian return sur; 100cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown} 101cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown 10229479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopianjobject android_view_Surface_createFromIGraphicBufferProducer(JNIEnv* env, 103d47f7d8b5fe3a3861d7cbdc5f912235407823c8eAndy McFadden const sp<IGraphicBufferProducer>& bufferProducer) { 104d47f7d8b5fe3a3861d7cbdc5f912235407823c8eAndy McFadden if (bufferProducer == NULL) { 105cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown return NULL; 106cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown } 107cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown 108e32632682ca9207bd247ca27012cf670b5c23f54Mathias Agopian sp<Surface> surface(new Surface(bufferProducer, true)); 109cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown if (surface == NULL) { 110cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown return NULL; 111cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown } 112cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown 113af608e81d450b962a443a21fb1a6feadeb355fe1Chong Zhang jobject surfaceObj = env->NewObject(gSurfaceClassInfo.clazz, 114af608e81d450b962a443a21fb1a6feadeb355fe1Chong Zhang gSurfaceClassInfo.ctor, (jlong)surface.get()); 115cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown if (surfaceObj == NULL) { 116cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown if (env->ExceptionCheck()) { 117d47f7d8b5fe3a3861d7cbdc5f912235407823c8eAndy McFadden ALOGE("Could not create instance of Surface from IGraphicBufferProducer."); 118cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown LOGE_EX(env); 119cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown env->ExceptionClear(); 120cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown } 121cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown return NULL; 122cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown } 123b1d90c8f60f71422196c337f1d078b68867f5710Mathias Agopian surface->incStrong(&sRefBaseOwner); 124cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown return surfaceObj; 125cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown} 126cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown 127805f3c9428f9ebd5080aec48d3d9d77dbf4b41a9Eino-Ville Talvalaint android_view_Surface_mapPublicFormatToHalFormat(PublicFormat f) { 128805f3c9428f9ebd5080aec48d3d9d77dbf4b41a9Eino-Ville Talvala 129805f3c9428f9ebd5080aec48d3d9d77dbf4b41a9Eino-Ville Talvala switch(f) { 130805f3c9428f9ebd5080aec48d3d9d77dbf4b41a9Eino-Ville Talvala case PublicFormat::JPEG: 131805f3c9428f9ebd5080aec48d3d9d77dbf4b41a9Eino-Ville Talvala case PublicFormat::DEPTH_POINT_CLOUD: 132805f3c9428f9ebd5080aec48d3d9d77dbf4b41a9Eino-Ville Talvala return HAL_PIXEL_FORMAT_BLOB; 133805f3c9428f9ebd5080aec48d3d9d77dbf4b41a9Eino-Ville Talvala case PublicFormat::DEPTH16: 134805f3c9428f9ebd5080aec48d3d9d77dbf4b41a9Eino-Ville Talvala return HAL_PIXEL_FORMAT_Y16; 135805f3c9428f9ebd5080aec48d3d9d77dbf4b41a9Eino-Ville Talvala case PublicFormat::RAW_SENSOR: 136805f3c9428f9ebd5080aec48d3d9d77dbf4b41a9Eino-Ville Talvala return HAL_PIXEL_FORMAT_RAW16; 137805f3c9428f9ebd5080aec48d3d9d77dbf4b41a9Eino-Ville Talvala default: 138805f3c9428f9ebd5080aec48d3d9d77dbf4b41a9Eino-Ville Talvala // Most formats map 1:1 139805f3c9428f9ebd5080aec48d3d9d77dbf4b41a9Eino-Ville Talvala return static_cast<int>(f); 140805f3c9428f9ebd5080aec48d3d9d77dbf4b41a9Eino-Ville Talvala } 141805f3c9428f9ebd5080aec48d3d9d77dbf4b41a9Eino-Ville Talvala} 142805f3c9428f9ebd5080aec48d3d9d77dbf4b41a9Eino-Ville Talvala 143805f3c9428f9ebd5080aec48d3d9d77dbf4b41a9Eino-Ville Talvalaandroid_dataspace android_view_Surface_mapPublicFormatToHalDataspace( 144805f3c9428f9ebd5080aec48d3d9d77dbf4b41a9Eino-Ville Talvala PublicFormat f) { 145805f3c9428f9ebd5080aec48d3d9d77dbf4b41a9Eino-Ville Talvala switch(f) { 146805f3c9428f9ebd5080aec48d3d9d77dbf4b41a9Eino-Ville Talvala case PublicFormat::JPEG: 1477966d446cddf92f814792dca3cfb0dfbbc1bef3eEino-Ville Talvala return HAL_DATASPACE_V0_JFIF; 148805f3c9428f9ebd5080aec48d3d9d77dbf4b41a9Eino-Ville Talvala case PublicFormat::DEPTH_POINT_CLOUD: 149805f3c9428f9ebd5080aec48d3d9d77dbf4b41a9Eino-Ville Talvala case PublicFormat::DEPTH16: 150805f3c9428f9ebd5080aec48d3d9d77dbf4b41a9Eino-Ville Talvala return HAL_DATASPACE_DEPTH; 151805f3c9428f9ebd5080aec48d3d9d77dbf4b41a9Eino-Ville Talvala case PublicFormat::RAW_SENSOR: 15244581ff4db54bbaa30365ed210e67a0369576100Yin-Chia Yeh case PublicFormat::RAW_PRIVATE: 153805f3c9428f9ebd5080aec48d3d9d77dbf4b41a9Eino-Ville Talvala case PublicFormat::RAW10: 15444581ff4db54bbaa30365ed210e67a0369576100Yin-Chia Yeh case PublicFormat::RAW12: 155805f3c9428f9ebd5080aec48d3d9d77dbf4b41a9Eino-Ville Talvala return HAL_DATASPACE_ARBITRARY; 156805f3c9428f9ebd5080aec48d3d9d77dbf4b41a9Eino-Ville Talvala case PublicFormat::YUV_420_888: 157805f3c9428f9ebd5080aec48d3d9d77dbf4b41a9Eino-Ville Talvala case PublicFormat::NV21: 158805f3c9428f9ebd5080aec48d3d9d77dbf4b41a9Eino-Ville Talvala case PublicFormat::YV12: 1597966d446cddf92f814792dca3cfb0dfbbc1bef3eEino-Ville Talvala return HAL_DATASPACE_V0_JFIF; 160805f3c9428f9ebd5080aec48d3d9d77dbf4b41a9Eino-Ville Talvala default: 161805f3c9428f9ebd5080aec48d3d9d77dbf4b41a9Eino-Ville Talvala // Most formats map to UNKNOWN 162805f3c9428f9ebd5080aec48d3d9d77dbf4b41a9Eino-Ville Talvala return HAL_DATASPACE_UNKNOWN; 163805f3c9428f9ebd5080aec48d3d9d77dbf4b41a9Eino-Ville Talvala } 164805f3c9428f9ebd5080aec48d3d9d77dbf4b41a9Eino-Ville Talvala} 165805f3c9428f9ebd5080aec48d3d9d77dbf4b41a9Eino-Ville Talvala 166805f3c9428f9ebd5080aec48d3d9d77dbf4b41a9Eino-Ville TalvalaPublicFormat android_view_Surface_mapHalFormatDataspaceToPublicFormat( 167805f3c9428f9ebd5080aec48d3d9d77dbf4b41a9Eino-Ville Talvala int format, android_dataspace dataSpace) { 168805f3c9428f9ebd5080aec48d3d9d77dbf4b41a9Eino-Ville Talvala switch(format) { 169805f3c9428f9ebd5080aec48d3d9d77dbf4b41a9Eino-Ville Talvala case HAL_PIXEL_FORMAT_RGBA_8888: 170805f3c9428f9ebd5080aec48d3d9d77dbf4b41a9Eino-Ville Talvala case HAL_PIXEL_FORMAT_RGBX_8888: 171805f3c9428f9ebd5080aec48d3d9d77dbf4b41a9Eino-Ville Talvala case HAL_PIXEL_FORMAT_RGB_888: 172805f3c9428f9ebd5080aec48d3d9d77dbf4b41a9Eino-Ville Talvala case HAL_PIXEL_FORMAT_RGB_565: 173805f3c9428f9ebd5080aec48d3d9d77dbf4b41a9Eino-Ville Talvala case HAL_PIXEL_FORMAT_Y8: 174805f3c9428f9ebd5080aec48d3d9d77dbf4b41a9Eino-Ville Talvala case HAL_PIXEL_FORMAT_RAW10: 17544581ff4db54bbaa30365ed210e67a0369576100Yin-Chia Yeh case HAL_PIXEL_FORMAT_RAW12: 176805f3c9428f9ebd5080aec48d3d9d77dbf4b41a9Eino-Ville Talvala case HAL_PIXEL_FORMAT_YCbCr_420_888: 177805f3c9428f9ebd5080aec48d3d9d77dbf4b41a9Eino-Ville Talvala case HAL_PIXEL_FORMAT_YV12: 178805f3c9428f9ebd5080aec48d3d9d77dbf4b41a9Eino-Ville Talvala // Enums overlap in both name and value 179805f3c9428f9ebd5080aec48d3d9d77dbf4b41a9Eino-Ville Talvala return static_cast<PublicFormat>(format); 180805f3c9428f9ebd5080aec48d3d9d77dbf4b41a9Eino-Ville Talvala case HAL_PIXEL_FORMAT_RAW16: 181805f3c9428f9ebd5080aec48d3d9d77dbf4b41a9Eino-Ville Talvala // Name differs, though value is the same 182805f3c9428f9ebd5080aec48d3d9d77dbf4b41a9Eino-Ville Talvala return PublicFormat::RAW_SENSOR; 18344581ff4db54bbaa30365ed210e67a0369576100Yin-Chia Yeh case HAL_PIXEL_FORMAT_RAW_OPAQUE: 18444581ff4db54bbaa30365ed210e67a0369576100Yin-Chia Yeh // Name differs, though value is the same 18544581ff4db54bbaa30365ed210e67a0369576100Yin-Chia Yeh return PublicFormat::RAW_PRIVATE; 186805f3c9428f9ebd5080aec48d3d9d77dbf4b41a9Eino-Ville Talvala case HAL_PIXEL_FORMAT_YCbCr_422_SP: 187805f3c9428f9ebd5080aec48d3d9d77dbf4b41a9Eino-Ville Talvala // Name differs, though the value is the same 188805f3c9428f9ebd5080aec48d3d9d77dbf4b41a9Eino-Ville Talvala return PublicFormat::NV16; 189805f3c9428f9ebd5080aec48d3d9d77dbf4b41a9Eino-Ville Talvala case HAL_PIXEL_FORMAT_YCrCb_420_SP: 190805f3c9428f9ebd5080aec48d3d9d77dbf4b41a9Eino-Ville Talvala // Name differs, though the value is the same 191805f3c9428f9ebd5080aec48d3d9d77dbf4b41a9Eino-Ville Talvala return PublicFormat::NV21; 192805f3c9428f9ebd5080aec48d3d9d77dbf4b41a9Eino-Ville Talvala case HAL_PIXEL_FORMAT_YCbCr_422_I: 193805f3c9428f9ebd5080aec48d3d9d77dbf4b41a9Eino-Ville Talvala // Name differs, though the value is the same 194805f3c9428f9ebd5080aec48d3d9d77dbf4b41a9Eino-Ville Talvala return PublicFormat::YUY2; 1952f17431194efc5a13981550b004dd8d5d2a42e5eZhijun He case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED: 1962f17431194efc5a13981550b004dd8d5d2a42e5eZhijun He // Name differs, though the value is the same 1972f17431194efc5a13981550b004dd8d5d2a42e5eZhijun He return PublicFormat::PRIVATE; 198805f3c9428f9ebd5080aec48d3d9d77dbf4b41a9Eino-Ville Talvala case HAL_PIXEL_FORMAT_Y16: 199805f3c9428f9ebd5080aec48d3d9d77dbf4b41a9Eino-Ville Talvala // Dataspace-dependent 200805f3c9428f9ebd5080aec48d3d9d77dbf4b41a9Eino-Ville Talvala switch (dataSpace) { 201805f3c9428f9ebd5080aec48d3d9d77dbf4b41a9Eino-Ville Talvala case HAL_DATASPACE_DEPTH: 202805f3c9428f9ebd5080aec48d3d9d77dbf4b41a9Eino-Ville Talvala return PublicFormat::DEPTH16; 203805f3c9428f9ebd5080aec48d3d9d77dbf4b41a9Eino-Ville Talvala default: 204805f3c9428f9ebd5080aec48d3d9d77dbf4b41a9Eino-Ville Talvala // Assume non-depth Y16 is just Y16. 205805f3c9428f9ebd5080aec48d3d9d77dbf4b41a9Eino-Ville Talvala return PublicFormat::Y16; 206805f3c9428f9ebd5080aec48d3d9d77dbf4b41a9Eino-Ville Talvala } 207805f3c9428f9ebd5080aec48d3d9d77dbf4b41a9Eino-Ville Talvala break; 208805f3c9428f9ebd5080aec48d3d9d77dbf4b41a9Eino-Ville Talvala case HAL_PIXEL_FORMAT_BLOB: 209805f3c9428f9ebd5080aec48d3d9d77dbf4b41a9Eino-Ville Talvala // Dataspace-dependent 210805f3c9428f9ebd5080aec48d3d9d77dbf4b41a9Eino-Ville Talvala switch (dataSpace) { 211805f3c9428f9ebd5080aec48d3d9d77dbf4b41a9Eino-Ville Talvala case HAL_DATASPACE_DEPTH: 212805f3c9428f9ebd5080aec48d3d9d77dbf4b41a9Eino-Ville Talvala return PublicFormat::DEPTH_POINT_CLOUD; 2137966d446cddf92f814792dca3cfb0dfbbc1bef3eEino-Ville Talvala case HAL_DATASPACE_V0_JFIF: 214805f3c9428f9ebd5080aec48d3d9d77dbf4b41a9Eino-Ville Talvala return PublicFormat::JPEG; 215805f3c9428f9ebd5080aec48d3d9d77dbf4b41a9Eino-Ville Talvala default: 216805f3c9428f9ebd5080aec48d3d9d77dbf4b41a9Eino-Ville Talvala // Assume otherwise-marked blobs are also JPEG 217805f3c9428f9ebd5080aec48d3d9d77dbf4b41a9Eino-Ville Talvala return PublicFormat::JPEG; 218805f3c9428f9ebd5080aec48d3d9d77dbf4b41a9Eino-Ville Talvala } 219805f3c9428f9ebd5080aec48d3d9d77dbf4b41a9Eino-Ville Talvala break; 220805f3c9428f9ebd5080aec48d3d9d77dbf4b41a9Eino-Ville Talvala case HAL_PIXEL_FORMAT_BGRA_8888: 221805f3c9428f9ebd5080aec48d3d9d77dbf4b41a9Eino-Ville Talvala // Not defined in public API 222805f3c9428f9ebd5080aec48d3d9d77dbf4b41a9Eino-Ville Talvala return PublicFormat::UNKNOWN; 223805f3c9428f9ebd5080aec48d3d9d77dbf4b41a9Eino-Ville Talvala 224805f3c9428f9ebd5080aec48d3d9d77dbf4b41a9Eino-Ville Talvala default: 225805f3c9428f9ebd5080aec48d3d9d77dbf4b41a9Eino-Ville Talvala return PublicFormat::UNKNOWN; 226805f3c9428f9ebd5080aec48d3d9d77dbf4b41a9Eino-Ville Talvala } 227805f3c9428f9ebd5080aec48d3d9d77dbf4b41a9Eino-Ville Talvala} 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 230f3d3b4d80618d498fb669c8bfdc492ce9ea25691Mathias Agopianstatic inline bool isSurfaceValid(const sp<Surface>& sur) { 231f3d3b4d80618d498fb669c8bfdc492ce9ea25691Mathias Agopian return Surface::isValid(sur); 23252800617946c456e78ed010c82d0ec4358368164Mathias Agopian} 23352800617946c456e78ed010c82d0ec4358368164Mathias Agopian 23452800617946c456e78ed010c82d0ec4358368164Mathias Agopian// ---------------------------------------------------------------------------- 23552800617946c456e78ed010c82d0ec4358368164Mathias Agopian 23636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhatstatic jlong nativeCreateFromSurfaceTexture(JNIEnv* env, jclass clazz, 23764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown jobject surfaceTextureObj) { 23852a9a10b6b8c7b7a9f97777541841b94d4fd9754Mathias Agopian sp<IGraphicBufferProducer> producer(SurfaceTexture_getProducer(env, surfaceTextureObj)); 23952a9a10b6b8c7b7a9f97777541841b94d4fd9754Mathias Agopian if (producer == NULL) { 2402e76c992bfa955cb637417005941e3e93810a99dDaniel Lam jniThrowException(env, "java/lang/IllegalArgumentException", 2412e76c992bfa955cb637417005941e3e93810a99dDaniel Lam "SurfaceTexture has already been released"); 2423866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian return 0; 2432e76c992bfa955cb637417005941e3e93810a99dDaniel Lam } 24464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown 24552a9a10b6b8c7b7a9f97777541841b94d4fd9754Mathias Agopian sp<Surface> surface(new Surface(producer, true)); 2460de171b0d490a5928d54d2fb67c912d140aac643Ted Bonkenburg if (surface == NULL) { 2470de171b0d490a5928d54d2fb67c912d140aac643Ted Bonkenburg jniThrowException(env, OutOfResourcesException, NULL); 2483866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian return 0; 2490de171b0d490a5928d54d2fb67c912d140aac643Ted Bonkenburg } 2500de171b0d490a5928d54d2fb67c912d140aac643Ted Bonkenburg 251b1d90c8f60f71422196c337f1d078b68867f5710Mathias Agopian surface->incStrong(&sRefBaseOwner); 25236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat return jlong(surface.get()); 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhatstatic void nativeRelease(JNIEnv* env, jclass clazz, jlong nativeObject) { 2563866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian sp<Surface> sur(reinterpret_cast<Surface *>(nativeObject)); 257b1d90c8f60f71422196c337f1d078b68867f5710Mathias Agopian sur->decStrong(&sRefBaseOwner); 2588138cb49e47f9a9905a316a217757710185c66aaMarco Nelissen} 2598138cb49e47f9a9905a316a217757710185c66aaMarco Nelissen 26036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhatstatic jboolean nativeIsValid(JNIEnv* env, jclass clazz, jlong nativeObject) { 2613866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian sp<Surface> sur(reinterpret_cast<Surface *>(nativeObject)); 26252800617946c456e78ed010c82d0ec4358368164Mathias Agopian return isSurfaceValid(sur) ? JNI_TRUE : JNI_FALSE; 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhatstatic jboolean nativeIsConsumerRunningBehind(JNIEnv* env, jclass clazz, jlong nativeObject) { 2663866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian sp<Surface> sur(reinterpret_cast<Surface *>(nativeObject)); 26752800617946c456e78ed010c82d0ec4358368164Mathias Agopian if (!isSurfaceValid(sur)) { 268c14bacf1fb511472138eeb5dc84a9423fc003214Mathias Agopian doThrowIAE(env); 26964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown return JNI_FALSE; 270c14bacf1fb511472138eeb5dc84a9423fc003214Mathias Agopian } 27164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown int value = 0; 2723866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian ANativeWindow* anw = static_cast<ANativeWindow*>(sur.get()); 273c14bacf1fb511472138eeb5dc84a9423fc003214Mathias Agopian anw->query(anw, NATIVE_WINDOW_CONSUMER_RUNNING_BEHIND, &value); 27464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown return value; 275c14bacf1fb511472138eeb5dc84a9423fc003214Mathias Agopian} 276c14bacf1fb511472138eeb5dc84a9423fc003214Mathias Agopian 277b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reedstatic inline SkColorType convertPixelFormat(PixelFormat format) { 278f1e5b0d4e5d0d2a78c234cd0cbd3005a74a79429Mathias Agopian /* note: if PIXEL_FORMAT_RGBX_8888 means that all alpha bytes are 0xFF, then 279b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed we can map to kN32_SkColorType, and optionally call 2808790be6de3644e332ec6a17c855da89ffc13a9bfLeon Scroggins III bitmap.setAlphaType(kOpaque_SkAlphaType) on the resulting SkBitmap 2818790be6de3644e332ec6a17c855da89ffc13a9bfLeon Scroggins III (as an accelerator) 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2838138cb49e47f9a9905a316a217757710185c66aaMarco Nelissen switch (format) { 284b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed case PIXEL_FORMAT_RGBX_8888: return kN32_SkColorType; 285b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed case PIXEL_FORMAT_RGBA_8888: return kN32_SkColorType; 286b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed case PIXEL_FORMAT_RGB_565: return kRGB_565_SkColorType; 287b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed default: return kUnknown_SkColorType; 2888138cb49e47f9a9905a316a217757710185c66aaMarco Nelissen } 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhatstatic jlong nativeLockCanvas(JNIEnv* env, jclass clazz, 29236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong nativeObject, jobject canvasObj, jobject dirtyRectObj) { 2933866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian sp<Surface> surface(reinterpret_cast<Surface *>(nativeObject)); 2943866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 29552800617946c456e78ed010c82d0ec4358368164Mathias Agopian if (!isSurfaceValid(surface)) { 2968451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes doThrowIAE(env); 297ed55c8db1c0d47492423fc54f4b0dd5cd585e593Andy McFadden return 0; 298fea12b87f2988f20ea87314c4a1b47e1a0f4d95eRomain Guy } 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 300827029228667507c69c7a430798d7ac88e438c33Pablo Ceballos Rect dirtyRect(Rect::EMPTY_RECT); 301667809ef5d2d1fe3796cdc9bdd09503a70d2ba6cMathias Agopian Rect* dirtyRectPtr = NULL; 302667809ef5d2d1fe3796cdc9bdd09503a70d2ba6cMathias Agopian 30364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown if (dirtyRectObj) { 304667809ef5d2d1fe3796cdc9bdd09503a70d2ba6cMathias Agopian dirtyRect.left = env->GetIntField(dirtyRectObj, gRectClassInfo.left); 305667809ef5d2d1fe3796cdc9bdd09503a70d2ba6cMathias Agopian dirtyRect.top = env->GetIntField(dirtyRectObj, gRectClassInfo.top); 306667809ef5d2d1fe3796cdc9bdd09503a70d2ba6cMathias Agopian dirtyRect.right = env->GetIntField(dirtyRectObj, gRectClassInfo.right); 307667809ef5d2d1fe3796cdc9bdd09503a70d2ba6cMathias Agopian dirtyRect.bottom = env->GetIntField(dirtyRectObj, gRectClassInfo.bottom); 308667809ef5d2d1fe3796cdc9bdd09503a70d2ba6cMathias Agopian dirtyRectPtr = &dirtyRect; 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31152800617946c456e78ed010c82d0ec4358368164Mathias Agopian ANativeWindow_Buffer outBuffer; 312667809ef5d2d1fe3796cdc9bdd09503a70d2ba6cMathias Agopian status_t err = surface->lock(&outBuffer, dirtyRectPtr); 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err < 0) { 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char* const exception = (err == NO_MEMORY) ? 31564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown OutOfResourcesException : 31664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown "java/lang/IllegalArgumentException"; 3178451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes jniThrowException(env, exception, NULL); 318ed55c8db1c0d47492423fc54f4b0dd5cd585e593Andy McFadden return 0; 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 321f35b989d26bb98900f6c5fa2e586326b30b6e161Leon Scroggins III 322b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed SkImageInfo info = SkImageInfo::Make(outBuffer.width, outBuffer.height, 323b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed convertPixelFormat(outBuffer.format), 324f35b989d26bb98900f6c5fa2e586326b30b6e161Leon Scroggins III outBuffer.format == PIXEL_FORMAT_RGBX_8888 ? 325f35b989d26bb98900f6c5fa2e586326b30b6e161Leon Scroggins III kOpaque_SkAlphaType : kPremul_SkAlphaType); 326b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed 327b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed SkBitmap bitmap; 328b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed ssize_t bpr = outBuffer.stride * bytesPerPixel(outBuffer.format); 329b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed bitmap.setInfo(info, bpr); 33052800617946c456e78ed010c82d0ec4358368164Mathias Agopian if (outBuffer.width > 0 && outBuffer.height > 0) { 33152800617946c456e78ed010c82d0ec4358368164Mathias Agopian bitmap.setPixels(outBuffer.bits); 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // be safe with an empty bitmap. 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bitmap.setPixels(NULL); 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 336fc615a0f643408956fc0dc1b997871e2b27cee7eDerek Sollenberger 337c1b33d665c8caf5760f68c45c6ca0baa649b832aJohn Reck Canvas* nativeCanvas = GraphicsJNI::getNativeCanvas(env, canvasObj); 338c1b33d665c8caf5760f68c45c6ca0baa649b832aJohn Reck nativeCanvas->setBitmap(bitmap); 3398451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes 340667809ef5d2d1fe3796cdc9bdd09503a70d2ba6cMathias Agopian if (dirtyRectPtr) { 341c1b33d665c8caf5760f68c45c6ca0baa649b832aJohn Reck nativeCanvas->clipRect(dirtyRect.left, dirtyRect.top, 342c1b33d665c8caf5760f68c45c6ca0baa649b832aJohn Reck dirtyRect.right, dirtyRect.bottom); 3436158b1bf0364da1582468a98ec09d004ba99deecMathias Agopian } 3446158b1bf0364da1582468a98ec09d004ba99deecMathias Agopian 34564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown if (dirtyRectObj) { 346667809ef5d2d1fe3796cdc9bdd09503a70d2ba6cMathias Agopian env->SetIntField(dirtyRectObj, gRectClassInfo.left, dirtyRect.left); 347667809ef5d2d1fe3796cdc9bdd09503a70d2ba6cMathias Agopian env->SetIntField(dirtyRectObj, gRectClassInfo.top, dirtyRect.top); 348667809ef5d2d1fe3796cdc9bdd09503a70d2ba6cMathias Agopian env->SetIntField(dirtyRectObj, gRectClassInfo.right, dirtyRect.right); 349667809ef5d2d1fe3796cdc9bdd09503a70d2ba6cMathias Agopian env->SetIntField(dirtyRectObj, gRectClassInfo.bottom, dirtyRect.bottom); 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 351ed55c8db1c0d47492423fc54f4b0dd5cd585e593Andy McFadden 352ed55c8db1c0d47492423fc54f4b0dd5cd585e593Andy McFadden // Create another reference to the surface and return it. This reference 353ed55c8db1c0d47492423fc54f4b0dd5cd585e593Andy McFadden // should be passed to nativeUnlockCanvasAndPost in place of mNativeObject, 354ed55c8db1c0d47492423fc54f4b0dd5cd585e593Andy McFadden // because the latter could be replaced while the surface is locked. 355ed55c8db1c0d47492423fc54f4b0dd5cd585e593Andy McFadden sp<Surface> lockedSurface(surface); 356ed55c8db1c0d47492423fc54f4b0dd5cd585e593Andy McFadden lockedSurface->incStrong(&sRefBaseOwner); 35736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat return (jlong) lockedSurface.get(); 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 360fc0ebd7d379ff63c00ebf78ca252fab5070213daJeff Brownstatic void nativeUnlockCanvasAndPost(JNIEnv* env, jclass clazz, 36136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong nativeObject, jobject canvasObj) { 3623866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian sp<Surface> surface(reinterpret_cast<Surface *>(nativeObject)); 36352800617946c456e78ed010c82d0ec4358368164Mathias Agopian if (!isSurfaceValid(surface)) { 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 36564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown } 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // detach the canvas from the surface 368c1b33d665c8caf5760f68c45c6ca0baa649b832aJohn Reck Canvas* nativeCanvas = GraphicsJNI::getNativeCanvas(env, canvasObj); 369c1b33d665c8caf5760f68c45c6ca0baa649b832aJohn Reck nativeCanvas->setBitmap(SkBitmap()); 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // unlock surface 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t err = surface->unlockAndPost(); 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err < 0) { 3748451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes doThrowIAE(env); 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3785795d6408d8bf44ffe2f49a25f9f333069b59a49Dan Stozastatic void nativeAllocateBuffers(JNIEnv* /* env */ , jclass /* clazz */, 3795795d6408d8bf44ffe2f49a25f9f333069b59a49Dan Stoza jlong nativeObject) { 3805795d6408d8bf44ffe2f49a25f9f333069b59a49Dan Stoza sp<Surface> surface(reinterpret_cast<Surface *>(nativeObject)); 3815795d6408d8bf44ffe2f49a25f9f333069b59a49Dan Stoza if (!isSurfaceValid(surface)) { 3825795d6408d8bf44ffe2f49a25f9f333069b59a49Dan Stoza return; 3835795d6408d8bf44ffe2f49a25f9f333069b59a49Dan Stoza } 3845795d6408d8bf44ffe2f49a25f9f333069b59a49Dan Stoza 3855795d6408d8bf44ffe2f49a25f9f333069b59a49Dan Stoza surface->allocateBuffers(); 3865795d6408d8bf44ffe2f49a25f9f333069b59a49Dan Stoza} 3875795d6408d8bf44ffe2f49a25f9f333069b59a49Dan Stoza 38864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown// ---------------------------------------------------------------------------- 38964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown 39036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhatstatic jlong nativeCreateFromSurfaceControl(JNIEnv* env, jclass clazz, 39136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong surfaceControlNativeObj) { 39217f638b39f2e8b610ecfa1290e5bc42ab7700c98Mathias Agopian /* 39317f638b39f2e8b610ecfa1290e5bc42ab7700c98Mathias Agopian * This is used by the WindowManagerService just after constructing 39417f638b39f2e8b610ecfa1290e5bc42ab7700c98Mathias Agopian * a Surface and is necessary for returning the Surface reference to 39517f638b39f2e8b610ecfa1290e5bc42ab7700c98Mathias Agopian * the caller. At this point, we should only have a SurfaceControl. 39617f638b39f2e8b610ecfa1290e5bc42ab7700c98Mathias Agopian */ 397fae5cb2b356a1fef172b43066180a7ab4c32dbacMathias Agopian 3983866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian sp<SurfaceControl> ctrl(reinterpret_cast<SurfaceControl *>(surfaceControlNativeObj)); 399fc0ebd7d379ff63c00ebf78ca252fab5070213daJeff Brown sp<Surface> surface(ctrl->getSurface()); 400fc0ebd7d379ff63c00ebf78ca252fab5070213daJeff Brown if (surface != NULL) { 401fc0ebd7d379ff63c00ebf78ca252fab5070213daJeff Brown surface->incStrong(&sRefBaseOwner); 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 40336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat return reinterpret_cast<jlong>(surface.get()); 40461566cc1932468720a831ad5cbc68ee080d613c9Dianne Hackborn} 40561566cc1932468720a831ad5cbc68ee080d613c9Dianne Hackborn 40636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhatstatic jlong nativeReadFromParcel(JNIEnv* env, jclass clazz, 40736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong nativeObject, jobject parcelObj) { 40864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown Parcel* parcel = parcelForJavaObject(env, parcelObj); 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parcel == NULL) { 4108451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes doThrowNPE(env); 4113866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian return 0; 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 413c3b9cd635163ae48a9151fc6e1650388c5d716beMathias Agopian 4145d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala android::view::Surface surfaceShim; 4155d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala 4165d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala // Calling code in Surface.java has already read the name of the Surface 4175d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala // from the Parcel 4185d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala surfaceShim.readFromParcel(parcel, /*nameAlreadyRead*/true); 4195d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala 4203866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian sp<Surface> self(reinterpret_cast<Surface *>(nativeObject)); 421c3b9cd635163ae48a9151fc6e1650388c5d716beMathias Agopian 422c3b9cd635163ae48a9151fc6e1650388c5d716beMathias Agopian // update the Surface only if the underlying IGraphicBufferProducer 423c3b9cd635163ae48a9151fc6e1650388c5d716beMathias Agopian // has changed. 4245d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala if (self != nullptr 4255d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala && (IInterface::asBinder(self->getIGraphicBufferProducer()) == 4265d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala IInterface::asBinder(surfaceShim.graphicBufferProducer))) { 427c3b9cd635163ae48a9151fc6e1650388c5d716beMathias Agopian // same IGraphicBufferProducer, return ourselves 42836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat return jlong(self.get()); 4293866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } 4304a05f436989a49e06ec762aac9507ad13fcc5e23Mathias Agopian 4314a05f436989a49e06ec762aac9507ad13fcc5e23Mathias Agopian sp<Surface> sur; 4325d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala if (surfaceShim.graphicBufferProducer != nullptr) { 433c3b9cd635163ae48a9151fc6e1650388c5d716beMathias Agopian // we have a new IGraphicBufferProducer, create a new Surface for it 4345d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala sur = new Surface(surfaceShim.graphicBufferProducer, true); 435c3b9cd635163ae48a9151fc6e1650388c5d716beMathias Agopian // and keep a reference before passing to java 436b1d90c8f60f71422196c337f1d078b68867f5710Mathias Agopian sur->incStrong(&sRefBaseOwner); 4373866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } 4384a05f436989a49e06ec762aac9507ad13fcc5e23Mathias Agopian 439c3b9cd635163ae48a9151fc6e1650388c5d716beMathias Agopian if (self != NULL) { 440c3b9cd635163ae48a9151fc6e1650388c5d716beMathias Agopian // and loose the java reference to ourselves 441c3b9cd635163ae48a9151fc6e1650388c5d716beMathias Agopian self->decStrong(&sRefBaseOwner); 442c3b9cd635163ae48a9151fc6e1650388c5d716beMathias Agopian } 443c3b9cd635163ae48a9151fc6e1650388c5d716beMathias Agopian 44436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat return jlong(sur.get()); 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 44729479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopianstatic void nativeWriteToParcel(JNIEnv* env, jclass clazz, 44836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jlong nativeObject, jobject parcelObj) { 44964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown Parcel* parcel = parcelForJavaObject(env, parcelObj); 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parcel == NULL) { 4518451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes doThrowNPE(env); 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4543866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian sp<Surface> self(reinterpret_cast<Surface *>(nativeObject)); 4555d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala android::view::Surface surfaceShim; 4565d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala if (self != nullptr) { 4575d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala surfaceShim.graphicBufferProducer = self->getIGraphicBufferProducer(); 4585d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala } 4595d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala // Calling code in Surface.java has already written the name of the Surface 4605d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala // to the Parcel 4615d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala surfaceShim.writeToParcel(parcel, /*nameAlreadyWritten*/true); 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 464b35c9602cf5c628c621e4fe102a461505f302bfeJohn Reckstatic jint nativeGetWidth(JNIEnv* env, jclass clazz, jlong nativeObject) { 465b35c9602cf5c628c621e4fe102a461505f302bfeJohn Reck Surface* surface = reinterpret_cast<Surface*>(nativeObject); 466b35c9602cf5c628c621e4fe102a461505f302bfeJohn Reck ANativeWindow* anw = static_cast<ANativeWindow*>(surface); 467b35c9602cf5c628c621e4fe102a461505f302bfeJohn Reck int value = 0; 468b35c9602cf5c628c621e4fe102a461505f302bfeJohn Reck anw->query(anw, NATIVE_WINDOW_WIDTH, &value); 469b35c9602cf5c628c621e4fe102a461505f302bfeJohn Reck return value; 470b35c9602cf5c628c621e4fe102a461505f302bfeJohn Reck} 471b35c9602cf5c628c621e4fe102a461505f302bfeJohn Reck 472b35c9602cf5c628c621e4fe102a461505f302bfeJohn Reckstatic jint nativeGetHeight(JNIEnv* env, jclass clazz, jlong nativeObject) { 473b35c9602cf5c628c621e4fe102a461505f302bfeJohn Reck Surface* surface = reinterpret_cast<Surface*>(nativeObject); 474b35c9602cf5c628c621e4fe102a461505f302bfeJohn Reck ANativeWindow* anw = static_cast<ANativeWindow*>(surface); 475b35c9602cf5c628c621e4fe102a461505f302bfeJohn Reck int value = 0; 476b35c9602cf5c628c621e4fe102a461505f302bfeJohn Reck anw->query(anw, NATIVE_WINDOW_HEIGHT, &value); 477b35c9602cf5c628c621e4fe102a461505f302bfeJohn Reck return value; 478b35c9602cf5c628c621e4fe102a461505f302bfeJohn Reck} 479cd9a18c7f864901400c6017c892bfd3bc48c3a4bRobert Carr 48064e516f5fa56d71bf6b5076e5620c30dc5810ba1Rob Carrstatic jlong nativeGetNextFrameNumber(JNIEnv *env, jclass clazz, jlong nativeObject) { 48164e516f5fa56d71bf6b5076e5620c30dc5810ba1Rob Carr Surface* surface = reinterpret_cast<Surface*>(nativeObject); 48264e516f5fa56d71bf6b5076e5620c30dc5810ba1Rob Carr return surface->getNextFrameNumber(); 48364e516f5fa56d71bf6b5076e5620c30dc5810ba1Rob Carr} 484b35c9602cf5c628c621e4fe102a461505f302bfeJohn Reck 485cd9a18c7f864901400c6017c892bfd3bc48c3a4bRobert Carrstatic jint nativeSetScalingMode(JNIEnv *env, jclass clazz, jlong nativeObject, jint scalingMode) { 486cd9a18c7f864901400c6017c892bfd3bc48c3a4bRobert Carr Surface* surface = reinterpret_cast<Surface*>(nativeObject); 487cd9a18c7f864901400c6017c892bfd3bc48c3a4bRobert Carr return surface->setScalingMode(scalingMode); 488cd9a18c7f864901400c6017c892bfd3bc48c3a4bRobert Carr} 489cd9a18c7f864901400c6017c892bfd3bc48c3a4bRobert Carr 490bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Recknamespace uirenderer { 491bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck 492bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reckusing namespace android::uirenderer::renderthread; 493bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck 494bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reckclass ContextFactory : public IContextFactory { 495bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reckpublic: 496bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck virtual AnimationContext* createAnimationContext(renderthread::TimeLord& clock) { 497bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck return new AnimationContext(clock); 498bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck } 499bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck}; 500bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck 501bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reckstatic jlong create(JNIEnv* env, jclass clazz, jlong rootNodePtr, jlong surfacePtr) { 502bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck RenderNode* rootNode = reinterpret_cast<RenderNode*>(rootNodePtr); 503bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck sp<Surface> surface(reinterpret_cast<Surface*>(surfacePtr)); 504bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck ContextFactory factory; 505bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck RenderProxy* proxy = new RenderProxy(false, rootNode, &factory); 506bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck proxy->loadSystemProperties(); 5071125d1fa92ab9f3b8315bbfb72e038b62dfd454bJohn Reck proxy->setSwapBehavior(kSwap_discardBuffer); 508bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck proxy->initialize(surface); 509bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck // Shadows can't be used via this interface, so just set the light source 510bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck // to all 0s. (and width & height are unused, TODO remove them) 51150210d912925aef14e4ce69be82e4949122a3cd9Alan Viverette proxy->setup(0, 0, 0, 0, 0); 51250210d912925aef14e4ce69be82e4949122a3cd9Alan Viverette proxy->setLightCenter((Vector3){0, 0, 0}); 513bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck return (jlong) proxy; 514bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck} 515bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck 516bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reckstatic void setSurface(JNIEnv* env, jclass clazz, jlong rendererPtr, jlong surfacePtr) { 517bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(rendererPtr); 518bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck sp<Surface> surface(reinterpret_cast<Surface*>(surfacePtr)); 519bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck proxy->updateSurface(surface); 520bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck} 521bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck 522bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reckstatic void draw(JNIEnv* env, jclass clazz, jlong rendererPtr) { 523bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(rendererPtr); 524ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck nsecs_t vsync = systemTime(CLOCK_MONOTONIC); 525ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck UiFrameInfoBuilder(proxy->frameInfo()) 526ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck .setVsync(vsync, vsync) 5271b54fb27ac48495ed0b33868fda5776fb49fe0f3Chris Craik .addFlag(FrameInfoFlags::SurfaceCanvas); 52851f2d606dcbfba3cc5b03dfea37c1304b91c232fJohn Reck proxy->syncAndDrawFrame(nullptr); 529bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck} 530bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck 531bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reckstatic void destroy(JNIEnv* env, jclass clazz, jlong rendererPtr) { 532bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(rendererPtr); 533bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck delete proxy; 534bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck} 535bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck 536bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck} // uirenderer 537bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 540bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Recknamespace hwui = android::uirenderer; 541bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck 54276f6a86de25e1bf74717e047e55fd44b089673f3Daniel Micaystatic const JNINativeMethod gSurfaceMethods[] = { 54336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat {"nativeCreateFromSurfaceTexture", "(Landroid/graphics/SurfaceTexture;)J", 54464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown (void*)nativeCreateFromSurfaceTexture }, 54536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat {"nativeRelease", "(J)V", 54664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown (void*)nativeRelease }, 54736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat {"nativeIsValid", "(J)Z", 54864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown (void*)nativeIsValid }, 54936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat {"nativeIsConsumerRunningBehind", "(J)Z", 55064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown (void*)nativeIsConsumerRunningBehind }, 55136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat {"nativeLockCanvas", "(JLandroid/graphics/Canvas;Landroid/graphics/Rect;)J", 55264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown (void*)nativeLockCanvas }, 55336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat {"nativeUnlockCanvasAndPost", "(JLandroid/graphics/Canvas;)V", 55464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown (void*)nativeUnlockCanvasAndPost }, 5555795d6408d8bf44ffe2f49a25f9f333069b59a49Dan Stoza {"nativeAllocateBuffers", "(J)V", 5565795d6408d8bf44ffe2f49a25f9f333069b59a49Dan Stoza (void*)nativeAllocateBuffers }, 55736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat {"nativeCreateFromSurfaceControl", "(J)J", 558fc0ebd7d379ff63c00ebf78ca252fab5070213daJeff Brown (void*)nativeCreateFromSurfaceControl }, 55936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat {"nativeReadFromParcel", "(JLandroid/os/Parcel;)J", 56064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown (void*)nativeReadFromParcel }, 56136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat {"nativeWriteToParcel", "(JLandroid/os/Parcel;)V", 56264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown (void*)nativeWriteToParcel }, 563b35c9602cf5c628c621e4fe102a461505f302bfeJohn Reck {"nativeGetWidth", "(J)I", (void*)nativeGetWidth }, 564b35c9602cf5c628c621e4fe102a461505f302bfeJohn Reck {"nativeGetHeight", "(J)I", (void*)nativeGetHeight }, 56564e516f5fa56d71bf6b5076e5620c30dc5810ba1Rob Carr {"nativeGetNextFrameNumber", "(J)J", (void*)nativeGetNextFrameNumber }, 566cd9a18c7f864901400c6017c892bfd3bc48c3a4bRobert Carr {"nativeSetScalingMode", "(JI)I", (void*)nativeSetScalingMode }, 567bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck 568bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck // HWUI context 569bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck {"nHwuiCreate", "(JJ)J", (void*) hwui::create }, 570bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck {"nHwuiSetSurface", "(JJ)V", (void*) hwui::setSurface }, 571bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck {"nHwuiDraw", "(J)V", (void*) hwui::draw }, 572bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck {"nHwuiDestroy", "(J)V", (void*) hwui::destroy }, 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint register_android_view_Surface(JNIEnv* env) 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 577ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe int err = RegisterMethodsOrDie(env, "android/view/Surface", 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gSurfaceMethods, NELEM(gSurfaceMethods)); 57964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown 580ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe jclass clazz = FindClassOrDie(env, "android/view/Surface"); 581ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe gSurfaceClassInfo.clazz = MakeGlobalRefOrDie(env, clazz); 582ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe gSurfaceClassInfo.mNativeObject = GetFieldIDOrDie(env, 583ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe gSurfaceClassInfo.clazz, "mNativeObject", "J"); 584ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe gSurfaceClassInfo.mLock = GetFieldIDOrDie(env, 585ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe gSurfaceClassInfo.clazz, "mLock", "Ljava/lang/Object;"); 586ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe gSurfaceClassInfo.ctor = GetMethodIDOrDie(env, gSurfaceClassInfo.clazz, "<init>", "(J)V"); 587ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe 588ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe clazz = FindClassOrDie(env, "android/graphics/Rect"); 589ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe gRectClassInfo.left = GetFieldIDOrDie(env, clazz, "left", "I"); 590ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe gRectClassInfo.top = GetFieldIDOrDie(env, clazz, "top", "I"); 591ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe gRectClassInfo.right = GetFieldIDOrDie(env, clazz, "right", "I"); 592ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe gRectClassInfo.bottom = GetFieldIDOrDie(env, clazz, "bottom", "I"); 59364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return err; 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 598