Merged default into iOS-improvements iOS-improvements
authorAlex Szpakowski <slime73@gmail.com>
Wed, 10 Sep 2014 18:10:37 -0300
branchiOS-improvements
changeset 9516 77867123589c
parent 9515 63f5d07c7d70 (current diff)
parent 9129 d183503df2e8 (diff)
child 9517 dbe19a0cad97
Merged default into iOS-improvements
include/SDL_hints.h
--- a/CMakeLists.txt	Wed Aug 20 17:20:22 2014 -0300
+++ b/CMakeLists.txt	Wed Sep 10 18:10:37 2014 -0300
@@ -29,9 +29,9 @@
 # set SDL_BINARY_AGE and SDL_INTERFACE_AGE to 0.
 set(SDL_MAJOR_VERSION 2)
 set(SDL_MINOR_VERSION 0)
-set(SDL_MICRO_VERSION 3)
-set(SDL_INTERFACE_AGE 1)
-set(SDL_BINARY_AGE 3)
+set(SDL_MICRO_VERSION 4)
+set(SDL_INTERFACE_AGE 0)
+set(SDL_BINARY_AGE 4)
 set(SDL_VERSION "${SDL_MAJOR_VERSION}.${SDL_MINOR_VERSION}.${SDL_MICRO_VERSION}")
 
 # Calculate a libtool-like version number
@@ -247,6 +247,7 @@
 set_option(VIDEO_COCOA         "Use Cocoa video driver" ${APPLE})
 set_option(DIRECTX             "Use DirectX for Windows audio/video" ${WINDOWS})
 set_option(RENDER_D3D          "Enable the Direct3D render driver" ${WINDOWS})
+set_option(VIDEO_MX6           "Use Freescale i.MX6 video driver" OFF)
 
 # TODO: We should (should we?) respect cmake's ${BUILD_SHARED_LIBS} flag here
 # The options below are for compatibility to configure's default behaviour.
@@ -678,6 +679,7 @@
     CheckOpenGLX11()
     CheckOpenGLESX11()
     CheckWayland()
+    CheckMX6()
   endif()
 
   if(LINUX)
@@ -970,6 +972,7 @@
     set_source_files_properties(${EXTRA_SOURCES} PROPERTIES LANGUAGE C)
     set(HAVE_SDL_FILE TRUE)
     set(SDL_FRAMEWORK_COCOA 1)
+    set(SDL_FRAMEWORK_COREVIDEO 1)
   else()
     message_error("SDL_FILE must be enabled to build on MacOS X")
   endif()
@@ -1029,6 +1032,10 @@
   endif()
 
   # Actually load the frameworks at the end so we don't duplicate include.
+  if(SDL_FRAMEWORK_COREVIDEO)
+    find_library(COREVIDEO CoreVideo)
+    list(APPEND EXTRA_LIBS ${COREVIDEO})
+  endif()
   if(SDL_FRAMEWORK_COCOA)
     find_library(COCOA_LIBRARY Cocoa)
     list(APPEND EXTRA_LIBS ${COCOA_LIBRARY})
--- a/Xcode/SDL/Info-Framework.plist	Wed Aug 20 17:20:22 2014 -0300
+++ b/Xcode/SDL/Info-Framework.plist	Wed Sep 10 18:10:37 2014 -0300
@@ -19,10 +19,10 @@
 	<key>CFBundlePackageType</key>
 	<string>FMWK</string>
 	<key>CFBundleShortVersionString</key>
-	<string>2.0.3</string>
+	<string>2.0.4</string>
 	<key>CFBundleSignature</key>
 	<string>SDLX</string>
 	<key>CFBundleVersion</key>
-	<string>2.0.3</string>
+	<string>2.0.4</string>
 </dict>
 </plist>
--- a/Xcode/SDL/SDL.xcodeproj/project.pbxproj	Wed Aug 20 17:20:22 2014 -0300
+++ b/Xcode/SDL/SDL.xcodeproj/project.pbxproj	Wed Sep 10 18:10:37 2014 -0300
@@ -810,6 +810,9 @@
 		DB31407217554B71006C0E22 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 007317C10858E15000B2BC32 /* Carbon.framework */; };
 		DB31408B17554D37006C0E22 /* ForceFeedback.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 00CFA89C106B4BA100758660 /* ForceFeedback.framework */; };
 		DB31408D17554D3C006C0E22 /* ForceFeedback.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 00CFA89C106B4BA100758660 /* ForceFeedback.framework */; };
+		FA73671D19A540EF004122E4 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA73671C19A540EF004122E4 /* CoreVideo.framework */; };
+		FA73671E19A54140004122E4 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA73671C19A540EF004122E4 /* CoreVideo.framework */; };
+		FA73671F19A54144004122E4 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA73671C19A540EF004122E4 /* CoreVideo.framework */; };
 /* End PBXBuildFile section */
 
 /* Begin PBXContainerItemProxy section */
@@ -830,7 +833,6 @@
 		0073179F0858DECD00B2BC32 /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = /System/Library/Frameworks/IOKit.framework; sourceTree = "<absolute>"; };
 		007317C10858E15000B2BC32 /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = /System/Library/Frameworks/Carbon.framework; sourceTree = "<absolute>"; };
 		00794D3F09D0C461003FC8A1 /* License.txt */ = {isa = PBXFileReference; lastKnownFileType = text; path = License.txt; sourceTree = "<group>"; };
-		00AE6E1E08B958CC00255E2F /* ReadMeDevLite.txt */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = ReadMeDevLite.txt; sourceTree = "<group>"; };
 		00CFA89C106B4BA100758660 /* ForceFeedback.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ForceFeedback.framework; path = /System/Library/Frameworks/ForceFeedback.framework; sourceTree = "<absolute>"; };
 		00D0D08310675DD9004B05EF /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = /System/Library/Frameworks/CoreFoundation.framework; sourceTree = "<absolute>"; };
 		04043BBA12FEB1BE0076DB1F /* SDL_glfuncs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDL_glfuncs.h; sourceTree = "<group>"; };
@@ -1100,15 +1102,10 @@
 		D55A1B80179F262300625D7C /* SDL_cocoamousetap.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDL_cocoamousetap.m; sourceTree = "<group>"; };
 		DB31407717554B71006C0E22 /* libSDL2.dylib */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = libSDL2.dylib; sourceTree = BUILT_PRODUCTS_DIR; };
 		DB89958518A1A5C50092407C /* SDL_syshaptic_c.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDL_syshaptic_c.h; sourceTree = "<group>"; };
-		F59C70FF00D5CB5801000001 /* ReadMe.txt */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = ReadMe.txt; sourceTree = "<group>"; };
-		F59C710000D5CB5801000001 /* Welcome.txt */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = Welcome.txt; sourceTree = "<group>"; };
 		F59C710300D5CB5801000001 /* ReadMe.txt */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = ReadMe.txt; sourceTree = "<group>"; };
-		F59C710500D5CB5801000001 /* SDL-devel.info */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = "SDL-devel.info"; sourceTree = "<group>"; };
 		F59C710600D5CB5801000001 /* SDL.info */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = SDL.info; sourceTree = "<group>"; };
-		F59C710C00D5D15801000001 /* install.sh */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.script.sh; path = install.sh; sourceTree = "<group>"; };
 		F5A2EF3900C6A39A01000001 /* BUGS.txt */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; name = BUGS.txt; path = ../../BUGS.txt; sourceTree = SOURCE_ROOT; };
-		F5A2EF3A00C6A3C201000001 /* README-macosx.txt */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; name = "README-macosx.txt"; path = "../../README-macosx.txt"; sourceTree = SOURCE_ROOT; };
-		F5F81AD400D706B101000001 /* Readme SDL Developer.txt */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; name = "Readme SDL Developer.txt"; path = "pkg-support/Readme SDL Developer.txt"; sourceTree = SOURCE_ROOT; };
+		FA73671C19A540EF004122E4 /* CoreVideo.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreVideo.framework; path = /System/Library/Frameworks/CoreVideo.framework; sourceTree = "<absolute>"; };
 /* End PBXFileReference section */
 
 /* Begin PBXFrameworksBuildPhase section */
@@ -1116,6 +1113,7 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				FA73671D19A540EF004122E4 /* CoreVideo.framework in Frameworks */,
 				007317A20858DECD00B2BC32 /* AudioToolbox.framework in Frameworks */,
 				007317A30858DECD00B2BC32 /* AudioUnit.framework in Frameworks */,
 				007317A40858DECD00B2BC32 /* Cocoa.framework in Frameworks */,
@@ -1131,6 +1129,7 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				FA73671E19A54140004122E4 /* CoreVideo.framework in Frameworks */,
 				007317A90858DECD00B2BC32 /* AudioToolbox.framework in Frameworks */,
 				007317AA0858DECD00B2BC32 /* AudioUnit.framework in Frameworks */,
 				007317AB0858DECD00B2BC32 /* Cocoa.framework in Frameworks */,
@@ -1145,6 +1144,7 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				FA73671F19A54144004122E4 /* CoreVideo.framework in Frameworks */,
 				DB31406C17554B71006C0E22 /* AudioToolbox.framework in Frameworks */,
 				DB31406D17554B71006C0E22 /* AudioUnit.framework in Frameworks */,
 				DB31406E17554B71006C0E22 /* Cocoa.framework in Frameworks */,
@@ -1663,7 +1663,6 @@
 			isa = PBXGroup;
 			children = (
 				F5A2EF3900C6A39A01000001 /* BUGS.txt */,
-				F5A2EF3A00C6A3C201000001 /* README-macosx.txt */,
 				F59C70FC00D5CB5801000001 /* pkg-support */,
 				0153844A006D81B07F000001 /* Public Headers */,
 				08FB77ACFE841707C02AAC07 /* Library Source */,
@@ -1738,6 +1737,7 @@
 		BEC562FE0761C0E800A33029 /* Linked Frameworks */ = {
 			isa = PBXGroup;
 			children = (
+				FA73671C19A540EF004122E4 /* CoreVideo.framework */,
 				00D0D08310675DD9004B05EF /* CoreFoundation.framework */,
 				007317C10858E15000B2BC32 /* Carbon.framework */,
 				0073179B0858DECD00B2BC32 /* AudioToolbox.framework */,
@@ -1753,30 +1753,16 @@
 		F59C70FC00D5CB5801000001 /* pkg-support */ = {
 			isa = PBXGroup;
 			children = (
-				F59C70FE00D5CB5801000001 /* devel-resources */,
 				F59C710100D5CB5801000001 /* resources */,
-				F5F81AD400D706B101000001 /* Readme SDL Developer.txt */,
-				F59C710500D5CB5801000001 /* SDL-devel.info */,
 				F59C710600D5CB5801000001 /* SDL.info */,
 			);
 			path = "pkg-support";
 			sourceTree = SOURCE_ROOT;
 		};
-		F59C70FE00D5CB5801000001 /* devel-resources */ = {
-			isa = PBXGroup;
-			children = (
-				F59C710C00D5D15801000001 /* install.sh */,
-				F59C70FF00D5CB5801000001 /* ReadMe.txt */,
-				F59C710000D5CB5801000001 /* Welcome.txt */,
-			);
-			path = "devel-resources";
-			sourceTree = "<group>";
-		};
 		F59C710100D5CB5801000001 /* resources */ = {
 			isa = PBXGroup;
 			children = (
 				00794D3F09D0C461003FC8A1 /* License.txt */,
-				00AE6E1E08B958CC00255E2F /* ReadMeDevLite.txt */,
 				F59C710300D5CB5801000001 /* ReadMe.txt */,
 			);
 			path = resources;
@@ -2807,7 +2793,7 @@
 			buildSettings = {
 				CLANG_LINK_OBJC_RUNTIME = NO;
 				DYLIB_COMPATIBILITY_VERSION = 1.0.0;
-				DYLIB_CURRENT_VERSION = 3.1.0;
+				DYLIB_CURRENT_VERSION = 5.0.0;
 				FRAMEWORK_VERSION = A;
 				HEADER_SEARCH_PATHS = /usr/X11R6/include;
 				INFOPLIST_FILE = "Info-Framework.plist";
@@ -2862,7 +2848,7 @@
 			buildSettings = {
 				CLANG_LINK_OBJC_RUNTIME = NO;
 				DYLIB_COMPATIBILITY_VERSION = 1.0.0;
-				DYLIB_CURRENT_VERSION = 3.1.0;
+				DYLIB_CURRENT_VERSION = 5.0.0;
 				FRAMEWORK_VERSION = A;
 				HEADER_SEARCH_PATHS = /usr/X11R6/include;
 				INFOPLIST_FILE = "Info-Framework.plist";
--- a/Xcode/SDLTest/SDLTest.xcodeproj/project.pbxproj	Wed Aug 20 17:20:22 2014 -0300
+++ b/Xcode/SDLTest/SDLTest.xcodeproj/project.pbxproj	Wed Sep 10 18:10:37 2014 -0300
@@ -555,6 +555,51 @@
 		DB89957918A19ABA0092407C /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 002A873910730675007319AE /* Carbon.framework */; };
 		DB89957A18A19ABA0092407C /* libSDL2.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 003FA645093FFD41000C53B3 /* libSDL2.a */; };
 		DB89958418A19B130092407C /* testhotplug.c in Sources */ = {isa = PBXBuildFile; fileRef = DB89958318A19B130092407C /* testhotplug.c */; };
+		FA73672319A54A90004122E4 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA73672219A54A90004122E4 /* CoreVideo.framework */; };
+		FA73672819A54AB6004122E4 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA73672219A54A90004122E4 /* CoreVideo.framework */; };
+		FA73672919A54AB9004122E4 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA73672219A54A90004122E4 /* CoreVideo.framework */; };
+		FA73672A19A54AC0004122E4 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA73672219A54A90004122E4 /* CoreVideo.framework */; };
+		FA73672B19A54AC2004122E4 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA73672219A54A90004122E4 /* CoreVideo.framework */; };
+		FA73672C19A54AC5004122E4 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA73672219A54A90004122E4 /* CoreVideo.framework */; };
+		FA73672D19A54AC7004122E4 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA73672219A54A90004122E4 /* CoreVideo.framework */; };
+		FA73672E19A54ACA004122E4 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA73672219A54A90004122E4 /* CoreVideo.framework */; };
+		FA73672F19A54ACC004122E4 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA73672219A54A90004122E4 /* CoreVideo.framework */; };
+		FA73673019A54AD0004122E4 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA73672219A54A90004122E4 /* CoreVideo.framework */; };
+		FA73673119A54AD3004122E4 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA73672219A54A90004122E4 /* CoreVideo.framework */; };
+		FA73673219A54AD5004122E4 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA73672219A54A90004122E4 /* CoreVideo.framework */; };
+		FA73673319A54AD8004122E4 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA73672219A54A90004122E4 /* CoreVideo.framework */; };
+		FA73673419A54ADB004122E4 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA73672219A54A90004122E4 /* CoreVideo.framework */; };
+		FA73673519A54ADE004122E4 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA73672219A54A90004122E4 /* CoreVideo.framework */; };
+		FA73673619A54AE1004122E4 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA73672219A54A90004122E4 /* CoreVideo.framework */; };
+		FA73673719A54AE3004122E4 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA73672219A54A90004122E4 /* CoreVideo.framework */; };
+		FA73673819A54AE6004122E4 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA73672219A54A90004122E4 /* CoreVideo.framework */; };
+		FA73673919A54AE8004122E4 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA73672219A54A90004122E4 /* CoreVideo.framework */; };
+		FA73673A19A54AEB004122E4 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA73672219A54A90004122E4 /* CoreVideo.framework */; };
+		FA73673B19A54AED004122E4 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA73672219A54A90004122E4 /* CoreVideo.framework */; };
+		FA73673C19A54AF0004122E4 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA73672219A54A90004122E4 /* CoreVideo.framework */; };
+		FA73673D19A54AF3004122E4 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA73672219A54A90004122E4 /* CoreVideo.framework */; };
+		FA73673E19A54AF6004122E4 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA73672219A54A90004122E4 /* CoreVideo.framework */; };
+		FA73673F19A54AF8004122E4 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA73672219A54A90004122E4 /* CoreVideo.framework */; };
+		FA73674019A54AFB004122E4 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA73672219A54A90004122E4 /* CoreVideo.framework */; };
+		FA73674119A54AFE004122E4 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA73672219A54A90004122E4 /* CoreVideo.framework */; };
+		FA73674219A54B01004122E4 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA73672219A54A90004122E4 /* CoreVideo.framework */; };
+		FA73674319A54B04004122E4 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA73672219A54A90004122E4 /* CoreVideo.framework */; };
+		FA73674419A54B06004122E4 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA73672219A54A90004122E4 /* CoreVideo.framework */; };
+		FA73674519A54B09004122E4 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA73672219A54A90004122E4 /* CoreVideo.framework */; };
+		FA73674619A54B0B004122E4 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA73672219A54A90004122E4 /* CoreVideo.framework */; };
+		FA73674719A54B0F004122E4 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA73672219A54A90004122E4 /* CoreVideo.framework */; };
+		FA73674819A54B13004122E4 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA73672219A54A90004122E4 /* CoreVideo.framework */; };
+		FA73674919A54B16004122E4 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA73672219A54A90004122E4 /* CoreVideo.framework */; };
+		FA73674A19A54B19004122E4 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA73672219A54A90004122E4 /* CoreVideo.framework */; };
+		FA73674B19A54B1B004122E4 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA73672219A54A90004122E4 /* CoreVideo.framework */; };
+		FA73674C19A54B1F004122E4 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA73672219A54A90004122E4 /* CoreVideo.framework */; };
+		FA73674D19A54B22004122E4 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA73672219A54A90004122E4 /* CoreVideo.framework */; };
+		FA73674E19A54B25004122E4 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA73672219A54A90004122E4 /* CoreVideo.framework */; };
+		FA73674F19A54B28004122E4 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA73672219A54A90004122E4 /* CoreVideo.framework */; };
+		FA73675019A54B2B004122E4 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA73672219A54A90004122E4 /* CoreVideo.framework */; };
+		FA73675119A54B2F004122E4 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA73672219A54A90004122E4 /* CoreVideo.framework */; };
+		FA73675219A54B32004122E4 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA73672219A54A90004122E4 /* CoreVideo.framework */; };
+		FA73675319A54B35004122E4 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA73672219A54A90004122E4 /* CoreVideo.framework */; };
 /* End PBXBuildFile section */
 
 /* Begin PBXContainerItemProxy section */
@@ -1141,6 +1186,7 @@
 		DB89957E18A19ABA0092407C /* testhotplug */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = testhotplug; sourceTree = BUILT_PRODUCTS_DIR; };
 		DB89958318A19B130092407C /* testhotplug.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = testhotplug.c; path = ../../test/testhotplug.c; sourceTree = "<group>"; };
 		DBBC552C182831D700F3CA8D /* TestDropFile-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = "TestDropFile-Info.plist"; sourceTree = "<group>"; };
+		FA73672219A54A90004122E4 /* CoreVideo.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreVideo.framework; path = /System/Library/Frameworks/CoreVideo.framework; sourceTree = "<absolute>"; };
 /* End PBXFileReference section */
 
 /* Begin PBXFrameworksBuildPhase section */
@@ -1148,6 +1194,7 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				FA73672919A54AB9004122E4 /* CoreVideo.framework in Frameworks */,
 				0017957C10741F7900F5D044 /* Cocoa.framework in Frameworks */,
 				0017957D10741F7900F5D044 /* CoreAudio.framework in Frameworks */,
 				0017957E10741F7900F5D044 /* ForceFeedback.framework in Frameworks */,
@@ -1164,6 +1211,7 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				FA73672A19A54AC0004122E4 /* CoreVideo.framework in Frameworks */,
 				0017959D107421BF00F5D044 /* Cocoa.framework in Frameworks */,
 				0017959E107421BF00F5D044 /* CoreAudio.framework in Frameworks */,
 				0017959F107421BF00F5D044 /* ForceFeedback.framework in Frameworks */,
@@ -1180,6 +1228,7 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				FA73673319A54AD8004122E4 /* CoreVideo.framework in Frameworks */,
 				0017971110742F3200F5D044 /* Cocoa.framework in Frameworks */,
 				0017971210742F3200F5D044 /* CoreAudio.framework in Frameworks */,
 				0017971310742F3200F5D044 /* ForceFeedback.framework in Frameworks */,
@@ -1197,6 +1246,7 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				FA73673419A54ADB004122E4 /* CoreVideo.framework in Frameworks */,
 				00179738107430D600F5D044 /* Cocoa.framework in Frameworks */,
 				00179739107430D600F5D044 /* CoreAudio.framework in Frameworks */,
 				0017973A107430D600F5D044 /* ForceFeedback.framework in Frameworks */,
@@ -1213,6 +1263,7 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				FA73672B19A54AC2004122E4 /* CoreVideo.framework in Frameworks */,
 				0017975E107431B300F5D044 /* Cocoa.framework in Frameworks */,
 				0017975F107431B300F5D044 /* CoreAudio.framework in Frameworks */,
 				00179760107431B300F5D044 /* ForceFeedback.framework in Frameworks */,
@@ -1230,6 +1281,7 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				FA73673719A54AE3004122E4 /* CoreVideo.framework in Frameworks */,
 				0017977E107432AE00F5D044 /* Cocoa.framework in Frameworks */,
 				0017977F107432AE00F5D044 /* CoreAudio.framework in Frameworks */,
 				00179780107432AE00F5D044 /* ForceFeedback.framework in Frameworks */,
@@ -1247,6 +1299,7 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				FA73673819A54AE6004122E4 /* CoreVideo.framework in Frameworks */,
 				0017979E1074334C00F5D044 /* Cocoa.framework in Frameworks */,
 				0017979F1074334C00F5D044 /* CoreAudio.framework in Frameworks */,
 				001797A01074334C00F5D044 /* ForceFeedback.framework in Frameworks */,
@@ -1264,6 +1317,7 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				FA73673B19A54AED004122E4 /* CoreVideo.framework in Frameworks */,
 				001797C0107433C600F5D044 /* Cocoa.framework in Frameworks */,
 				001797C1107433C600F5D044 /* CoreAudio.framework in Frameworks */,
 				001797C2107433C600F5D044 /* ForceFeedback.framework in Frameworks */,
@@ -1280,6 +1334,7 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				FA73673E19A54AF6004122E4 /* CoreVideo.framework in Frameworks */,
 				001798021074355200F5D044 /* Cocoa.framework in Frameworks */,
 				001798031074355200F5D044 /* CoreAudio.framework in Frameworks */,
 				001798041074355200F5D044 /* ForceFeedback.framework in Frameworks */,
@@ -1296,6 +1351,7 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				FA73673F19A54AF8004122E4 /* CoreVideo.framework in Frameworks */,
 				001798841074392D00F5D044 /* Cocoa.framework in Frameworks */,
 				001798851074392D00F5D044 /* CoreAudio.framework in Frameworks */,
 				001798861074392D00F5D044 /* ForceFeedback.framework in Frameworks */,
@@ -1312,6 +1368,7 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				FA73674219A54B01004122E4 /* CoreVideo.framework in Frameworks */,
 				001798A5107439DF00F5D044 /* Cocoa.framework in Frameworks */,
 				001798A6107439DF00F5D044 /* CoreAudio.framework in Frameworks */,
 				001798A7107439DF00F5D044 /* ForceFeedback.framework in Frameworks */,
@@ -1328,6 +1385,7 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				FA73674619A54B0B004122E4 /* CoreVideo.framework in Frameworks */,
 				001798E210743BEC00F5D044 /* Cocoa.framework in Frameworks */,
 				001798E310743BEC00F5D044 /* CoreAudio.framework in Frameworks */,
 				001798E410743BEC00F5D044 /* ForceFeedback.framework in Frameworks */,
@@ -1344,6 +1402,7 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				FA73674C19A54B1F004122E4 /* CoreVideo.framework in Frameworks */,
 				0017990610743F1000F5D044 /* Cocoa.framework in Frameworks */,
 				0017990710743F1000F5D044 /* CoreAudio.framework in Frameworks */,
 				0017990810743F1000F5D044 /* ForceFeedback.framework in Frameworks */,
@@ -1361,6 +1420,7 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				FA73675219A54B32004122E4 /* CoreVideo.framework in Frameworks */,
 				0017992810743FB700F5D044 /* Cocoa.framework in Frameworks */,
 				0017992910743FB700F5D044 /* CoreAudio.framework in Frameworks */,
 				0017992A10743FB700F5D044 /* ForceFeedback.framework in Frameworks */,
@@ -1378,6 +1438,7 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				FA73672F19A54ACC004122E4 /* CoreVideo.framework in Frameworks */,
 				002F340B09CA1BFF00EBEB88 /* Cocoa.framework in Frameworks */,
 				002A866B10730548007319AE /* CoreAudio.framework in Frameworks */,
 				002A866C10730548007319AE /* ForceFeedback.framework in Frameworks */,
@@ -1394,6 +1455,7 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				FA73673619A54AE1004122E4 /* CoreVideo.framework in Frameworks */,
 				002F342A09CA1F0300EBEB88 /* Cocoa.framework in Frameworks */,
 				002A866210730547007319AE /* CoreAudio.framework in Frameworks */,
 				002A866310730547007319AE /* ForceFeedback.framework in Frameworks */,
@@ -1410,6 +1472,7 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				FA73674019A54AFB004122E4 /* CoreVideo.framework in Frameworks */,
 				002F344609CA1FB300EBEB88 /* Cocoa.framework in Frameworks */,
 				002A868010730549007319AE /* CoreAudio.framework in Frameworks */,
 				002A868110730549007319AE /* ForceFeedback.framework in Frameworks */,
@@ -1426,6 +1489,7 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				FA73674119A54AFE004122E4 /* CoreVideo.framework in Frameworks */,
 				002F346309CA204F00EBEB88 /* Cocoa.framework in Frameworks */,
 				002A868610730549007319AE /* CoreAudio.framework in Frameworks */,
 				002A868710730549007319AE /* ForceFeedback.framework in Frameworks */,
@@ -1442,6 +1506,7 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				FA73674B19A54B1B004122E4 /* CoreVideo.framework in Frameworks */,
 				DB166D7116A1CFB200A1396C /* AudioToolbox.framework in Frameworks */,
 				DB166D7216A1CFB200A1396C /* AudioUnit.framework in Frameworks */,
 				DB166D7316A1CFB200A1396C /* Carbon.framework in Frameworks */,
@@ -1459,6 +1524,7 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				FA73673119A54AD3004122E4 /* CoreVideo.framework in Frameworks */,
 				BBFC08C0164C6862003E6A99 /* Cocoa.framework in Frameworks */,
 				BBFC08C1164C6862003E6A99 /* CoreAudio.framework in Frameworks */,
 				BBFC08C2164C6862003E6A99 /* ForceFeedback.framework in Frameworks */,
@@ -1475,6 +1541,7 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				FA73672319A54A90004122E4 /* CoreVideo.framework in Frameworks */,
 				002F33C109CA188600EBEB88 /* Cocoa.framework in Frameworks */,
 				002A863010730405007319AE /* libSDL2.a in Frameworks */,
 				002A864D10730546007319AE /* CoreAudio.framework in Frameworks */,
@@ -1491,6 +1558,7 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				FA73672819A54AB6004122E4 /* CoreVideo.framework in Frameworks */,
 				002F33BF09CA188600EBEB88 /* Cocoa.framework in Frameworks */,
 				002A865310730547007319AE /* CoreAudio.framework in Frameworks */,
 				002A865410730547007319AE /* ForceFeedback.framework in Frameworks */,
@@ -1507,6 +1575,7 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				FA73672E19A54ACA004122E4 /* CoreVideo.framework in Frameworks */,
 				002F33BC09CA188600EBEB88 /* Cocoa.framework in Frameworks */,
 				002A866E10730548007319AE /* CoreAudio.framework in Frameworks */,
 				002A866F10730548007319AE /* ForceFeedback.framework in Frameworks */,
@@ -1523,6 +1592,7 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				FA73674F19A54B28004122E4 /* CoreVideo.framework in Frameworks */,
 				002F33B809CA188600EBEB88 /* Cocoa.framework in Frameworks */,
 				002A868F1073054A007319AE /* CoreAudio.framework in Frameworks */,
 				002A86901073054A007319AE /* ForceFeedback.framework in Frameworks */,
@@ -1539,6 +1609,7 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				FA73673919A54AE8004122E4 /* CoreVideo.framework in Frameworks */,
 				002F33B709CA188600EBEB88 /* Cocoa.framework in Frameworks */,
 				002A867410730548007319AE /* CoreAudio.framework in Frameworks */,
 				002A867510730548007319AE /* ForceFeedback.framework in Frameworks */,
@@ -1555,6 +1626,7 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				FA73673A19A54AEB004122E4 /* CoreVideo.framework in Frameworks */,
 				002F33B509CA188600EBEB88 /* Cocoa.framework in Frameworks */,
 				002A867710730548007319AE /* CoreAudio.framework in Frameworks */,
 				002A867810730548007319AE /* ForceFeedback.framework in Frameworks */,
@@ -1571,6 +1643,7 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				FA73673C19A54AF0004122E4 /* CoreVideo.framework in Frameworks */,
 				002F33B609CA188600EBEB88 /* Cocoa.framework in Frameworks */,
 				002A867A10730549007319AE /* CoreAudio.framework in Frameworks */,
 				002A867B10730549007319AE /* ForceFeedback.framework in Frameworks */,
@@ -1587,6 +1660,7 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				FA73674919A54B16004122E4 /* CoreVideo.framework in Frameworks */,
 				002F33B209CA188600EBEB88 /* Cocoa.framework in Frameworks */,
 				002A868910730549007319AE /* CoreAudio.framework in Frameworks */,
 				002A868A10730549007319AE /* ForceFeedback.framework in Frameworks */,
@@ -1603,6 +1677,7 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				FA73675019A54B2B004122E4 /* CoreVideo.framework in Frameworks */,
 				002F33B009CA188600EBEB88 /* Cocoa.framework in Frameworks */,
 				002A86981073054A007319AE /* CoreAudio.framework in Frameworks */,
 				002A86991073054A007319AE /* ForceFeedback.framework in Frameworks */,
@@ -1619,6 +1694,7 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				FA73675119A54B2F004122E4 /* CoreVideo.framework in Frameworks */,
 				002F33AF09CA188600EBEB88 /* Cocoa.framework in Frameworks */,
 				002A86951073054A007319AE /* CoreAudio.framework in Frameworks */,
 				002A86961073054A007319AE /* ForceFeedback.framework in Frameworks */,
@@ -1635,6 +1711,7 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				FA73675319A54B35004122E4 /* CoreVideo.framework in Frameworks */,
 				002F33AA09CA188600EBEB88 /* Cocoa.framework in Frameworks */,
 				002A864110730546007319AE /* CoreAudio.framework in Frameworks */,
 				002A864210730546007319AE /* ForceFeedback.framework in Frameworks */,
@@ -1651,6 +1728,7 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				FA73672C19A54AC5004122E4 /* CoreVideo.framework in Frameworks */,
 				DB0F48DD17CA51E5008798C5 /* Cocoa.framework in Frameworks */,
 				DB0F48DE17CA51E5008798C5 /* CoreAudio.framework in Frameworks */,
 				DB0F48DF17CA51E5008798C5 /* ForceFeedback.framework in Frameworks */,
@@ -1667,6 +1745,7 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				FA73673019A54AD0004122E4 /* CoreVideo.framework in Frameworks */,
 				DB0F48F317CA5212008798C5 /* Cocoa.framework in Frameworks */,
 				DB0F48F417CA5212008798C5 /* CoreAudio.framework in Frameworks */,
 				DB0F48F517CA5212008798C5 /* ForceFeedback.framework in Frameworks */,
@@ -1690,6 +1769,7 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				FA73673219A54AD5004122E4 /* CoreVideo.framework in Frameworks */,
 				DB166DB116A1D2F600A1396C /* Cocoa.framework in Frameworks */,
 				DB166DB216A1D2F600A1396C /* CoreAudio.framework in Frameworks */,
 				DB166DB316A1D2F600A1396C /* ForceFeedback.framework in Frameworks */,
@@ -1706,6 +1786,7 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				FA73673D19A54AF3004122E4 /* CoreVideo.framework in Frameworks */,
 				DB166DC816A1D36A00A1396C /* Cocoa.framework in Frameworks */,
 				DB166DC916A1D36A00A1396C /* CoreAudio.framework in Frameworks */,
 				DB166DCA16A1D36A00A1396C /* ForceFeedback.framework in Frameworks */,
@@ -1722,6 +1803,7 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				FA73674319A54B04004122E4 /* CoreVideo.framework in Frameworks */,
 				DB166DE016A1D50C00A1396C /* Cocoa.framework in Frameworks */,
 				DB166DE116A1D50C00A1396C /* CoreAudio.framework in Frameworks */,
 				DB166DE216A1D50C00A1396C /* ForceFeedback.framework in Frameworks */,
@@ -1739,6 +1821,7 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				FA73674419A54B06004122E4 /* CoreVideo.framework in Frameworks */,
 				DB166DF716A1D57C00A1396C /* Cocoa.framework in Frameworks */,
 				DB166DF816A1D57C00A1396C /* CoreAudio.framework in Frameworks */,
 				DB166DF916A1D57C00A1396C /* ForceFeedback.framework in Frameworks */,
@@ -1756,6 +1839,7 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				FA73674519A54B09004122E4 /* CoreVideo.framework in Frameworks */,
 				DB166E0E16A1D5AD00A1396C /* Cocoa.framework in Frameworks */,
 				DB166E0F16A1D5AD00A1396C /* CoreAudio.framework in Frameworks */,
 				DB166E1016A1D5AD00A1396C /* ForceFeedback.framework in Frameworks */,
@@ -1773,6 +1857,7 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				FA73674719A54B0F004122E4 /* CoreVideo.framework in Frameworks */,
 				DB166E2B16A1D64D00A1396C /* Cocoa.framework in Frameworks */,
 				DB166E2C16A1D64D00A1396C /* CoreAudio.framework in Frameworks */,
 				DB166E2D16A1D64D00A1396C /* ForceFeedback.framework in Frameworks */,
@@ -1789,6 +1874,7 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				FA73674819A54B13004122E4 /* CoreVideo.framework in Frameworks */,
 				DB166E4116A1D69000A1396C /* Cocoa.framework in Frameworks */,
 				DB166E4216A1D69000A1396C /* CoreAudio.framework in Frameworks */,
 				DB166E4316A1D69000A1396C /* ForceFeedback.framework in Frameworks */,
@@ -1806,6 +1892,7 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				FA73674A19A54B19004122E4 /* CoreVideo.framework in Frameworks */,
 				DB166E5B16A1D6F300A1396C /* Cocoa.framework in Frameworks */,
 				DB166E5C16A1D6F300A1396C /* CoreAudio.framework in Frameworks */,
 				DB166E5D16A1D6F300A1396C /* ForceFeedback.framework in Frameworks */,
@@ -1822,6 +1909,7 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				FA73674D19A54B22004122E4 /* CoreVideo.framework in Frameworks */,
 				DB166E7116A1D78400A1396C /* Cocoa.framework in Frameworks */,
 				DB166E7216A1D78400A1396C /* CoreAudio.framework in Frameworks */,
 				DB166E7316A1D78400A1396C /* ForceFeedback.framework in Frameworks */,
@@ -1838,6 +1926,7 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				FA73674E19A54B25004122E4 /* CoreVideo.framework in Frameworks */,
 				DB166E8416A1D78C00A1396C /* Cocoa.framework in Frameworks */,
 				DB166E8516A1D78C00A1396C /* CoreAudio.framework in Frameworks */,
 				DB166E8616A1D78C00A1396C /* ForceFeedback.framework in Frameworks */,
@@ -1854,6 +1943,7 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				FA73672D19A54AC7004122E4 /* CoreVideo.framework in Frameworks */,
 				DB445EEA18184B7000B306B0 /* Cocoa.framework in Frameworks */,
 				DB445EEB18184B7000B306B0 /* CoreAudio.framework in Frameworks */,
 				DB445EEC18184B7000B306B0 /* ForceFeedback.framework in Frameworks */,
@@ -1871,6 +1961,7 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				FA73673519A54ADE004122E4 /* CoreVideo.framework in Frameworks */,
 				DB89957118A19ABA0092407C /* Cocoa.framework in Frameworks */,
 				DB89957218A19ABA0092407C /* CoreAudio.framework in Frameworks */,
 				DB89957318A19ABA0092407C /* ForceFeedback.framework in Frameworks */,
@@ -1889,6 +1980,7 @@
 		002F33A209CA183B00EBEB88 /* Linked Frameworks */ = {
 			isa = PBXGroup;
 			children = (
+				FA73672219A54A90004122E4 /* CoreVideo.framework */,
 				002A869F10730593007319AE /* AudioToolbox.framework */,
 				002A871410730623007319AE /* AudioUnit.framework */,
 				002A873910730675007319AE /* Carbon.framework */,
--- a/cmake/sdlchecks.cmake	Wed Aug 20 17:20:22 2014 -0300
+++ b/cmake/sdlchecks.cmake	Wed Sep 10 18:10:37 2014 -0300
@@ -601,6 +601,25 @@
 endmacro(CheckDirectFB)
 
 # Requires:
+# - n/a
+macro(CheckMX6)
+  if(VIDEO_MX6)
+    check_c_source_compiles("
+        #define EGL_API_FB
+        #include <EGL/eglvivante.h>
+        int main(int argc, char** argv) {}" HAVE_VIDEO_OPENGL_EGL_VIVANTE)
+    if(HAVE_VIDEO_OPENGL_EGL_VIVANTE)
+      set(HAVE_VIDEO_MX6 TRUE)
+      set(HAVE_SDL_VIDEO TRUE)
+
+      file(GLOB MX6_SOURCES ${SDL2_SOURCE_DIR}/src/video/mx6/*.c)
+      set(SOURCE_FILES ${SOURCE_FILES} ${MX6_SOURCES})
+      set(SDL_VIDEO_DRIVER_MX6 1)
+    endif(HAVE_VIDEO_OPENGL_EGL_VIVANTE)
+  endif(VIDEO_MX6)
+endmacro(CheckMX6)
+
+# Requires:
 # - nada
 macro(CheckOpenGLX11)
   if(VIDEO_OPENGL)
@@ -624,6 +643,7 @@
 macro(CheckOpenGLESX11)
   if(VIDEO_OPENGLES)
     check_c_source_compiles("
+        #define EGL_API_FB
         #include <EGL/egl.h>
         int main (int argc, char** argv) {}" HAVE_VIDEO_OPENGL_EGL)
     if(HAVE_VIDEO_OPENGL_EGL)
--- a/configure	Wed Aug 20 17:20:22 2014 -0300
+++ b/configure	Wed Sep 10 18:10:37 2014 -0300
@@ -832,6 +832,7 @@
 enable_video_x11_scrnsaver
 enable_video_x11_xshape
 enable_video_x11_vm
+enable_video_mx6
 enable_video_cocoa
 enable_video_directfb
 enable_directfb_shared
@@ -1561,6 +1562,7 @@
   --enable-video-x11-xshape
                           enable X11 XShape support [[default=yes]]
   --enable-video-x11-vm   use X11 VM extension for fullscreen [[default=yes]]
+  --enable-video-mx6      use Freescale i.MX6 video driver [[default=no]]
   --enable-video-cocoa    use Cocoa video driver [[default=yes]]
   --enable-video-directfb use DirectFB video driver [[default=no]]
   --enable-directfb-shared
@@ -2673,9 +2675,9 @@
 #
 SDL_MAJOR_VERSION=2
 SDL_MINOR_VERSION=0
-SDL_MICRO_VERSION=3
-SDL_INTERFACE_AGE=1
-SDL_BINARY_AGE=3
+SDL_MICRO_VERSION=4
+SDL_INTERFACE_AGE=0
+SDL_BINARY_AGE=4
 SDL_VERSION=$SDL_MAJOR_VERSION.$SDL_MINOR_VERSION.$SDL_MICRO_VERSION
 
 
@@ -20591,6 +20593,53 @@
     fi
 }
 
+CheckMX6Video()
+{
+    # Check whether --enable-video-mx6 was given.
+if test "${enable_video_mx6+set}" = set; then :
+  enableval=$enable_video_mx6;
+else
+  enable_video_mx6=no
+fi
+
+    if test x$enable_video = xyes -a x$enable_video_mx6 = xyes; then
+        { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Vivante GPU SDK" >&5
+$as_echo_n "checking for Vivante GPU SDK... " >&6; }
+        have_viv_sdk=no
+        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+          #define EGL_API_FB
+          #include <EGL/eglvivante.h>
+
+int
+main ()
+{
+
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+        have_viv_sdk=yes
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_viv_sdk" >&5
+$as_echo "$have_viv_sdk" >&6; }
+        if test x$have_viv_sdk = xyes; then
+
+$as_echo "#define SDL_VIDEO_DRIVER_MX6 1" >>confdefs.h
+
+            SOURCES="$SOURCES $srcdir/src/video/mx6/*.c"
+            SUMMARY_video="${SUMMARY_video} mx6"
+            have_video=yes
+        fi
+    fi
+}
+
 CheckHaikuVideo()
 {
     if test x$enable_video = xyes; then
@@ -21044,6 +21093,7 @@
         cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
+         #define EGL_API_FB
          #include <EGL/egl.h>
          #include <EGL/eglext.h>
 
@@ -22818,6 +22868,7 @@
         CheckClockGettime
         CheckLinuxVersion
         CheckRPATH
+        CheckMX6Video
         # Set up files for the audio library
         if test x$enable_audio = xyes; then
           case $ARCH in
@@ -23338,6 +23389,7 @@
         # The Mac OS X platform requires special setup.
         EXTRA_CFLAGS="$EXTRA_CFLAGS -fpascal-strings"
         EXTRA_LDFLAGS="$EXTRA_LDFLAGS -lobjc"
+        EXTRA_LDFLAGS="$EXTRA_LDFLAGS -Wl,-framework,CoreVideo"
         EXTRA_LDFLAGS="$EXTRA_LDFLAGS -Wl,-framework,Cocoa"
         EXTRA_LDFLAGS="$EXTRA_LDFLAGS -Wl,-framework,Carbon"
         EXTRA_LDFLAGS="$EXTRA_LDFLAGS -Wl,-framework,IOKit"
--- a/configure.in	Wed Aug 20 17:20:22 2014 -0300
+++ b/configure.in	Wed Sep 10 18:10:37 2014 -0300
@@ -20,9 +20,9 @@
 #
 SDL_MAJOR_VERSION=2
 SDL_MINOR_VERSION=0
-SDL_MICRO_VERSION=3
-SDL_INTERFACE_AGE=1
-SDL_BINARY_AGE=3
+SDL_MICRO_VERSION=4
+SDL_INTERFACE_AGE=0
+SDL_BINARY_AGE=4
 SDL_VERSION=$SDL_MAJOR_VERSION.$SDL_MINOR_VERSION.$SDL_MICRO_VERSION
 
 AC_SUBST(SDL_MAJOR_VERSION)
@@ -1729,6 +1729,32 @@
     fi
 }
 
+dnl Set up the MX6 video driver if enabled
+CheckMX6Video()
+{
+    AC_ARG_ENABLE(video-mx6,
+AC_HELP_STRING([--enable-video-mx6], [use Freescale i.MX6 video driver [[default=no]]]),
+                  , enable_video_mx6=no)
+    if test x$enable_video = xyes -a x$enable_video_mx6 = xyes; then
+        AC_MSG_CHECKING(for Vivante GPU SDK)
+        have_viv_sdk=no
+        AC_TRY_COMPILE([
+          #define EGL_API_FB
+          #include <EGL/eglvivante.h>
+        ],[
+        ],[
+        have_viv_sdk=yes
+        ])
+        AC_MSG_RESULT($have_viv_sdk)
+        if test x$have_viv_sdk = xyes; then
+            AC_DEFINE(SDL_VIDEO_DRIVER_MX6, 1, [ ])
+            SOURCES="$SOURCES $srcdir/src/video/mx6/*.c"
+            SUMMARY_video="${SUMMARY_video} mx6"
+            have_video=yes
+        fi
+    fi
+}
+
 dnl Set up the Haiku video driver if enabled
 CheckHaikuVideo()
 {
@@ -1955,6 +1981,7 @@
         AC_MSG_CHECKING(for EGL support)
         video_opengl_egl=no
         AC_TRY_COMPILE([
+         #define EGL_API_FB
          #include <EGL/egl.h>
          #include <EGL/eglext.h>
         ],[
@@ -2809,6 +2836,7 @@
         CheckClockGettime
         CheckLinuxVersion
         CheckRPATH
+        CheckMX6Video
         # Set up files for the audio library
         if test x$enable_audio = xyes; then
           case $ARCH in
@@ -3215,6 +3243,7 @@
         # The Mac OS X platform requires special setup.
         EXTRA_CFLAGS="$EXTRA_CFLAGS -fpascal-strings"
         EXTRA_LDFLAGS="$EXTRA_LDFLAGS -lobjc"
+        EXTRA_LDFLAGS="$EXTRA_LDFLAGS -Wl,-framework,CoreVideo"
         EXTRA_LDFLAGS="$EXTRA_LDFLAGS -Wl,-framework,Cocoa"
         EXTRA_LDFLAGS="$EXTRA_LDFLAGS -Wl,-framework,Carbon"
         EXTRA_LDFLAGS="$EXTRA_LDFLAGS -Wl,-framework,IOKit"
--- a/docs/README-linux.md	Wed Aug 20 17:20:22 2014 -0300
+++ b/docs/README-linux.md	Wed Sep 10 18:10:37 2014 -0300
@@ -19,7 +19,7 @@
 libtool libasound2-dev libpulse-dev libaudio-dev libx11-dev libxext-dev \
 libxrandr-dev libxcursor-dev libxi-dev libxinerama-dev libxxf86vm-dev \
 libxss-dev libgl1-mesa-dev libesd0-dev libdbus-1-dev libudev-dev \
-libgles1-mesa-dev libgles2-mesa-dev libegl1-mesa-dev
+libgles1-mesa-dev libgles2-mesa-dev libegl1-mesa-dev libibus-1.0-dev
 
 Ubuntu 14.04 can also add "libwayland-dev libmirclient-dev libxkbcommon-dev"
 to that command line for Wayland and Mir support.
--- a/docs/doxyfile	Wed Aug 20 17:20:22 2014 -0300
+++ b/docs/doxyfile	Wed Sep 10 18:10:37 2014 -0300
@@ -31,7 +31,7 @@
 # This could be handy for archiving the generated documentation or 
 # if some version control system is used.
 
-PROJECT_NUMBER         = 2.0.0
+PROJECT_NUMBER         = 2.0
 
 # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) 
 # base path where the generated documentation will be put. 
--- a/include/SDL_config.h.cmake	Wed Aug 20 17:20:22 2014 -0300
+++ b/include/SDL_config.h.cmake	Wed Sep 10 18:10:37 2014 -0300
@@ -264,6 +264,7 @@
 #cmakedefine SDL_VIDEO_DRIVER_WINDOWS @SDL_VIDEO_DRIVER_WINDOWS@
 #cmakedefine SDL_VIDEO_DRIVER_WAYLAND @SDL_VIDEO_DRIVER_WAYLAND@
 #cmakedefine SDL_VIDEO_DRIVER_RPI @SDL_VIDEO_DRIVER_RPI@
+#cmakedefine SDL_VIDEO_DRIVER_MX6 @SDL_VIDEO_DRIVER_MX6@
 
 #if 0
 /* !!! FIXME: in configure script version, missing here: */
--- a/include/SDL_config.h.in	Wed Aug 20 17:20:22 2014 -0300
+++ b/include/SDL_config.h.in	Wed Sep 10 18:10:37 2014 -0300
@@ -308,6 +308,7 @@
 #undef SDL_VIDEO_DRIVER_X11_CONST_PARAM_XEXTADDDISPLAY
 #undef SDL_VIDEO_DRIVER_X11_HAS_XKBKEYCODETOKEYSYM
 #undef SDL_VIDEO_DRIVER_NACL
+#undef SDL_VIDEO_DRIVER_MX6
 
 #undef SDL_VIDEO_RENDER_D3D
 #undef SDL_VIDEO_RENDER_D3D11
--- a/include/SDL_hints.h	Wed Aug 20 17:20:22 2014 -0300
+++ b/include/SDL_hints.h	Wed Sep 10 18:10:37 2014 -0300
@@ -479,14 +479,13 @@
 #define SDL_HINT_ANDROID_APK_EXPANSION_PATCH_FILE_VERSION "SDL_ANDROID_APK_EXPANSION_PATCH_FILE_VERSION"
 
 /**
- * \brief A variable to control whether certain IMs should handle text editing internally instead of sending TEXTEDITING events.
- *
+ * \brief A variable to control whether certain IMEs should handle text editing internally instead of sending SDL_TEXTEDITING events.
  *
  * The variable can be set to the following values:
- *   "0"       - TEXTEDITING events are sent, and it is the application's
+ *   "0"       - SDL_TEXTEDITING events are sent, and it is the application's
  *               responsibility to render the text from these events and 
  *               differentiate it somehow from committed text. (default)
- *   "1"       - If supported by the IM then TEXTEDITING events are not sent, 
+ *   "1"       - If supported by the IME then SDL_TEXTEDITING events are not sent, 
  *               and text that is being composed will be rendered in its own UI.
  */
 #define SDL_HINT_IME_INTERNAL_EDITING "SDL_IME_INTERNAL_EDITING"
--- a/include/SDL_thread.h	Wed Aug 20 17:20:22 2014 -0300
+++ b/include/SDL_thread.h	Wed Sep 10 18:10:37 2014 -0300
@@ -233,9 +233,9 @@
  *          if (!thread_local_storage) {
  *              thread_local_storage = SDL_TLSCreate();
  *          }
- *          SDL_AtomicUnLock(&tls_lock);
+ *          SDL_AtomicUnlock(&tls_lock);
  *      }
- *      SDL_TLSSet(thread_local_storage, value);
+ *      SDL_TLSSet(thread_local_storage, value, 0);
  *  }
  *  
  *  void *GetMyThreadData(void)
--- a/include/SDL_version.h	Wed Aug 20 17:20:22 2014 -0300
+++ b/include/SDL_version.h	Wed Sep 10 18:10:37 2014 -0300
@@ -59,7 +59,7 @@
 */
 #define SDL_MAJOR_VERSION   2
 #define SDL_MINOR_VERSION   0
-#define SDL_PATCHLEVEL      3
+#define SDL_PATCHLEVEL      4
 
 /**
  *  \brief Macro to determine SDL version program was compiled against.
--- a/premake/README-macosx.txt	Wed Aug 20 17:20:22 2014 -0300
+++ b/premake/README-macosx.txt	Wed Sep 10 18:10:37 2014 -0300
@@ -17,6 +17,7 @@
 
 The Mac OS X projects currently have reliance on the following dependencies:
 
+  -CoreVideo.framework
   -AudioToolbox.framework
   -AudioUnit.framework
   -Cocoa.framework
--- a/premake/projects/SDL2.lua	Wed Aug 20 17:20:22 2014 -0300
+++ b/premake/projects/SDL2.lua	Wed Sep 10 18:10:37 2014 -0300
@@ -213,6 +213,7 @@
 		}
 		SDL_links
 		{
+			"CoreVideo.framework",
 			"AudioToolbox.framework",
 			"AudioUnit.framework",
 			"Cocoa.framework",
--- a/src/core/linux/SDL_ibus.c	Wed Aug 20 17:20:22 2014 -0300
+++ b/src/core/linux/SDL_ibus.c	Wed Sep 10 18:10:37 2014 -0300
@@ -54,14 +54,14 @@
     SDL_Keymod sdl_mods = SDL_GetModState();
     
     /* Not sure about MOD3, MOD4 and HYPER mappings */
-    if(sdl_mods & KMOD_LSHIFT) ibus_mods |= IBUS_SHIFT_MASK;
-    if(sdl_mods & KMOD_CAPS)   ibus_mods |= IBUS_LOCK_MASK;
-    if(sdl_mods & KMOD_LCTRL)  ibus_mods |= IBUS_CONTROL_MASK;
-    if(sdl_mods & KMOD_LALT)   ibus_mods |= IBUS_MOD1_MASK;
-    if(sdl_mods & KMOD_NUM)    ibus_mods |= IBUS_MOD2_MASK;
-    if(sdl_mods & KMOD_MODE)   ibus_mods |= IBUS_MOD5_MASK;
-    if(sdl_mods & KMOD_LGUI)   ibus_mods |= IBUS_SUPER_MASK;
-    if(sdl_mods & KMOD_RGUI)   ibus_mods |= IBUS_META_MASK;
+    if (sdl_mods & KMOD_LSHIFT) ibus_mods |= IBUS_SHIFT_MASK;
+    if (sdl_mods & KMOD_CAPS)   ibus_mods |= IBUS_LOCK_MASK;
+    if (sdl_mods & KMOD_LCTRL)  ibus_mods |= IBUS_CONTROL_MASK;
+    if (sdl_mods & KMOD_LALT)   ibus_mods |= IBUS_MOD1_MASK;
+    if (sdl_mods & KMOD_NUM)    ibus_mods |= IBUS_MOD2_MASK;
+    if (sdl_mods & KMOD_MODE)   ibus_mods |= IBUS_MOD5_MASK;
+    if (sdl_mods & KMOD_LGUI)   ibus_mods |= IBUS_SUPER_MASK;
+    if (sdl_mods & KMOD_RGUI)   ibus_mods |= IBUS_META_MASK;
 
     return ibus_mods;
 }
@@ -71,34 +71,34 @@
 {
     /* The text we need is nested weirdly, use dbus-monitor to see the structure better */
     const char *text = NULL;
+    const char *struct_id = NULL;
     DBusMessageIter sub1, sub2;
 
-    if(dbus->message_iter_get_arg_type(iter) != DBUS_TYPE_VARIANT){
+    if (dbus->message_iter_get_arg_type(iter) != DBUS_TYPE_VARIANT) {
         return NULL;
     }
     
     dbus->message_iter_recurse(iter, &sub1);
     
-    if(dbus->message_iter_get_arg_type(&sub1) != DBUS_TYPE_STRUCT){
+    if (dbus->message_iter_get_arg_type(&sub1) != DBUS_TYPE_STRUCT) {
         return NULL;
     }
     
     dbus->message_iter_recurse(&sub1, &sub2);
     
-    if(dbus->message_iter_get_arg_type(&sub2) != DBUS_TYPE_STRING){
+    if (dbus->message_iter_get_arg_type(&sub2) != DBUS_TYPE_STRING) {
         return NULL;
     }
     
-    const char *struct_id = NULL;
     dbus->message_iter_get_basic(&sub2, &struct_id);
-    if(!struct_id || SDL_strncmp(struct_id, "IBusText", sizeof("IBusText")) != 0){
+    if (!struct_id || SDL_strncmp(struct_id, "IBusText", sizeof("IBusText")) != 0) {
         return NULL;
     }
     
     dbus->message_iter_next(&sub2);
     dbus->message_iter_next(&sub2);
     
-    if(dbus->message_iter_get_arg_type(&sub2) != DBUS_TYPE_STRING){
+    if (dbus->message_iter_get_arg_type(&sub2) != DBUS_TYPE_STRING) {
         return NULL;
     }
     
@@ -113,8 +113,8 @@
     size_t utf8_len = 0;
     const char *p;
     
-    for(p = str; *p; ++p){
-        if(!((*p & 0x80) && !(*p & 0x40))){
+    for (p = str; *p; ++p) {
+        if (!((*p & 0x80) && !(*p & 0x40))) {
             ++utf8_len;
         }
     }
@@ -127,16 +127,18 @@
 {
     SDL_DBusContext *dbus = (SDL_DBusContext *)user_data;
         
-    if(dbus->message_is_signal(msg, IBUS_INPUT_INTERFACE, "CommitText")){
+    if (dbus->message_is_signal(msg, IBUS_INPUT_INTERFACE, "CommitText")) {
         DBusMessageIter iter;
+        const char *text;
+
         dbus->message_iter_init(msg, &iter);
         
-        const char *text = IBus_GetVariantText(conn, &iter, dbus);
-        if(text && *text){
+        text = IBus_GetVariantText(conn, &iter, dbus);
+        if (text && *text) {
             char buf[SDL_TEXTEDITINGEVENT_TEXT_SIZE];
             size_t text_bytes = SDL_strlen(text), i = 0;
             
-            while(i < text_bytes){
+            while (i < text_bytes) {
                 size_t sz = SDL_utf8strlcpy(buf, text+i, sizeof(buf));
                 SDL_SendKeyboardText(buf);
                 
@@ -147,17 +149,19 @@
         return DBUS_HANDLER_RESULT_HANDLED;
     }
     
-    if(dbus->message_is_signal(msg, IBUS_INPUT_INTERFACE, "UpdatePreeditText")){
+    if (dbus->message_is_signal(msg, IBUS_INPUT_INTERFACE, "UpdatePreeditText")) {
         DBusMessageIter iter;
+        const char *text;
+
         dbus->message_iter_init(msg, &iter);
-        const char *text = IBus_GetVariantText(conn, &iter, dbus);
+        text = IBus_GetVariantText(conn, &iter, dbus);
         
-        if(text && *text){
+        if (text && *text) {
             char buf[SDL_TEXTEDITINGEVENT_TEXT_SIZE];
             size_t text_bytes = SDL_strlen(text), i = 0;
             size_t cursor = 0;
             
-            while(i < text_bytes){
+            while (i < text_bytes) {
                 size_t sz = SDL_utf8strlcpy(buf, text+i, sizeof(buf));
                 size_t chars = IBus_utf8_strlen(buf);
                 
@@ -173,9 +177,9 @@
         return DBUS_HANDLER_RESULT_HANDLED;
     }
     
-    if(dbus->message_is_signal(msg, IBUS_INPUT_INTERFACE, "HidePreeditText")){
-    	SDL_SendEditingText("", 0, 0);
-    	return DBUS_HANDLER_RESULT_HANDLED;
+    if (dbus->message_is_signal(msg, IBUS_INPUT_INTERFACE, "HidePreeditText")) {
+        SDL_SendEditingText("", 0, 0);
+        return DBUS_HANDLER_RESULT_HANDLED;
     }
     
     return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
@@ -184,19 +188,20 @@
 static char *
 IBus_ReadAddressFromFile(const char *file_path)
 {
-    FILE *addr_file = fopen(file_path, "r");
-    if(!addr_file){
+    char addr_buf[1024];
+    SDL_bool success = SDL_FALSE;
+    FILE *addr_file;
+
+    addr_file = fopen(file_path, "r");
+    if (!addr_file) {
         return NULL;
     }
 
-    char addr_buf[1024];
-    SDL_bool success = SDL_FALSE;
-
-    while(fgets(addr_buf, sizeof(addr_buf), addr_file)){
-        if(SDL_strncmp(addr_buf, "IBUS_ADDRESS=", sizeof("IBUS_ADDRESS=")-1) == 0){
+    while (fgets(addr_buf, sizeof(addr_buf), addr_file)) {
+        if (SDL_strncmp(addr_buf, "IBUS_ADDRESS=", sizeof("IBUS_ADDRESS=")-1) == 0) {
             size_t sz = SDL_strlen(addr_buf);
-            if(addr_buf[sz-1] == '\n') addr_buf[sz-1] = 0;
-            if(addr_buf[sz-2] == '\r') addr_buf[sz-2] = 0;
+            if (addr_buf[sz-1] == '\n') addr_buf[sz-1] = 0;
+            if (addr_buf[sz-2] == '\r') addr_buf[sz-2] = 0;
             success = SDL_TRUE;
             break;
         }
@@ -204,7 +209,7 @@
 
     fclose(addr_file);
 
-    if(success){
+    if (success) {
         return SDL_strdup(addr_buf + (sizeof("IBUS_ADDRESS=") - 1));
     } else {
         return NULL;
@@ -214,38 +219,47 @@
 static char *
 IBus_GetDBusAddressFilename(void)
 {
-    if(ibus_addr_file){
+    SDL_DBusContext *dbus;
+    const char *disp_env;
+    char config_dir[PATH_MAX];
+    char *display = NULL;
+    const char *addr;
+    const char *conf_env;
+    char *key;
+    char file_path[PATH_MAX];
+    const char *host;
+    char *disp_num, *screen_num;
+
+    if (ibus_addr_file) {
         return SDL_strdup(ibus_addr_file);
     }
     
-    SDL_DBusContext *dbus = SDL_DBus_GetContext();
-    
-    if(!dbus){
+    dbus = SDL_DBus_GetContext();
+    if (!dbus) {
         return NULL;
     }
     
     /* Use this environment variable if it exists. */
-    const char *addr = SDL_getenv("IBUS_ADDRESS");
-    if(addr && *addr){
+    addr = SDL_getenv("IBUS_ADDRESS");
+    if (addr && *addr) {
         return SDL_strdup(addr);
     }
     
     /* Otherwise, we have to get the hostname, display, machine id, config dir
        and look up the address from a filepath using all those bits, eek. */
-    const char *disp_env = SDL_getenv("DISPLAY");
-    char *display = NULL;
-    
-    if(!disp_env || !*disp_env){
+    disp_env = SDL_getenv("DISPLAY");
+
+    if (!disp_env || !*disp_env) {
         display = SDL_strdup(":0.0");
     } else {
         display = SDL_strdup(disp_env);
     }
     
-    const char *host = display;
-    char *disp_num   = SDL_strrchr(display, ':'), 
-         *screen_num = SDL_strrchr(display, '.');
+    host = display;
+    disp_num   = SDL_strrchr(display, ':');
+    screen_num = SDL_strrchr(display, '.');
     
-    if(!disp_num){
+    if (!disp_num) {
         SDL_free(display);
         return NULL;
     }
@@ -253,32 +267,30 @@
     *disp_num = 0;
     disp_num++;
     
-    if(screen_num){
+    if (screen_num) {
         *screen_num = 0;
     }
     
-    if(!*host){
+    if (!*host) {
         host = "unix";
     }
         
-    char config_dir[PATH_MAX];
     SDL_memset(config_dir, 0, sizeof(config_dir));
     
-    const char *conf_env = SDL_getenv("XDG_CONFIG_HOME");
-    if(conf_env && *conf_env){
+    conf_env = SDL_getenv("XDG_CONFIG_HOME");
+    if (conf_env && *conf_env) {
         SDL_strlcpy(config_dir, conf_env, sizeof(config_dir));
     } else {
         const char *home_env = SDL_getenv("HOME");
-        if(!home_env || !*home_env){
+        if (!home_env || !*home_env) {
             SDL_free(display);
             return NULL;
         }
         SDL_snprintf(config_dir, sizeof(config_dir), "%s/.config", home_env);
     }
     
-    char *key = dbus->get_local_machine_id();
-    
-    char file_path[PATH_MAX];
+    key = dbus->get_local_machine_id();
+
     SDL_memset(file_path, 0, sizeof(file_path));
     SDL_snprintf(file_path, sizeof(file_path), "%s/ibus/bus/%s-%s-%s", 
                                                config_dir, key, host, disp_num);
@@ -296,15 +308,15 @@
 {
     SDL_DBusContext *dbus = SDL_DBus_GetContext();
     
-    if(IBus_CheckConnection(dbus)){
+    if (IBus_CheckConnection(dbus)) {
 
         DBusMessage *msg = dbus->message_new_method_call(IBUS_SERVICE,
                                                          input_ctx_path,
                                                          IBUS_INPUT_INTERFACE,
                                                          "SetCapabilities");
-        if(msg){
+        if (msg) {
             Uint32 caps = IBUS_CAP_FOCUS;
-            if(!(internal_editing && *internal_editing == '1')){
+            if (!(internal_editing && *internal_editing == '1')) {
                 caps |= IBUS_CAP_PREEDIT_TEXT;
             }
             
@@ -313,8 +325,8 @@
                                       DBUS_TYPE_INVALID);
         }
         
-        if(msg){
-            if(dbus->connection_send(ibus_conn, msg, NULL)){
+        if (msg) {
+            if (dbus->connection_send(ibus_conn, msg, NULL)) {
                 dbus->connection_flush(ibus_conn);
             }
             dbus->message_unref(msg);
@@ -328,42 +340,40 @@
 {
     const char *path = NULL;
     SDL_bool result = SDL_FALSE;
-    
+    DBusMessage *msg;
+
     ibus_conn = dbus->connection_open_private(addr, NULL);
 
-    if(!ibus_conn){
+    if (!ibus_conn) {
         return SDL_FALSE;
     }
 
     dbus->connection_flush(ibus_conn);
     
-    if(!dbus->bus_register(ibus_conn, NULL)){
+    if (!dbus->bus_register(ibus_conn, NULL)) {
         ibus_conn = NULL;
         return SDL_FALSE;
     }
     
     dbus->connection_flush(ibus_conn);
 
-    DBusMessage *msg = dbus->message_new_method_call(IBUS_SERVICE,
-                                                     IBUS_PATH,
-                                                     IBUS_INTERFACE,
-                                                     "CreateInputContext");
-    if(msg){
+    msg = dbus->message_new_method_call(IBUS_SERVICE, IBUS_PATH, IBUS_INTERFACE, "CreateInputContext");
+    if (msg) {
         const char *client_name = "SDL2_Application";
         dbus->message_append_args(msg,
                                   DBUS_TYPE_STRING, &client_name,
                                   DBUS_TYPE_INVALID);
     }
     
-    if(msg){
+    if (msg) {
         DBusMessage *reply;
         
         reply = dbus->connection_send_with_reply_and_block(ibus_conn, msg, 1000, NULL);
-        if(reply){
-            if(dbus->message_get_args(reply, NULL,
+        if (reply) {
+            if (dbus->message_get_args(reply, NULL,
                                        DBUS_TYPE_OBJECT_PATH, &path,
-                                       DBUS_TYPE_INVALID)){
-                if(input_ctx_path){
+                                       DBUS_TYPE_INVALID)) {
+                if (input_ctx_path) {
                     SDL_free(input_ctx_path);
                 }
                 input_ctx_path = SDL_strdup(path);
@@ -374,7 +384,7 @@
         dbus->message_unref(msg);
     }
 
-    if(result){
+    if (result) {
         SDL_AddHintCallback(SDL_HINT_IME_INTERNAL_EDITING, &IBus_SetCapabilities, NULL);
         
         dbus->bus_add_match(ibus_conn, "type='signal',interface='org.freedesktop.IBus.InputContext'", NULL);
@@ -391,27 +401,27 @@
 static SDL_bool
 IBus_CheckConnection(SDL_DBusContext *dbus)
 {
-    if(!dbus) return SDL_FALSE;
+    if (!dbus) return SDL_FALSE;
     
-    if(ibus_conn && dbus->connection_get_is_connected(ibus_conn)){
+    if (ibus_conn && dbus->connection_get_is_connected(ibus_conn)) {
         return SDL_TRUE;
     }
     
-    if(inotify_fd > 0 && inotify_wd > 0){
+    if (inotify_fd > 0 && inotify_wd > 0) {
         char buf[1024];
         ssize_t readsize = read(inotify_fd, buf, sizeof(buf));
-        if(readsize > 0){
+        if (readsize > 0) {
         
             char *p;
             SDL_bool file_updated = SDL_FALSE;
             
-            for(p = buf; p < buf + readsize; /**/){
+            for (p = buf; p < buf + readsize; /**/) {
                 struct inotify_event *event = (struct inotify_event*) p;
-                if(event->len > 0){
+                if (event->len > 0) {
                     char *addr_file_no_path = SDL_strrchr(ibus_addr_file, '/');
-                    if(!addr_file_no_path) return SDL_FALSE;
+                    if (!addr_file_no_path) return SDL_FALSE;
                  
-                    if(SDL_strcmp(addr_file_no_path + 1, event->name) == 0){
+                    if (SDL_strcmp(addr_file_no_path + 1, event->name) == 0) {
                         file_updated = SDL_TRUE;
                         break;
                     }
@@ -420,9 +430,9 @@
                 p += sizeof(struct inotify_event) + event->len;
             }
             
-            if(file_updated){
+            if (file_updated) {
                 char *addr = IBus_ReadAddressFromFile(ibus_addr_file);
-                if(addr){
+                if (addr) {
                     SDL_bool result = IBus_SetupConnection(dbus, addr);
                     SDL_free(addr);
                     return result;
@@ -440,23 +450,26 @@
     SDL_bool result = SDL_FALSE;
     SDL_DBusContext *dbus = SDL_DBus_GetContext();
     
-    if(dbus){
+    if (dbus) {
         char *addr_file = IBus_GetDBusAddressFilename();
-        if(!addr_file){
+        char *addr;
+        char *addr_file_dir;
+
+        if (!addr_file) {
             return SDL_FALSE;
         }
         
         ibus_addr_file = SDL_strdup(addr_file);
         
-        char *addr = IBus_ReadAddressFromFile(addr_file);
+        addr = IBus_ReadAddressFromFile(addr_file);
         
-        if(inotify_fd < 0){
+        if (inotify_fd < 0) {
             inotify_fd = inotify_init();
             fcntl(inotify_fd, F_SETFL, O_NONBLOCK);
         }
         
-        char *addr_file_dir = SDL_strrchr(addr_file, '/');
-        if(addr_file_dir){
+        addr_file_dir = SDL_strrchr(addr_file, '/');
+        if (addr_file_dir) {
             *addr_file_dir = 0;
         }
         
@@ -473,24 +486,26 @@
 void
 SDL_IBus_Quit(void)
 {   
-    if(input_ctx_path){
+    SDL_DBusContext *dbus;
+
+    if (input_ctx_path) {
         SDL_free(input_ctx_path);
         input_ctx_path = NULL;
     }
     
-    if(ibus_addr_file){
+    if (ibus_addr_file) {
         SDL_free(ibus_addr_file);
         ibus_addr_file = NULL;
     }
     
-    SDL_DBusContext *dbus = SDL_DBus_GetContext();
+    dbus = SDL_DBus_GetContext();
     
-    if(dbus && ibus_conn){
+    if (dbus && ibus_conn) {
         dbus->connection_close(ibus_conn);
         dbus->connection_unref(ibus_conn);
     }
     
-    if(inotify_fd > 0 && inotify_wd > 0){
+    if (inotify_fd > 0 && inotify_wd > 0) {
         inotify_rm_watch(inotify_fd, inotify_wd);
         inotify_wd = -1;
     }
@@ -505,13 +520,13 @@
 {   
     SDL_DBusContext *dbus = SDL_DBus_GetContext();
     
-    if(IBus_CheckConnection(dbus)){
+    if (IBus_CheckConnection(dbus)) {
         DBusMessage *msg = dbus->message_new_method_call(IBUS_SERVICE,
                                                          input_ctx_path,
                                                          IBUS_INPUT_INTERFACE,
                                                          method);
-        if(msg){
-            if(dbus->connection_send(ibus_conn, msg, NULL)){
+        if (msg) {
+            if (dbus->connection_send(ibus_conn, msg, NULL)) {
                 dbus->connection_flush(ibus_conn);
             }
             dbus->message_unref(msg);
@@ -538,12 +553,12 @@
     SDL_bool result = SDL_FALSE;   
     SDL_DBusContext *dbus = SDL_DBus_GetContext();
     
-    if(IBus_CheckConnection(dbus)){
+    if (IBus_CheckConnection(dbus)) {
         DBusMessage *msg = dbus->message_new_method_call(IBUS_SERVICE,
                                                          input_ctx_path,
                                                          IBUS_INPUT_INTERFACE,
                                                          "ProcessKeyEvent");
-        if(msg){
+        if (msg) {
             Uint32 mods = IBus_ModState();
             dbus->message_append_args(msg,
                                       DBUS_TYPE_UINT32, &keysym,
@@ -552,14 +567,14 @@
                                       DBUS_TYPE_INVALID);
         }
         
-        if(msg){
+        if (msg) {
             DBusMessage *reply;
             
             reply = dbus->connection_send_with_reply_and_block(ibus_conn, msg, 300, NULL);
-            if(reply){
-                if(!dbus->message_get_args(reply, NULL,
+            if (reply) {
+                if (!dbus->message_get_args(reply, NULL,
                                            DBUS_TYPE_BOOLEAN, &result,
-                                           DBUS_TYPE_INVALID)){
+                                           DBUS_TYPE_INVALID)) {
                     result = SDL_FALSE;                         
                 }
                 dbus->message_unref(reply);
@@ -577,49 +592,51 @@
 void
 SDL_IBus_UpdateTextRect(SDL_Rect *rect)
 {
-    if(rect){
+    SDL_Window *focused_win;
+    SDL_SysWMinfo info;
+    int x = 0, y = 0;
+    SDL_DBusContext *dbus;
+
+    if (rect) {
         SDL_memcpy(&ibus_cursor_rect, rect, sizeof(ibus_cursor_rect));
     }
-    
-    SDL_Window *focused_win = SDL_GetKeyboardFocus();
+
+    focused_win = SDL_GetKeyboardFocus();
+    if (!focused_win) {
+        return;
+    }
 
-    if(!focused_win) return;
-    
-    SDL_SysWMinfo info;
     SDL_VERSION(&info.version);
-    
-    if(!SDL_GetWindowWMInfo(focused_win, &info)) return;
-    
-    int x = 0, y = 0;
-    
+    if (!SDL_GetWindowWMInfo(focused_win, &info)) {
+        return;
+    }
+
     SDL_GetWindowPosition(focused_win, &x, &y);
    
 #if SDL_VIDEO_DRIVER_X11    
-    if(info.subsystem == SDL_SYSWM_X11){
-        SDL_DisplayData *displaydata =
-            (SDL_DisplayData *) SDL_GetDisplayForWindow(focused_win)->driverdata;
+    if (info.subsystem == SDL_SYSWM_X11) {
+        SDL_DisplayData *displaydata = (SDL_DisplayData *) SDL_GetDisplayForWindow(focused_win)->driverdata;
             
         Display *x_disp = info.info.x11.display;
         Window x_win = info.info.x11.window;
         int x_screen = displaydata->screen;
         Window unused;
             
-        X11_XTranslateCoordinates(x_disp, x_win, RootWindow(x_disp, x_screen),
-            0, 0, &x, &y, &unused);
+        X11_XTranslateCoordinates(x_disp, x_win, RootWindow(x_disp, x_screen), 0, 0, &x, &y, &unused);
     }
 #endif
 
     x += ibus_cursor_rect.x;
     y += ibus_cursor_rect.y;
         
-    SDL_DBusContext *dbus = SDL_DBus_GetContext();
+    dbus = SDL_DBus_GetContext();
     
-    if(IBus_CheckConnection(dbus)){
+    if (IBus_CheckConnection(dbus)) {
         DBusMessage *msg = dbus->message_new_method_call(IBUS_SERVICE,
                                                          input_ctx_path,
                                                          IBUS_INPUT_INTERFACE,
                                                          "SetCursorLocation");
-        if(msg){
+        if (msg) {
             dbus->message_append_args(msg,
                                       DBUS_TYPE_INT32, &x,
                                       DBUS_TYPE_INT32, &y,
@@ -628,8 +645,8 @@
                                       DBUS_TYPE_INVALID);
         }
         
-        if(msg){
-            if(dbus->connection_send(ibus_conn, msg, NULL)){
+        if (msg) {
+            if (dbus->connection_send(ibus_conn, msg, NULL)) {
                 dbus->connection_flush(ibus_conn);
             }
             dbus->message_unref(msg);
@@ -642,10 +659,10 @@
 {
     SDL_DBusContext *dbus = SDL_DBus_GetContext();
     
-    if(IBus_CheckConnection(dbus)){
+    if (IBus_CheckConnection(dbus)) {
         dbus->connection_read_write(ibus_conn, 0);
     
-        while(dbus->connection_dispatch(ibus_conn) == DBUS_DISPATCH_DATA_REMAINS){
+        while (dbus->connection_dispatch(ibus_conn) == DBUS_DISPATCH_DATA_REMAINS) {
             /* Do nothing, actual work happens in IBus_MessageFilter */
         }
     }
--- a/src/joystick/darwin/SDL_sysjoystick.c	Wed Aug 20 17:20:22 2014 -0300
+++ b/src/joystick/darwin/SDL_sysjoystick.c	Wed Sep 10 18:10:37 2014 -0300
@@ -364,15 +364,33 @@
     return SDL_TRUE;
 }
 
+static SDL_bool
+JoystickAlreadyKnown(IOHIDDeviceRef ioHIDDeviceObject)
+{
+    recDevice *i;
+    for (i = gpDeviceList; i != NULL; i = i->pNext) {
+        if (i->deviceRef == ioHIDDeviceObject) {
+            return SDL_TRUE;
+        }
+    }
+    return SDL_FALSE;
+}
+
 
 static void
 JoystickDeviceWasAddedCallback(void *ctx, IOReturn res, void *sender, IOHIDDeviceRef ioHIDDeviceObject)
 {
+    recDevice *device;
+
     if (res != kIOReturnSuccess) {
         return;
     }
 
-    recDevice *device = (recDevice *) SDL_calloc(1, sizeof(recDevice));
+    if (JoystickAlreadyKnown(ioHIDDeviceObject)) {
+        return;  /* IOKit sent us a duplicate. */
+    }
+
+    device = (recDevice *) SDL_calloc(1, sizeof(recDevice));
 
     if (!device) {
         SDL_OutOfMemory();
--- a/src/main/windows/version.rc	Wed Aug 20 17:20:22 2014 -0300
+++ b/src/main/windows/version.rc	Wed Sep 10 18:10:37 2014 -0300
@@ -9,8 +9,8 @@
 //
 
 VS_VERSION_INFO VERSIONINFO
- FILEVERSION 2,0,3,0
- PRODUCTVERSION 2,0,3,0
+ FILEVERSION 2,0,4,0
+ PRODUCTVERSION 2,0,4,0
  FILEFLAGSMASK 0x3fL
  FILEFLAGS 0x0L
  FILEOS 0x40004L
@@ -23,12 +23,12 @@
         BEGIN
             VALUE "CompanyName", "\0"
             VALUE "FileDescription", "SDL\0"
-            VALUE "FileVersion", "2, 0, 3, 0\0"
+            VALUE "FileVersion", "2, 0, 4, 0\0"
             VALUE "InternalName", "SDL\0"
             VALUE "LegalCopyright", "Copyright  2014 Sam Lantinga\0"
             VALUE "OriginalFilename", "SDL2.dll\0"
             VALUE "ProductName", "Simple DirectMedia Layer\0"
-            VALUE "ProductVersion", "2, 0, 3, 0\0"
+            VALUE "ProductVersion", "2, 0, 4, 0\0"
         END
     END
     BLOCK "VarFileInfo"
--- a/src/render/opengl/SDL_render_gl.c	Wed Aug 20 17:20:22 2014 -0300
+++ b/src/render/opengl/SDL_render_gl.c	Wed Sep 10 18:10:37 2014 -0300
@@ -1429,6 +1429,7 @@
                        format, type, temp_pixels);
 
     if (GL_CheckError("glReadPixels()", renderer) < 0) {
+        SDL_free(temp_pixels);
         return -1;
     }
 
--- a/src/video/SDL_bmp.c	Wed Aug 20 17:20:22 2014 -0300
+++ b/src/video/SDL_bmp.c	Wed Sep 10 18:10:37 2014 -0300
@@ -85,15 +85,17 @@
     int bmpPitch;
     int i, pad;
     SDL_Surface *surface;
-    Uint32 Rmask;
-    Uint32 Gmask;
-    Uint32 Bmask;
-    Uint32 Amask;
+    Uint32 Rmask = 0;
+    Uint32 Gmask = 0;
+    Uint32 Bmask = 0;
+    Uint32 Amask = 0;
     SDL_Palette *palette;
     Uint8 *bits;
     Uint8 *top, *end;
     SDL_bool topDown;
     int ExpandBMP;
+    SDL_bool haveRGBMasks = SDL_FALSE;
+    SDL_bool haveAlphaMask = SDL_FALSE;
     SDL_bool correctAlpha = SDL_FALSE;
 
     /* The Win32 BMP file header (14 bytes) */
@@ -144,15 +146,14 @@
 
     /* Read the Win32 BITMAPINFOHEADER */
     biSize = SDL_ReadLE32(src);
-    if (biSize == 12) {
+    if (biSize == 12) {   /* really old BITMAPCOREHEADER */
         biWidth = (Uint32) SDL_ReadLE16(src);
         biHeight = (Uint32) SDL_ReadLE16(src);
         /* biPlanes = */ SDL_ReadLE16(src);
         biBitCount = SDL_ReadLE16(src);
         biCompression = BI_RGB;
-    } else {
-        const unsigned int headerSize = 40;
-
+    } else if (biSize >= 40) {  /* some version of BITMAPINFOHEADER */
+        Uint32 headerSize;
         biWidth = SDL_ReadLE32(src);
         biHeight = SDL_ReadLE32(src);
         /* biPlanes = */ SDL_ReadLE16(src);
@@ -164,6 +165,54 @@
         biClrUsed = SDL_ReadLE32(src);
         /* biClrImportant = */ SDL_ReadLE32(src);
 
+        /* 64 == BITMAPCOREHEADER2, an incompatible OS/2 2.x extension. Skip this stuff for now. */
+        if (biSize == 64) {
+            /* ignore these extra fields. */
+            if (biCompression == BI_BITFIELDS) {
+                /* this value is actually huffman compression in this variant. */
+                SDL_SetError("Compressed BMP files not supported");
+                was_error = SDL_TRUE;
+                goto done;
+            }
+        } else {
+            /* This is complicated. If compression is BI_BITFIELDS, then
+               we have 3 DWORDS that specify the RGB masks. This is either
+               stored here in an BITMAPV2INFOHEADER (which only differs in
+               that it adds these RGB masks) and biSize >= 52, or we've got
+               these masks stored in the exact same place, but strictly
+               speaking, this is the bmiColors field in BITMAPINFO immediately
+               following the legacy v1 info header, just past biSize. */
+            if (biCompression == BI_BITFIELDS) {
+                haveRGBMasks = SDL_TRUE;
+                Rmask = SDL_ReadLE32(src);
+                Gmask = SDL_ReadLE32(src);
+                Bmask = SDL_ReadLE32(src);
+
+                /* ...v3 adds an alpha mask. */
+                if (biSize >= 56) {  /* BITMAPV3INFOHEADER; adds alpha mask */
+                    haveAlphaMask = SDL_TRUE;
+                    Amask = SDL_ReadLE32(src);
+                }
+            } else {
+                /* the mask fields are ignored for v2+ headers if not BI_BITFIELD. */
+                if (biSize >= 52) {  /* BITMAPV2INFOHEADER; adds RGB masks */
+                    /*Rmask = */ SDL_ReadLE32(src);
+                    /*Gmask = */ SDL_ReadLE32(src);
+                    /*Bmask = */ SDL_ReadLE32(src);
+                }
+                if (biSize >= 56) {  /* BITMAPV3INFOHEADER; adds alpha mask */
+                    /*Amask = */ SDL_ReadLE32(src);
+                }
+            }
+
+            /* Insert other fields here; Wikipedia and MSDN say we're up to
+               v5 of this header, but we ignore those for now (they add gamma,
+               color spaces, etc). Ignoring the weird OS/2 2.x format, we
+               currently parse up to v3 correctly (hopefully!). */
+        }
+
+        /* skip any header bytes we didn't handle... */
+        headerSize = (Uint32) (SDL_RWtell(src) - (fp_offset + 14));
         if (biSize > headerSize) {
             SDL_RWseek(src, (biSize - headerSize), RW_SEEK_CUR);
         }
@@ -194,80 +243,46 @@
     }
 
     /* We don't support any BMP compression right now */
-    Rmask = Gmask = Bmask = Amask = 0;
     switch (biCompression) {
     case BI_RGB:
         /* If there are no masks, use the defaults */
-        if (bfOffBits == (14 + biSize)) {
-            /* Default values for the BMP format */
-            switch (biBitCount) {
-            case 15:
-            case 16:
-                Rmask = 0x7C00;
-                Gmask = 0x03E0;
-                Bmask = 0x001F;
-                break;
-            case 24:
-#if SDL_BYTEORDER == SDL_BIG_ENDIAN
-                Rmask = 0x000000FF;
-                Gmask = 0x0000FF00;
-                Bmask = 0x00FF0000;
-#else
-                Rmask = 0x00FF0000;
-                Gmask = 0x0000FF00;
-                Bmask = 0x000000FF;
-#endif
-                break;
-            case 32:
-                /* We don't know if this has alpha channel or not */
-                correctAlpha = SDL_TRUE;
-                Amask = 0xFF000000;
-                Rmask = 0x00FF0000;
-                Gmask = 0x0000FF00;
-                Bmask = 0x000000FF;
-                break;
-            default:
-                break;
-            }
-            break;
-        }
-        /* Fall through -- read the RGB masks */
-
-    case BI_BITFIELDS:
+        SDL_assert(!haveRGBMasks);
+        SDL_assert(!haveAlphaMask);
+        /* Default values for the BMP format */
         switch (biBitCount) {
         case 15:
         case 16:
-            Rmask = SDL_ReadLE32(src);
-            Gmask = SDL_ReadLE32(src);
-            Bmask = SDL_ReadLE32(src);
+            Rmask = 0x7C00;
+            Gmask = 0x03E0;
+            Bmask = 0x001F;
+            break;
+        case 24:
+#if SDL_BYTEORDER == SDL_BIG_ENDIAN
+            Rmask = 0x000000FF;
+            Gmask = 0x0000FF00;
+            Bmask = 0x00FF0000;
+#else
+            Rmask = 0x00FF0000;
+            Gmask = 0x0000FF00;
+            Bmask = 0x000000FF;
+#endif
             break;
         case 32:
-            Rmask = SDL_ReadLE32(src);
-            Gmask = SDL_ReadLE32(src);
-            Bmask = SDL_ReadLE32(src);
-            Amask = SDL_ReadLE32(src);
-
-            /* ImageMagick seems to put out bogus masks here. Pick a default. */
-            if ((Rmask == 0xFFFFFF) && (Gmask == 0xFFFFFF) &&
-                (Bmask == 0xFFFFFF) && (Amask == 0xFFFFFF) ) {
-                Amask = 0xFF000000;
-                Rmask = 0x00FF0000;
-                Gmask = 0x0000FF00;
-                Bmask = 0x000000FF;
-            } else if ((Rmask == 0xFFFFFF00) && (Gmask == 0xFFFFFF00) &&
-                       (Bmask == 0xFFFFFF00) && (Amask == 0xFFFFFF00) ) {
-                /* argh, The Gimp seems to put out different bogus masks! */
-                Amask = 0x000000FF;
-                Rmask = 0xFF000000;
-                Gmask = 0x00FF0000;
-                Bmask = 0x0000FF00;
-            }
-
+            /* We don't know if this has alpha channel or not */
+            correctAlpha = SDL_TRUE;
+            Amask = 0xFF000000;
+            Rmask = 0x00FF0000;
+            Gmask = 0x0000FF00;
+            Bmask = 0x000000FF;
             break;
         default:
             break;
         }
         break;
+
+    case BI_BITFIELDS:
+        break;  /* we handled this in the info header. */
+
     default:
         SDL_SetError("Compressed BMP files not supported");
         was_error = SDL_TRUE;
--- a/src/video/SDL_shape.c	Wed Aug 20 17:20:22 2014 -0300
+++ b/src/video/SDL_shape.c	Wed Sep 10 18:10:37 2014 -0300
@@ -128,6 +128,7 @@
     SDL_Color key;
     SDL_ShapeTree* result = (SDL_ShapeTree*)SDL_malloc(sizeof(SDL_ShapeTree));
     SDL_Rect next = {0,0,0,0};
+
     for(y=dimensions.y;y<dimensions.y + dimensions.h;y++) {
         for(x=dimensions.x;x<dimensions.x + dimensions.w;x++) {
             pixel_value = 0;
@@ -165,27 +166,37 @@
             if(last_opaque == -1)
                 last_opaque = pixel_opaque;
             if(last_opaque != pixel_opaque) {
+                const int halfwidth = dimensions.w / 2;
+                const int halfheight = dimensions.h / 2;
+
                 result->kind = QuadShape;
-                /* These will stay the same. */
-                next.w = dimensions.w / 2;
-                next.h = dimensions.h / 2;
-                /* These will change from recursion to recursion. */
+
                 next.x = dimensions.x;
                 next.y = dimensions.y;
+                next.w = halfwidth;
+                next.h = halfheight;
                 result->data.children.upleft = (struct SDL_ShapeTree *)RecursivelyCalculateShapeTree(mode,mask,next);
-                next.x += next.w;
-                /* Unneeded: next.y = dimensions.y; */
+
+                next.x = dimensions.x + halfwidth;
+                next.w = dimensions.w - halfwidth;
                 result->data.children.upright = (struct SDL_ShapeTree *)RecursivelyCalculateShapeTree(mode,mask,next);
+
                 next.x = dimensions.x;
-                next.y += next.h;
+                next.w = halfwidth;
+                next.y = dimensions.y + halfheight;
+                next.h = dimensions.h - halfheight;
                 result->data.children.downleft = (struct SDL_ShapeTree *)RecursivelyCalculateShapeTree(mode,mask,next);
-                next.x += next.w;
-                /* Unneeded: next.y = dimensions.y + dimensions.h /2; */
+
+                next.x = dimensions.x + halfwidth;
+                next.w = dimensions.w - halfwidth;
                 result->data.children.downright = (struct SDL_ShapeTree *)RecursivelyCalculateShapeTree(mode,mask,next);
+
                 return result;
             }
         }
     }
+
+
     /* If we never recursed, all the pixels in this quadrant have the same "value". */
     result->kind = (last_opaque == SDL_TRUE ? OpaqueShape : TransparentShape);
     result->data.shape = dimensions;
--- a/src/video/SDL_sysvideo.h	Wed Aug 20 17:20:22 2014 -0300
+++ b/src/video/SDL_sysvideo.h	Wed Sep 10 18:10:37 2014 -0300
@@ -391,6 +391,9 @@
 #if SDL_VIDEO_DRIVER_NACL
 extern VideoBootStrap NACL_bootstrap;
 #endif
+#if SDL_VIDEO_DRIVER_MX6
+extern VideoBootStrap MX6_bootstrap;
+#endif
 
 extern SDL_VideoDevice *SDL_GetVideoDevice(void);
 extern int SDL_AddBasicVideoDisplay(const SDL_DisplayMode * desktop_mode);
--- a/src/video/SDL_video.c	Wed Aug 20 17:20:22 2014 -0300
+++ b/src/video/SDL_video.c	Wed Sep 10 18:10:37 2014 -0300
@@ -95,6 +95,9 @@
 #if SDL_VIDEO_DRIVER_NACL
     &NACL_bootstrap,
 #endif
+#if SDL_VIDEO_DRIVER_MX6
+    &MX6_bootstrap,
+#endif
 #if SDL_VIDEO_DRIVER_DUMMY
     &DUMMY_bootstrap,
 #endif
--- a/src/video/cocoa/SDL_cocoamodes.m	Wed Aug 20 17:20:22 2014 -0300
+++ b/src/video/cocoa/SDL_cocoamodes.m	Wed Sep 10 18:10:37 2014 -0300
@@ -27,6 +27,10 @@
 /* We need this for IODisplayCreateInfoDictionary and kIODisplayOnlyPreferredName */
 #include <IOKit/graphics/IOGraphicsLib.h>
 
+/* We need this for CVDisplayLinkGetNominalOutputVideoRefreshPeriod */
+#include <CoreVideo/CVBase.h>
+#include <CoreVideo/CVDisplayLink.h>
+
 /* we need this for ShowMenuBar() and HideMenuBar(). */
 #include <Carbon/Carbon.h>
 
@@ -114,7 +118,7 @@
 }
 
 static SDL_bool
-GetDisplayMode(_THIS, const void *moderef, SDL_DisplayMode *mode)
+GetDisplayMode(_THIS, const void *moderef, CVDisplayLinkRef link, SDL_DisplayMode *mode)
 {
     SDL_DisplayModeData *data;
     long width = 0;
@@ -133,7 +137,7 @@
         CFStringRef fmt = CGDisplayModeCopyPixelEncoding(vidmode);
         width = (long) CGDisplayModeGetWidth(vidmode);
         height = (long) CGDisplayModeGetHeight(vidmode);
-        refreshRate = (long) CGDisplayModeGetRefreshRate(vidmode);
+        refreshRate = (long) (CGDisplayModeGetRefreshRate(vidmode) + 0.5);
 
         if (CFStringCompare(fmt, CFSTR(IO32BitDirectPixels),
                             kCFCompareCaseInsensitive) == kCFCompareEqualTo) {
@@ -141,6 +145,9 @@
         } else if (CFStringCompare(fmt, CFSTR(IO16BitDirectPixels),
                             kCFCompareCaseInsensitive) == kCFCompareEqualTo) {
             bpp = 16;
+        } else if (CFStringCompare(fmt, CFSTR(kIO30BitDirectPixels),
+                            kCFCompareCaseInsensitive) == kCFCompareEqualTo) {
+            bpp = 30;
         } else {
             bpp = 0;  /* ignore 8-bit and such for now. */
         }
@@ -151,6 +158,7 @@
     #if MAC_OS_X_VERSION_MIN_REQUIRED < 1060
     if (!IS_SNOW_LEOPARD_OR_LATER()) {
         CFNumberRef number;
+        double refresh;
         CFDictionaryRef vidmode = (CFDictionaryRef) moderef;
         number = CFDictionaryGetValue(vidmode, kCGDisplayWidth);
         CFNumberGetValue(number, kCFNumberLongType, &width);
@@ -159,15 +167,27 @@
         number = CFDictionaryGetValue(vidmode, kCGDisplayBitsPerPixel);
         CFNumberGetValue(number, kCFNumberLongType, &bpp);
         number = CFDictionaryGetValue(vidmode, kCGDisplayRefreshRate);
-        CFNumberGetValue(number, kCFNumberLongType, &refreshRate);
+        CFNumberGetValue(number, kCFNumberDoubleType, &refresh);
+        refreshRate = (long) (refresh + 0.5);
     }
     #endif
 
+    /* CGDisplayModeGetRefreshRate returns 0 for many non-CRT displays. */
+    if (refreshRate == 0 && link != NULL) {
+        CVTime time = CVDisplayLinkGetNominalOutputVideoRefreshPeriod(link);
+        if ((time.flags & kCVTimeIsIndefinite) == 0 && time.timeValue != 0) {
+            refreshRate = (long) ((time.timeScale / (double) time.timeValue) + 0.5);
+        }
+    }
+
     mode->format = SDL_PIXELFORMAT_UNKNOWN;
     switch (bpp) {
     case 16:
         mode->format = SDL_PIXELFORMAT_ARGB1555;
         break;
+    case 30:
+        mode->format = SDL_PIXELFORMAT_ARGB2101010;
+        break;
     case 32:
         mode->format = SDL_PIXELFORMAT_ARGB8888;
         break;
@@ -241,6 +261,7 @@
             SDL_DisplayData *displaydata;
             SDL_DisplayMode mode;
             const void *moderef = NULL;
+            CVDisplayLinkRef link = NULL;
 
             if (pass == 0) {
                 if (!CGDisplayIsMain(displays[i])) {
@@ -277,16 +298,21 @@
             }
             displaydata->display = displays[i];
 
+            CVDisplayLinkCreateWithCGDisplay(displays[i], &link);
+
             SDL_zero(display);
             /* this returns a stddup'ed string */
             display.name = (char *)Cocoa_GetDisplayName(displays[i]);
-            if (!GetDisplayMode (_this, moderef, &mode)) {
+            if (!GetDisplayMode(_this, moderef, link, &mode)) {
+                CVDisplayLinkRelease(link);
                 Cocoa_ReleaseDisplayMode(_this, moderef);
                 SDL_free(display.name);
                 SDL_free(displaydata);
                 continue;
             }
 
+            CVDisplayLinkRelease(link);
+
             display.desktop_mode = mode;
             display.current_mode = mode;
             display.driverdata = displaydata;
@@ -328,13 +354,16 @@
     #endif
 
     if (modes) {
+        CVDisplayLinkRef link = NULL;
         const CFIndex count = CFArrayGetCount(modes);
         CFIndex i;
 
+        CVDisplayLinkCreateWithCGDisplay(data->display, &link);
+
         for (i = 0; i < count; i++) {
             const void *moderef = CFArrayGetValueAtIndex(modes, i);
             SDL_DisplayMode mode;
-            if (GetDisplayMode(_this, moderef, &mode)) {
+            if (GetDisplayMode(_this, moderef, link, &mode)) {
                 if (IS_SNOW_LEOPARD_OR_LATER()) {
                     CGDisplayModeRetain((CGDisplayModeRef) moderef);
                 }
@@ -342,6 +371,7 @@
             }
         }
 
+        CVDisplayLinkRelease(link);
         Cocoa_ReleaseDisplayModeList(_this, modes);
     }
 }
--- a/src/video/directfb/SDL_DirectFB_window.c	Wed Aug 20 17:20:22 2014 -0300
+++ b/src/video/directfb/SDL_DirectFB_window.c	Wed Sep 10 18:10:37 2014 -0300
@@ -90,7 +90,7 @@
     desc.height = windata->size.h;
     desc.pixelformat = dispdata->pixelformat;
     desc.surface_caps = DSCAPS_PREMULTIPLIED;
-#if DIRECTFB_MAJOR_VERSION == 1 && DIRECTFB_MINOR_VERSION >= 4
+#if DIRECTFB_MAJOR_VERSION == 1 && DIRECTFB_MINOR_VERSION >= 6
     if (window->flags & SDL_WINDOW_OPENGL) {
         desc.surface_caps |= DSCAPS_GL;
     }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/video/mx6/SDL_mx6events.c	Wed Sep 10 18:10:37 2014 -0300
@@ -0,0 +1,45 @@
+/*
+  Simple DirectMedia Layer
+  Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
+
+  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 "../../SDL_internal.h"
+
+#if SDL_VIDEO_DRIVER_MX6
+
+#include "../../events/SDL_sysevents.h"
+#include "../../events/SDL_events_c.h"
+#include "../../events/SDL_keyboard_c.h"
+#include "SDL_mx6video.h"
+#include "SDL_mx6events_c.h"
+
+#ifdef SDL_INPUT_LINUXEV
+#include "../../core/linux/SDL_evdev.h"
+#endif
+
+void MX6_PumpEvents(_THIS)
+{
+#ifdef SDL_INPUT_LINUXEV
+    SDL_EVDEV_Poll();
+#endif
+    
+}
+
+#endif /* SDL_VIDEO_DRIVER_MX6 */
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/video/mx6/SDL_mx6events_c.h	Wed Sep 10 18:10:37 2014 -0300
@@ -0,0 +1,31 @@
+/*
+  Simple DirectMedia Layer
+  Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
+
+  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 _SDL_mx6events_c_h
+#define _SDL_mx6events_c_h
+
+#include "SDL_mx6video.h"
+
+void MX6_PumpEvents(_THIS);
+void MX6_EventInit(_THIS);
+void MX6_EventQuit(_THIS);
+
+#endif /* _SDL_mx6events_c_h */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/video/mx6/SDL_mx6opengles.c	Wed Sep 10 18:10:37 2014 -0300
@@ -0,0 +1,209 @@
+/*
+  Simple DirectMedia Layer
+  Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
+
+  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 "../../SDL_internal.h"
+
+#if SDL_VIDEO_DRIVER_MX6 && SDL_VIDEO_OPENGL_EGL
+
+#include "SDL_mx6opengles.h"
+#include "SDL_loadso.h"
+#include "SDL_mx6video.h"
+
+#define DEFAULT_OGL "libGL.so.1"
+#define DEFAULT_EGL "libEGL.so.1"
+#define DEFAULT_OGL_ES2 "libGLESv2.so.2"
+#define DEFAULT_OGL_ES "libGLESv1_CM.so.1"
+
+#define LOAD_FUNC(NAME) \
+*((void**)&_this->egl_data->NAME) = SDL_LoadFunction(_this->egl_data->dll_handle, #NAME); \
+if (!_this->egl_data->NAME) \
+{ \
+    return SDL_SetError("Could not retrieve EGL function " #NAME); \
+}
+
+#define LOAD_VIV_FUNC(NAME) \
+*((void**)&egl_viv_data->NAME) = SDL_LoadFunction(_this->egl_data->dll_handle, #NAME); \
+if (!egl_viv_data->NAME) \
+{ \
+    return SDL_SetError("Could not retrieve EGL function " #NAME); \
+}
+
+/* EGL implementation of SDL OpenGL support */
+
+int
+MX6_GLES_LoadLibrary(_THIS, const char *egl_path) {
+    /* The definitions of egl_dll_handle and dll_handle were interchanged for some reason.
+       Just left them as is for compatibility */
+    void *dll_handle = NULL, *egl_dll_handle = NULL;
+    char *path = NULL;
+    SDL_DisplayData *displaydata;
+
+    if (_this->egl_data) {
+        return SDL_SetError("OpenGL ES context already created");
+    }
+
+    _this->egl_data = (struct SDL_EGL_VideoData *) SDL_calloc(1, sizeof(SDL_EGL_VideoData));
+    if (!_this->egl_data) {
+        return SDL_OutOfMemory();
+    }
+
+    egl_viv_data = (struct MX6_EGL_VivanteData *) SDL_calloc(1, sizeof(MX6_EGL_VivanteData));
+    if (!egl_viv_data) {
+        return SDL_OutOfMemory();
+    }
+
+    path = SDL_getenv("SDL_VIDEO_GL_DRIVER");
+    if (path != NULL) {
+        egl_dll_handle = SDL_LoadObject(path);
+    }
+
+    if (egl_dll_handle == NULL) {
+        if(_this->gl_config.profile_mask == SDL_GL_CONTEXT_PROFILE_ES) {
+            if (_this->gl_config.major_version > 1) {
+                path = DEFAULT_OGL_ES2;
+                egl_dll_handle = SDL_LoadObject(path);
+            }
+            else {
+                path = DEFAULT_OGL_ES;
+                egl_dll_handle = SDL_LoadObject(path);
+            }
+        }      
+        else {
+            path = DEFAULT_OGL;
+            egl_dll_handle = SDL_LoadObject(path);
+        }     
+    }
+    _this->egl_data->egl_dll_handle = egl_dll_handle;
+
+    if (egl_dll_handle == NULL) {
+        return SDL_SetError("Could not initialize OpenGL / GLES library");
+    }
+
+    if (egl_path != NULL) {
+        dll_handle = SDL_LoadObject(egl_path);
+    }   
+    
+    if (SDL_LoadFunction(dll_handle, "eglChooseConfig") == NULL) {
+        if (dll_handle != NULL) {
+            SDL_UnloadObject(dll_handle);
+        }
+        path = SDL_getenv("SDL_VIDEO_EGL_DRIVER");
+        if (path == NULL) {
+            path = DEFAULT_EGL;
+        }
+        dll_handle = SDL_LoadObject(path);
+        if (dll_handle == NULL) {
+            return SDL_SetError("Could not load EGL library");
+        }
+    }
+
+    _this->egl_data->dll_handle = dll_handle;
+
+    /* Load new function pointers */
+    LOAD_FUNC(eglGetDisplay);
+    LOAD_FUNC(eglInitialize);
+    LOAD_FUNC(eglTerminate);
+    LOAD_FUNC(eglGetProcAddress);
+    LOAD_FUNC(eglChooseConfig);
+    LOAD_FUNC(eglGetConfigAttrib);
+    LOAD_FUNC(eglCreateContext);
+    LOAD_FUNC(eglDestroyContext);
+    LOAD_FUNC(eglCreateWindowSurface);
+    LOAD_FUNC(eglDestroySurface);
+    LOAD_FUNC(eglMakeCurrent);
+    LOAD_FUNC(eglSwapBuffers);
+    LOAD_FUNC(eglSwapInterval);
+    LOAD_FUNC(eglWaitNative);
+    LOAD_FUNC(eglWaitGL);
+    LOAD_FUNC(eglBindAPI);
+    /* Functions from Vivante GPU SDK */
+    LOAD_VIV_FUNC(fbGetDisplay);
+    LOAD_VIV_FUNC(fbGetDisplayByIndex);
+    LOAD_VIV_FUNC(fbGetDisplayGeometry);
+    LOAD_VIV_FUNC(fbGetDisplayInfo);
+    LOAD_VIV_FUNC(fbDestroyDisplay);
+    LOAD_VIV_FUNC(fbCreateWindow);
+    LOAD_VIV_FUNC(fbGetWindowGeometry);
+    LOAD_VIV_FUNC(fbGetWindowInfo);
+    LOAD_VIV_FUNC(fbDestroyWindow);
+    LOAD_VIV_FUNC(fbCreatePixmap);
+    LOAD_VIV_FUNC(fbCreatePixmapWithBpp);
+    LOAD_VIV_FUNC(fbGetPixmapGeometry);
+    LOAD_VIV_FUNC(fbGetPixmapInfo);
+    LOAD_VIV_FUNC(fbDestroyPixmap);
+   
+    displaydata = SDL_GetDisplayDriverData(0);
+
+    _this->egl_data->egl_display = _this->egl_data->eglGetDisplay(displaydata->native_display);
+    if (!_this->egl_data->egl_display) {
+        return SDL_SetError("Could not get EGL display");
+    }
+    
+    if (_this->egl_data->eglInitialize(_this->egl_data->egl_display, NULL, NULL) != EGL_TRUE) {
+        return SDL_SetError("Could not initialize EGL");
+    }
+
+    displaydata->egl_display = _this->egl_data->egl_display;
+
+    _this->gl_config.driver_loaded = 1;
+
+    if (path) {
+        SDL_strlcpy(_this->gl_config.driver_path, path, sizeof(_this->gl_config.driver_path) - 1);
+    } else {
+        *_this->gl_config.driver_path = '\0';
+    }
+    
+    return 0;
+}
+
+void
+MX6_GLES_UnloadLibrary(_THIS)
+{
+    if (_this->egl_data) {
+        if (_this->egl_data->egl_display) {
+            _this->egl_data->eglTerminate(_this->egl_data->egl_display);
+            _this->egl_data->egl_display = NULL;
+        }
+
+        if (_this->egl_data->dll_handle) {
+            SDL_UnloadObject(_this->egl_data->dll_handle);
+            _this->egl_data->dll_handle = NULL;
+        }
+        if (_this->egl_data->egl_dll_handle) {
+            SDL_UnloadObject(_this->egl_data->egl_dll_handle);
+            _this->egl_data->egl_dll_handle = NULL;
+        }
+        
+        SDL_free(_this->egl_data);
+        _this->egl_data = NULL;
+
+        SDL_free(egl_viv_data);
+        egl_viv_data = NULL;
+    }
+}
+
+SDL_EGL_CreateContext_impl(MX6)
+SDL_EGL_SwapWindow_impl(MX6)
+SDL_EGL_MakeCurrent_impl(MX6)
+
+#endif /* SDL_VIDEO_DRIVER_MX6 && SDL_VIDEO_OPENGL_EGL */
+
+/* vi: set ts=4 sw=4 expandtab: */
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/video/mx6/SDL_mx6opengles.h	Wed Sep 10 18:10:37 2014 -0300
@@ -0,0 +1,68 @@
+/*
+  Simple DirectMedia Layer
+  Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
+
+  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 "../../SDL_internal.h"
+
+#ifndef _SDL_mx6opengles_h
+#define _SDL_mx6opengles_h
+
+#if SDL_VIDEO_DRIVER_MX6 && SDL_VIDEO_OPENGL_EGL
+
+#include "../SDL_sysvideo.h"
+#include "../SDL_egl_c.h"
+
+typedef struct MX6_EGL_VivanteData
+{
+    EGLNativeDisplayType(EGLAPIENTRY *fbGetDisplay) (void *context);
+    EGLNativeDisplayType(EGLAPIENTRY *fbGetDisplayByIndex) (int DisplayIndex);
+    void(EGLAPIENTRY *fbGetDisplayGeometry) (EGLNativeDisplayType Display, int *Width, int *Height);
+    void(EGLAPIENTRY *fbGetDisplayInfo) (EGLNativeDisplayType Display, int *Width, int *Height, unsigned long *Physical, int *Stride, int *BitsPerPixel);
+    void(EGLAPIENTRY *fbDestroyDisplay) (EGLNativeDisplayType Display);
+    EGLNativeWindowType(EGLAPIENTRY *fbCreateWindow) (EGLNativeDisplayType Display, int X, int Y, int Width, int Height);
+    void(EGLAPIENTRY *fbGetWindowGeometry) (EGLNativeWindowType Window, int *X, int *Y, int *Width, int *Height);
+    void(EGLAPIENTRY *fbGetWindowInfo) (EGLNativeWindowType Window, int *X, int *Y, int *Width, int *Height, int *BitsPerPixel, unsigned int *Offset);
+    void(EGLAPIENTRY *fbDestroyWindow) (EGLNativeWindowType Window);
+    EGLNativePixmapType(EGLAPIENTRY *fbCreatePixmap) (EGLNativeDisplayType Display, int Width, int Height);
+    EGLNativePixmapType(EGLAPIENTRY *fbCreatePixmapWithBpp) (EGLNativeDisplayType Display, int Width, int Height, int BitsPerPixel);
+    void(EGLAPIENTRY *fbGetPixmapGeometry) (EGLNativePixmapType Pixmap, int *Width, int *Height);
+    void(EGLAPIENTRY *fbGetPixmapInfo) (EGLNativePixmapType Pixmap, int *Width, int *Height, int *BitsPerPixel, int *Stride, void **Bits);
+    void(EGLAPIENTRY *fbDestroyPixmap) (EGLNativePixmapType Pixmap);
+} MX6_EGL_VivanteData;
+
+struct MX6_EGL_VivanteData *egl_viv_data;
+
+/* OpenGLES functions */
+#define MX6_GLES_GetAttribute SDL_EGL_GetAttribute
+#define MX6_GLES_GetProcAddress SDL_EGL_GetProcAddress
+#define MX6_GLES_SetSwapInterval SDL_EGL_SetSwapInterval
+#define MX6_GLES_GetSwapInterval SDL_EGL_GetSwapInterval
+#define MX6_GLES_DeleteContext SDL_EGL_DeleteContext
+
+extern int MX6_GLES_LoadLibrary(_THIS, const char *path);
+extern void MX6_GLES_UnloadLibrary(_THIS);
+extern SDL_GLContext MX6_GLES_CreateContext(_THIS, SDL_Window * window);
+extern void MX6_GLES_SwapWindow(_THIS, SDL_Window * window);
+extern int MX6_GLES_MakeCurrent(_THIS, SDL_Window * window, SDL_GLContext context);
+
+#endif /* SDL_VIDEO_DRIVER_MX6 && SDL_VIDEO_OPENGL_EGL */
+
+#endif /* _SDL_mx6opengles_h */
+
+/* vi: set ts=4 sw=4 expandtab: */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/video/mx6/SDL_mx6video.c	Wed Sep 10 18:10:37 2014 -0300
@@ -0,0 +1,325 @@
+/*
+  Simple DirectMedia Layer
+  Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
+
+  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 "../../SDL_internal.h"
+
+#if SDL_VIDEO_DRIVER_MX6
+
+/* SDL internals */
+#include "../SDL_sysvideo.h"
+#include "SDL_version.h"
+#include "SDL_syswm.h"
+#include "SDL_loadso.h"
+#include "SDL_events.h"
+
+#ifdef SDL_INPUT_LINUXEV
+#include "../../core/linux/SDL_evdev.h"
+#endif
+
+#include "SDL_mx6video.h"
+#include "SDL_mx6events_c.h"
+#include "SDL_mx6opengles.h"
+
+static int
+MX6_Available(void)
+{
+    return 1;
+}
+
+static void
+MX6_Destroy(SDL_VideoDevice * device)
+{
+    if (device->driverdata != NULL) {
+        device->driverdata = NULL;
+    }
+}
+
+static SDL_VideoDevice *
+MX6_Create()
+{
+    SDL_VideoDevice *device;
+    SDL_VideoData *phdata;
+
+    /* Initialize SDL_VideoDevice structure */
+    device = (SDL_VideoDevice *) SDL_calloc(1, sizeof(SDL_VideoDevice));
+    if (device == NULL) {
+        SDL_OutOfMemory();
+        return NULL;
+    }
+
+    /* Initialize internal data */
+    phdata = (SDL_VideoData *) SDL_calloc(1, sizeof(SDL_VideoData));
+    if (phdata == NULL) {
+        SDL_OutOfMemory();
+        SDL_free(device);
+        return NULL;
+    }
+
+    device->driverdata = phdata;
+
+    /* Setup amount of available displays and current display */
+    device->num_displays = 0;
+
+    /* Set device free function */
+    device->free = MX6_Destroy;
+
+    /* Setup all functions which we can handle */
+    device->VideoInit = MX6_VideoInit;
+    device->VideoQuit = MX6_VideoQuit;
+    device->GetDisplayModes = MX6_GetDisplayModes;
+    device->SetDisplayMode = MX6_SetDisplayMode;
+    device->CreateWindow = MX6_CreateWindow;
+    device->CreateWindowFrom = MX6_CreateWindowFrom;
+    device->SetWindowTitle = MX6_SetWindowTitle;
+    device->SetWindowIcon = MX6_SetWindowIcon;
+    device->SetWindowPosition = MX6_SetWindowPosition;
+    device->SetWindowSize = MX6_SetWindowSize;
+    device->ShowWindow = MX6_ShowWindow;
+    device->HideWindow = MX6_HideWindow;
+    device->RaiseWindow = MX6_RaiseWindow;
+    device->MaximizeWindow = MX6_MaximizeWindow;
+    device->MinimizeWindow = MX6_MinimizeWindow;
+    device->RestoreWindow = MX6_RestoreWindow;
+    device->SetWindowGrab = MX6_SetWindowGrab;
+    device->DestroyWindow = MX6_DestroyWindow;
+    device->GetWindowWMInfo = MX6_GetWindowWMInfo;
+
+    device->GL_LoadLibrary = MX6_GLES_LoadLibrary;
+    device->GL_GetProcAddress = MX6_GLES_GetProcAddress;
+    device->GL_UnloadLibrary = MX6_GLES_UnloadLibrary;
+    device->GL_CreateContext = MX6_GLES_CreateContext;
+    device->GL_MakeCurrent = MX6_GLES_MakeCurrent;
+    device->GL_SetSwapInterval = MX6_GLES_SetSwapInterval;
+    device->GL_GetSwapInterval = MX6_GLES_GetSwapInterval;
+    device->GL_SwapWindow = MX6_GLES_SwapWindow;
+    device->GL_DeleteContext = MX6_GLES_DeleteContext;
+
+    device->PumpEvents = MX6_PumpEvents;
+
+    return device;
+}
+
+VideoBootStrap MX6_bootstrap = {
+    "MX6",
+    "Freescale i.MX6 Video Driver",
+    MX6_Available,
+    MX6_Create
+};
+
+static void
+MX6_UpdateDisplay(_THIS)
+{
+    SDL_VideoDisplay *display = &_this->displays[0];
+    SDL_DisplayData *data = (SDL_DisplayData*)display->driverdata;
+    EGLNativeDisplayType native_display = egl_viv_data->fbGetDisplayByIndex(0);
+    SDL_DisplayMode current_mode;
+    int pitch, bpp;
+    unsigned long pixels;
+
+    /* Store the native EGL display */
+    data->native_display = native_display;
+
+    SDL_zero(current_mode);
+    egl_viv_data->fbGetDisplayInfo(native_display, &current_mode.w, &current_mode.h, &pixels, &pitch, &bpp);
+    /* FIXME: How do we query refresh rate? */
+    current_mode.refresh_rate = 60;
+
+    switch (bpp)
+    {
+    default: /* Is another format used? */
+    case 16:
+        current_mode.format = SDL_PIXELFORMAT_RGB565;
+        break;
+    }
+
+    display->desktop_mode = current_mode;
+    display->current_mode = current_mode;
+}
+
+/*****************************************************************************/
+/* SDL Video and Display initialization/handling functions                   */
+/*****************************************************************************/
+int
+MX6_VideoInit(_THIS)
+{
+    SDL_VideoDisplay display;
+    SDL_DisplayMode current_mode;
+    SDL_DisplayData *data;
+    
+    data = (SDL_DisplayData *) SDL_calloc(1, sizeof(SDL_DisplayData));
+    if (data == NULL) {
+        return SDL_OutOfMemory();
+    }
+
+    SDL_zero(display);
+    SDL_zero(current_mode);
+    display.desktop_mode = current_mode;
+    display.current_mode = current_mode;
+    display.driverdata = data;
+    SDL_AddVideoDisplay(&display);
+
+    if (SDL_GL_LoadLibrary(NULL) < 0) {
+        return -1;
+    }
+    MX6_UpdateDisplay(_this);
+
+#ifdef SDL_INPUT_LINUXEV    
+    SDL_EVDEV_Init();
+#endif    
+
+    return 1;
+}
+
+void
+MX6_VideoQuit(_THIS)
+{
+#ifdef SDL_INPUT_LINUXEV    
+    SDL_EVDEV_Quit();
+#endif    
+}
+
+void
+MX6_GetDisplayModes(_THIS, SDL_VideoDisplay * display)
+{
+    /* Only one display mode available, the current one */
+    SDL_AddDisplayMode(display, &display->current_mode);
+}
+
+int
+MX6_SetDisplayMode(_THIS, SDL_VideoDisplay * display, SDL_DisplayMode * mode)
+{
+    return 0;
+}
+
+int
+MX6_CreateWindow(_THIS, SDL_Window * window)
+{
+    SDL_DisplayData *displaydata;
+    SDL_WindowData *wdata;
+    
+    displaydata = SDL_GetDisplayDriverData(0);
+    
+    /* Allocate window internal data */
+    wdata = (SDL_WindowData *) SDL_calloc(1, sizeof(SDL_WindowData));
+    if (wdata == NULL) {
+        return SDL_OutOfMemory();
+    }
+
+    /* Setup driver data for this window */
+    window->driverdata = wdata;
+    window->flags |= SDL_WINDOW_OPENGL;
+    
+    if (!_this->egl_data) {
+        return -1;
+    }
+
+    wdata->native_window = egl_viv_data->fbCreateWindow(displaydata->native_display, window->x, window->y, window->w, window->h);    
+    if (!wdata->native_window) {
+        return SDL_SetError("MX6: Can't create native window");
+    }
+
+    wdata->egl_surface = SDL_EGL_CreateSurface(_this, wdata->native_window);
+    if (wdata->egl_surface == EGL_NO_SURFACE) {
+        return SDL_SetError("MX6: Can't create EGL surface");
+    }
+
+    /* Window has been successfully created */
+    return 0;
+}
+
+void
+MX6_DestroyWindow(_THIS, SDL_Window * window)
+{
+    SDL_WindowData *wdata;
+    
+    wdata = window->driverdata;
+    if (wdata) {
+        SDL_EGL_DestroySurface(_this, wdata->egl_surface);
+    }
+
+    if (egl_viv_data) {
+        egl_viv_data->fbDestroyWindow(wdata->native_window);
+    }
+}
+
+int
+MX6_CreateWindowFrom(_THIS, SDL_Window * window, const void *data)
+{
+    return -1;
+}
+
+void
+MX6_SetWindowTitle(_THIS, SDL_Window * window)
+{
+}
+void
+MX6_SetWindowIcon(_THIS, SDL_Window * window, SDL_Surface * icon)
+{
+}
+void
+MX6_SetWindowPosition(_THIS, SDL_Window * window)
+{
+}
+void
+MX6_SetWindowSize(_THIS, SDL_Window * window)
+{
+}
+void
+MX6_ShowWindow(_THIS, SDL_Window * window)
+{
+}
+void
+MX6_HideWindow(_THIS, SDL_Window * window)
+{
+}
+void
+MX6_RaiseWindow(_THIS, SDL_Window * window)
+{
+}
+void
+MX6_MaximizeWindow(_THIS, SDL_Window * window)
+{
+}
+void
+MX6_MinimizeWindow(_THIS, SDL_Window * window)
+{
+}
+void
+MX6_RestoreWindow(_THIS, SDL_Window * window)
+{
+}
+void
+MX6_SetWindowGrab(_THIS, SDL_Window * window, SDL_bool grabbed)
+{
+}
+
+/*****************************************************************************/
+/* SDL Window Manager function                                               */
+/*****************************************************************************/
+SDL_bool
+MX6_GetWindowWMInfo(_THIS, SDL_Window * window, struct SDL_SysWMinfo *info)
+{
+    return SDL_TRUE;
+}
+
+#endif /* SDL_VIDEO_DRIVER_MX6 */
+
+/* vi: set ts=4 sw=4 expandtab: */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/video/mx6/SDL_mx6video.h	Wed Sep 10 18:10:37 2014 -0300
@@ -0,0 +1,76 @@
+/*
+  Simple DirectMedia Layer
+  Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
+
+  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 __SDL_MX6VIDEO_H__
+#define __SDL_MX6VIDEO_H__
+
+#include "../../SDL_internal.h"
+#include "../SDL_sysvideo.h"
+
+#include "SDL_egl.h"
+
+typedef struct SDL_VideoData
+{
+} SDL_VideoData;
+
+typedef struct SDL_DisplayData
+{
+    EGLNativeDisplayType native_display;
+    EGLDisplay egl_display;
+} SDL_DisplayData;
+
+typedef struct SDL_WindowData
+{
+    EGLNativeWindowType native_window;
+    EGLSurface egl_surface;
+} SDL_WindowData;
+
+/****************************************************************************/
+/* SDL_VideoDevice functions declaration                                    */
+/****************************************************************************/
+
+/* Display and window functions */
+int MX6_VideoInit(_THIS);
+void MX6_VideoQuit(_THIS);
+void MX6_GetDisplayModes(_THIS, SDL_VideoDisplay * display);
+int MX6_SetDisplayMode(_THIS, SDL_VideoDisplay * display, SDL_DisplayMode * mode);
+int MX6_CreateWindow(_THIS, SDL_Window * window);
+int MX6_CreateWindowFrom(_THIS, SDL_Window * window, const void *data);
+void MX6_SetWindowTitle(_THIS, SDL_Window * window);
+void MX6_SetWindowIcon(_THIS, SDL_Window * window, SDL_Surface * icon);
+void MX6_SetWindowPosition(_THIS, SDL_Window * window);
+void MX6_SetWindowSize(_THIS, SDL_Window * window);
+void MX6_ShowWindow(_THIS, SDL_Window * window);
+void MX6_HideWindow(_THIS, SDL_Window * window);
+void MX6_RaiseWindow(_THIS, SDL_Window * window);
+void MX6_MaximizeWindow(_THIS, SDL_Window * window);
+void MX6_MinimizeWindow(_THIS, SDL_Window * window);
+void MX6_RestoreWindow(_THIS, SDL_Window * window);
+void MX6_SetWindowGrab(_THIS, SDL_Window * window, SDL_bool grabbed);
+void MX6_DestroyWindow(_THIS, SDL_Window * window);
+
+/* Window manager function */
+SDL_bool MX6_GetWindowWMInfo(_THIS, SDL_Window * window,
+                             struct SDL_SysWMinfo *info);
+
+#endif /* __SDL_MX6VIDEO_H__ */
+
+/* vi: set ts=4 sw=4 expandtab: */
--- a/src/video/x11/SDL_x11window.c	Wed Aug 20 17:20:22 2014 -0300
+++ b/src/video/x11/SDL_x11window.c	Wed Sep 10 18:10:37 2014 -0300
@@ -643,6 +643,7 @@
                     &items_read, &items_left, &propdata);
         if (status == Success && propdata) {
             title = SDL_iconv_string("UTF-8", "", SDL_static_cast(char*, propdata), items_read+1);
+            X11_XFree(propdata);
         } else {
             title = SDL_strdup("");
         }
--- a/test/testdrawchessboard.c	Wed Aug 20 17:20:22 2014 -0300
+++ b/test/testdrawchessboard.c	Wed Sep 10 18:10:37 2014 -0300
@@ -14,25 +14,22 @@
 
 /* Sample program:  Draw a Chess Board  by using SDL_CreateSoftwareRenderer API */
 
-#include <stdlib.h>
-#include <stdio.h>
-
 #include "SDL.h"
 
 void
 DrawChessBoard(SDL_Renderer * renderer)
 {
-	int row = 0,coloum = 0,x = 0;
+	int row = 0,column = 0,x = 0;
 	SDL_Rect rect, darea;
 
 	/* Get the Size of drawing surface */
 	SDL_RenderGetViewport(renderer, &darea);
 
-	for(row; row < 8; row++)
+	for( ; row < 8; row++)
 	{
-		coloum = row%2;
-		x = x + coloum;
-		for(coloum; coloum < 4+(row%2); coloum++)
+		column = row%2;
+		x = x + column;
+		for( ; column < 4+(row%2); column++)
 		{
 			SDL_SetRenderDrawColor(renderer, 0, 0, 0, 0xFF);
 
--- a/test/testgamecontroller.c	Wed Aug 20 17:20:22 2014 -0300
+++ b/test/testgamecontroller.c	Wed Sep 10 18:10:37 2014 -0300
@@ -28,51 +28,6 @@
 #define SCREEN_HEIGHT   317
 #endif
 
-static const char *
-ControllerAxisName(const SDL_GameControllerAxis axis)
-{
-    switch (axis)
-    {
-        #define AXIS_CASE(ax) case SDL_CONTROLLER_AXIS_##ax: return #ax
-        AXIS_CASE(INVALID);
-        AXIS_CASE(LEFTX);
-        AXIS_CASE(LEFTY);
-        AXIS_CASE(RIGHTX);
-        AXIS_CASE(RIGHTY);
-        AXIS_CASE(TRIGGERLEFT);
-        AXIS_CASE(TRIGGERRIGHT);
-        #undef AXIS_CASE
-        default: return "???";
-    }
-}
-
-static const char *
-ControllerButtonName(const SDL_GameControllerButton button)
-{
-    switch (button)
-    {
-        #define BUTTON_CASE(btn) case SDL_CONTROLLER_BUTTON_##btn: return #btn
-        BUTTON_CASE(INVALID);
-        BUTTON_CASE(A);
-        BUTTON_CASE(B);
-        BUTTON_CASE(X);
-        BUTTON_CASE(Y);
-        BUTTON_CASE(BACK);
-        BUTTON_CASE(GUIDE);
-        BUTTON_CASE(START);
-        BUTTON_CASE(LEFTSTICK);
-        BUTTON_CASE(RIGHTSTICK);
-        BUTTON_CASE(LEFTSHOULDER);
-        BUTTON_CASE(RIGHTSHOULDER);
-        BUTTON_CASE(DPAD_UP);
-        BUTTON_CASE(DPAD_DOWN);
-        BUTTON_CASE(DPAD_LEFT);
-        BUTTON_CASE(DPAD_RIGHT);
-        #undef BUTTON_CASE
-        default: return "???";
-    }
-}
-
 static SDL_Texture *
 LoadTexture(SDL_Renderer *renderer, char *file, SDL_bool transparent)
 {
--- a/test/teststreaming.c	Wed Aug 20 17:20:22 2014 -0300
+++ b/test/teststreaming.c	Wed Sep 10 18:10:37 2014 -0300
@@ -27,27 +27,27 @@
 #define MOOSEFRAMES_COUNT 10
 
 SDL_Color MooseColors[84] = {
-    {49, 49, 49}, {66, 24, 0}, {66, 33, 0}, {66, 66, 66},
-    {66, 115, 49}, {74, 33, 0}, {74, 41, 16}, {82, 33, 8},
-    {82, 41, 8}, {82, 49, 16}, {82, 82, 82}, {90, 41, 8},
-    {90, 41, 16}, {90, 57, 24}, {99, 49, 16}, {99, 66, 24},
-    {99, 66, 33}, {99, 74, 33}, {107, 57, 24}, {107, 82, 41},
-    {115, 57, 33}, {115, 66, 33}, {115, 66, 41}, {115, 74, 0},
-    {115, 90, 49}, {115, 115, 115}, {123, 82, 0}, {123, 99, 57},
-    {132, 66, 41}, {132, 74, 41}, {132, 90, 8}, {132, 99, 33},
-    {132, 99, 66}, {132, 107, 66}, {140, 74, 49}, {140, 99, 16},
-    {140, 107, 74}, {140, 115, 74}, {148, 107, 24}, {148, 115, 82},
-    {148, 123, 74}, {148, 123, 90}, {156, 115, 33}, {156, 115, 90},
-    {156, 123, 82}, {156, 132, 82}, {156, 132, 99}, {156, 156, 156},
-    {165, 123, 49}, {165, 123, 90}, {165, 132, 82}, {165, 132, 90},
-    {165, 132, 99}, {165, 140, 90}, {173, 132, 57}, {173, 132, 99},
-    {173, 140, 107}, {173, 140, 115}, {173, 148, 99}, {173, 173, 173},
-    {181, 140, 74}, {181, 148, 115}, {181, 148, 123}, {181, 156, 107},
-    {189, 148, 123}, {189, 156, 82}, {189, 156, 123}, {189, 156, 132},
-    {189, 189, 189}, {198, 156, 123}, {198, 165, 132}, {206, 165, 99},
-    {206, 165, 132}, {206, 173, 140}, {206, 206, 206}, {214, 173, 115},
-    {214, 173, 140}, {222, 181, 148}, {222, 189, 132}, {222, 189, 156},
-    {222, 222, 222}, {231, 198, 165}, {231, 231, 231}, {239, 206, 173}
+    {49, 49, 49, 255}, {66, 24, 0, 255}, {66, 33, 0, 255}, {66, 66, 66, 255},
+    {66, 115, 49, 255}, {74, 33, 0, 255}, {74, 41, 16, 255}, {82, 33, 8, 255},
+    {82, 41, 8, 255}, {82, 49, 16, 255}, {82, 82, 82, 255}, {90, 41, 8, 255},
+    {90, 41, 16, 255}, {90, 57, 24, 255}, {99, 49, 16, 255}, {99, 66, 24, 255},
+    {99, 66, 33, 255}, {99, 74, 33, 255}, {107, 57, 24, 255}, {107, 82, 41, 255},
+    {115, 57, 33, 255}, {115, 66, 33, 255}, {115, 66, 41, 255}, {115, 74, 0, 255},
+    {115, 90, 49, 255}, {115, 115, 115, 255}, {123, 82, 0, 255}, {123, 99, 57, 255},
+    {132, 66, 41, 255}, {132, 74, 41, 255}, {132, 90, 8, 255}, {132, 99, 33, 255},
+    {132, 99, 66, 255}, {132, 107, 66, 255}, {140, 74, 49, 255}, {140, 99, 16, 255},
+    {140, 107, 74, 255}, {140, 115, 74, 255}, {148, 107, 24, 255}, {148, 115, 82, 255},
+    {148, 123, 74, 255}, {148, 123, 90, 255}, {156, 115, 33, 255}, {156, 115, 90, 255},
+    {156, 123, 82, 255}, {156, 132, 82, 255}, {156, 132, 99, 255}, {156, 156, 156, 255},
+    {165, 123, 49, 255}, {165, 123, 90, 255}, {165, 132, 82, 255}, {165, 132, 90, 255},
+    {165, 132, 99, 255}, {165, 140, 90, 255}, {173, 132, 57, 255}, {173, 132, 99, 255},
+    {173, 140, 107, 255}, {173, 140, 115, 255}, {173, 148, 99, 255}, {173, 173, 173, 255},
+    {181, 140, 74, 255}, {181, 148, 115, 255}, {181, 148, 123, 255}, {181, 156, 107, 255},
+    {189, 148, 123, 255}, {189, 156, 82, 255}, {189, 156, 123, 255}, {189, 156, 132, 255},
+    {189, 189, 189, 255}, {198, 156, 123, 255}, {198, 165, 132, 255}, {206, 165, 99, 255},
+    {206, 165, 132, 255}, {206, 173, 140, 255}, {206, 206, 206, 255}, {214, 173, 115, 255},
+    {214, 173, 140, 255}, {222, 181, 148, 255}, {222, 189, 132, 255}, {222, 189, 156, 255},
+    {222, 222, 222, 255}, {231, 198, 165, 255}, {231, 231, 231, 255}, {239, 206, 173, 255}
 };
 
 Uint8 MooseFrames[MOOSEFRAMES_COUNT][MOOSEFRAME_SIZE];