Просмотр исходного кода

Updated LÖVE code to tag 11.2 (changeset 55dc225ee2)

Martin Felis 8 лет назад
Родитель
Сommit
0000c326a8
38 измененных файлов с 197 добавлено и 73 удалено
  1. 1 0
      love/build.gradle
  2. 2 2
      love/src/jni/love/.hg_archival.txt
  3. 1 0
      love/src/jni/love/.hgtags
  4. 18 1
      love/src/jni/love/CMakeLists.txt
  5. 18 0
      love/src/jni/love/changes.txt
  6. 1 1
      love/src/jni/love/extra/appveyor/appveyor.yml
  7. 1 1
      love/src/jni/love/extra/cmake/FindLuaJIT.cmake
  8. BIN
      love/src/jni/love/extra/windows/love.rc
  9. 2 1
      love/src/jni/love/platform/unix/configure.ac
  10. 2 2
      love/src/jni/love/platform/unix/debian/changelog.in
  11. 2 1
      love/src/jni/love/platform/unix/debian/control.in
  12. 3 0
      love/src/jni/love/platform/unix/deps.m4
  13. 1 1
      love/src/jni/love/platform/unix/love.6
  14. 1 1
      love/src/jni/love/platform/xcode/ios/love-ios.plist
  15. 7 3
      love/src/jni/love/platform/xcode/liblove.xcodeproj/project.pbxproj
  16. 7 1
      love/src/jni/love/platform/xcode/love.xcodeproj/project.pbxproj
  17. 1 1
      love/src/jni/love/platform/xcode/macosx/liblove-macosx.plist
  18. 1 1
      love/src/jni/love/platform/xcode/macosx/love-macosx.plist
  19. 36 3
      love/src/jni/love/src/common/Matrix.cpp
  20. 0 1
      love/src/jni/love/src/common/StringMap.cpp
  21. 0 1
      love/src/jni/love/src/common/StringMap.h
  22. 3 3
      love/src/jni/love/src/common/android.cpp
  23. 9 0
      love/src/jni/love/src/common/runtime.cpp
  24. 6 0
      love/src/jni/love/src/common/runtime.h
  25. 3 3
      love/src/jni/love/src/common/version.h
  26. 8 2
      love/src/jni/love/src/libraries/physfs/physfs_platform_windows.c
  27. 2 1
      love/src/jni/love/src/love.cpp
  28. 9 0
      love/src/jni/love/src/modules/audio/wrap_Source.cpp
  29. 1 1
      love/src/jni/love/src/modules/data/wrap_DataModule.cpp
  30. 1 0
      love/src/jni/love/src/modules/graphics/StreamBuffer.cpp
  31. 2 1
      love/src/jni/love/src/modules/graphics/StreamBuffer.h
  32. 1 1
      love/src/jni/love/src/modules/graphics/opengl/FenceSync.h
  33. 1 0
      love/src/jni/love/src/modules/graphics/opengl/Shader.cpp
  34. 4 33
      love/src/jni/love/src/modules/graphics/opengl/StreamBuffer.cpp
  35. 1 1
      love/src/jni/love/src/modules/graphics/wrap_Graphics.cpp
  36. 8 5
      love/src/jni/love/src/modules/joystick/sdl/JoystickModule.cpp
  37. 5 0
      love/src/jni/love/src/modules/mouse/sdl/Mouse.cpp
  38. 28 0
      love/src/jni/love/src/modules/physics/box2d/wrap_Body.cpp

+ 1 - 0
love/build.gradle

@@ -54,4 +54,5 @@ dependencies {
 
 
 repositories {
 repositories {
     google()
     google()
+    jcenter()
 }
 }

+ 2 - 2
love/src/jni/love/.hg_archival.txt

@@ -1,4 +1,4 @@
 repo: d362ae6ab7f5005b8dbc7cba9ce592637de60f99
 repo: d362ae6ab7f5005b8dbc7cba9ce592637de60f99
-node: 0ab246b5045d2e697a516fcc0f8b12496a2d5c78
+node: 55dc225ee239c15eff5751d35ca40252588abd92
 branch: default
 branch: default
-tag: 11.1
+tag: 11.2

+ 1 - 0
love/src/jni/love/.hgtags

@@ -12,3 +12,4 @@ a5e405cdf14d030b71d09a105086797942ae91a9 0.9.2
 3cb3559eebb89803c0b7fa83d51d8e48a2b20b7a 0.10.1
 3cb3559eebb89803c0b7fa83d51d8e48a2b20b7a 0.10.1
 afc69c4f714534c64e6f8c8660b724b5b736d7f3 0.10.2
 afc69c4f714534c64e6f8c8660b724b5b736d7f3 0.10.2
 bf8892ecbd07a10453c4bb36aa538b90a2830d2b 11.0
 bf8892ecbd07a10453c4bb36aa538b90a2830d2b 11.0
+0ab246b5045d2e697a516fcc0f8b12496a2d5c78 11.1

+ 18 - 1
love/src/jni/love/CMakeLists.txt

@@ -66,6 +66,10 @@ endif()
 
 
 message(STATUS "Target platform: ${LOVE_TARGET_PLATFORM}")
 message(STATUS "Target platform: ${LOVE_TARGET_PLATFORM}")
 
 
+if(POLICY CMP0072)
+	cmake_policy(SET CMP0072 NEW)
+endif()
+
 find_package(OpenGL)
 find_package(OpenGL)
 
 
 if(MEGA)
 if(MEGA)
@@ -174,6 +178,8 @@ Please see http://bitbucket.org/rude/megasource
 	find_package(SDL2 REQUIRED)
 	find_package(SDL2 REQUIRED)
 	find_package(Theora REQUIRED)
 	find_package(Theora REQUIRED)
 	find_package(Vorbis REQUIRED)
 	find_package(Vorbis REQUIRED)
+	find_package(ZLIB REQUIRED)
+	find_package(Ogg REQUIRED)
 
 
 	# required for enet
 	# required for enet
 	add_definitions(-D HAS_SOCKLEN_T)
 	add_definitions(-D HAS_SOCKLEN_T)
@@ -182,6 +188,11 @@ Please see http://bitbucket.org/rude/megasource
 		${SDL2_INCLUDE_DIR}
 		${SDL2_INCLUDE_DIR}
 		${FREETYPE_INCLUDE_DIRS}
 		${FREETYPE_INCLUDE_DIRS}
 		${VORBIS_INCLUDE_DIR}
 		${VORBIS_INCLUDE_DIR}
+		${OPENAL_INCLUDE_DIR}
+		${ZLIB_INCLUDE_DIRS}
+		${MODPLUG_INCLUDE_DIR}
+		${OGG_INCLUDE_DIR}
+		${THEORA_INCLUDE_DIR}
 	)
 	)
 
 
 	set(LOVE_LINK_LIBRARIES
 	set(LOVE_LINK_LIBRARIES
@@ -194,14 +205,20 @@ Please see http://bitbucket.org/rude/megasource
 		${THEORADEC_LIBRARY}
 		${THEORADEC_LIBRARY}
 		${VORBISFILE_LIBRARY}
 		${VORBISFILE_LIBRARY}
 		${LOVE_LUA_LIBRARY}
 		${LOVE_LUA_LIBRARY}
+		${OGG_LIBRARY}
+		${ZLIB_LIBRARY}
 	)
 	)
-	
+
 	if(LOVE_MPG123)
 	if(LOVE_MPG123)
 		find_package(MPG123 REQUIRED)
 		find_package(MPG123 REQUIRED)
 		set(LOVE_LINK_LIBRARIES
 		set(LOVE_LINK_LIBRARIES
 			${LOVE_LINK_LIBRARIES}
 			${LOVE_LINK_LIBRARIES}
 			${MPG123_LIBRARY}
 			${MPG123_LIBRARY}
 		)
 		)
+		set(LOVE_INCLUDE_DIRS
+			${LOVE_INCLUDE_DIRS}
+			${MPG123_INCLUDE_DIR}
+		)
 	endif()
 	endif()
 
 
 	if(LOVE_JIT)
 	if(LOVE_JIT)

+ 18 - 0
love/src/jni/love/changes.txt

@@ -1,3 +1,21 @@
+LOVE 11.2 [Mysterious Mysteries]
+--------------------------------
+
+Released: 2018-11-25
+
+* Added Source:setAirAbsorption and Source:getAirAbsorption.
+* Added Body:setTransform and Body:getTransform.
+
+* Improved performance of love.graphics.draw slightly on iOS and Android.
+
+* Fixed filesystem initialization on Windows 10 update 1809.
+* Fixed compatibility with Lua 5.2 and 5.3.
+* Fixed the explicit format + Data argument variant of love.data.decompress.
+* Fixed love.joystick.setGamepadMapping not being able to change existing mappings.
+* Fixed a crash on quit on Linux if a custom cursor is active when quitting.
+* Fixed a crash in the Data variant of Shader:send when it's called after love.window.setMode.
+* Fixed a love.graphics.setCanvas error message to be less confusing.
+
 LOVE 11.1 [Mysterious Mysteries]
 LOVE 11.1 [Mysterious Mysteries]
 --------------------------------
 --------------------------------
 
 

+ 1 - 1
love/src/jni/love/extra/appveyor/appveyor.yml

@@ -1,4 +1,4 @@
-version: 11.1.{build}
+version: 11.2.{build}
 
 
 image: Visual Studio 2013
 image: Visual Studio 2013
 
 

+ 1 - 1
love/src/jni/love/extra/cmake/FindLuaJIT.cmake

@@ -11,7 +11,7 @@ set(LUAJIT_SEARCH_PATHS
 
 
 find_path(LUAJIT_INCLUDE_DIR
 find_path(LUAJIT_INCLUDE_DIR
 	NAMES luajit.h
 	NAMES luajit.h
-	PATH_SUFFIXES include include/luajit-2.0
+	PATH_SUFFIXES include include/luajit-2.0 include/luajit-2.1
 	PATHS ${LUAJIT_SEARCH_PATHS})
 	PATHS ${LUAJIT_SEARCH_PATHS})
 
 
 find_library(LUAJIT_LIBRARY
 find_library(LUAJIT_LIBRARY

BIN
love/src/jni/love/extra/windows/love.rc


+ 2 - 1
love/src/jni/love/platform/unix/configure.ac

@@ -1,4 +1,4 @@
-AC_INIT([love], [11.1])
+AC_INIT([love], [11.2])
 AC_CONFIG_HEADERS([config.h])
 AC_CONFIG_HEADERS([config.h])
 AC_CONFIG_AUX_DIR([platform/unix])
 AC_CONFIG_AUX_DIR([platform/unix])
 AC_CONFIG_MACRO_DIR([platform/unix/m4])
 AC_CONFIG_MACRO_DIR([platform/unix/m4])
@@ -63,6 +63,7 @@ ACLOVE_DEP_LUA
 ACLOVE_DEP_SDL2
 ACLOVE_DEP_SDL2
 ACLOVE_DEP_LIBM
 ACLOVE_DEP_LIBM
 ACLOVE_DEP_ZLIB
 ACLOVE_DEP_ZLIB
+ACLOVE_DEP_PTHREAD
 
 
 # Conditional dependencies
 # Conditional dependencies
 AS_VAR_IF([enable_module_audio], [yes], [ACLOVE_DEP_OPENAL], [])
 AS_VAR_IF([enable_module_audio], [yes], [ACLOVE_DEP_OPENAL], [])

+ 2 - 2
love/src/jni/love/platform/unix/debian/changelog.in

@@ -1,5 +1,5 @@
-love@LOVE_SUFFIX@ (0.11.0~pre3420ppa3) trusty; urgency=medium
+love@LOVE_SUFFIX@ (11.2~pre3458ppa1) trusty; urgency=medium
 
 
   * Upstream testing release
   * Upstream testing release
 
 
- -- Bart van Strien <bart.bes@gmail.com>  Sat, 31 Mar 2018 13:50:30 +0200
+ -- Bart van Strien <bart.bes@gmail.com>  Tue, 10 Jul 2018 19:22:30 +0200

+ 2 - 1
love/src/jni/love/platform/unix/debian/control.in

@@ -35,7 +35,8 @@ Description: 2D game engine - runtime
 Package: love@LOVE_SUFFIX@
 Package: love@LOVE_SUFFIX@
 Architecture: any
 Architecture: any
 Depends: ${misc:Depends},
 Depends: ${misc:Depends},
-         ${shlibs:Depends}
+         ${shlibs:Depends},
+         liblove@LOVE_SUFFIX@0 (= ${binary:Version})
 Description: 2D game engine
 Description: 2D game engine
  LOVE is a free 2D game engine which enables easy game creation in Lua.
  LOVE is a free 2D game engine which enables easy game creation in Lua.
 
 

+ 3 - 0
love/src/jni/love/platform/unix/deps.m4

@@ -22,6 +22,9 @@ AC_DEFUN([ACLOVE_DEP_LIBM], [
 AC_DEFUN([ACLOVE_DEP_SDL2], [
 AC_DEFUN([ACLOVE_DEP_SDL2], [
 	AM_PATH_SDL2([], [], [LOVE_MSG_ERROR([SDL 2])])])
 	AM_PATH_SDL2([], [], [LOVE_MSG_ERROR([SDL 2])])])
 
 
+AC_DEFUN([ACLOVE_DEP_PTHREAD], [
+	AC_SEARCH_LIBS([pthread_create], [pthread], [], [LOVE_MSG_ERROR([the POSIX threads library])])])
+
 # does not use pkg-config because of the FILE_OFFSET_BITS.. bit
 # does not use pkg-config because of the FILE_OFFSET_BITS.. bit
 AC_DEFUN([ACLOVE_DEP_MPG123], [
 AC_DEFUN([ACLOVE_DEP_MPG123], [
 	AC_SEARCH_LIBS([mpg123_open_feed], [mpg123], [],
 	AC_SEARCH_LIBS([mpg123_open_feed], [mpg123], [],

+ 1 - 1
love/src/jni/love/platform/unix/love.6

@@ -12,7 +12,7 @@
 .\" 3. This notice may not be removed or altered from any source distribution.
 .\" 3. This notice may not be removed or altered from any source distribution.
 .Dd March 31, 2018
 .Dd March 31, 2018
 .Dt LOVE 6
 .Dt LOVE 6
-.Os LÖVE 11.1
+.Os LÖVE 11.2
 .Sh NAME
 .Sh NAME
 .Nm love
 .Nm love
 .Nd 2D game development framework
 .Nd 2D game development framework

+ 1 - 1
love/src/jni/love/platform/xcode/ios/love-ios.plist

@@ -40,7 +40,7 @@
 	<key>CFBundlePackageType</key>
 	<key>CFBundlePackageType</key>
 	<string>APPL</string>
 	<string>APPL</string>
 	<key>CFBundleShortVersionString</key>
 	<key>CFBundleShortVersionString</key>
-	<string>11.1</string>
+	<string>11.2</string>
 	<key>CFBundleSignature</key>
 	<key>CFBundleSignature</key>
 	<string>????</string>
 	<string>????</string>
 	<key>CFBundleVersion</key>
 	<key>CFBundleVersion</key>

+ 7 - 3
love/src/jni/love/platform/xcode/liblove.xcodeproj/project.pbxproj

@@ -1081,7 +1081,6 @@
 		FADF543D1E3DAFF700012CC0 /* wrap_Graphics.h in Headers */ = {isa = PBXBuildFile; fileRef = FADF543A1E3DAFF700012CC0 /* wrap_Graphics.h */; };
 		FADF543D1E3DAFF700012CC0 /* wrap_Graphics.h in Headers */ = {isa = PBXBuildFile; fileRef = FADF543A1E3DAFF700012CC0 /* wrap_Graphics.h */; };
 		FAE272521C05A15B00A67640 /* ParticleSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAE272501C05A15B00A67640 /* ParticleSystem.cpp */; };
 		FAE272521C05A15B00A67640 /* ParticleSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAE272501C05A15B00A67640 /* ParticleSystem.cpp */; };
 		FAE272531C05A15B00A67640 /* ParticleSystem.h in Headers */ = {isa = PBXBuildFile; fileRef = FAE272511C05A15B00A67640 /* ParticleSystem.h */; };
 		FAE272531C05A15B00A67640 /* ParticleSystem.h in Headers */ = {isa = PBXBuildFile; fileRef = FAE272511C05A15B00A67640 /* ParticleSystem.h */; };
-		FAE64A7E2071359C00BC7981 /* libfreetype.a in Frameworks */ = {isa = PBXBuildFile; fileRef = FAE64A7D2071359C00BC7981 /* libfreetype.a */; };
 		FAE64A7F207135AD00BC7981 /* libfreetype.a in Frameworks */ = {isa = PBXBuildFile; fileRef = FAE64A7D2071359C00BC7981 /* libfreetype.a */; };
 		FAE64A7F207135AD00BC7981 /* libfreetype.a in Frameworks */ = {isa = PBXBuildFile; fileRef = FAE64A7D2071359C00BC7981 /* libfreetype.a */; };
 		FAE64A802071362A00BC7981 /* physfs_archiver_7z.c in Sources */ = {isa = PBXBuildFile; fileRef = FAC7CD5D1FE35E95006A60C7 /* physfs_archiver_7z.c */; };
 		FAE64A802071362A00BC7981 /* physfs_archiver_7z.c in Sources */ = {isa = PBXBuildFile; fileRef = FAC7CD5D1FE35E95006A60C7 /* physfs_archiver_7z.c */; };
 		FAE64A812071363100BC7981 /* physfs_archiver_dir.c in Sources */ = {isa = PBXBuildFile; fileRef = FAC7CD6C1FE35E95006A60C7 /* physfs_archiver_dir.c */; };
 		FAE64A812071363100BC7981 /* physfs_archiver_dir.c in Sources */ = {isa = PBXBuildFile; fileRef = FAC7CD6C1FE35E95006A60C7 /* physfs_archiver_dir.c */; };
@@ -2079,7 +2078,6 @@
 				FA9B4A0816E1578300074F42 /* SDL2.framework in Frameworks */,
 				FA9B4A0816E1578300074F42 /* SDL2.framework in Frameworks */,
 				FAAFF04416CB11C700CCDE45 /* OpenAL-Soft.framework in Frameworks */,
 				FAAFF04416CB11C700CCDE45 /* OpenAL-Soft.framework in Frameworks */,
 				FAD43ECC1FF312D800831BB8 /* freetype.framework in Frameworks */,
 				FAD43ECC1FF312D800831BB8 /* freetype.framework in Frameworks */,
-				FAE64A7E2071359C00BC7981 /* libfreetype.a in Frameworks */,
 				FA577AB016C7507900860150 /* Cocoa.framework in Frameworks */,
 				FA577AB016C7507900860150 /* Cocoa.framework in Frameworks */,
 				FA577AC516C7513400860150 /* libmodplug.framework in Frameworks */,
 				FA577AC516C7513400860150 /* libmodplug.framework in Frameworks */,
 				FA577AC716C7513A00860150 /* mpg123.framework in Frameworks */,
 				FA577AC716C7513A00860150 /* mpg123.framework in Frameworks */,
@@ -4125,7 +4123,7 @@
 		08FB7793FE84155DC02AAC07 /* Project object */ = {
 		08FB7793FE84155DC02AAC07 /* Project object */ = {
 			isa = PBXProject;
 			isa = PBXProject;
 			attributes = {
 			attributes = {
-				LastUpgradeCheck = 0920;
+				LastUpgradeCheck = 1000;
 				TargetAttributes = {
 				TargetAttributes = {
 					FA0B78DC1A958B90000E1D17 = {
 					FA0B78DC1A958B90000E1D17 = {
 						CreatedOnToolsVersion = 6.1.1;
 						CreatedOnToolsVersion = 6.1.1;
@@ -4966,12 +4964,14 @@
 				CLANG_WARN_BOOL_CONVERSION = YES;
 				CLANG_WARN_BOOL_CONVERSION = YES;
 				CLANG_WARN_COMMA = NO;
 				CLANG_WARN_COMMA = NO;
 				CLANG_WARN_CONSTANT_CONVERSION = YES;
 				CLANG_WARN_CONSTANT_CONVERSION = YES;
+				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
 				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
 				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
 				CLANG_WARN_EMPTY_BODY = YES;
 				CLANG_WARN_EMPTY_BODY = YES;
 				CLANG_WARN_ENUM_CONVERSION = YES;
 				CLANG_WARN_ENUM_CONVERSION = YES;
 				CLANG_WARN_INFINITE_RECURSION = YES;
 				CLANG_WARN_INFINITE_RECURSION = YES;
 				CLANG_WARN_INT_CONVERSION = YES;
 				CLANG_WARN_INT_CONVERSION = YES;
 				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
 				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
 				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
 				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
 				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
 				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
 				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
 				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
@@ -5026,12 +5026,14 @@
 				CLANG_WARN_BOOL_CONVERSION = YES;
 				CLANG_WARN_BOOL_CONVERSION = YES;
 				CLANG_WARN_COMMA = NO;
 				CLANG_WARN_COMMA = NO;
 				CLANG_WARN_CONSTANT_CONVERSION = YES;
 				CLANG_WARN_CONSTANT_CONVERSION = YES;
+				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
 				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
 				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
 				CLANG_WARN_EMPTY_BODY = YES;
 				CLANG_WARN_EMPTY_BODY = YES;
 				CLANG_WARN_ENUM_CONVERSION = YES;
 				CLANG_WARN_ENUM_CONVERSION = YES;
 				CLANG_WARN_INFINITE_RECURSION = YES;
 				CLANG_WARN_INFINITE_RECURSION = YES;
 				CLANG_WARN_INT_CONVERSION = YES;
 				CLANG_WARN_INT_CONVERSION = YES;
 				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
 				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
 				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
 				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
 				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
 				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
 				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
 				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
@@ -5214,12 +5216,14 @@
 				CLANG_WARN_BOOL_CONVERSION = YES;
 				CLANG_WARN_BOOL_CONVERSION = YES;
 				CLANG_WARN_COMMA = NO;
 				CLANG_WARN_COMMA = NO;
 				CLANG_WARN_CONSTANT_CONVERSION = YES;
 				CLANG_WARN_CONSTANT_CONVERSION = YES;
+				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
 				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
 				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
 				CLANG_WARN_EMPTY_BODY = YES;
 				CLANG_WARN_EMPTY_BODY = YES;
 				CLANG_WARN_ENUM_CONVERSION = YES;
 				CLANG_WARN_ENUM_CONVERSION = YES;
 				CLANG_WARN_INFINITE_RECURSION = YES;
 				CLANG_WARN_INFINITE_RECURSION = YES;
 				CLANG_WARN_INT_CONVERSION = YES;
 				CLANG_WARN_INT_CONVERSION = YES;
 				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
 				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
 				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
 				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
 				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
 				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
 				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
 				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;

+ 7 - 1
love/src/jni/love/platform/xcode/love.xcodeproj/project.pbxproj

@@ -326,7 +326,7 @@
 		29B97313FDCFA39411CA2CEA /* Project object */ = {
 		29B97313FDCFA39411CA2CEA /* Project object */ = {
 			isa = PBXProject;
 			isa = PBXProject;
 			attributes = {
 			attributes = {
-				LastUpgradeCheck = 0920;
+				LastUpgradeCheck = 1000;
 				TargetAttributes = {
 				TargetAttributes = {
 					FA0B7F051A95AAF3000E1D17 = {
 					FA0B7F051A95AAF3000E1D17 = {
 						CreatedOnToolsVersion = 6.1.1;
 						CreatedOnToolsVersion = 6.1.1;
@@ -503,11 +503,13 @@
 				CLANG_WARN_BOOL_CONVERSION = YES;
 				CLANG_WARN_BOOL_CONVERSION = YES;
 				CLANG_WARN_COMMA = YES;
 				CLANG_WARN_COMMA = YES;
 				CLANG_WARN_CONSTANT_CONVERSION = YES;
 				CLANG_WARN_CONSTANT_CONVERSION = YES;
+				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
 				CLANG_WARN_EMPTY_BODY = YES;
 				CLANG_WARN_EMPTY_BODY = YES;
 				CLANG_WARN_ENUM_CONVERSION = YES;
 				CLANG_WARN_ENUM_CONVERSION = YES;
 				CLANG_WARN_INFINITE_RECURSION = YES;
 				CLANG_WARN_INFINITE_RECURSION = YES;
 				CLANG_WARN_INT_CONVERSION = YES;
 				CLANG_WARN_INT_CONVERSION = YES;
 				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
 				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
 				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
 				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
 				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
 				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
 				CLANG_WARN_STRICT_PROTOTYPES = YES;
 				CLANG_WARN_STRICT_PROTOTYPES = YES;
@@ -580,11 +582,13 @@
 				CLANG_WARN_BOOL_CONVERSION = YES;
 				CLANG_WARN_BOOL_CONVERSION = YES;
 				CLANG_WARN_COMMA = YES;
 				CLANG_WARN_COMMA = YES;
 				CLANG_WARN_CONSTANT_CONVERSION = YES;
 				CLANG_WARN_CONSTANT_CONVERSION = YES;
+				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
 				CLANG_WARN_EMPTY_BODY = YES;
 				CLANG_WARN_EMPTY_BODY = YES;
 				CLANG_WARN_ENUM_CONVERSION = YES;
 				CLANG_WARN_ENUM_CONVERSION = YES;
 				CLANG_WARN_INFINITE_RECURSION = YES;
 				CLANG_WARN_INFINITE_RECURSION = YES;
 				CLANG_WARN_INT_CONVERSION = YES;
 				CLANG_WARN_INT_CONVERSION = YES;
 				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
 				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
 				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
 				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
 				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
 				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
 				CLANG_WARN_STRICT_PROTOTYPES = YES;
 				CLANG_WARN_STRICT_PROTOTYPES = YES;
@@ -806,11 +810,13 @@
 				CLANG_WARN_BOOL_CONVERSION = YES;
 				CLANG_WARN_BOOL_CONVERSION = YES;
 				CLANG_WARN_COMMA = YES;
 				CLANG_WARN_COMMA = YES;
 				CLANG_WARN_CONSTANT_CONVERSION = YES;
 				CLANG_WARN_CONSTANT_CONVERSION = YES;
+				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
 				CLANG_WARN_EMPTY_BODY = YES;
 				CLANG_WARN_EMPTY_BODY = YES;
 				CLANG_WARN_ENUM_CONVERSION = YES;
 				CLANG_WARN_ENUM_CONVERSION = YES;
 				CLANG_WARN_INFINITE_RECURSION = YES;
 				CLANG_WARN_INFINITE_RECURSION = YES;
 				CLANG_WARN_INT_CONVERSION = YES;
 				CLANG_WARN_INT_CONVERSION = YES;
 				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
 				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
 				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
 				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
 				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
 				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
 				CLANG_WARN_STRICT_PROTOTYPES = YES;
 				CLANG_WARN_STRICT_PROTOTYPES = YES;

+ 1 - 1
love/src/jni/love/platform/xcode/macosx/liblove-macosx.plist

@@ -17,7 +17,7 @@
 	<key>CFBundlePackageType</key>
 	<key>CFBundlePackageType</key>
 	<string>FMWK</string>
 	<string>FMWK</string>
 	<key>CFBundleShortVersionString</key>
 	<key>CFBundleShortVersionString</key>
-	<string>11.1</string>
+	<string>11.2</string>
 	<key>CFBundleSignature</key>
 	<key>CFBundleSignature</key>
 	<string>LoVe</string>
 	<string>LoVe</string>
 	<key>NSPrincipalClass</key>
 	<key>NSPrincipalClass</key>

+ 1 - 1
love/src/jni/love/platform/xcode/macosx/love-macosx.plist

@@ -62,7 +62,7 @@
 	<key>CFBundlePackageType</key>
 	<key>CFBundlePackageType</key>
 	<string>APPL</string>
 	<string>APPL</string>
 	<key>CFBundleShortVersionString</key>
 	<key>CFBundleShortVersionString</key>
-	<string>11.1</string>
+	<string>11.2</string>
 	<key>CFBundleSignature</key>
 	<key>CFBundleSignature</key>
 	<string>LoVe</string>
 	<string>LoVe</string>
 	<key>LSApplicationCategoryType</key>
 	<key>LSApplicationCategoryType</key>

+ 36 - 3
love/src/jni/love/src/common/Matrix.cpp

@@ -29,6 +29,10 @@
 #include <xmmintrin.h>
 #include <xmmintrin.h>
 #endif
 #endif
 
 
+#if defined(LOVE_SIMD_NEON)
+#include <arm_neon.h>
+#endif
+
 namespace love
 namespace love
 {
 {
 
 
@@ -43,9 +47,6 @@ namespace love
 
 
 void Matrix4::multiply(const Matrix4 &a, const Matrix4 &b, float t[16])
 void Matrix4::multiply(const Matrix4 &a, const Matrix4 &b, float t[16])
 {
 {
-	// NOTE: in my testing with ARM NEON instructions (on an iPhone 6 with arm64)
-	// it performed slightly worse than the regular add/multiply code. Further
-	// investigation would be useful.
 #if defined(LOVE_SIMD_SSE)
 #if defined(LOVE_SIMD_SSE)
 
 
 	// We can't guarantee 16-bit alignment (e.g. for heap-allocated Matrix4
 	// We can't guarantee 16-bit alignment (e.g. for heap-allocated Matrix4
@@ -70,6 +71,38 @@ void Matrix4::multiply(const Matrix4 &a, const Matrix4 &b, float t[16])
 		_mm_storeu_ps(&t[4*i], col);
 		_mm_storeu_ps(&t[4*i], col);
 	}
 	}
 
 
+#elif defined(LOVE_SIMD_NEON)
+
+	float32x4_t cola1 = vld1q_f32(&a.e[0]);
+	float32x4_t cola2 = vld1q_f32(&a.e[4]);
+	float32x4_t cola3 = vld1q_f32(&a.e[8]);
+	float32x4_t cola4 = vld1q_f32(&a.e[12]);
+
+	float32x4_t col1 = vmulq_n_f32(cola1, b.e[0]);
+	col1 = vmlaq_n_f32(col1, cola2, b.e[1]);
+	col1 = vmlaq_n_f32(col1, cola3, b.e[2]);
+	col1 = vmlaq_n_f32(col1, cola4, b.e[3]);
+
+	float32x4_t col2 = vmulq_n_f32(cola1, b.e[4]);
+	col2 = vmlaq_n_f32(col2, cola2, b.e[5]);
+	col2 = vmlaq_n_f32(col2, cola3, b.e[6]);
+	col2 = vmlaq_n_f32(col2, cola4, b.e[7]);
+
+	float32x4_t col3 = vmulq_n_f32(cola1, b.e[8]);
+	col3 = vmlaq_n_f32(col3, cola2, b.e[9]);
+	col3 = vmlaq_n_f32(col3, cola3, b.e[10]);
+	col3 = vmlaq_n_f32(col3, cola4, b.e[11]);
+
+	float32x4_t col4 = vmulq_n_f32(cola1, b.e[12]);
+	col4 = vmlaq_n_f32(col4, cola2, b.e[13]);
+	col4 = vmlaq_n_f32(col4, cola3, b.e[14]);
+	col4 = vmlaq_n_f32(col4, cola4, b.e[15]);
+
+	vst1q_f32(&t[0], col1);
+	vst1q_f32(&t[4], col2);
+	vst1q_f32(&t[8], col3);
+	vst1q_f32(&t[12], col4);
+
 #else
 #else
 
 
 	t[0]  = (a.e[0]*b.e[0])  + (a.e[4]*b.e[1])  + (a.e[8]*b.e[2])  + (a.e[12]*b.e[3]);
 	t[0]  = (a.e[0]*b.e[0])  + (a.e[4]*b.e[1])  + (a.e[8]*b.e[2])  + (a.e[12]*b.e[3]);

+ 0 - 1
love/src/jni/love/src/common/StringMap.cpp

@@ -22,4 +22,3 @@
 
 
 // See the header
 // See the header
 template class std::vector<std::string>;
 template class std::vector<std::string>;
-template decltype(std::vector<std::string>().emplace_back("")) std::vector<std::string>::emplace_back<const char *const&>(const char *const&);

+ 0 - 1
love/src/jni/love/src/common/StringMap.h

@@ -30,7 +30,6 @@
 // getNames(), we end up with multiple copies in the object files. This
 // getNames(), we end up with multiple copies in the object files. This
 // declaration means we only emit it once (in StringMap.cpp).
 // declaration means we only emit it once (in StringMap.cpp).
 extern template class std::vector<std::string>;
 extern template class std::vector<std::string>;
-extern template decltype(std::vector<std::string>().emplace_back("")) std::vector<std::string>::emplace_back<const char *const&>(const char *const&);
 
 
 namespace love
 namespace love
 {
 {

+ 3 - 3
love/src/jni/love/src/common/android.cpp

@@ -123,14 +123,14 @@ bool openURL(const std::string &url)
 	JNIEnv *env = (JNIEnv*) SDL_AndroidGetJNIEnv();
 	JNIEnv *env = (JNIEnv*) SDL_AndroidGetJNIEnv();
 	jclass activity = env->FindClass("org/love2d/android/GameActivity");
 	jclass activity = env->FindClass("org/love2d/android/GameActivity");
 
 
-	jmethodID openURL= env->GetStaticMethodID(activity, "openURL", "(Ljava/lang/String;)V");
+	jmethodID openURL = env->GetStaticMethodID(activity, "openURL", "(Ljava/lang/String;)Z");
 	jstring url_jstring = (jstring) env->NewStringUTF(url.c_str());
 	jstring url_jstring = (jstring) env->NewStringUTF(url.c_str());
 
 
-	env->CallStaticVoidMethod(activity, openURL, url_jstring);
+	jboolean result = env->CallStaticBooleanMethod(activity, openURL, url_jstring);
 
 
 	env->DeleteLocalRef(url_jstring);
 	env->DeleteLocalRef(url_jstring);
 	env->DeleteLocalRef(activity);
 	env->DeleteLocalRef(activity);
-	return true;
+	return result;
 }
 }
 
 
 void vibrate(double seconds)
 void vibrate(double seconds)

+ 9 - 0
love/src/jni/love/src/common/runtime.cpp

@@ -879,4 +879,13 @@ Type *luax_type(lua_State *L, int idx)
 	return Type::byName(luaL_checkstring(L, idx));
 	return Type::byName(luaL_checkstring(L, idx));
 }
 }
 
 
+int luax_resume(lua_State *L, int nargs)
+{
+#if LUA_VERSION_NUM >= 502
+	return lua_resume(L, nullptr, nargs);
+#else
+	return lua_resume(L, nargs);
+#endif
+}
+
 } // love
 } // love

+ 6 - 0
love/src/jni/love/src/common/runtime.h

@@ -676,6 +676,12 @@ int luax_catchexcept(lua_State *L, const T& func, const F& finallyfunc)
 	return 0;
 	return 0;
 }
 }
 
 
+/**
+ * Compatibility shim for lua_resume
+ * Exported because it's used in the launcher
+ **/
+LOVE_EXPORT int luax_resume(lua_State *L, int nargs);
+
 } // love
 } // love
 
 
 #endif // LOVE_RUNTIME_H
 #endif // LOVE_RUNTIME_H

+ 3 - 3
love/src/jni/love/src/common/version.h

@@ -25,12 +25,12 @@ namespace love
 {
 {
 
 
 // Version stuff.
 // Version stuff.
-#define LOVE_VERSION_STRING "11.1"
+#define LOVE_VERSION_STRING "11.2"
 static const int VERSION_MAJOR = 11;
 static const int VERSION_MAJOR = 11;
-static const int VERSION_MINOR = 1;
+static const int VERSION_MINOR = 2;
 static const int VERSION_REV = 0;
 static const int VERSION_REV = 0;
 static const char *VERSION = LOVE_VERSION_STRING;
 static const char *VERSION = LOVE_VERSION_STRING;
-static const char *VERSION_COMPATIBILITY[] =  { VERSION, "11.0", 0 };
+static const char *VERSION_COMPATIBILITY[] =  { VERSION, "11.0", "11.1", 0 };
 static const char *VERSION_CODENAME = "Mysterious Mysteries";
 static const char *VERSION_CODENAME = "Mysterious Mysteries";
 
 
 } // love
 } // love

+ 8 - 2
love/src/jni/love/src/libraries/physfs/physfs_platform_windows.c

@@ -566,7 +566,6 @@ char *__PHYSFS_platformCalcUserDir(void)
     else
     else
     {
     {
         DWORD psize = 0;
         DWORD psize = 0;
-        WCHAR dummy = 0;
         LPWSTR wstr = NULL;
         LPWSTR wstr = NULL;
         BOOL rc = 0;
         BOOL rc = 0;
 
 
@@ -575,7 +574,14 @@ char *__PHYSFS_platformCalcUserDir(void)
          *  psize. Also note that the second parameter can't be
          *  psize. Also note that the second parameter can't be
          *  NULL or the function fails.
          *  NULL or the function fails.
          */
          */
-        rc = pGetDir(accessToken, &dummy, &psize);
+        /*
+         *  EDIT: (03.10.2018) after Windows 10 Update 1809 psize will be zero 
+         *  if something other than NULL is passed for the second argument.
+         *  Passing NULL now makes GetUserProfileDirectoryW fail (rc == 0)
+         *  and psize receives the correct user directory length.
+         *  It seems to work fine on Windows 7 and Windows 10 Update 1803 too
+         */
+        rc = pGetDir(accessToken, NULL, &psize);
         GOTO_IF(rc, PHYSFS_ERR_OS_ERROR, done);  /* should have failed! */
         GOTO_IF(rc, PHYSFS_ERR_OS_ERROR, done);  /* should have failed! */
 
 
         /* Allocate memory for the profile directory */
         /* Allocate memory for the profile directory */

+ 2 - 1
love/src/jni/love/src/love.cpp

@@ -19,6 +19,7 @@
  **/
  **/
 
 
 #include "common/version.h"
 #include "common/version.h"
+#include "common/runtime.h"
 #include "modules/love/love.h"
 #include "modules/love/love.h"
 #include <SDL.h>
 #include <SDL.h>
 
 
@@ -214,7 +215,7 @@ static DoneAction runlove(int argc, char **argv, int &retval)
 	lua_newthread(L);
 	lua_newthread(L);
 	lua_pushvalue(L, -2);
 	lua_pushvalue(L, -2);
 	int stackpos = lua_gettop(L);
 	int stackpos = lua_gettop(L);
-	while (lua_resume(L, 0) == LUA_YIELD)
+	while (love::luax_resume(L, 0) == LUA_YIELD)
 		lua_pop(L, lua_gettop(L) - stackpos);
 		lua_pop(L, lua_gettop(L) - stackpos);
 
 
 	retval = 0;
 	retval = 0;

+ 9 - 0
love/src/jni/love/src/modules/audio/wrap_Source.cpp

@@ -338,6 +338,13 @@ int w_Source_setAirAbsorption(lua_State *L)
 	return 0;
 	return 0;
 }
 }
 
 
+int w_Source_getAirAbsorption(lua_State *L)
+{
+	Source *t = luax_checksource(L, 1);
+	luax_catchexcept(L, [&](){ lua_pushnumber(L, t->getAirAbsorptionFactor()); });
+	return 1;
+}
+
 int w_Source_getChannelCount(lua_State *L)
 int w_Source_getChannelCount(lua_State *L)
 {
 {
 	Source *t = luax_checksource(L, 1);
 	Source *t = luax_checksource(L, 1);
@@ -628,6 +635,8 @@ static const luaL_Reg w_Source_functions[] =
 	{ "getAttenuationDistances", w_Source_getAttenuationDistances },
 	{ "getAttenuationDistances", w_Source_getAttenuationDistances },
 	{ "setRolloff", w_Source_setRolloff },
 	{ "setRolloff", w_Source_setRolloff },
 	{ "getRolloff", w_Source_getRolloff },
 	{ "getRolloff", w_Source_getRolloff },
+	{ "setAirAbsorption", w_Source_setAirAbsorption },
+	{ "getAirAbsorption", w_Source_getAirAbsorption },
 
 
 	{ "getChannelCount", w_Source_getChannelCount },
 	{ "getChannelCount", w_Source_getChannelCount },
 
 

+ 1 - 1
love/src/jni/love/src/modules/data/wrap_DataModule.cpp

@@ -171,7 +171,7 @@ int w_decompress(lua_State *L)
 
 
 		if (luax_istype(L, 3, Data::type))
 		if (luax_istype(L, 3, Data::type))
 		{
 		{
-			Data *data = luax_checktype<Data>(L, 2);
+			Data *data = luax_checktype<Data>(L, 3);
 			cbytes = (const char *) data->getData();
 			cbytes = (const char *) data->getData();
 			compressedsize = data->getSize();
 			compressedsize = data->getSize();
 		}
 		}

+ 1 - 0
love/src/jni/love/src/modules/graphics/StreamBuffer.cpp

@@ -28,6 +28,7 @@ namespace graphics
 
 
 StreamBuffer::StreamBuffer(BufferType mode, size_t size)
 StreamBuffer::StreamBuffer(BufferType mode, size_t size)
 	: bufferSize(size)
 	: bufferSize(size)
+	, frameGPUReadOffset(0)
 	, mode(mode)
 	, mode(mode)
 {
 {
 }
 }

+ 2 - 1
love/src/jni/love/src/modules/graphics/StreamBuffer.h

@@ -54,8 +54,8 @@ public:
 
 
 	size_t getSize() const { return bufferSize; }
 	size_t getSize() const { return bufferSize; }
 	BufferType getMode() const { return mode; }
 	BufferType getMode() const { return mode; }
+	size_t getUsableSize() const { return bufferSize - frameGPUReadOffset; }
 
 
-	virtual size_t getUsableSize() const = 0;
 	virtual MapInfo map(size_t minsize) = 0;
 	virtual MapInfo map(size_t minsize) = 0;
 	virtual size_t unmap(size_t usedsize) = 0;
 	virtual size_t unmap(size_t usedsize) = 0;
 	virtual void markUsed(size_t usedsize) = 0;
 	virtual void markUsed(size_t usedsize) = 0;
@@ -67,6 +67,7 @@ protected:
 	StreamBuffer(BufferType mode, size_t size);
 	StreamBuffer(BufferType mode, size_t size);
 
 
 	size_t bufferSize;
 	size_t bufferSize;
+	size_t frameGPUReadOffset;
 	BufferType mode;
 	BufferType mode;
 
 
 }; // StreamBuffer
 }; // StreamBuffer

+ 1 - 1
love/src/jni/love/src/modules/graphics/opengl/FenceSync.h

@@ -38,7 +38,7 @@ class FenceSync
 {
 {
 public:
 public:
 
 
-	FenceSync() {}
+	FenceSync() : sync(0) {}
 	~FenceSync();
 	~FenceSync();
 
 
 	bool fence();
 	bool fence();

+ 1 - 0
love/src/jni/love/src/modules/graphics/opengl/Shader.cpp

@@ -148,6 +148,7 @@ void Shader::mapActiveUniforms()
 		if (oldu != olduniforms.end())
 		if (oldu != olduniforms.end())
 		{
 		{
 			u.data = oldu->second.data;
 			u.data = oldu->second.data;
+			u.dataSize = oldu->second.dataSize;
 			u.textures = oldu->second.textures;
 			u.textures = oldu->second.textures;
 
 
 			updateUniform(&u, u.count, true);
 			updateUniform(&u, u.count, true);

+ 4 - 33
love/src/jni/love/src/modules/graphics/opengl/StreamBuffer.cpp

@@ -62,11 +62,6 @@ public:
 		delete[] data;
 		delete[] data;
 	}
 	}
 
 
-	size_t getUsableSize() const override
-	{
-		return bufferSize;
-	}
-
 	MapInfo map(size_t /*minsize*/) override
 	MapInfo map(size_t /*minsize*/) override
 	{
 	{
 		return MapInfo(data, bufferSize);
 		return MapInfo(data, bufferSize);
@@ -96,7 +91,6 @@ public:
 		, glMode(OpenGL::getGLBufferType(mode))
 		, glMode(OpenGL::getGLBufferType(mode))
 		, data(nullptr)
 		, data(nullptr)
 		, offset(0)
 		, offset(0)
-		, frameOffset(0)
 	{
 	{
 		try
 		try
 		{
 		{
@@ -116,17 +110,12 @@ public:
 		delete[] data;
 		delete[] data;
 	}
 	}
 
 
-	size_t getUsableSize() const override
-	{
-		return bufferSize - frameOffset;
-	}
-
 	MapInfo map(size_t minsize) override
 	MapInfo map(size_t minsize) override
 	{
 	{
 		if (offset + minsize > bufferSize)
 		if (offset + minsize > bufferSize)
 		{
 		{
 			offset = 0;
 			offset = 0;
-			frameOffset = 0;
+			frameGPUReadOffset = 0;
 			gl.bindBuffer(mode, vbo);
 			gl.bindBuffer(mode, vbo);
 			glBufferData(glMode, bufferSize, nullptr, GL_STREAM_DRAW);
 			glBufferData(glMode, bufferSize, nullptr, GL_STREAM_DRAW);
 		}
 		}
@@ -144,12 +133,12 @@ public:
 	void markUsed(size_t usedsize) override
 	void markUsed(size_t usedsize) override
 	{
 	{
 		offset += usedsize;
 		offset += usedsize;
-		frameOffset += usedsize;
+		frameGPUReadOffset += usedsize;
 	}
 	}
 
 
 	void nextFrame() override
 	void nextFrame() override
 	{
 	{
-		frameOffset = 0;
+		frameGPUReadOffset = 0;
 	}
 	}
 
 
 	ptrdiff_t getHandle() const override { return vbo; }
 	ptrdiff_t getHandle() const override { return vbo; }
@@ -164,7 +153,7 @@ public:
 		glBufferData(glMode, bufferSize, nullptr, GL_STREAM_DRAW);
 		glBufferData(glMode, bufferSize, nullptr, GL_STREAM_DRAW);
 
 
 		offset = 0;
 		offset = 0;
-		frameOffset = 0;
+		frameGPUReadOffset = 0;
 
 
 		return true;
 		return true;
 	}
 	}
@@ -186,7 +175,6 @@ protected:
 	uint8 *data;
 	uint8 *data;
 
 
 	size_t offset;
 	size_t offset;
-	size_t frameOffset;
 
 
 }; // StreamBufferSubDataOrphan
 }; // StreamBufferSubDataOrphan
 
 
@@ -198,7 +186,6 @@ public:
 		: love::graphics::StreamBuffer(type, size)
 		: love::graphics::StreamBuffer(type, size)
 		, syncSize((size + MAX_SYNCS_PER_FRAME - 1) / MAX_SYNCS_PER_FRAME)
 		, syncSize((size + MAX_SYNCS_PER_FRAME - 1) / MAX_SYNCS_PER_FRAME)
 		, frameIndex(0)
 		, frameIndex(0)
-		, frameGPUReadOffset(0)
 		, syncs()
 		, syncs()
 	{}
 	{}
 
 
@@ -231,7 +218,6 @@ protected:
 	const size_t syncSize;
 	const size_t syncSize;
 
 
 	int frameIndex;
 	int frameIndex;
-	size_t frameGPUReadOffset;
 
 
 	FenceSync syncs[MAX_SYNCS_PER_FRAME * BUFFER_FRAMES];
 	FenceSync syncs[MAX_SYNCS_PER_FRAME * BUFFER_FRAMES];
 
 
@@ -259,11 +245,6 @@ public:
 		unloadVolatile();
 		unloadVolatile();
 	}
 	}
 
 
-	size_t getUsableSize() const override
-	{
-		return bufferSize - frameGPUReadOffset;
-	}
-
 	MapInfo map(size_t /*minsize*/) override
 	MapInfo map(size_t /*minsize*/) override
 	{
 	{
 		gl.bindBuffer(mode, vbo);
 		gl.bindBuffer(mode, vbo);
@@ -351,11 +332,6 @@ public:
 		unloadVolatile();
 		unloadVolatile();
 	}
 	}
 
 
-	size_t getUsableSize() const override
-	{
-		return bufferSize - frameGPUReadOffset;
-	}
-
 	MapInfo map(size_t /*minsize*/) override
 	MapInfo map(size_t /*minsize*/) override
 	{
 	{
 		MapInfo info;
 		MapInfo info;
@@ -454,11 +430,6 @@ public:
 		alignedFree(data);
 		alignedFree(data);
 	}
 	}
 
 
-	size_t getUsableSize() const override
-	{
-		return bufferSize - frameGPUReadOffset;
-	}
-
 	MapInfo map(size_t /*minsize*/) override
 	MapInfo map(size_t /*minsize*/) override
 	{
 	{
 		MapInfo info;
 		MapInfo info;

+ 1 - 1
love/src/jni/love/src/modules/graphics/wrap_Graphics.cpp

@@ -290,7 +290,7 @@ int w_setCanvas(lua_State *L)
 				targets.colors.emplace_back(luax_checkcanvas(L, -1), 0);
 				targets.colors.emplace_back(luax_checkcanvas(L, -1), 0);
 
 
 				if (targets.colors.back().canvas->getTextureType() != TEXTURE_2D)
 				if (targets.colors.back().canvas->getTextureType() != TEXTURE_2D)
-					return luaL_error(L, "The table-of-tables variant of setCanvas must be used with non-2D Canvases.");
+					return luaL_error(L, "Non-2D canvases must use the table-of-tables variant of setCanvas.");
 			}
 			}
 
 
 			lua_pop(L, 1);
 			lua_pop(L, 1);

+ 8 - 5
love/src/jni/love/src/modules/joystick/sdl/JoystickModule.cpp

@@ -356,7 +356,7 @@ void JoystickModule::checkGamepads(const std::string &guid) const
 
 
 		for (auto stick : activeSticks)
 		for (auto stick : activeSticks)
 		{
 		{
-			if (stick->isGamepad() || guid.compare(stick->getGUID()) != 0)
+			if (guid.compare(stick->getGUID()) != 0)
 				continue;
 				continue;
 
 
 			// Big hack time: open the index as a game controller and compare
 			// Big hack time: open the index as a game controller and compare
@@ -365,12 +365,15 @@ void JoystickModule::checkGamepads(const std::string &guid) const
 			if (controller == nullptr)
 			if (controller == nullptr)
 				continue;
 				continue;
 
 
+			// GameController objects are reference-counted in SDL, so we don't want to
+			// have a joystick open when trying to re-initialize it
 			SDL_Joystick *sdlstick = SDL_GameControllerGetJoystick(controller);
 			SDL_Joystick *sdlstick = SDL_GameControllerGetJoystick(controller);
-			if (sdlstick == (SDL_Joystick *) stick->getHandle())
-				stick->openGamepad(d_index);
-
-			// GameController objects are reference-counted in SDL.
+			bool open_gamepad = (sdlstick == (SDL_Joystick *) stick->getHandle());
 			SDL_GameControllerClose(controller);
 			SDL_GameControllerClose(controller);
+
+			// open as gamepad if necessary
+			if (open_gamepad)
+				stick->openGamepad(d_index);
 		}
 		}
 	}
 	}
 }
 }

+ 5 - 0
love/src/jni/love/src/modules/mouse/sdl/Mouse.cpp

@@ -57,6 +57,9 @@ const char *Mouse::getName() const
 Mouse::Mouse()
 Mouse::Mouse()
 	: curCursor(nullptr)
 	: curCursor(nullptr)
 {
 {
+	// SDL may need the video subsystem in order to clean up the cursor when
+	// quitting. Subsystems are reference-counted.
+	SDL_InitSubSystem(SDL_INIT_VIDEO);
 }
 }
 
 
 Mouse::~Mouse()
 Mouse::~Mouse()
@@ -66,6 +69,8 @@ Mouse::~Mouse()
 
 
 	for (auto &c : systemCursors)
 	for (auto &c : systemCursors)
 		c.second->release();
 		c.second->release();
+
+	SDL_QuitSubSystem(SDL_INIT_VIDEO);
 }
 }
 
 
 love::mouse::Cursor *Mouse::newCursor(love::image::ImageData *data, int hotx, int hoty)
 love::mouse::Cursor *Mouse::newCursor(love::image::ImageData *data, int hotx, int hoty)

+ 28 - 0
love/src/jni/love/src/modules/physics/box2d/wrap_Body.cpp

@@ -69,6 +69,19 @@ int w_Body_getPosition(lua_State *L)
 	return 2;
 	return 2;
 }
 }
 
 
+int w_Body_getTransform(lua_State *L)
+{
+	Body *t = luax_checkbody(L, 1);
+
+	float x_o, y_o;
+	t->getPosition(x_o, y_o);
+	lua_pushnumber(L, x_o);
+	lua_pushnumber(L, y_o);
+	lua_pushnumber(L, t->getAngle());
+
+	return 3;
+}
+
 int w_Body_getLinearVelocity(lua_State *L)
 int w_Body_getLinearVelocity(lua_State *L)
 {
 {
 	Body *t = luax_checkbody(L, 1);
 	Body *t = luax_checkbody(L, 1);
@@ -253,6 +266,19 @@ int w_Body_setY(lua_State *L)
 	return 0;
 	return 0;
 }
 }
 
 
+int w_Body_setTransform(lua_State *L)
+{
+	Body *t = luax_checkbody(L, 1);
+	float x = (float)luaL_checknumber(L, 2);
+	float y = (float)luaL_checknumber(L, 3);
+	float angle = (float)luaL_checknumber(L, 4);
+	luax_catchexcept(L, [&](){
+		t->setPosition(x, y);
+		t->setAngle(angle);
+	});
+	return 0;
+}
+
 int w_Body_setLinearVelocity(lua_State *L)
 int w_Body_setLinearVelocity(lua_State *L)
 {
 {
 	Body *t = luax_checkbody(L, 1);
 	Body *t = luax_checkbody(L, 1);
@@ -617,6 +643,8 @@ static const luaL_Reg w_Body_functions[] =
 	{ "getY", w_Body_getY },
 	{ "getY", w_Body_getY },
 	{ "getAngle", w_Body_getAngle },
 	{ "getAngle", w_Body_getAngle },
 	{ "getPosition", w_Body_getPosition },
 	{ "getPosition", w_Body_getPosition },
+	{ "getTransform", w_Body_getTransform },
+	{ "setTransform", w_Body_setTransform },
 	{ "getLinearVelocity", w_Body_getLinearVelocity },
 	{ "getLinearVelocity", w_Body_getLinearVelocity },
 	{ "getWorldCenter", w_Body_getWorldCenter },
 	{ "getWorldCenter", w_Body_getWorldCenter },
 	{ "getLocalCenter", w_Body_getLocalCenter },
 	{ "getLocalCenter", w_Body_getLocalCenter },