From 4478707b0ae213bc2bcc02089c30f21954df5475 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Tue, 31 Oct 2017 13:49:59 -0700 Subject: [PATCH] Add SDL_GetDisplayDPI implementation on Android. (thanks Rachel!) --- .../main/java/org/libsdl/app/SDLActivity.java | 5 ++++ src/core/android/SDL_android.c | 27 ++++++++++++++++++- src/core/android/SDL_android.h | 2 ++ src/video/android/SDL_androidvideo.c | 9 +++++++ 4 files changed, 42 insertions(+), 1 deletion(-) diff --git a/android-project/app/src/main/java/org/libsdl/app/SDLActivity.java b/android-project/app/src/main/java/org/libsdl/app/SDLActivity.java index 176f07abca9c8..ae0bc811a0807 100644 --- a/android-project/app/src/main/java/org/libsdl/app/SDLActivity.java +++ b/android-project/app/src/main/java/org/libsdl/app/SDLActivity.java @@ -18,6 +18,7 @@ import android.widget.LinearLayout; import android.widget.TextView; import android.os.*; +import android.util.DisplayMetrics; import android.util.Log; import android.util.SparseArray; import android.graphics.*; @@ -613,6 +614,10 @@ public static Context getContext() { return SDL.getContext(); } + public static DisplayMetrics getDisplayDPI() { + return getContext().getResources().getDisplayMetrics(); + } + /** * This method is called by SDL using JNI. */ diff --git a/src/core/android/SDL_android.c b/src/core/android/SDL_android.c index 4fe6e8c929354..bfc1c7136f04b 100644 --- a/src/core/android/SDL_android.c +++ b/src/core/android/SDL_android.c @@ -214,6 +214,7 @@ static jmethodID midClipboardGetText; static jmethodID midClipboardHasText; static jmethodID midOpenAPKExpansionInputStream; static jmethodID midGetManifestEnvironmentVariable; +static jmethodID midGetDisplayDPI; /* audio manager */ static jclass mAudioManagerClass; @@ -316,11 +317,13 @@ JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(nativeSetupJNI)(JNIEnv* mEnv, jclass c midGetManifestEnvironmentVariable = (*mEnv)->GetStaticMethodID(mEnv, mActivityClass, "getManifestEnvironmentVariable", "(Ljava/lang/String;)Ljava/lang/String;"); + midGetDisplayDPI = (*mEnv)->GetStaticMethodID(mEnv, mActivityClass, "getDisplayDPI", "()Landroid/util/DisplayMetrics;"); + if (!midGetNativeSurface || !midSetActivityTitle || !midSetOrientation || !midGetContext || !midInputGetInputDeviceIds || !midSendMessage || !midShowTextInput || !midIsScreenKeyboardShown || !midClipboardSetText || !midClipboardGetText || !midClipboardHasText || - !midOpenAPKExpansionInputStream || !midGetManifestEnvironmentVariable) { + !midOpenAPKExpansionInputStream || !midGetManifestEnvironmentVariable || !midGetDisplayDPI) { __android_log_print(ANDROID_LOG_WARN, "SDL", "Missing some Java callbacks, do you have the latest version of SDLActivity.java?"); } @@ -1047,6 +1050,28 @@ int Android_JNI_OpenAudioDevice(int iscapture, int sampleRate, int is16Bit, int return audioBufferFrames; } +int Android_JNI_GetDisplayDPI(float *ddpi, float *xdpi, float *ydpi) +{ + JNIEnv *env = Android_JNI_GetEnv(); + + jobject jDisplayObj = (*env)->CallStaticObjectMethod(env, mActivityClass, midGetDisplayDPI); + jclass jDisplayClass = (*env)->GetObjectClass(env, jDisplayObj); + + jfieldID fidXdpi = (*env)->GetFieldID(env, jDisplayClass, "xdpi", "F"); + jfieldID fidYdpi = (*env)->GetFieldID(env, jDisplayClass, "ydpi", "F"); + jfieldID fidDdpi = (*env)->GetFieldID(env, jDisplayClass, "densityDpi", "I"); + + float nativeXdpi = (*env)->GetFloatField(env, jDisplayObj, fidXdpi); + float nativeYdpi = (*env)->GetFloatField(env, jDisplayObj, fidYdpi); + int nativeDdpi = (*env)->GetIntField(env, jDisplayObj, fidDdpi); + + *ddpi = (float)nativeDdpi; + *xdpi = nativeXdpi; + *ydpi = nativeYdpi; + + return 0; +} + void * Android_JNI_GetAudioBuffer(void) { return audioBufferPinned; diff --git a/src/core/android/SDL_android.h b/src/core/android/SDL_android.h index 1d7e81aa7e5a9..06d40e23a8c41 100644 --- a/src/core/android/SDL_android.h +++ b/src/core/android/SDL_android.h @@ -42,6 +42,8 @@ extern void Android_JNI_HideTextInput(void); extern SDL_bool Android_JNI_IsScreenKeyboardShown(void); extern ANativeWindow* Android_JNI_GetNativeWindow(void); +extern int Android_JNI_GetDisplayDPI(float *ddpi, float *xdpi, float *ydpi); + /* Audio support */ extern int Android_JNI_OpenAudioDevice(int iscapture, int sampleRate, int is16Bit, int channelCount, int desiredBufferFrames); extern void* Android_JNI_GetAudioBuffer(void); diff --git a/src/video/android/SDL_androidvideo.c b/src/video/android/SDL_androidvideo.c index bd7b1ae20348d..6ce825758b54b 100644 --- a/src/video/android/SDL_androidvideo.c +++ b/src/video/android/SDL_androidvideo.c @@ -47,6 +47,7 @@ /* Initialization/Query functions */ static int Android_VideoInit(_THIS); static void Android_VideoQuit(_THIS); +int Android_GetDisplayDPI(_THIS, SDL_VideoDisplay * display, float * ddpi, float * hdpi, float * vdpi); #include "../SDL_egl_c.h" #define Android_GLES_GetProcAddress SDL_EGL_GetProcAddress @@ -115,6 +116,8 @@ Android_CreateDevice(int devindex) device->VideoQuit = Android_VideoQuit; device->PumpEvents = Android_PumpEvents; + device->GetDisplayDPI = Android_GetDisplayDPI; + device->CreateSDLWindow = Android_CreateWindow; device->SetWindowTitle = Android_SetWindowTitle; device->DestroyWindow = Android_DestroyWindow; @@ -198,6 +201,12 @@ Android_VideoQuit(_THIS) Android_QuitTouch(); } +int +Android_GetDisplayDPI(_THIS, SDL_VideoDisplay * display, float * ddpi, float * hdpi, float * vdpi) +{ + return Android_JNI_GetDisplayDPI(ddpi, hdpi, vdpi); +} + void Android_SetScreenResolution(int width, int height, Uint32 format, float rate) {