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