Skip to content

Commit

Permalink
Add SDL_GetDisplayDPI implementation on Android. (thanks Rachel!)
Browse files Browse the repository at this point in the history
  • Loading branch information
slouken committed Oct 31, 2017
1 parent 0e032d5 commit 4478707
Show file tree
Hide file tree
Showing 4 changed files with 42 additions and 1 deletion.
Expand Up @@ -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.*;
Expand Down Expand Up @@ -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.
*/
Expand Down
27 changes: 26 additions & 1 deletion src/core/android/SDL_android.c
Expand Up @@ -214,6 +214,7 @@ static jmethodID midClipboardGetText;
static jmethodID midClipboardHasText;
static jmethodID midOpenAPKExpansionInputStream;
static jmethodID midGetManifestEnvironmentVariable;
static jmethodID midGetDisplayDPI;

/* audio manager */
static jclass mAudioManagerClass;
Expand Down Expand Up @@ -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?");
}

Expand Down Expand Up @@ -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;
Expand Down
2 changes: 2 additions & 0 deletions src/core/android/SDL_android.h
Expand Up @@ -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);
Expand Down
9 changes: 9 additions & 0 deletions src/video/android/SDL_androidvideo.c
Expand Up @@ -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
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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)
{
Expand Down

0 comments on commit 4478707

Please sign in to comment.