android_view_Display.cpp revision 9066cfe9886ac131c34d59ed0e2d287b0e3c0087
1e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber/* 2e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * Copyright (C) 2007 The Android Open Source Project 3e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * 4e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 5e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * you may not use this file except in compliance with the License. 6e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * You may obtain a copy of the License at 7e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * 8e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 9e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * 10e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * Unless required by applicable law or agreed to in writing, software 11e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 12e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * See the License for the specific language governing permissions and 14e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * limitations under the License. 15e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber */ 16e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 17e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#include <stdio.h> 18e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#include <assert.h> 19e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 20e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#include <ui/SurfaceComposerClient.h> 21e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#include <ui/PixelFormat.h> 22e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#include <ui/DisplayInfo.h> 23e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 24e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#include "jni.h" 25e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#include <android_runtime/AndroidRuntime.h> 26e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#include <utils/misc.h> 27e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 28e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber// ---------------------------------------------------------------------------- 29e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 30e46b7be812d68e49710b34048662cbf18e2a6550Andreas Hubernamespace android { 31e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 32e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber// ---------------------------------------------------------------------------- 33e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 34e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberstruct offsets_t { 35e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber jfieldID display; 36e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber jfieldID pixelFormat; 37e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber jfieldID fps; 38e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber jfieldID density; 39e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber jfieldID xdpi; 40e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber jfieldID ydpi; 41e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber}; 42e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberstatic offsets_t offsets; 43e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 44e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberstatic void doThrow(JNIEnv* env, const char* exc, const char* msg = NULL) 45e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber{ 46e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber jclass npeClazz = env->FindClass(exc); 47e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber env->ThrowNew(npeClazz, msg); 48e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber} 49e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 50e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber// ---------------------------------------------------------------------------- 51e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 52e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberstatic void android_view_Display_init( 53e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber JNIEnv* env, jobject clazz, jint dpy) 54e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber{ 55e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber DisplayInfo info; 56e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber status_t err = SurfaceComposerClient::getDisplayInfo(DisplayID(dpy), &info); 57e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber if (err < 0) { 58e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber doThrow(env, "java/lang/IllegalArgumentException"); 59e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber return; 60e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber } 61e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber env->SetIntField(clazz, offsets.pixelFormat,info.pixelFormatInfo.format); 62e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber env->SetFloatField(clazz, offsets.fps, info.fps); 63e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber env->SetFloatField(clazz, offsets.density, info.density); 64e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber env->SetFloatField(clazz, offsets.xdpi, info.xdpi); 65e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber env->SetFloatField(clazz, offsets.ydpi, info.ydpi); 66e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber} 67e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 68e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberstatic jint android_view_Display_getWidth( 69e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber JNIEnv* env, jobject clazz) 70e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber{ 71e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber DisplayID dpy = env->GetIntField(clazz, offsets.display); 72e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber return SurfaceComposerClient::getDisplayWidth(dpy); 73e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber} 74e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 75e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberstatic jint android_view_Display_getHeight( 768a432776d003247c12222d8dd6a30ea4621aa2d0Andreas Huber JNIEnv* env, jobject clazz) 778a432776d003247c12222d8dd6a30ea4621aa2d0Andreas Huber{ 78e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber DisplayID dpy = env->GetIntField(clazz, offsets.display); 79e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber return SurfaceComposerClient::getDisplayHeight(dpy); 80e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber} 81e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 82e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberstatic jint android_view_Display_getOrientation( 83e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber JNIEnv* env, jobject clazz) 84e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber{ 85e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber DisplayID dpy = env->GetIntField(clazz, offsets.display); 86e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber return SurfaceComposerClient::getDisplayOrientation(dpy); 87e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber} 88e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 89e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberstatic jint android_view_Display_getDisplayCount( 90e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber JNIEnv* env, jclass clazz) 91e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber{ 92e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber return SurfaceComposerClient::getNumberOfDisplays(); 93e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber} 94e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 95e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber// ---------------------------------------------------------------------------- 96e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 97e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberconst char* const kClassPathName = "android/view/Display"; 98e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 99e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberstatic void nativeClassInit(JNIEnv* env, jclass clazz); 100e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 101e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberstatic JNINativeMethod gMethods[] = { 102e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber { "nativeClassInit", "()V", 103e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber (void*)nativeClassInit }, 104e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber { "getDisplayCount", "()I", 105e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber (void*)android_view_Display_getDisplayCount }, 106e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber { "init", "(I)V", 107e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber (void*)android_view_Display_init }, 108e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber { "getWidth", "()I", 109e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber (void*)android_view_Display_getWidth }, 110e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber { "getHeight", "()I", 111e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber (void*)android_view_Display_getHeight }, 112e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber { "getOrientation", "()I", 113e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber (void*)android_view_Display_getOrientation } 114e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber}; 115e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 116e46b7be812d68e49710b34048662cbf18e2a6550Andreas Hubervoid nativeClassInit(JNIEnv* env, jclass clazz) 117e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber{ 118e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber offsets.display = env->GetFieldID(clazz, "mDisplay", "I"); 119e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber offsets.pixelFormat = env->GetFieldID(clazz, "mPixelFormat", "I"); 120e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber offsets.fps = env->GetFieldID(clazz, "mRefreshRate", "F"); 121e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber offsets.density = env->GetFieldID(clazz, "mDensity", "F"); 122e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber offsets.xdpi = env->GetFieldID(clazz, "mDpiX", "F"); 123e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber offsets.ydpi = env->GetFieldID(clazz, "mDpiY", "F"); 124e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber} 125e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 126e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberint register_android_view_Display(JNIEnv* env) 127e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber{ 128e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber return AndroidRuntime::registerNativeMethods(env, 129e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber kClassPathName, gMethods, NELEM(gMethods)); 130e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber} 131e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 132e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber}; 133e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 134e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber