浏览代码

love.window.getPixelScale now works properly on Android.

Jairo Luiz 12 年之前
父节点
当前提交
007b0fc3f0
共有 4 个文件被更改,包括 99 次插入1 次删除
  1. 1 0
      jni/love/Android.mk
  2. 48 0
      jni/love/src/common/android.cpp
  3. 43 0
      jni/love/src/common/android.h
  4. 7 1
      jni/love/src/modules/window/sdl/Window.cpp

+ 1 - 0
jni/love/Android.mk

@@ -16,6 +16,7 @@ LOCAL_C_INCLUDES  :=  \
 	${LOCAL_PATH}/src/libraries/ \
 	${LOCAL_PATH}/src/libraries/enet/libenet/include \
 	${LOCAL_PATH}/../SDL2-2.0.1/include \
+	${LOCAL_PATH}/../SDL2-2.0.1/src \
 	${LOCAL_PATH}/../devil-1.7.8/include \
 	${LOCAL_PATH}/../devil-1.7.8/src-IL/include \
 	${LOCAL_PATH}/../jasper-1.900.1/src/libjasper/include \

+ 48 - 0
jni/love/src/common/android.cpp

@@ -0,0 +1,48 @@
+/**
+ * Copyright (c) 2006-2014 LOVE Development Team
+ *
+ * This software is provided 'as-is', without any express or implied
+ * warranty.  In no event will the authors be held liable for any damages
+ * arising from the use of this software.
+ *
+ * Permission is granted to anyone to use this software for any purpose,
+ * including commercial applications, and to alter it and redistribute it
+ * freely, subject to the following restrictions:
+ *
+ * 1. The origin of this software must not be misrepresented; you must not
+ *    claim that you wrote the original software. If you use this software
+ *    in a product, an acknowledgment in the product documentation would be
+ *    appreciated but is not required.
+ * 2. Altered source versions must be plainly marked as such, and must not be
+ *    misrepresented as being the original software.
+ * 3. This notice may not be removed or altered from any source distribution.
+ **/
+
+#include "android.h"
+
+#ifdef LOVE_ANDROID
+
+// SDL
+#include "core/android/SDL_android.h"
+
+namespace love
+{
+namespace android
+{
+
+double getScreenScale()
+{
+  JNIEnv *env = Android_JNI_GetEnv();
+
+  jclass activity = env->FindClass("org/love2d/android/GameActivity");
+  jmethodID getMetrics = env->GetStaticMethodID(activity, "getMetrics", "()Landroid/util/DisplayMetrics;");
+  jobject metrics = env->CallStaticObjectMethod(activity, getMetrics);
+  jclass metricsClass = env->GetObjectClass(metrics);
+
+  return env->GetFloatField(metrics, env->GetFieldID(metricsClass, "density", "F"));
+}
+
+} // android
+} // love
+
+#endif // LOVE_ANDROID

+ 43 - 0
jni/love/src/common/android.h

@@ -0,0 +1,43 @@
+/**
+ * Copyright (c) 2006-2014 LOVE Development Team
+ *
+ * This software is provided 'as-is', without any express or implied
+ * warranty.  In no event will the authors be held liable for any damages
+ * arising from the use of this software.
+ *
+ * Permission is granted to anyone to use this software for any purpose,
+ * including commercial applications, and to alter it and redistribute it
+ * freely, subject to the following restrictions:
+ *
+ * 1. The origin of this software must not be misrepresented; you must not
+ *    claim that you wrote the original software. If you use this software
+ *    in a product, an acknowledgment in the product documentation would be
+ *    appreciated but is not required.
+ * 2. Altered source versions must be plainly marked as such, and must not be
+ *    misrepresented as being the original software.
+ * 3. This notice may not be removed or altered from any source distribution.
+ **/
+
+#ifndef LOVE_ANDROID_H
+#define LOVE_ANDROID_H
+
+#include "config.h"
+
+#ifdef LOVE_ANDROID
+
+namespace love
+{
+namespace android
+{
+
+/**
+ * Gets the scale factor of the window's screen, e.g. on Retina displays this
+ * will return 2.0.
+ **/
+double getScreenScale();
+
+} // android
+} // love
+
+#endif // LOVE_ANDROID
+#endif // LOVE_ANDROID_H

+ 7 - 1
jni/love/src/modules/window/sdl/Window.cpp

@@ -23,6 +23,10 @@
 #include "graphics/Graphics.h"
 #include "Window.h"
 
+#ifdef LOVE_ANDROID
+#include "common/android.h"
+#endif
+
 // C++
 #include <iostream>
 #include <vector>
@@ -671,7 +675,9 @@ double Window::getPixelScale() const
 {
 	double scale = 1.0;
 
-#if SDL_VERSION_ATLEAST(2,0,1)
+#ifdef LOVE_ANDROID
+	scale = love::android::getScreenScale();
+#elif SDL_VERSION_ATLEAST(2,0,1)
 	if (window)
 	{
 		int wheight;