Browse Source

-Added ability to use cubic interpolation on image resize (little more quality on non-po2 resizing)
-Added ability for exporter to shrink images to non-integer values. Helps if you want to convert your game artwork from 1080->720 or similar

Juan Linietsky 10 years ago
parent
commit
e055247b17

+ 107 - 0
core/image.cpp

@@ -400,6 +400,102 @@ Image::Format Image::get_format() const{
 	return format;
 }
 
+static double _bicubic_interp_kernel( double x ) {
+
+	x = ABS(x);
+
+	double bc = 0;
+
+	if ( x <= 1 )
+		bc = ( 1.5 * x - 2.5 ) * x * x + 1;
+	else if ( x < 2 )
+		bc = ( ( -0.5 * x + 2.5 ) * x - 4 ) * x + 2;
+
+
+	return bc;
+}
+
+template<int CC>
+static void _scale_cubic(const uint8_t* p_src, uint8_t* p_dst, uint32_t p_src_width, uint32_t p_src_height, uint32_t p_dst_width, uint32_t p_dst_height) {
+
+
+	// get source image size
+	int width   = p_src_width;
+	int height  = p_src_height;
+	double xfac = (double) width / p_dst_width;
+	double yfac = (double) height / p_dst_height;
+	// coordinates of source points and cooefficiens
+	double  ox, oy, dx, dy, k1, k2;
+	int     ox1, oy1, ox2, oy2;
+	// destination pixel values
+	// width and height decreased by 1
+	int ymax = height - 1;
+	int xmax = width - 1;
+	// temporary pointer
+
+	for ( int y = 0; y < p_dst_height; y++ ) {
+		// Y coordinates
+		oy  = (double) y * yfac - 0.5f;
+		oy1 = (int) oy;
+		dy  = oy - (double) oy1;
+
+		for ( int x = 0; x < p_dst_width; x++ )	{
+			// X coordinates
+			ox  = (double) x * xfac - 0.5f;
+			ox1 = (int) ox;
+			dx  = ox - (double) ox1;
+
+			// initial pixel value
+
+			uint8_t *dst=p_dst + (y*p_dst_width+x)*CC;
+
+			double color[CC];
+			for(int i=0;i<CC;i++) {
+				color[i]=0;
+			}
+
+
+
+			for ( int n = -1; n < 3; n++ ) {
+				// get Y cooefficient
+				k1 = _bicubic_interp_kernel( dy - (double) n );
+
+				oy2 = oy1 + n;
+				if ( oy2 < 0 )
+					oy2 = 0;
+				if ( oy2 > ymax )
+					oy2 = ymax;
+
+				for ( int m = -1; m < 3; m++ ) {
+					// get X cooefficient
+					k2 = k1 * _bicubic_interp_kernel( (double) m - dx );
+
+					ox2 = ox1 + m;
+					if ( ox2 < 0 )
+						ox2 = 0;
+					if ( ox2 > xmax )
+						ox2 = xmax;
+
+					// get pixel of original image
+					const uint8_t *p = p_src + (oy2 * p_src_width + ox2)*CC;
+
+					for(int i=0;i<CC;i++) {
+
+						color[i]+=p[i]*k2;
+					}
+				}
+			}
+
+			for(int i=0;i<CC;i++) {
+				dst[i]=CLAMP(Math::fast_ftoi(color[i]),0,255);
+			}
+		}
+	}
+}
+
+
+
+
 template<int CC>
 static void _scale_bilinear(const uint8_t* p_src, uint8_t* p_dst, uint32_t p_src_width, uint32_t p_src_height, uint32_t p_dst_width, uint32_t p_dst_height) {
 
@@ -559,6 +655,17 @@ void Image::resize( int p_width, int p_height, Interpolation p_interpolation ) {
 			}
 
 		} break;
+		case INTERPOLATE_CUBIC: {
+
+			switch(get_format_pixel_size(format)) {
+				case 1: _scale_cubic<1>(r_ptr,w_ptr,width,height,p_width,p_height); break;
+				case 2: _scale_cubic<2>(r_ptr,w_ptr,width,height,p_width,p_height); break;
+				case 3: _scale_cubic<3>(r_ptr,w_ptr,width,height,p_width,p_height); break;
+				case 4: _scale_cubic<4>(r_ptr,w_ptr,width,height,p_width,p_height); break;
+			}
+
+		} break;
+
 
 	}
 

+ 1 - 0
core/image.h

@@ -91,6 +91,7 @@ public:
 	
 		INTERPOLATE_NEAREST,
 		INTERPOLATE_BILINEAR,
+		INTERPOLATE_CUBIC,
 		/* INTERPOLATE GAUSS */
 	};
 

+ 376 - 376
platform/windows/detect.py

@@ -1,376 +1,376 @@
-# 
-# 	tested on               | Windows native    | Linux cross-compilation
-#	------------------------+-------------------+---------------------------
-#	MSVS C++ 2010 Express   | WORKS             | n/a
-#	Mingw-w64               | WORKS             | WORKS
-#	Mingw-w32               | WORKS             | WORKS
-#	MinGW                   | WORKS             | untested
-#
-#####
-# Notes about MSVS C++ :
-#
-# 	- MSVC2010-Express compiles to 32bits only.
-#
-#####
-# Notes about Mingw-w64 and Mingw-w32 under Windows :
-#
-#	- both can be installed using the official installer :
-#		http://mingw-w64.sourceforge.net/download.php#mingw-builds
-#
-#	- if you want to compile both 32bits and 64bits, don't forget to
-#	run the installer twice to install them both.
-#
-#	- install them into a path that does not contain spaces
-#		( example : "C:/Mingw-w32", "C:/Mingw-w64" )
-#
-#	- if you want to compile faster using the "-j" option, don't forget
-#	to install the appropriate version of the Pywin32 python extension 
-#	available from : http://sourceforge.net/projects/pywin32/files/
-#
-#	- before running scons, you must add into the environment path 
-#	the path to the "/bin" directory of the Mingw version you want 
-#	to use :
-#
-#		set PATH=C:/Mingw-w32/bin;%PATH%
-#
-#	- then, scons should be able to detect gcc.
-#	- Mingw-w32 only compiles 32bits.
-#	- Mingw-w64 only compiles 64bits.
-#
-#	- it is possible to add them both at the same time into the PATH env, 
-#	if you also define the MINGW32_PREFIX and MINGW64_PREFIX environment 
-#	variables. 
-#	For instance, you could store that set of commands into a .bat script
-#	that you would run just before scons :
-#
-#			set PATH=C:\mingw-w32\bin;%PATH%
-#			set PATH=C:\mingw-w64\bin;%PATH%
-#			set MINGW32_PREFIX=C:\mingw-w32\bin\
-#			set MINGW64_PREFIX=C:\mingw-w64\bin\
-#
-#####
-# Notes about Mingw, Mingw-w64 and Mingw-w32 under Linux :
-#
-#	- default toolchain prefixes are :
-#		"i586-mingw32msvc-" for MinGW
-#		"i686-w64-mingw32-"	for Mingw-w32
-#		"x86_64-w64-mingw32-" for Mingw-w64
-#
-#	- if both MinGW and Mingw-w32 are installed on your system
-#	Mingw-w32 should take the priority over MinGW.
-#
-#	- it is possible to manually override prefixes by defining
-#	the MINGW32_PREFIX and MINGW64_PREFIX environment variables.
-#	
-#####
-# Notes about Mingw under Windows :
-#
-#	- this is the MinGW version from http://mingw.org/ 
-#	- install it into a path that does not contain spaces
-#		( example : "C:/MinGW" )
-#	- several DirectX headers might be missing. You can copy them into 
-#	the C:/MinGW/include" directory from this page :
-#	 https://code.google.com/p/mingw-lib/source/browse/trunk/working/avcodec_to_widget_5/directx_include/
-#	- before running scons, add the path to the "/bin" directory :
-#		set PATH=C:/MinGW/bin;%PATH%
-#	- scons should be able to detect gcc.
-#
-
-#####
-# TODO :
-#
-#	- finish to cleanup this script to remove all the remains of previous hacks and workarounds
-#	- make it work with the Windows7 SDK that is supposed to enable 64bits compilation for MSVC2010-Express
-#	- confirm it works well with other Visual Studio versions.
-#	- update the wiki about the pywin32 extension required for the "-j" option under Windows.
-#	- update the wiki to document MINGW32_PREFIX and MINGW64_PREFIX
-# 	
-
-import os
-
-import sys	
-
-
-def is_active():
-	return True
-        
-def get_name():
-        return "Windows"
-
-def can_build():
-	
-	if (os.name=="nt"):
-		#building natively on windows!
-		if (os.getenv("VSINSTALLDIR")):
-			return True 
-		else:
-			print("\nMSVC not detected, attempting Mingw.")
-			mingw32 = ""
-			mingw64 = ""
-			if ( os.getenv("MINGW32_PREFIX") ) :
-				mingw32 = os.getenv("MINGW32_PREFIX")
-			if ( os.getenv("MINGW64_PREFIX") ) :
-				mingw64 = os.getenv("MINGW64_PREFIX")
-				
-			test = "gcc --version > NUL 2>&1"
-			if os.system(test)!= 0 and os.system(mingw32+test)!=0 and os.system(mingw64+test)!=0 :
-				print("- could not detect gcc.")
-				print("Please, make sure a path to a Mingw /bin directory is accessible into the environment PATH.\n")
-				return False
-			else:
-				print("- gcc detected.")
-				
-			return True
-			
-	if (os.name=="posix"):
-
-		mingw = "i586-mingw32msvc-"
-		mingw64 = "x86_64-w64-mingw32-"
-		mingw32 = "i686-w64-mingw32-"
-		
-		if (os.getenv("MINGW32_PREFIX")):
-			mingw32=os.getenv("MINGW32_PREFIX")
-			mingw = mingw32
-		if (os.getenv("MINGW64_PREFIX")):
-			mingw64=os.getenv("MINGW64_PREFIX")
-			
-		test = "gcc --version &>/dev/null"
-		if (os.system(mingw+test) == 0 or os.system(mingw64+test) == 0 or os.system(mingw32+test) == 0):
-			return True
-			
-	return False
-		
-def get_opts():
-
-	mingw=""
-	mingw32=""
-	mingw64=""
-	if ( os.name == "posix" ):
-		mingw = "i586-mingw32msvc-"
-		mingw32 = "i686-w64-mingw32-"
-		mingw64 = "x86_64-w64-mingw32-"
-		
-		if os.system(mingw32+"gcc --version &>/dev/null") != 0 :
-			mingw32 = mingw
-	
-	if (os.getenv("MINGW32_PREFIX")):
-		mingw32=os.getenv("MINGW32_PREFIX")
-		mingw = mingw32
-	if (os.getenv("MINGW64_PREFIX")):
-		mingw64=os.getenv("MINGW64_PREFIX")
-
-
-	return [
-		('mingw_prefix','Mingw Prefix',mingw32),
-		('mingw_prefix_64','Mingw Prefix 64 bits',mingw64),
-	]
-  
-def get_flags():
-
-	return [
-		('freetype','builtin'), #use builtin freetype
-		('openssl','builtin'), #use builtin openssl
-		('theora','no'),
-	]
-			
-
-
-def configure(env):
-
-	env.Append(CPPPATH=['#platform/windows'])
-
-
-	if (os.name=="nt" and os.getenv("VSINSTALLDIR")!=None):
-		#build using visual studio
-		env['ENV']['TMP'] = os.environ['TMP']
-		env.Append(CPPPATH=['#platform/windows/include'])
-		env.Append(LIBPATH=['#platform/windows/lib'])
-
-		if (env["freetype"]!="no"):
-			env.Append(CCFLAGS=['/DFREETYPE_ENABLED'])
-			env.Append(CPPPATH=['#tools/freetype'])
-			env.Append(CPPPATH=['#tools/freetype/freetype/include'])
-
-		if (env["target"]=="release"):
-
-			env.Append(CCFLAGS=['/O2'])
-			env.Append(LINKFLAGS=['/SUBSYSTEM:WINDOWS'])
-			env.Append(LINKFLAGS=['/ENTRY:mainCRTStartup'])
-
-		elif (env["target"]=="release_debug"):
-
-			env.Append(CCFLAGS=['/O2','/DDEBUG_ENABLED'])
-			env.Append(LINKFLAGS=['/SUBSYSTEM:CONSOLE'])
-		elif (env["target"]=="debug_release"):
-
-			env.Append(CCFLAGS=['/Zi','/Od'])
-			env.Append(LINKFLAGS=['/DEBUG'])
-			env.Append(LINKFLAGS=['/SUBSYSTEM:WINDOWS'])
-			env.Append(LINKFLAGS=['/ENTRY:mainCRTStartup'])
-
-		elif (env["target"]=="debug"):
-
-			env.Append(CCFLAGS=['/Zi','/DDEBUG_ENABLED','/DDEBUG_MEMORY_ENABLED','/DD3D_DEBUG_INFO','/Od'])
-			env.Append(LINKFLAGS=['/SUBSYSTEM:CONSOLE'])
-			env.Append(LINKFLAGS=['/DEBUG'])
-
-
-		env.Append(CCFLAGS=['/MT','/Gd','/GR','/nologo'])
-		env.Append(CXXFLAGS=['/TP'])
-		env.Append(CPPFLAGS=['/DMSVC', '/GR', ])
-		env.Append(CCFLAGS=['/I'+os.getenv("WindowsSdkDir")+"/Include"])
-		env.Append(CCFLAGS=['/DWINDOWS_ENABLED'])
-		env.Append(CCFLAGS=['/DRTAUDIO_ENABLED'])
-		env.Append(CCFLAGS=['/DWIN32'])
-		env.Append(CCFLAGS=['/DTYPED_METHOD_BIND'])
-
-		env.Append(CCFLAGS=['/DGLES2_ENABLED'])
-
-		env.Append(CCFLAGS=['/DGLEW_ENABLED'])
-		LIBS=['winmm','opengl32','dsound','kernel32','ole32','user32','gdi32', 'IPHLPAPI','Shlwapi', 'wsock32', 'shell32','advapi32']
-		env.Append(LINKFLAGS=[p+env["LIBSUFFIX"] for p in LIBS])
-		
-		env.Append(LIBPATH=[os.getenv("WindowsSdkDir")+"/Lib"])
-                if (os.getenv("DXSDK_DIR")):
-                        DIRECTX_PATH=os.getenv("DXSDK_DIR")
-                else:
-                        DIRECTX_PATH="C:/Program Files/Microsoft DirectX SDK (March 2009)"
-
-                if (os.getenv("VCINSTALLDIR")):
-                        VC_PATH=os.getenv("VCINSTALLDIR")
-                else:
-                        VC_PATH=""
-
-		env.Append(CCFLAGS=["/I" + p for p in os.getenv("INCLUDE").split(";")])
-		env.Append(LIBPATH=[p for p in os.getenv("LIB").split(";")])
-		env.Append(CCFLAGS=["/I"+DIRECTX_PATH+"/Include"])
-		env.Append(LIBPATH=[DIRECTX_PATH+"/Lib/x86"])
-		env['ENV'] = os.environ;
-	else:
-
-		# Workaround for MinGW. See:
-		# http://www.scons.org/wiki/LongCmdLinesOnWin32
-		if (os.name=="nt"):
-			import subprocess
-			
-			def mySubProcess(cmdline,env):
-				#print "SPAWNED : " + cmdline
-				startupinfo = subprocess.STARTUPINFO()
-				startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
-				proc = subprocess.Popen(cmdline, stdin=subprocess.PIPE, stdout=subprocess.PIPE,
-					stderr=subprocess.PIPE, startupinfo=startupinfo, shell = False, env = env)
-				data, err = proc.communicate()
-				rv = proc.wait()
-				if rv:
-					print "====="
-					print err
-					print "====="
-				return rv
-				
-			def mySpawn(sh, escape, cmd, args, env):
-								
-				newargs = ' '.join(args[1:])
-				cmdline = cmd + " " + newargs
-				
-				rv=0
-				if len(cmdline) > 32000 and cmd.endswith("ar") :
-					cmdline = cmd + " " + args[1] + " " + args[2] + " "
-					for i in range(3,len(args)) :
-						rv = mySubProcess( cmdline + args[i], env )
-						if rv :
-							break	
-				else:				
-					rv = mySubProcess( cmdline, env )
-					
-				return rv
-				
-			env['SPAWN'] = mySpawn
-
-		#build using mingw
-		if (os.name=="nt"):
-			env['ENV']['TMP'] = os.environ['TMP'] #way to go scons, you can be so stupid sometimes
-		else:
-			env["PROGSUFFIX"]=env["PROGSUFFIX"]+".exe" # for linux cross-compilation
-
-		mingw_prefix=""
-
-		if (env["bits"]=="default"):
-			env["bits"]="32"
-
-		if (env["bits"]=="32"):
-			env.Append(LINKFLAGS=['-static'])
-			env.Append(LINKFLAGS=['-static-libgcc'])
-			env.Append(LINKFLAGS=['-static-libstdc++'])
-			mingw_prefix=env["mingw_prefix"];
-		else:
-			env.Append(LINKFLAGS=['-static'])
-			mingw_prefix=env["mingw_prefix_64"];
-
-		nulstr=""
-
-		if (os.name=="posix"):
-		    nulstr=">/dev/null"
-		else:
-		    nulstr=">nul"
-
-
-
-		# if os.system(mingw_prefix+"gcc --version"+nulstr)!=0:
-			# #not really super consistent but..
-			# print("Can't find Windows compiler: "+mingw_prefix)
-			# sys.exit(255)
-
-		if (env["target"]=="release"):
-			
-			env.Append(CCFLAGS=['-O3','-ffast-math','-fomit-frame-pointer','-msse2'])
-			env.Append(LINKFLAGS=['-Wl,--subsystem,windows'])
-
-		elif (env["target"]=="release_debug"):
-
-			env.Append(CCFLAGS=['-O2','-DDEBUG_ENABLED'])
-
-		elif (env["target"]=="debug"):
-					
-			env.Append(CCFLAGS=['-g', '-Wall','-DDEBUG_ENABLED','-DDEBUG_MEMORY_ENABLED'])
-
-		if (env["freetype"]!="no"):
-			env.Append(CCFLAGS=['-DFREETYPE_ENABLED'])
-			env.Append(CPPPATH=['#tools/freetype'])
-			env.Append(CPPPATH=['#tools/freetype/freetype/include'])
-
-		env["CC"]=mingw_prefix+"gcc"
-		env['AS']=mingw_prefix+"as"
-		env['CXX'] = mingw_prefix+"g++"
-		env['AR'] = mingw_prefix+"ar"
-		env['RANLIB'] = mingw_prefix+"ranlib"
-		env['LD'] = mingw_prefix+"g++"
-
-		#env['CC'] = "winegcc"
-		#env['CXX'] = "wineg++"
-
-		env.Append(CCFLAGS=['-DWINDOWS_ENABLED','-mwindows'])
-		env.Append(CPPFLAGS=['-DRTAUDIO_ENABLED'])
-		env.Append(CCFLAGS=['-DGLES2_ENABLED','-DGLEW_ENABLED'])
-		env.Append(LIBS=['mingw32','opengl32', 'dsound', 'ole32', 'd3d9','winmm','gdi32','iphlpapi','shlwapi','wsock32','kernel32'])
-
-		# if (env["bits"]=="32"):
-# #			env.Append(LIBS=['gcc_s'])
-			# #--with-arch=i686
-			# env.Append(CPPFLAGS=['-march=i686'])
-			# env.Append(LINKFLAGS=['-march=i686'])
-
-
-
-
-		#'d3dx9d'
-		env.Append(CPPFLAGS=['-DMINGW_ENABLED'])
-		env.Append(LINKFLAGS=['-g'])
-
-	import methods
-	env.Append( BUILDERS = { 'GLSL120' : env.Builder(action = methods.build_legacygl_headers, suffix = 'glsl.h',src_suffix = '.glsl') } )
-	env.Append( BUILDERS = { 'GLSL' : env.Builder(action = methods.build_glsl_headers, suffix = 'glsl.h',src_suffix = '.glsl') } )
-	env.Append( BUILDERS = { 'HLSL9' : env.Builder(action = methods.build_hlsl_dx9_headers, suffix = 'hlsl.h',src_suffix = '.hlsl') } )
-	env.Append( BUILDERS = { 'GLSL120GLES' : env.Builder(action = methods.build_gles2_headers, suffix = 'glsl.h',src_suffix = '.glsl') } )
-
-	
-
+# 
+# 	tested on               | Windows native    | Linux cross-compilation
+#	------------------------+-------------------+---------------------------
+#	MSVS C++ 2010 Express   | WORKS             | n/a
+#	Mingw-w64               | WORKS             | WORKS
+#	Mingw-w32               | WORKS             | WORKS
+#	MinGW                   | WORKS             | untested
+#
+#####
+# Notes about MSVS C++ :
+#
+# 	- MSVC2010-Express compiles to 32bits only.
+#
+#####
+# Notes about Mingw-w64 and Mingw-w32 under Windows :
+#
+#	- both can be installed using the official installer :
+#		http://mingw-w64.sourceforge.net/download.php#mingw-builds
+#
+#	- if you want to compile both 32bits and 64bits, don't forget to
+#	run the installer twice to install them both.
+#
+#	- install them into a path that does not contain spaces
+#		( example : "C:/Mingw-w32", "C:/Mingw-w64" )
+#
+#	- if you want to compile faster using the "-j" option, don't forget
+#	to install the appropriate version of the Pywin32 python extension 
+#	available from : http://sourceforge.net/projects/pywin32/files/
+#
+#	- before running scons, you must add into the environment path 
+#	the path to the "/bin" directory of the Mingw version you want 
+#	to use :
+#
+#		set PATH=C:/Mingw-w32/bin;%PATH%
+#
+#	- then, scons should be able to detect gcc.
+#	- Mingw-w32 only compiles 32bits.
+#	- Mingw-w64 only compiles 64bits.
+#
+#	- it is possible to add them both at the same time into the PATH env, 
+#	if you also define the MINGW32_PREFIX and MINGW64_PREFIX environment 
+#	variables. 
+#	For instance, you could store that set of commands into a .bat script
+#	that you would run just before scons :
+#
+#			set PATH=C:\mingw-w32\bin;%PATH%
+#			set PATH=C:\mingw-w64\bin;%PATH%
+#			set MINGW32_PREFIX=C:\mingw-w32\bin\
+#			set MINGW64_PREFIX=C:\mingw-w64\bin\
+#
+#####
+# Notes about Mingw, Mingw-w64 and Mingw-w32 under Linux :
+#
+#	- default toolchain prefixes are :
+#		"i586-mingw32msvc-" for MinGW
+#		"i686-w64-mingw32-"	for Mingw-w32
+#		"x86_64-w64-mingw32-" for Mingw-w64
+#
+#	- if both MinGW and Mingw-w32 are installed on your system
+#	Mingw-w32 should take the priority over MinGW.
+#
+#	- it is possible to manually override prefixes by defining
+#	the MINGW32_PREFIX and MINGW64_PREFIX environment variables.
+#	
+#####
+# Notes about Mingw under Windows :
+#
+#	- this is the MinGW version from http://mingw.org/ 
+#	- install it into a path that does not contain spaces
+#		( example : "C:/MinGW" )
+#	- several DirectX headers might be missing. You can copy them into 
+#	the C:/MinGW/include" directory from this page :
+#	 https://code.google.com/p/mingw-lib/source/browse/trunk/working/avcodec_to_widget_5/directx_include/
+#	- before running scons, add the path to the "/bin" directory :
+#		set PATH=C:/MinGW/bin;%PATH%
+#	- scons should be able to detect gcc.
+#
+
+#####
+# TODO :
+#
+#	- finish to cleanup this script to remove all the remains of previous hacks and workarounds
+#	- make it work with the Windows7 SDK that is supposed to enable 64bits compilation for MSVC2010-Express
+#	- confirm it works well with other Visual Studio versions.
+#	- update the wiki about the pywin32 extension required for the "-j" option under Windows.
+#	- update the wiki to document MINGW32_PREFIX and MINGW64_PREFIX
+# 	
+
+import os
+
+import sys	
+
+
+def is_active():
+	return True
+        
+def get_name():
+        return "Windows"
+
+def can_build():
+	
+	if (os.name=="nt"):
+		#building natively on windows!
+		if (os.getenv("VSINSTALLDIR")):
+			return True 
+		else:
+			print("\nMSVC not detected, attempting Mingw.")
+			mingw32 = ""
+			mingw64 = ""
+			if ( os.getenv("MINGW32_PREFIX") ) :
+				mingw32 = os.getenv("MINGW32_PREFIX")
+			if ( os.getenv("MINGW64_PREFIX") ) :
+				mingw64 = os.getenv("MINGW64_PREFIX")
+				
+			test = "gcc --version > NUL 2>&1"
+			if os.system(test)!= 0 and os.system(mingw32+test)!=0 and os.system(mingw64+test)!=0 :
+				print("- could not detect gcc.")
+				print("Please, make sure a path to a Mingw /bin directory is accessible into the environment PATH.\n")
+				return False
+			else:
+				print("- gcc detected.")
+				
+			return True
+			
+	if (os.name=="posix"):
+
+		mingw = "i586-mingw32msvc-"
+		mingw64 = "x86_64-w64-mingw32-"
+		mingw32 = "i686-w64-mingw32-"
+		
+		if (os.getenv("MINGW32_PREFIX")):
+			mingw32=os.getenv("MINGW32_PREFIX")
+			mingw = mingw32
+		if (os.getenv("MINGW64_PREFIX")):
+			mingw64=os.getenv("MINGW64_PREFIX")
+			
+		test = "gcc --version &>/dev/null"
+		if (os.system(mingw+test) == 0 or os.system(mingw64+test) == 0 or os.system(mingw32+test) == 0):
+			return True
+			
+	return False
+		
+def get_opts():
+
+	mingw=""
+	mingw32=""
+	mingw64=""
+	if ( os.name == "posix" ):
+		mingw = "i586-mingw32msvc-"
+		mingw32 = "i686-w64-mingw32-"
+		mingw64 = "x86_64-w64-mingw32-"
+		
+		if os.system(mingw32+"gcc --version &>/dev/null") != 0 :
+			mingw32 = mingw
+	
+	if (os.getenv("MINGW32_PREFIX")):
+		mingw32=os.getenv("MINGW32_PREFIX")
+		mingw = mingw32
+	if (os.getenv("MINGW64_PREFIX")):
+		mingw64=os.getenv("MINGW64_PREFIX")
+
+
+	return [
+		('mingw_prefix','Mingw Prefix',mingw32),
+		('mingw_prefix_64','Mingw Prefix 64 bits',mingw64),
+	]
+  
+def get_flags():
+
+	return [
+		('freetype','builtin'), #use builtin freetype
+		('openssl','builtin'), #use builtin openssl
+		('theora','no'),
+	]
+			
+
+
+def configure(env):
+
+	env.Append(CPPPATH=['#platform/windows'])
+
+
+	if (os.name=="nt" and os.getenv("VSINSTALLDIR")!=None):
+		#build using visual studio
+		env['ENV']['TMP'] = os.environ['TMP']
+		env.Append(CPPPATH=['#platform/windows/include'])
+		env.Append(LIBPATH=['#platform/windows/lib'])
+
+		if (env["freetype"]!="no"):
+			env.Append(CCFLAGS=['/DFREETYPE_ENABLED'])
+			env.Append(CPPPATH=['#tools/freetype'])
+			env.Append(CPPPATH=['#tools/freetype/freetype/include'])
+
+		if (env["target"]=="release"):
+
+			env.Append(CCFLAGS=['/O2'])
+			env.Append(LINKFLAGS=['/SUBSYSTEM:WINDOWS'])
+			env.Append(LINKFLAGS=['/ENTRY:mainCRTStartup'])
+
+		elif (env["target"]=="release_debug"):
+
+			env.Append(CCFLAGS=['/O2','/DDEBUG_ENABLED'])
+			env.Append(LINKFLAGS=['/SUBSYSTEM:CONSOLE'])
+		elif (env["target"]=="debug_release"):
+
+			env.Append(CCFLAGS=['/Zi','/Od'])
+			env.Append(LINKFLAGS=['/DEBUG'])
+			env.Append(LINKFLAGS=['/SUBSYSTEM:WINDOWS'])
+			env.Append(LINKFLAGS=['/ENTRY:mainCRTStartup'])
+
+		elif (env["target"]=="debug"):
+
+			env.Append(CCFLAGS=['/Zi','/DDEBUG_ENABLED','/DDEBUG_MEMORY_ENABLED','/DD3D_DEBUG_INFO','/Od'])
+			env.Append(LINKFLAGS=['/SUBSYSTEM:CONSOLE'])
+			env.Append(LINKFLAGS=['/DEBUG'])
+
+
+		env.Append(CCFLAGS=['/MT','/Gd','/GR','/nologo'])
+		env.Append(CXXFLAGS=['/TP'])
+		env.Append(CPPFLAGS=['/DMSVC', '/GR', ])
+		env.Append(CCFLAGS=['/I'+os.getenv("WindowsSdkDir")+"/Include"])
+		env.Append(CCFLAGS=['/DWINDOWS_ENABLED'])
+		env.Append(CCFLAGS=['/DRTAUDIO_ENABLED'])
+		env.Append(CCFLAGS=['/DWIN32'])
+		env.Append(CCFLAGS=['/DTYPED_METHOD_BIND'])
+
+		env.Append(CCFLAGS=['/DGLES2_ENABLED'])
+
+		env.Append(CCFLAGS=['/DGLEW_ENABLED'])
+		LIBS=['winmm','opengl32','dsound','kernel32','ole32','user32','gdi32', 'IPHLPAPI','Shlwapi', 'wsock32', 'shell32','advapi32']
+		env.Append(LINKFLAGS=[p+env["LIBSUFFIX"] for p in LIBS])
+		
+		env.Append(LIBPATH=[os.getenv("WindowsSdkDir")+"/Lib"])
+                if (os.getenv("DXSDK_DIR")):
+                        DIRECTX_PATH=os.getenv("DXSDK_DIR")
+                else:
+                        DIRECTX_PATH="C:/Program Files/Microsoft DirectX SDK (March 2009)"
+
+                if (os.getenv("VCINSTALLDIR")):
+                        VC_PATH=os.getenv("VCINSTALLDIR")
+                else:
+                        VC_PATH=""
+
+		env.Append(CCFLAGS=["/I" + p for p in os.getenv("INCLUDE").split(";")])
+		env.Append(LIBPATH=[p for p in os.getenv("LIB").split(";")])
+		env.Append(CCFLAGS=["/I"+DIRECTX_PATH+"/Include"])
+		env.Append(LIBPATH=[DIRECTX_PATH+"/Lib/x86"])
+		env['ENV'] = os.environ;
+	else:
+
+		# Workaround for MinGW. See:
+		# http://www.scons.org/wiki/LongCmdLinesOnWin32
+		if (os.name=="nt"):
+			import subprocess
+			
+			def mySubProcess(cmdline,env):
+				#print "SPAWNED : " + cmdline
+				startupinfo = subprocess.STARTUPINFO()
+				startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
+				proc = subprocess.Popen(cmdline, stdin=subprocess.PIPE, stdout=subprocess.PIPE,
+					stderr=subprocess.PIPE, startupinfo=startupinfo, shell = False, env = env)
+				data, err = proc.communicate()
+				rv = proc.wait()
+				if rv:
+					print "====="
+					print err
+					print "====="
+				return rv
+				
+			def mySpawn(sh, escape, cmd, args, env):
+								
+				newargs = ' '.join(args[1:])
+				cmdline = cmd + " " + newargs
+				
+				rv=0
+				if len(cmdline) > 32000 and cmd.endswith("ar") :
+					cmdline = cmd + " " + args[1] + " " + args[2] + " "
+					for i in range(3,len(args)) :
+						rv = mySubProcess( cmdline + args[i], env )
+						if rv :
+							break	
+				else:				
+					rv = mySubProcess( cmdline, env )
+					
+				return rv
+				
+			env['SPAWN'] = mySpawn
+
+		#build using mingw
+		if (os.name=="nt"):
+			env['ENV']['TMP'] = os.environ['TMP'] #way to go scons, you can be so stupid sometimes
+		else:
+			env["PROGSUFFIX"]=env["PROGSUFFIX"]+".exe" # for linux cross-compilation
+
+		mingw_prefix=""
+
+		if (env["bits"]=="default"):
+			env["bits"]="32"
+
+		if (env["bits"]=="32"):
+			env.Append(LINKFLAGS=['-static'])
+			env.Append(LINKFLAGS=['-static-libgcc'])
+			env.Append(LINKFLAGS=['-static-libstdc++'])
+			mingw_prefix=env["mingw_prefix"];
+		else:
+			env.Append(LINKFLAGS=['-static'])
+			mingw_prefix=env["mingw_prefix_64"];
+
+		nulstr=""
+
+		if (os.name=="posix"):
+		    nulstr=">/dev/null"
+		else:
+		    nulstr=">nul"
+
+
+
+		# if os.system(mingw_prefix+"gcc --version"+nulstr)!=0:
+			# #not really super consistent but..
+			# print("Can't find Windows compiler: "+mingw_prefix)
+			# sys.exit(255)
+
+		if (env["target"]=="release"):
+			
+			env.Append(CCFLAGS=['-O3','-ffast-math','-fomit-frame-pointer','-msse2'])
+			env.Append(LINKFLAGS=['-Wl,--subsystem,windows'])
+
+		elif (env["target"]=="release_debug"):
+
+			env.Append(CCFLAGS=['-O2','-DDEBUG_ENABLED'])
+
+		elif (env["target"]=="debug"):
+					
+			env.Append(CCFLAGS=['-g', '-Wall','-DDEBUG_ENABLED','-DDEBUG_MEMORY_ENABLED'])
+
+		if (env["freetype"]!="no"):
+			env.Append(CCFLAGS=['-DFREETYPE_ENABLED'])
+			env.Append(CPPPATH=['#tools/freetype'])
+			env.Append(CPPPATH=['#tools/freetype/freetype/include'])
+
+		env["CC"]=mingw_prefix+"gcc"
+		env['AS']=mingw_prefix+"as"
+		env['CXX'] = mingw_prefix+"g++"
+		env['AR'] = mingw_prefix+"ar"
+		env['RANLIB'] = mingw_prefix+"ranlib"
+		env['LD'] = mingw_prefix+"g++"
+
+		#env['CC'] = "winegcc"
+		#env['CXX'] = "wineg++"
+
+		env.Append(CCFLAGS=['-DWINDOWS_ENABLED','-mwindows'])
+		env.Append(CPPFLAGS=['-DRTAUDIO_ENABLED'])
+		env.Append(CCFLAGS=['-DGLES2_ENABLED','-DGLEW_ENABLED'])
+		env.Append(LIBS=['mingw32','opengl32', 'dsound', 'ole32', 'd3d9','winmm','gdi32','iphlpapi','shlwapi','wsock32','kernel32'])
+
+		# if (env["bits"]=="32"):
+# #			env.Append(LIBS=['gcc_s'])
+			# #--with-arch=i686
+			# env.Append(CPPFLAGS=['-march=i686'])
+			# env.Append(LINKFLAGS=['-march=i686'])
+
+
+
+
+		#'d3dx9d'
+		env.Append(CPPFLAGS=['-DMINGW_ENABLED'])
+		env.Append(LINKFLAGS=['-g'])
+
+	import methods
+	env.Append( BUILDERS = { 'GLSL120' : env.Builder(action = methods.build_legacygl_headers, suffix = 'glsl.h',src_suffix = '.glsl') } )
+	env.Append( BUILDERS = { 'GLSL' : env.Builder(action = methods.build_glsl_headers, suffix = 'glsl.h',src_suffix = '.glsl') } )
+	env.Append( BUILDERS = { 'HLSL9' : env.Builder(action = methods.build_hlsl_dx9_headers, suffix = 'hlsl.h',src_suffix = '.hlsl') } )
+	env.Append( BUILDERS = { 'GLSL120GLES' : env.Builder(action = methods.build_gles2_headers, suffix = 'glsl.h',src_suffix = '.glsl') } )
+
+	
+

+ 4 - 4
tools/editor/editor_import_export.cpp

@@ -1420,12 +1420,12 @@ EditorImportExport::ImageAction EditorImportExport::get_export_image_action() co
 	return image_action;
 }
 
-void EditorImportExport::set_export_image_shrink(int p_shrink) {
+void EditorImportExport::set_export_image_shrink(float p_shrink) {
 
 	image_shrink=p_shrink;
 }
 
-int EditorImportExport::get_export_image_shrink() const{
+float EditorImportExport::get_export_image_shrink() const{
 
 	return image_shrink;
 }
@@ -1496,12 +1496,12 @@ bool EditorImportExport::image_export_group_get_make_atlas(const StringName& p_e
 	return image_groups[p_export_group].make_atlas;
 
 }
-void EditorImportExport::image_export_group_set_shrink(const StringName& p_export_group,int p_amount){
+void EditorImportExport::image_export_group_set_shrink(const StringName& p_export_group,float p_amount){
 	ERR_FAIL_COND(!image_groups.has(p_export_group));
 	image_groups[p_export_group].shrink=p_amount;
 
 }
-int EditorImportExport::image_export_group_get_shrink(const StringName& p_export_group) const{
+float EditorImportExport::image_export_group_get_shrink(const StringName& p_export_group) const{
 
 	ERR_FAIL_COND_V(!image_groups.has(p_export_group),1);
 	return image_groups[p_export_group].shrink;

+ 6 - 6
tools/editor/editor_import_export.h

@@ -252,7 +252,7 @@ protected:
 		ImageAction action;
 		bool make_atlas;
 		float lossy_quality;
-		int shrink;
+		float shrink;
 	};
 
 	Vector<Ref<EditorExportPlugin> > export_plugins;
@@ -260,7 +260,7 @@ protected:
 	Map<String,int> by_idx;
 	ImageAction image_action;
 	float image_action_compress_quality;
-	int image_shrink;
+	float image_shrink;
 	Set<String> image_formats;
 
 	ExportFilter export_filter;
@@ -310,8 +310,8 @@ public:
 	void set_export_image_action(ImageAction p_action);
 	ImageAction get_export_image_action() const;
 
-	void set_export_image_shrink(int p_shrink);
-	int get_export_image_shrink() const;
+	void set_export_image_shrink(float p_shrink);
+	float get_export_image_shrink() const;
 
 	void set_export_image_quality(float p_quality);
 	float get_export_image_quality() const;
@@ -326,8 +326,8 @@ public:
 	ImageAction image_export_group_get_image_action(const StringName& p_export_group) const;
 	void image_export_group_set_make_atlas(const StringName& p_export_group,bool p_make);
 	bool image_export_group_get_make_atlas(const StringName& p_export_group) const;
-	void image_export_group_set_shrink(const StringName& p_export_group,int p_amount);
-	int image_export_group_get_shrink(const StringName& p_export_group) const;
+	void image_export_group_set_shrink(const StringName& p_export_group,float p_amount);
+	float image_export_group_get_shrink(const StringName& p_export_group) const;
 	void image_export_group_set_lossy_quality(const StringName& p_export_group,float p_quality);
 	float image_export_group_get_lossy_quality(const StringName& p_export_group) const;
 

+ 4 - 4
tools/editor/io_plugins/editor_texture_import_plugin.cpp

@@ -828,7 +828,7 @@ Error EditorTextureImportPlugin::import(const String& p_path, const Ref<Resource
 }
 
 
-Error EditorTextureImportPlugin::_process_texture_data(Ref<ImageTexture> &texture,int format, float quality,int flags,EditorExportPlatform::ImageCompression p_compr,int tex_flags,int shrink)  {
+Error EditorTextureImportPlugin::_process_texture_data(Ref<ImageTexture> &texture,int format, float quality,int flags,EditorExportPlatform::ImageCompression p_compr,int tex_flags,float shrink)  {
 
 
 	if (format==IMAGE_FORMAT_COMPRESS_DISK_LOSSLESS || format==IMAGE_FORMAT_COMPRESS_DISK_LOSSY) {
@@ -866,7 +866,7 @@ Error EditorTextureImportPlugin::_process_texture_data(Ref<ImageTexture> &textur
 
 			int orig_w=image.get_width();
 			int orig_h=image.get_height();
-			image.resize(orig_w/shrink,orig_h/shrink);
+			image.resize(orig_w/shrink,orig_h/shrink,Image::INTERPOLATE_CUBIC);
 			texture->create_from_image(image,tex_flags);
 			texture->set_size_override(Size2(orig_w,orig_h));
 
@@ -926,7 +926,7 @@ Error EditorTextureImportPlugin::_process_texture_data(Ref<ImageTexture> &textur
 		int orig_h=image.get_height();
 
 		if (shrink>1) {
-			image.resize(orig_w/shrink,orig_h/shrink);
+			image.resize(orig_w/shrink,orig_h/shrink,Image::INTERPOLATE_CUBIC);
 			texture->create_from_image(image,tex_flags);
 			texture->set_size_override(Size2(orig_w,orig_h));
 		}
@@ -987,7 +987,7 @@ Error EditorTextureImportPlugin::import2(const String& p_path, const Ref<Resourc
 		tex_flags|=Texture::FLAG_ANISOTROPIC_FILTER;
 
 	print_line("path: "+p_path+" flags: "+itos(tex_flags));
-	int shrink=1;
+	float shrink=1;
 	if (from->has_option("shrink"))
 		shrink=from->get_option("shrink");
 

+ 1 - 1
tools/editor/io_plugins/editor_texture_import_plugin.h

@@ -70,7 +70,7 @@ private:
 	static EditorTextureImportPlugin *singleton[MODE_MAX];
 	//used by other importers such as mesh
 
-	Error _process_texture_data(Ref<ImageTexture> &texture, int format, float quality, int flags,EditorExportPlatform::ImageCompression p_compr,int tex_flags,int shrink);
+	Error _process_texture_data(Ref<ImageTexture> &texture, int format, float quality, int flags,EditorExportPlatform::ImageCompression p_compr,int tex_flags,float shrink);
 	void compress_image(EditorExportPlatform::ImageCompression p_mode,Image& image,bool p_smaller);
 public:
 

+ 2 - 2
tools/editor/project_export.cpp

@@ -1156,7 +1156,7 @@ ProjectExportDialog::ProjectExportDialog(EditorNode *p_editor) {
 	image_shrink = memnew( SpinBox );
 	image_shrink->set_min(1);
 	image_shrink->set_max(8);
-	image_shrink->set_step(1);
+	image_shrink->set_step(0.1);
 	image_vb->add_margin_child("Shrink All Images:",image_shrink);
 	sections->add_child(image_vb);
 
@@ -1237,7 +1237,7 @@ ProjectExportDialog::ProjectExportDialog(EditorNode *p_editor) {
 	group_shrink->set_min(1);
 	group_shrink->set_max(8);
 	group_shrink->set_val(1);
-	group_shrink->set_step(1);
+	group_shrink->set_step(0.001);
 	group_options->add_margin_child("Shrink By:",group_shrink);
 	group_shrink->connect("value_changed",this,"_group_changed");