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 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdio.h> 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <assert.h> 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 204c7cc34127efa3308e1a09b28728868911b79789Dianne Hackborn#include <cutils/properties.h> 214c7cc34127efa3308e1a09b28728868911b79789Dianne Hackborn 22000479f9e325b4e426a67033abd92d47da412725Mathias Agopian#include <surfaceflinger/SurfaceComposerClient.h> 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <ui/PixelFormat.h> 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <ui/DisplayInfo.h> 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "jni.h" 278451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes#include "JNIHelp.h" 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <android_runtime/AndroidRuntime.h> 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/misc.h> 304c7cc34127efa3308e1a09b28728868911b79789Dianne Hackborn#include <utils/Log.h> 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android { 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct offsets_t { 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfieldID display; 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfieldID pixelFormat; 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfieldID fps; 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfieldID density; 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfieldID xdpi; 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfieldID ydpi; 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic offsets_t offsets; 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_view_Display_init( 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JNIEnv* env, jobject clazz, jint dpy) 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DisplayInfo info; 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t err = SurfaceComposerClient::getDisplayInfo(DisplayID(dpy), &info); 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err < 0) { 568451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes jniThrowException(env, "java/lang/IllegalArgumentException", NULL); 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->SetIntField(clazz, offsets.pixelFormat,info.pixelFormatInfo.format); 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->SetFloatField(clazz, offsets.fps, info.fps); 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->SetFloatField(clazz, offsets.density, info.density); 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->SetFloatField(clazz, offsets.xdpi, info.xdpi); 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->SetFloatField(clazz, offsets.ydpi, info.ydpi); 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 66ec537457cd2869e52b9b2c99e8c01dd96a9682e2Dianne Hackbornstatic jint android_view_Display_getRawWidthNative( 6799aac7beca18b6d73e40db5e8e49f52f94be638eDianne Hackborn JNIEnv* env, jobject clazz) 6899aac7beca18b6d73e40db5e8e49f52f94be638eDianne Hackborn{ 6999aac7beca18b6d73e40db5e8e49f52f94be638eDianne Hackborn DisplayID dpy = env->GetIntField(clazz, offsets.display); 7099aac7beca18b6d73e40db5e8e49f52f94be638eDianne Hackborn return SurfaceComposerClient::getDisplayWidth(dpy); 7199aac7beca18b6d73e40db5e8e49f52f94be638eDianne Hackborn} 7299aac7beca18b6d73e40db5e8e49f52f94be638eDianne Hackborn 73ec537457cd2869e52b9b2c99e8c01dd96a9682e2Dianne Hackbornstatic jint android_view_Display_getRawHeightNative( 7499aac7beca18b6d73e40db5e8e49f52f94be638eDianne Hackborn JNIEnv* env, jobject clazz) 7599aac7beca18b6d73e40db5e8e49f52f94be638eDianne Hackborn{ 7699aac7beca18b6d73e40db5e8e49f52f94be638eDianne Hackborn DisplayID dpy = env->GetIntField(clazz, offsets.display); 7799aac7beca18b6d73e40db5e8e49f52f94be638eDianne Hackborn return SurfaceComposerClient::getDisplayHeight(dpy); 7899aac7beca18b6d73e40db5e8e49f52f94be638eDianne Hackborn} 7999aac7beca18b6d73e40db5e8e49f52f94be638eDianne Hackborn 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint android_view_Display_getOrientation( 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JNIEnv* env, jobject clazz) 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DisplayID dpy = env->GetIntField(clazz, offsets.display); 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return SurfaceComposerClient::getDisplayOrientation(dpy); 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint android_view_Display_getDisplayCount( 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JNIEnv* env, jclass clazz) 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return SurfaceComposerClient::getNumberOfDisplays(); 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectconst char* const kClassPathName = "android/view/Display"; 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void nativeClassInit(JNIEnv* env, jclass clazz); 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNINativeMethod gMethods[] = { 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "nativeClassInit", "()V", 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (void*)nativeClassInit }, 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "getDisplayCount", "()I", 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (void*)android_view_Display_getDisplayCount }, 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "init", "(I)V", 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (void*)android_view_Display_init }, 106ec537457cd2869e52b9b2c99e8c01dd96a9682e2Dianne Hackborn { "getRawWidthNative", "()I", 107ec537457cd2869e52b9b2c99e8c01dd96a9682e2Dianne Hackborn (void*)android_view_Display_getRawWidthNative }, 108ec537457cd2869e52b9b2c99e8c01dd96a9682e2Dianne Hackborn { "getRawHeightNative", "()I", 109ec537457cd2869e52b9b2c99e8c01dd96a9682e2Dianne Hackborn (void*)android_view_Display_getRawHeightNative }, 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "getOrientation", "()I", 11199aac7beca18b6d73e40db5e8e49f52f94be638eDianne Hackborn (void*)android_view_Display_getOrientation } 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid nativeClassInit(JNIEnv* env, jclass clazz) 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project offsets.display = env->GetFieldID(clazz, "mDisplay", "I"); 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project offsets.pixelFormat = env->GetFieldID(clazz, "mPixelFormat", "I"); 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project offsets.fps = env->GetFieldID(clazz, "mRefreshRate", "F"); 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project offsets.density = env->GetFieldID(clazz, "mDensity", "F"); 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project offsets.xdpi = env->GetFieldID(clazz, "mDpiX", "F"); 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project offsets.ydpi = env->GetFieldID(clazz, "mDpiY", "F"); 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint register_android_view_Display(JNIEnv* env) 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return AndroidRuntime::registerNativeMethods(env, 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project kClassPathName, gMethods, NELEM(gMethods)); 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 131