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 20000479f9e325b4e426a67033abd92d47da412725Mathias Agopian#include <surfaceflinger/SurfaceComposerClient.h> 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <ui/PixelFormat.h> 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <ui/DisplayInfo.h> 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "jni.h" 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <android_runtime/AndroidRuntime.h> 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/misc.h> 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android { 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct offsets_t { 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfieldID display; 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfieldID pixelFormat; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfieldID fps; 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfieldID density; 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfieldID xdpi; 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfieldID ydpi; 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic offsets_t offsets; 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void doThrow(JNIEnv* env, const char* exc, const char* msg = NULL) 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jclass npeClazz = env->FindClass(exc); 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ThrowNew(npeClazz, msg); 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_view_Display_init( 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JNIEnv* env, jobject clazz, jint dpy) 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DisplayInfo info; 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t err = SurfaceComposerClient::getDisplayInfo(DisplayID(dpy), &info); 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err < 0) { 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project doThrow(env, "java/lang/IllegalArgumentException"); 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->SetIntField(clazz, offsets.pixelFormat,info.pixelFormatInfo.format); 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->SetFloatField(clazz, offsets.fps, info.fps); 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->SetFloatField(clazz, offsets.density, info.density); 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->SetFloatField(clazz, offsets.xdpi, info.xdpi); 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->SetFloatField(clazz, offsets.ydpi, info.ydpi); 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint android_view_Display_getWidth( 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JNIEnv* env, jobject clazz) 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DisplayID dpy = env->GetIntField(clazz, offsets.display); 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return SurfaceComposerClient::getDisplayWidth(dpy); 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint android_view_Display_getHeight( 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JNIEnv* env, jobject clazz) 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DisplayID dpy = env->GetIntField(clazz, offsets.display); 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return SurfaceComposerClient::getDisplayHeight(dpy); 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint android_view_Display_getOrientation( 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JNIEnv* env, jobject clazz) 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DisplayID dpy = env->GetIntField(clazz, offsets.display); 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return SurfaceComposerClient::getDisplayOrientation(dpy); 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint android_view_Display_getDisplayCount( 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JNIEnv* env, jclass clazz) 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return SurfaceComposerClient::getNumberOfDisplays(); 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectconst char* const kClassPathName = "android/view/Display"; 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void nativeClassInit(JNIEnv* env, jclass clazz); 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNINativeMethod gMethods[] = { 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "nativeClassInit", "()V", 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (void*)nativeClassInit }, 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "getDisplayCount", "()I", 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (void*)android_view_Display_getDisplayCount }, 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "init", "(I)V", 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (void*)android_view_Display_init }, 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "getWidth", "()I", 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (void*)android_view_Display_getWidth }, 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "getHeight", "()I", 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (void*)android_view_Display_getHeight }, 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "getOrientation", "()I", 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (void*)android_view_Display_getOrientation } 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid nativeClassInit(JNIEnv* env, jclass clazz) 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project offsets.display = env->GetFieldID(clazz, "mDisplay", "I"); 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project offsets.pixelFormat = env->GetFieldID(clazz, "mPixelFormat", "I"); 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project offsets.fps = env->GetFieldID(clazz, "mRefreshRate", "F"); 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project offsets.density = env->GetFieldID(clazz, "mDensity", "F"); 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project offsets.xdpi = env->GetFieldID(clazz, "mDpiX", "F"); 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project offsets.ydpi = env->GetFieldID(clazz, "mDpiY", "F"); 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint register_android_view_Display(JNIEnv* env) 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return AndroidRuntime::registerNativeMethods(env, 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project kClassPathName, gMethods, NELEM(gMethods)); 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 134