diff --git a/src/libprojectM/Common.hpp b/src/libprojectM/Common.hpp
index b325f80..843422b 100644
--- a/src/libprojectM/Common.hpp
+++ b/src/libprojectM/Common.hpp
@@ -26,20 +26,22 @@
 
 #ifndef COMMON_HPP
 #define COMMON_HPP
+
 #include <vector>
 #include <typeinfo>
 #include <cstdarg>
 #include <cassert>
+
 #ifdef _MSC_sVER
-#define strcasecmp(s, t) _strcmpi(s, t)
+#define strcasecmp(s, t)    _strcmpi(s, t)
 #endif
 
 #ifdef _MSC_VER
-	#pragma warning( disable : 4244 4305 4996; once : 4018 )
-	#define WIN32_LEAN_AND_MEAN
-	#define NOMINMAX
-	#include <windows.h>
-	typedef unsigned int uint;
+  #pragma warning( disable : 4244 4305 4996; once : 4018 )
+  #define WIN32_LEAN_AND_MEAN
+  #define NOMINMAX
+  #include <windows.h>
+  typedef unsigned int uint;
 #endif
 
 #ifdef DEBUG
@@ -48,193 +50,180 @@
 
 #ifdef MACOS
 #include <cstdio>
-extern FILE *fmemopen(void *buf, size_t len, const char *pMode);
+extern FILE *fmemopen (void *buf, size_t len, const char *pMode);
 #endif /** MACOS */
 
 #include "dlldefs.h"
 
-#define DEFAULT_FONT_PATH "/home/carm/fonts/courier1.glf"
-#define MAX_TOKEN_SIZE 512
-#define MAX_PATH_SIZE 4096
+#define DEFAULT_FONT_PATH   "/home/carm/fonts/courier1.glf"
+#define MAX_TOKEN_SIZE      512
+#define MAX_PATH_SIZE       4096
 
-#define STRING_BUFFER_SIZE 1024*150
-#define STRING_LINE_SIZE 1024
+#define STRING_BUFFER_SIZE  1024*150
+#define STRING_LINE_SIZE    1024
 
 
 #ifdef LINUX
 #include <cstdlib>
-#define projectM_isnan std::isnan
-
+#define projectM_isnan      std::isnan
+#define projectM_fmax       fmax
+#define projectM_fmin       fmin
 #endif
 
 #ifdef WIN32
-#define projectM_isnan(x) ((x) != (x))
+#define projectM_isnan(x)   ((x) != (x))
+#define projectM_fmax(x,y)  ((x) >= (y) ? (x): (y))
+#define projectM_fmin(x,y)  ((x) <= (y) ? (x): (y))
 #endif
 
 #ifdef MACOS
-#define projectM_isnan(x) ((x) != (x))
-#endif
-
-#ifdef LINUX
-#define projectM_fmax fmax
-#endif
-
-#ifdef WIN32
-#define projectM_fmax(x,y) ((x) >= (y) ? (x): (y))
-#endif
-
-#ifdef MACOS
-#define projectM_fmax(x,y) ((x) >= (y) ? (x): (y))
-#endif
-
-#ifdef LINUX
-#define projectM_fmin fmin
-#endif
-
-#ifdef WIN32
-#define projectM_fmin(x,y) ((x) <= (y) ? (x): (y))
-#endif
-
-#ifdef MACOS
-#define projectM_fmin(x,y) ((x) <= (y) ? (x): (y))
+#define projectM_isnan(x)   ((x) != (x))
+#define projectM_fmax(x,y)  ((x) >= (y) ? (x): (y))
+#define projectM_fmin(x,y)  ((x) <= (y) ? (x): (y))
 #endif
 
 #ifndef TRUE
-#define TRUE true
+#define TRUE                true
 #endif
 
 #ifndef FALSE
-#define FALSE false
+#define FALSE               false
 #endif
 
 
-#define MAX_DOUBLE_SIZE  10000000.0
-#define MIN_DOUBLE_SIZE -10000000.0
+#define MAX_DOUBLE_SIZE      10000000.0
+#define MIN_DOUBLE_SIZE     -10000000.0
 
-#define MAX_INT_SIZE  10000000
-#define MIN_INT_SIZE -10000000
+#define MAX_INT_SIZE         10000000
+#define MIN_INT_SIZE        -10000000
 
 /* default float initial value */
-#define DEFAULT_DOUBLE_IV 0.0
+#define DEFAULT_DOUBLE_IV   0.0
 
 /* default float lower bound */
-#define DEFAULT_DOUBLE_LB MIN_DOUBLE_SIZE
+#define DEFAULT_DOUBLE_LB   MIN_DOUBLE_SIZE
 
 /* default float upper bound */
-#define DEFAULT_DOUBLE_UB MAX_DOUBLE_SIZE
+#define DEFAULT_DOUBLE_UB   MAX_DOUBLE_SIZE
 
 #ifdef WIN32
 #include <float.h>
-#define isnan _isnan
+#define isnan               _isnan
 #endif /** WIN32 */
 
 /** Per-platform path separators */
-#define WIN32_PATH_SEPARATOR '\\'
-#define UNIX_PATH_SEPARATOR '/'
+#define WIN32_PATH_SEPARATOR  '\\'
+#define UNIX_PATH_SEPARATOR   '/'
 #ifdef WIN32
-#define PATH_SEPARATOR WIN32_PATH_SEPARATOR
+#define PATH_SEPARATOR        WIN32_PATH_SEPARATOR
 #else
-#define PATH_SEPARATOR UNIX_PATH_SEPARATOR
+#define PATH_SEPARATOR        UNIX_PATH_SEPARATOR
 #endif /** WIN32 */
+
 #include <string>
 
-const unsigned int NUM_Q_VARIABLES(32);
-const std::string PROJECTM_FILE_EXTENSION("prjm");
-const std::string MILKDROP_FILE_EXTENSION("milk");
-const std::string PROJECTM_MODULE_EXTENSION("so");
 
- template <class TraverseFunctor, class Container>
-  void traverse(Container & container)
+const unsigned int  NUM_Q_VARIABLES (32);
+const std::string   PROJECTM_FILE_EXTENSION ("prjm");
+const std::string   MILKDROP_FILE_EXTENSION ("milk");
+const std::string   PROJECTM_MODULE_EXTENSION ("so");
+
+
+template <class TraverseFunctor, class Container>
+void traverse (Container & container)
+{
+  TraverseFunctor functor;
+
+  for (typename Container::iterator pos = container.begin ();
+       pos != container.end ();
+       ++pos)
   {
-
-    TraverseFunctor functor;
-
-    for (typename Container::iterator pos = container.begin(); pos != container.end(); ++pos)
-    {
-      assert(pos->second);
-      functor(pos->second);
-    }
-
+    assert (pos->second);
+    functor (pos->second);
   }
 
-
-  template <class TraverseFunctor, class Container>
-  void traverseVector(Container & container)
-  {
-
-    TraverseFunctor functor;
-
-    for (typename Container::iterator pos = container.begin(); pos != container.end(); ++pos)
-    {
-      assert(*pos);
-      functor(*pos);
-    }
-
-  }
-
-  template <class TraverseFunctor, class Container>
-  void traverse(Container & container, TraverseFunctor & functor)
-  {
-
-    for (typename Container::iterator pos = container.begin(); pos != container.end(); ++pos)
-    {
-      assert(pos->second);
-      functor(pos->second);
-    }
-
-  }
-
-  namespace TraverseFunctors
-  {
-    template <class Data>
-    class Delete
-    {
-
-    public:
-
-      void operator() (Data * data)
-      {
-        assert(data);
-        delete(data);
-      }
-
-    };
-  }
-
-
-inline std::string parseExtension(const std::string & filename) {
-
-const std::size_t start = filename.find_last_of('.');
-
-if (start == std::string::npos || start >= (filename.length()-1))
-	return "";
-else
-	return filename.substr(start+1, filename.length());
-
 }
 
-inline std::string parseFilename(const std::string & filename) {
 
-const std::size_t start = filename.find_last_of('/');
+template <class TraverseFunctor, class Container>
+void traverseVector (Container & container)
+{
+  TraverseFunctor functor;
 
-if (start == std::string::npos || start >= (filename.length()-1))
-	return "";
-else
-	return filename.substr(start+1, filename.length());
+  for (typename Container::iterator pos = container.begin ();
+       pos != container.end ();
+       ++pos)
+  {
+    assert (*pos);
+    functor (*pos);
+  }
 
 }
 
-inline double meanSquaredError(const double & x, const double & y) {
-		return (x-y)*(x-y);
+template <class TraverseFunctor, class Container>
+void traverse (Container & container, TraverseFunctor & functor)
+{
+  for (typename Container::iterator pos = container.begin ();
+       pos != container.end ();
+       ++pos)
+  {
+    assert (pos->second);
+    functor (pos->second);
+  }
+
+}
+
+namespace TraverseFunctors
+{
+  template <class Data>
+  class Delete
+  {
+
+  public:
+
+    void
+    operator () (Data * data)
+    {
+      assert (data);
+      delete (data);
+    }
+
+  };
+} /*  namespace TraverseFunctors  */
+
+
+inline std::string
+parseExtension (const std::string & filename) {
+  const std::size_t start = filename.find_last_of ('.');
+
+  if (start == std::string::npos  ||  start >= (filename.length ()-1))
+    return "";
+  else
+    return filename.substr (start+1, filename.length ());
+}
+
+inline std::string
+parseFilename (const std::string & filename) {
+  const std::size_t start = filename.find_last_of ('/');
+
+  if (start == std::string::npos || start >= (filename.length ()-1))
+    return "";
+  else
+    return filename.substr (start+1, filename.length ());
+}
+
+inline double
+meanSquaredError (const double & x, const double & y) {
+  return (x-y)*(x-y);
 }
 
 
 enum PresetRatingType {
-	FIRST_RATING_TYPE = 0,
-	HARD_CUT_RATING_TYPE = FIRST_RATING_TYPE,
-	SOFT_CUT_RATING_TYPE,
-	LAST_RATING_TYPE = SOFT_CUT_RATING_TYPE,
-	TOTAL_RATING_TYPES = SOFT_CUT_RATING_TYPE+1
+  FIRST_RATING_TYPE     = 0,
+  HARD_CUT_RATING_TYPE  = FIRST_RATING_TYPE,
+  SOFT_CUT_RATING_TYPE,
+  LAST_RATING_TYPE      = SOFT_CUT_RATING_TYPE,
+  TOTAL_RATING_TYPES    = SOFT_CUT_RATING_TYPE+1
 };
 
 
diff --git a/src/libprojectM/ConfigFile.cpp b/src/libprojectM/ConfigFile.cpp
index f041064..c10662d 100644
--- a/src/libprojectM/ConfigFile.cpp
+++ b/src/libprojectM/ConfigFile.cpp
@@ -1,142 +1,158 @@
-// ConfigFile.cpp
-
-#include "ConfigFile.h"
-
-using std::string;
-
-ConfigFile::ConfigFile( string filename, string delimiter,
-                        string comment, string sentry )
-	: myDelimiter(delimiter), myComment(comment), mySentry(sentry)
-{
-	// Construct a ConfigFile, getting keys and values from given file
-	
-	std::ifstream in( filename.c_str() );
-	
-	if( !in ) throw file_not_found( filename ); 
-	
-	in >> (*this);
-}
-
-
-ConfigFile::ConfigFile()
-	: myDelimiter( string(1,'=') ), myComment( string(1,'#') )
-{
-	// Construct a ConfigFile without a file; empty
-}
-
-
-void ConfigFile::remove( const string& key )
-{
-	// Remove key and its value
-	myContents.erase( myContents.find( key ) );
-	return;
-}
-
-
-bool ConfigFile::keyExists( const string& key ) const
-{
-	// Indicate whether key is found
-	mapci p = myContents.find( key );
-	return ( p != myContents.end() );
-}
-
-
-/* static */
-void ConfigFile::trim( string& s )
-{
-	// Remove leading and trailing whitespace
-	static const char whitespace[] = " \n\t\v\r\f";
-	s.erase( 0, s.find_first_not_of(whitespace) );
-	s.erase( s.find_last_not_of(whitespace) + 1U );
-}
-
-
-std::ostream& operator<<( std::ostream& os, const ConfigFile& cf )
-{
-	// Save a ConfigFile to os
-	for( ConfigFile::mapci p = cf.myContents.begin();
-	     p != cf.myContents.end();
-		 ++p )
-	{
-		os << p->first << " " << cf.myDelimiter << " ";
-		os << p->second << std::endl;
-	}
-	return os;
-}
-
-
-std::istream& operator>>( std::istream& is, ConfigFile& cf )
-{
-	// Load a ConfigFile from is
-	// Read in keys and values, keeping internal whitespace
-	typedef string::size_type pos;
-	const string& delim  = cf.myDelimiter;  // separator
-	const string& comm   = cf.myComment;    // comment
-	const string& sentry = cf.mySentry;     // end of file sentry
-	const pos skip = delim.length();        // length of separator
-	
-	string nextline = "";  // might need to read ahead to see where value ends
-	
-	while( is || nextline.length() > 0 )
-	{
-		// Read an entire line at a time
-		string line;
-		if( nextline.length() > 0 )
-		{
-			line = nextline;  // we read ahead; use it now
-			nextline = "";
-		}
-		else
-		{
-			std::getline( is, line );
-		}
-		
-		// Ignore comments
-		line = line.substr( 0, line.find(comm) );
-		
-		// Check for end of file sentry
-		if( sentry != "" && line.find(sentry) != string::npos ) return is;
-		
-		// Parse the line if it contains a delimiter
-		pos delimPos = line.find( delim );
-		if( delimPos < string::npos )
-		{
-			// Extract the key
-			string key = line.substr( 0, delimPos );
-			line.replace( 0, delimPos+skip, "" );
-			
-			// See if value continues on the next line
-			// Stop at blank line, next line with a key, end of stream,
-			// or end of file sentry
-			bool terminate = false;
-			while( !terminate && is )
-			{
-				std::getline( is, nextline );
-				terminate = true;
-				
-				string nlcopy = nextline;
-				ConfigFile::trim(nlcopy);
-				if( nlcopy == "" ) continue;
-				
-				nextline = nextline.substr( 0, nextline.find(comm) );
-				if( nextline.find(delim) != string::npos )
-					continue;
-				if( sentry != "" && nextline.find(sentry) != string::npos )
-					continue;
-				
-				nlcopy = nextline;
-				ConfigFile::trim(nlcopy);
-				if( nlcopy != "" ) line += "\n";
-				line += nextline;
-				terminate = false;
-			}
-			
-			// Store key and value
-			ConfigFile::trim(key);
-			ConfigFile::trim(line);
-			cf.myContents[key] = line;  // overwrites if key is repeated
-		}
-	}
-	
-	return is;
-}
+// ConfigFile.cpp
+
+#include "ConfigFile.h"
+
+
+using std::string;
+
+ConfigFile::ConfigFile (
+string filename,
+string delimiter,
+string comment,
+string sentry
+)
+  : myDelimiter (delimiter),
+    myComment (comment),
+    mySentry (sentry)
+{
+  // Construct a ConfigFile, getting keys and values from given file
+
+  std::ifstream in (filename.c_str ());
+
+  if (!in) throw file_not_found (filename);
+
+  in >> (*this);
+}
+
+
+ConfigFile::ConfigFile ()
+  : myDelimiter (string (1,'=')),
+    myComment (string (1,'#'))
+{
+  // Construct a ConfigFile without a file; empty
+}
+
+
+void
+ConfigFile::remove (const string& key)
+{
+  // Remove key and its value
+  myContents.erase (myContents.find (key));
+  return;
+}
+
+
+bool
+ConfigFile::keyExists (const string& key) const
+{
+  // Indicate whether key is found
+  mapci p = myContents.find (key);
+
+  return (p != myContents.end ());
+}
+
+
+/* static */
+void
+ConfigFile::trim (string& s)
+{
+  // Remove leading and trailing whitespace
+  static const char whitespace[] = " \n\t\v\r\f";
+
+  s.erase (0, s.find_first_not_of (whitespace));
+  s.erase (s.find_last_not_of (whitespace) + 1U);
+}
+
+
+std::ostream&
+operator<< (std::ostream& os, const ConfigFile& cf)
+{
+  // Save a ConfigFile to os
+  for (ConfigFile::mapci p = cf.myContents.begin ();
+       p != cf.myContents.end ();
+       ++p)
+  {
+    os << p->first << " " << cf.myDelimiter << " ";
+    os << p->second << std::endl;
+  }
+  return os;
+}
+
+
+std::istream&
+operator>> (std::istream& is, ConfigFile& cf)
+{
+  // Load a ConfigFile from is
+  // Read in keys and values, keeping internal whitespace
+  typedef string::size_type pos;
+  const string              &delim  = cf.myDelimiter; // separator
+  const string              &comm   = cf.myComment;   // comment
+  const string              &sentry = cf.mySentry;    // end of file sentry
+  const pos                 skip = delim.length ();   // length of separator
+
+  string nextline = "";  // might need to read ahead to see where value ends
+
+  while (is  ||  nextline.length () > 0)
+  {
+    // Read an entire line at a time
+    string line;
+
+    if (nextline.length () > 0)
+    {
+      line = nextline;  // we read ahead; use it now
+      nextline = "";
+    }
+    else
+    {
+      std::getline (is, line);
+    }
+
+    // Ignore comments
+    line = line.substr (0, line.find (comm));
+
+    // Check for end of file sentry
+    if (sentry != ""  &&  line.find (sentry) != string::npos) return is;
+
+    // Parse the line if it contains a delimiter
+    pos delimPos = line.find (delim);
+    if (delimPos < string::npos)
+    {
+      // Extract the key
+      string key = line.substr (0, delimPos);
+      line.replace (0, delimPos+skip, "");
+
+      // See if value continues on the next line
+      // Stop at blank line, next line with a key, end of stream,
+      // or end of file sentry
+      bool terminate = false;
+      while (!terminate  &&  is)
+      {
+        std::getline (is, nextline);
+        terminate = true;
+
+        string nlcopy = nextline;
+        ConfigFile::trim (nlcopy);
+        if (nlcopy == "") continue;
+
+        nextline = nextline.substr (0, nextline.find (comm));
+        if (nextline.find (delim) != string::npos)
+          continue;
+        if (sentry != ""  &&  nextline.find (sentry) != string::npos)
+          continue;
+
+        nlcopy = nextline;
+        ConfigFile::trim (nlcopy);
+        if (nlcopy != "") line += "\n";
+        line += nextline;
+        terminate = false;
+      }
+
+      // Store key and value
+      ConfigFile::trim (key);
+      ConfigFile::trim (line);
+      cf.myContents[key] = line;  // overwrites if key is repeated
+    }
+  }
+
+  return is;
+}
diff --git a/src/libprojectM/ConfigFile.h b/src/libprojectM/ConfigFile.h
index c2f0024..7e93ae4 100644
--- a/src/libprojectM/ConfigFile.h
+++ b/src/libprojectM/ConfigFile.h
@@ -1,253 +1,258 @@
-// ConfigFile.h
-// Class for reading named values from configuration files
-// Richard J. Wagner  v2.1  24 May 2004  wagnerr@umich.edu
-
-// Copyright (c) 2004 Richard J. Wagner
-// 
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to
-// deal in the Software without restriction, including without limitation the
-// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-// sell copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-// 
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-// 
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-// IN THE SOFTWARE.
-
-// Typical usage
-// -------------
-// 
-// Given a configuration file "settings.inp":
-//   atoms  = 25
-//   length = 8.0  # nanometers
-//   name = Reece Surcher
-// 
-// Named values are read in various ways, with or without default values:
-//   ConfigFile config( "settings.inp" );
-//   int atoms = config.read<int>( "atoms" );
-//   double length = config.read( "length", 10.0 );
-//   string author, title;
-//   config.readInto( author, "name" );
-//   config.readInto( title, "title", string("Untitled") );
-// 
-// See file example.cpp for more examples.
-
-#ifndef CONFIGFILE_H
-#define CONFIGFILE_H
-
-#include <string>
-#include <map>
-#include <iostream>
-#include <fstream>
-#include <sstream>
-
-using std::string;
-
-class ConfigFile {
-// Data
-protected:
-	string myDelimiter;  // separator between key and value
-	string myComment;    // separator between value and comments
-	string mySentry;     // optional string to signal end of file
-	std::map<string,string> myContents;  // extracted keys and values
-	
-	typedef std::map<string,string>::iterator mapi;
-	typedef std::map<string,string>::const_iterator mapci;
-
-// Methods
-public:
-	ConfigFile( string filename,
-	            string delimiter = "=",
-	            string comment = "#",
-				string sentry = "EndConfigFile" );
-	ConfigFile();
-	
-	// Search for key and read value or optional default value
-	template<class T> T read( const string& key ) const;  // call as read<T>
-	template<class T> T read( const string& key, const T& value ) const;
-	template<class T> bool readInto( T& var, const string& key ) const;
-	template<class T>
-	bool readInto( T& var, const string& key, const T& value ) const;
-	
-	// Modify keys and values
-	template<class T> void add( string key, const T& value );
-	void remove( const string& key );
-	
-	// Check whether key exists in configuration
-	bool keyExists( const string& key ) const;
-	
-	// Check or change configuration syntax
-	string getDelimiter() const { return myDelimiter; }
-	string getComment() const { return myComment; }
-	string getSentry() const { return mySentry; }
-	string setDelimiter( const string& s )
-		{ string old = myDelimiter;  myDelimiter = s;  return old; }  
-	string setComment( const string& s )
-		{ string old = myComment;  myComment = s;  return old; }
-	
-	// Write or read configuration
-	friend std::ostream& operator<<( std::ostream& os, const ConfigFile& cf );
-	friend std::istream& operator>>( std::istream& is, ConfigFile& cf );
-	
-protected:
-	template<class T> static string T_as_string( const T& t );
-	template<class T> static T string_as_T( const string& s );
-	static void trim( string& s );
-
-
-// Exception types
-public:
-	struct file_not_found {
-		string filename;
-		file_not_found( const string& filename_ = string() )
-			: filename(filename_) {} };
-	struct key_not_found {  // thrown only by T read(key) variant of read()
-		string key;
-		key_not_found( const string& key_ = string() )
-			: key(key_) {} };
-};
-
-
-/* static */
-template<class T>
-string ConfigFile::T_as_string( const T& t )
-{
-	// Convert from a T to a string
-	// Type T must support << operator
-	std::ostringstream ost;
-	ost << t;
-	return ost.str();
-}
-
-
-/* static */
-template<class T>
-T ConfigFile::string_as_T( const string& s )
-{
-	// Convert from a string to a T
-	// Type T must support >> operator
-	T t;
-	std::istringstream ist(s);
-	ist >> t;
-	return t;
-}
-
-
-/* static */
-template<>
-inline string ConfigFile::string_as_T<string>( const string& s )
-{
-	// Convert from a string to a string
-	// In other words, do nothing
-	return s;
-}
-
-
-/* static */
-template<>
-inline bool ConfigFile::string_as_T<bool>( const string& s )
-{
-	// Convert from a string to a bool
-	// Interpret "false", "F", "no", "n", "0" as false
-	// Interpret "true", "T", "yes", "y", "1", "-1", or anything else as true
-	bool b = true;
-	string sup = s;
-	for( string::iterator p = sup.begin(); p != sup.end(); ++p )
-		*p = toupper(*p);  // make string all caps
-	if( sup==string("FALSE") || sup==string("F") ||
-	    sup==string("NO") || sup==string("N") ||
-	    sup==string("0") || sup==string("NONE") )
-		b = false;
-	return b;
-}
-
-
-template<class T>
-T ConfigFile::read( const string& key ) const
-{
-	// Read the value corresponding to key
-	mapci p = myContents.find(key);
-	if( p == myContents.end() ) throw key_not_found(key);
-	return string_as_T<T>( p->second );
-}
-
-
-template<class T>
-T ConfigFile::read( const string& key, const T& value ) const
-{
-	// Return the value corresponding to key or given default value
-	// if key is not found
-	mapci p = myContents.find(key);
-	if( p == myContents.end() ) return value;
-	return string_as_T<T>( p->second );
-}
-
-
-template<class T>
-bool ConfigFile::readInto( T& var, const string& key ) const
-{
-	// Get the value corresponding to key and store in var
-	// Return true if key is found
-	// Otherwise leave var untouched
-	mapci p = myContents.find(key);
-	bool found = ( p != myContents.end() );
-	if( found ) var = string_as_T<T>( p->second );
-	return found;
-}
-
-
-template<class T>
-bool ConfigFile::readInto( T& var, const string& key, const T& value ) const
-{
-	// Get the value corresponding to key and store in var
-	// Return true if key is found
-	// Otherwise set var to given default
-	mapci p = myContents.find(key);
-	bool found = ( p != myContents.end() );
-	if( found )
-		var = string_as_T<T>( p->second );
-	else
-		var = value;
-	return found;
-}
-
-
-template<class T>
-void ConfigFile::add( string key, const T& value )
-{
-	// Add a key with given value
-	string v = T_as_string( value );
-	trim(key);
-	trim(v);
-	myContents[key] = v;
-	return;
-}
-
-#endif  // CONFIGFILE_H
-
-// Release notes:
-// v1.0  21 May 1999
-//   + First release
-//   + Template read() access only through non-member readConfigFile()
-//   + ConfigurationFileBool is only built-in helper class
-// 
-// v2.0  3 May 2002
-//   + Shortened name from ConfigurationFile to ConfigFile
-//   + Implemented template member functions
-//   + Changed default comment separator from % to #
-//   + Enabled reading of multiple-line values
-// 
-// v2.1  24 May 2004
-//   + Made template specializations inline to avoid compiler-dependent linkage
-//   + Allowed comments within multiple-line values
-//   + Enabled blank line termination for multiple-line values
-//   + Added optional sentry to detect end of configuration file
-//   + Rewrote messy trimWhitespace() function as elegant trim()
+// ConfigFile.h
+// Class for reading named values from configuration files
+// Richard J. Wagner  v2.1  24 May 2004  wagnerr@umich.edu
+
+// Copyright (c) 2004 Richard J. Wagner
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to
+// deal in the Software without restriction, including without limitation the
+// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+// sell copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+// IN THE SOFTWARE.
+
+// Typical usage
+// -------------
+//
+// Given a configuration file "settings.inp":
+//   atoms  = 25
+//   length = 8.0  # nanometers
+//   name = Reece Surcher
+//
+// Named values are read in various ways, with or without default values:
+//   ConfigFile config ("settings.inp");
+//   int atoms = config.read<int>( "atoms");
+//   double length = config.read ("length", 10.0);
+//   string author, title;
+//   config.readInto (author, "name");
+//   config.readInto (title, "title", string("Untitled"));
+//
+// See file example.cpp for more examples.
+
+#ifndef CONFIGFILE_H
+#define CONFIGFILE_H
+
+#include <string>
+#include <map>
+#include <iostream>
+#include <fstream>
+#include <sstream>
+
+using std::string;
+
+class ConfigFile {
+// Data
+protected:
+  string                  myDelimiter;  // separator between key and value
+  string                  myComment;    // separator between value and comments
+  string                  mySentry;     // optional string to signal end of file
+  std::map<string,string> myContents;   // extracted keys and values
+
+  typedef std::map<string,string>::iterator mapi;
+  typedef std::map<string,string>::const_iterator mapci;
+
+// Methods
+public:
+  ConfigFile (string filename,
+              string delimiter = "=",
+              string comment = "#",
+              string sentry = "EndConfigFile");
+  ConfigFile();
+
+  // Search for key and read value or optional default value
+  template<class T> T     read (const string& key) const;  // call as read<T>
+  template<class T> T     read (const string& key, const T& value) const;
+  template<class T> bool  readInto (T& var, const string& key) const;
+  template<class T> bool  readInto (T& var, const string& key, const T& value) const;
+
+  // Modify keys and values
+  template<class T> void  add (string key, const T& value);
+  void                    remove (const string& key);
+
+  // Check whether key exists in configuration
+  bool keyExists (const string& key) const;
+
+  // Check or change configuration syntax
+  string getDelimiter() const { return myDelimiter; }
+  string getComment() const { return myComment; }
+  string getSentry() const { return mySentry; }
+  string setDelimiter (const string& s)
+    { string old = myDelimiter;  myDelimiter = s;  return old; }
+  string setComment (const string& s)
+    { string old = myComment;  myComment = s;  return old; }
+
+  // Write or read configuration
+  friend std::ostream& operator<<(std::ostream& os, const ConfigFile& cf);
+  friend std::istream& operator>>(std::istream& is, ConfigFile& cf);
+
+protected:
+  template<class T> static string T_as_string (const T& t);
+  template<class T> static T      string_as_T (const string& s);
+  static void                     trim (string& s);
+
+
+// Exception types
+public:
+  struct file_not_found {
+    string filename;
+    file_not_found (const string& filename_ = string())
+      : filename(filename_) {} };
+  struct key_not_found {  // thrown only by T read(key) variant of read()
+    string key;
+    key_not_found (const string& key_ = string())
+      : key(key_) {} };
+};
+
+
+/* static */
+template<class T>
+string ConfigFile::T_as_string (const T& t)
+{
+  // Convert from a T to a string
+  // Type T must support << operator
+  std::ostringstream ost;
+
+  ost << t;
+  return ost.str();
+}
+
+
+/* static */
+template<class T>
+T ConfigFile::string_as_T (const string& s)
+{
+  // Convert from a string to a T
+  // Type T must support >> operator
+  T t;
+  std::istringstream ist (s);
+
+  ist >> t;
+  return t;
+}
+
+
+/* static */
+template<>
+inline string ConfigFile::string_as_T<string>(const string& s)
+{
+  // Convert from a string to a string
+  // In other words, do nothing
+  return s;
+}
+
+
+/* static */
+template<>
+inline bool ConfigFile::string_as_T<bool>(const string& s)
+{
+  // Convert from a string to a bool
+  // Interpret "false", "F", "no", "n", "0" as false
+  // Interpret "true", "T", "yes", "y", "1", "-1", or anything else as true
+  bool b = true;
+  string sup = s;
+
+  for (string::iterator p = sup.begin();  p != sup.end();  ++p)
+    *p = toupper (*p);  // make string all caps
+  if (    sup==string ("FALSE")  ||  sup==string ("F")
+      ||  sup==string ("NO")  ||  sup==string ("N")
+      ||  sup==string ("0")  ||  sup==string ("NONE"))
+    b = false;
+  return b;
+}
+
+
+template<class T>
+T ConfigFile::read (const string& key) const
+{
+  // Read the value corresponding to key
+  mapci p = myContents.find (key);
+  if (p == myContents.end()) throw key_not_found (key);
+  return string_as_T<T>(p->second);
+}
+
+
+template<class T>
+T ConfigFile::read (const string& key, const T& value) const
+{
+  // Return the value corresponding to key or given default value
+  // if key is not found
+  mapci p = myContents.find (key);
+  if (p == myContents.end()) return value;
+  return string_as_T<T>(p->second);
+}
+
+
+template<class T>
+bool ConfigFile::readInto (T& var, const string& key) const
+{
+  // Get the value corresponding to key and store in var
+  // Return true if key is found
+  // Otherwise leave var untouched
+  mapci p = myContents.find (key);
+  bool found = (p != myContents.end());
+
+  if (found) var = string_as_T<T>(p->second);
+  return found;
+}
+
+
+template<class T>
+bool ConfigFile::readInto (T& var, const string& key, const T& value) const
+{
+  // Get the value corresponding to key and store in var
+  // Return true if key is found
+  // Otherwise set var to given default
+  mapci p = myContents.find (key);
+  bool found = (p != myContents.end());
+
+  if (found)
+    var = string_as_T<T>(p->second);
+  else
+    var = value;
+  return found;
+}
+
+
+template<class T>
+void ConfigFile::add (string key, const T& value)
+{
+  // Add a key with given value
+  string v = T_as_string (value);
+
+  trim (key);
+  trim (v);
+  myContents[key] = v;
+  return;
+}
+
+#endif  // CONFIGFILE_H
+
+// Release notes:
+// v1.0  21 May 1999
+//   + First release
+//   + Template read() access only through non-member readConfigFile()
+//   + ConfigurationFileBool is only built-in helper class
+//
+// v2.0  3 May 2002
+//   + Shortened name from ConfigurationFile to ConfigFile
+//   + Implemented template member functions
+//   + Changed default comment separator from % to #
+//   + Enabled reading of multiple-line values
+//
+// v2.1  24 May 2004
+//   + Made template specializations inline to avoid compiler-dependent linkage
+//   + Allowed comments within multiple-line values
+//   + Enabled blank line termination for multiple-line values
+//   + Added optional sentry to detect end of configuration file
+//   + Rewrote messy trimWhitespace() function as elegant trim()
diff --git a/src/libprojectM/HungarianMethod.hpp b/src/libprojectM/HungarianMethod.hpp
index 4b6b93c..e68f5d8 100644
--- a/src/libprojectM/HungarianMethod.hpp
+++ b/src/libprojectM/HungarianMethod.hpp
@@ -1,11 +1,13 @@
 #ifndef HUNGARIAN_METHOD_HPP
 #define HUNGARIAN_METHOD_HPP
+//
 //#include "Common.hpp"
 #include <cstdlib>
 #include <cstdio>
 #include <cstring>
 #include <limits>
 
+
 /// A function object which calculates the maximum-weighted bipartite matching between
 /// two sets via the hungarian method.
 template <int N=20>
@@ -14,15 +16,15 @@
 static const int MAX_SIZE = N;
 
 private:
-int n, max_match;        //n workers and n jobs
-double lx[N], ly[N];        //labels of X and Y parts
-int xy[N];               //xy[x] - vertex that is matched with x,
-int yx[N];               //yx[y] - vertex that is matched with y
-bool S[N], T[N];         //sets S and T in algorithm
-double slack[N];            //as in the algorithm description
-double slackx[N];           //slackx[y] such a vertex, that
-                         // l(slackx[y]) + l(y) - w(slackx[y],y) = slack[y]
-int prev[N];             //array for memorizing alternating paths
+int     n, max_match;       // n workers and n jobs
+double  lx[N], ly[N];       // labels of X and Y parts
+int     xy[N];              // xy[x] - vertex that is matched with x,
+int     yx[N];              // yx[y] - vertex that is matched with y
+bool    S[N], T[N];         // sets S and T in algorithm
+double  slack[N];           // as in the algorithm description
+double  slackx[N];          // slackx[y] such a vertex, that
+                            //  l(slackx[y]) + l(y) - w(slackx[y],y) = slack[y]
+int     prev[N];            // array for memorizing alternating paths
 
 void init_labels(const double cost[N][N])
 {
@@ -56,7 +58,7 @@
         slack[y] = lx[root] + ly[y] - cost[root][y];
         slackx[y] = root;
     }
-   while (true)                                                        //main cycle
+    while (true)                                                        //main cycle
     {
         while (rd < wr)                                                 //building tree with bfs cycle
         {
@@ -174,7 +176,7 @@
 /// \param i the index of the ith element in the first set (passed in operator())
 /// \returns an index j, denoting the matched jth element of the 2nd set
 inline int matching(int i) const {
-	return xy[i];
+  return xy[i];
 }
 
 
@@ -183,7 +185,7 @@
 /// \returns an index i, denoting the matched ith element of the 1st set
 /// \note inverseMatching(matching(i)) == i
 inline int inverseMatching(int j) const {
-	return yx[j];
+  return yx[j];
 }
 
 };
diff --git a/src/libprojectM/KeyHandler.cpp b/src/libprojectM/KeyHandler.cpp
index 3661f2b..5ff80a4 100644
--- a/src/libprojectM/KeyHandler.cpp
+++ b/src/libprojectM/KeyHandler.cpp
@@ -18,7 +18,6 @@
  * See 'LICENSE.txt' included within this release
  *
  */
-
 #include <stdio.h>
 
 #include "Common.hpp"
@@ -34,17 +33,19 @@
 #include "TimeKeeper.hpp"
 
 
+void selectRandom (const bool hardCut);
+void selectNext (const bool hardCut);
+void selectPrevious (const bool hardCut);
+
+
 class Preset;
 interface_t current_interface = DEFAULT_INTERFACE;
 
-void selectRandom(const bool hardCut);
-void selectNext(const bool hardCut);
-void selectPrevious(const bool hardCut);
 
-void refreshConsole() {
-
+void
+refreshConsole ()
+{
   switch (current_interface) {
-
   case MENU_INTERFACE:
     // unimplemented
     break;
@@ -62,192 +63,223 @@
   default:
     break;
   }
-
 }
 
-void projectM::key_handler( projectMEvent event,
-                            projectMKeycode keycode, projectMModifier modifier ) {
+void
+projectM::key_handler (
+projectMEvent     event,
+projectMKeycode   keycode,
+projectMModifier  modifier
+)
+{
+  switch (event) {
+  case PROJECTM_KEYDOWN:
 
-	switch( event ) {
+    //default_key_handler ();
+    switch (current_interface) {
+    case MENU_INTERFACE:
+//    menu_key_handler (this, event, keycode);
+      break;
 
+    case SHELL_INTERFACE:
+//    shell_key_handler ();
+      break;
 
-	case PROJECTM_KEYDOWN:
+    case EDITOR_INTERFACE:
+//    editor_key_handler (event,keycode);
+      break;
 
-	  //default_key_handler();
-	  switch (current_interface)
-	    {
+    case BROWSER_INTERFACE:
+//    browser_key_handler (event,keycode,modifier);
+      break;
 
-	    case MENU_INTERFACE:
-//	      menu_key_handler(this, event, keycode);
-	      break;
-	    case SHELL_INTERFACE:
-	      //shell_key_handler();
-	      break;
-	    case EDITOR_INTERFACE:
-//	      editor_key_handler(event,keycode);
-	      break;
-	    case BROWSER_INTERFACE:
-//	      browser_key_handler(event,keycode,modifier);
-	      break;
-	    case DEFAULT_INTERFACE:
-	      default_key_handler(event,keycode);
-	      break;
-	    default:
-	      default_key_handler(event,keycode);
-	      break;
+    case DEFAULT_INTERFACE:
+      default_key_handler (event, keycode);
+      break;
 
-	    }
-	  break;
-	default:
-		break;
+    default:
+      default_key_handler (event, keycode);
+      break;
+    }
+    break;
 
-	}
+  default:
+    break;
+  }
 }
 
-void projectM::default_key_handler( projectMEvent event, projectMKeycode keycode) {
+void
+projectM::default_key_handler (projectMEvent event, projectMKeycode keycode)
+{
+  switch (event) {
 
-	switch( event ) {
+  case PROJECTM_KEYDOWN:
 
-	case PROJECTM_KEYDOWN:
+    switch (keycode) {
+    case PROJECTM_K_UP:
+      beatDetect->beat_sensitivity += 0.25;
+      if (beatDetect->beat_sensitivity > 5.0) beatDetect->beat_sensitivity = 5.0;
+      break;
 
-	  switch( keycode )
-	    {
-	    case PROJECTM_K_UP:
-            beatDetect->beat_sensitivity += 0.25;
-			if (beatDetect->beat_sensitivity > 5.0) beatDetect->beat_sensitivity = 5.0;
-	      break;
-	    case PROJECTM_K_DOWN:
-            beatDetect->beat_sensitivity -= 0.25;
-			if (beatDetect->beat_sensitivity < 0) beatDetect->beat_sensitivity = 0;
-	      break;
-		case PROJECTM_K_h:
- 		  renderer->showhelp = !renderer->showhelp;
-	      renderer->showstats= false;
-	      renderer->showfps=false;
-	    case PROJECTM_K_F1:
-	      renderer->showhelp = !renderer->showhelp;
-	      renderer->showstats=false;
-	      renderer->showfps=false;
-	      break;
-	    case PROJECTM_K_y:
-		this->setShuffleEnabled(!this->isShuffleEnabled());
-		 break;
+    case PROJECTM_K_DOWN:
+      beatDetect->beat_sensitivity -= 0.25;
+      if (beatDetect->beat_sensitivity < 0) beatDetect->beat_sensitivity = 0;
+      break;
 
-	    case PROJECTM_K_F5:
-	      if (!renderer->showhelp)
-		      renderer->showfps = !renderer->showfps;
-	      break;
-	    case PROJECTM_K_F4:
-		if (!renderer->showhelp)
-	       		renderer->showstats = !renderer->showstats;
-	      break;
-	    case PROJECTM_K_F3: {
-	      renderer->showpreset = !renderer->showpreset;
-	      break;
-	     }
-	    case PROJECTM_K_F2:
-	      renderer->showtitle = !renderer->showtitle;
-	      break;
+    case PROJECTM_K_h:
+      renderer->showhelp  = !renderer->showhelp;
+      renderer->showstats = false;
+      renderer->showfps   = false;
+      /*  FIXME: should be 'break' here or folded into following case.  */
+
+    case PROJECTM_K_F1:
+      renderer->showhelp  = !renderer->showhelp;
+      renderer->showstats = false;
+      renderer->showfps   = false;
+      break;
+
+    case PROJECTM_K_y:
+      this->setShuffleEnabled (!this->isShuffleEnabled());
+      break;
+
+    case PROJECTM_K_F5:
+      if (!renderer->showhelp)
+        renderer->showfps = !renderer->showfps;
+      break;
+
+    case PROJECTM_K_F4:
+      if (!renderer->showhelp)
+        renderer->showstats = !renderer->showstats;
+      break;
+
+    case PROJECTM_K_F3:
+     {
+      renderer->showpreset = !renderer->showpreset;
+      break;
+     }
+
+    case PROJECTM_K_F2:
+      renderer->showtitle = !renderer->showtitle;
+      break;
 #ifndef MACOS
-	    case PROJECTM_K_F9:
+    case PROJECTM_K_F9:
 #else
-        case PROJECTM_K_F8:
+    case PROJECTM_K_F8:
 #endif
 
-	      renderer->studio = !renderer->studio;
-	      break;
+      renderer->studio = !renderer->studio;
+      break;
 
-	    case PROJECTM_K_ESCAPE: {
-//	        exit( 1 );
-	        break;
-	      }
-	    case PROJECTM_K_f:
+    case PROJECTM_K_ESCAPE:
+     {
+      //          exit (1);
+      break;
+     }
 
-	      break;
-	    case PROJECTM_K_a:
-		    renderer->correction = !renderer->correction;
-	        break;
-	    case PROJECTM_K_b:
-	      break;
-            case PROJECTM_K_n:
-		selectNext(true);
-	      break;
-            case PROJECTM_K_N:
-		selectNext(false);
-	      break;
-	    case PROJECTM_K_r:
-		selectRandom(true);
-		break;
-	    case PROJECTM_K_R:
-		selectRandom(false);
-		break;
-	    case PROJECTM_K_p:
-	      selectPrevious(true);
-	      break;
-	    case PROJECTM_K_P:
-	      selectPrevious(false);
-	      break;
-	    case PROJECTM_K_l:
-		renderer->noSwitch=!renderer->noSwitch;
-	      break;
-	    case PROJECTM_K_s:
-            	renderer->studio = !renderer->studio;
-	    case PROJECTM_K_i:
-	        break;
-	    case PROJECTM_K_z:
-	      break;
-	    case PROJECTM_K_0:
-//	      nWaveMode=0;
-	      break;
-	    case PROJECTM_K_6:
-//	      nWaveMode=6;
-	      break;
-	    case PROJECTM_K_7:
-//	      nWaveMode=7;
-	      break;
-	    case PROJECTM_K_m:
-	      break;
-	    case PROJECTM_K_t:
-	      break;
-	    case PROJECTM_K_EQUALS:
-	    case PROJECTM_K_PLUS:
+    case PROJECTM_K_f:
+      break;
 
-	    	unsigned int index;
+    case PROJECTM_K_a:
+      renderer->correction = !renderer->correction;
+      break;
 
-	    	if (selectedPresetIndex(index)) {
+    case PROJECTM_K_b:
+      break;
 
-	    		const int oldRating = getPresetRating(index, HARD_CUT_RATING_TYPE);
+    case PROJECTM_K_n:
+      selectNext (true);
+      break;
 
-	    		if (oldRating >= 6)
-	    			  break;
+    case PROJECTM_K_N:
+      selectNext (false);
+      break;
 
-	    		const int rating = oldRating + 1;
+    case PROJECTM_K_r:
+      selectRandom (true);
+      break;
 
-	    		changePresetRating(index, rating, HARD_CUT_RATING_TYPE);
-	    	}
+    case PROJECTM_K_R:
+      selectRandom (false);
+      break;
 
-	    	break;
+    case PROJECTM_K_p:
+      selectPrevious (true);
+      break;
 
-	    case PROJECTM_K_MINUS:
-	    	if (selectedPresetIndex(index)) {
+    case PROJECTM_K_P:
+      selectPrevious (false);
+      break;
 
-	    		const int oldRating = getPresetRating(index, HARD_CUT_RATING_TYPE);
+    case PROJECTM_K_l:
+      renderer->noSwitch=!renderer->noSwitch;
+      break;
 
-	    		if (oldRating <= 1)
-	    			  break;
+    case PROJECTM_K_s:
+      renderer->studio = !renderer->studio;
 
-	    		const int rating = oldRating - 1;
+    case PROJECTM_K_i:
+      break;
 
-	    		changePresetRating(index, rating, HARD_CUT_RATING_TYPE);
-	    	}
-	    	break;
+    case PROJECTM_K_z:
+      break;
 
-	    default:
-	      break;
-	    }
-	default:
-		break;
+    case PROJECTM_K_0:
+      //        nWaveMode=0;
+      break;
 
-	}
+    case PROJECTM_K_6:
+      //        nWaveMode=6;
+      break;
+
+    case PROJECTM_K_7:
+      //        nWaveMode=7;
+      break;
+
+    case PROJECTM_K_m:
+      break;
+
+    case PROJECTM_K_t:
+      break;
+
+    case PROJECTM_K_EQUALS:
+    case PROJECTM_K_PLUS:
+     {
+      unsigned int index;
+
+      if (selectedPresetIndex (index)) {
+        const int oldRating = getPresetRating (index, HARD_CUT_RATING_TYPE);
+
+        if (oldRating >= 6)
+          break;
+
+        const int rating = oldRating + 1;
+
+        changePresetRating (index, rating, HARD_CUT_RATING_TYPE);
+      }
+      break;
+     }
+
+    case PROJECTM_K_MINUS:
+     {
+      unsigned int index;
+
+      if (selectedPresetIndex (index)) {
+        const int oldRating = getPresetRating (index, HARD_CUT_RATING_TYPE);
+
+        if (oldRating <= 1)
+          break;
+
+        const int rating = oldRating - 1;
+
+        changePresetRating (index, rating, HARD_CUT_RATING_TYPE);
+      }
+      break;
+     }
+
+    default:
+      break;
+    }
+  default:
+    break;
+  }
 }
-
diff --git a/src/libprojectM/KeyHandler.hpp b/src/libprojectM/KeyHandler.hpp
index b9a7563..7143e56 100644
--- a/src/libprojectM/KeyHandler.hpp
+++ b/src/libprojectM/KeyHandler.hpp
@@ -1,39 +1,39 @@
-/**
- * projectM -- Milkdrop-esque visualisation SDK
- * Copyright (C)2003-2007 projectM Team
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- * See 'LICENSE.txt' included within this release
- *
- */
-/**
- * $Id: console_interface.h,v 1.1.1.1 2005/12/23 18:05:03 psperl Exp $
- *
- * $Log$
- */
-
-#ifndef _KEY_HANDLER_HPP
-#define _KEY_HANDLER_HPP
-
-#include "event.h"
-class projectM;
-void default_key_handler(projectM *PM, projectMEvent event, projectMKeycode keycode);
-void refreshConsole();
-#if defined(__CPLUSPLUS) && !defined(MACOS)
-extern "C" void key_handler(projectM *PM, projectMEvent event, projectMKeycode keycode, projectMModifier modifier );
-#else
-extern void key_handler(projectM *PM, projectMEvent event, projectMKeycode keycode, projectMModifier modifier );
-#endif
-#endif /** !_KEY_HANDLER_HPP */
+/**
+ * projectM -- Milkdrop-esque visualisation SDK
+ * Copyright (C)2003-2007 projectM Team
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ * See 'LICENSE.txt' included within this release
+ *
+ */
+/**
+ * $Id: console_interface.h,v 1.1.1.1 2005/12/23 18:05:03 psperl Exp $
+ *
+ * $Log$
+ */
+
+#ifndef _KEY_HANDLER_HPP
+#define _KEY_HANDLER_HPP
+
+#include "event.h"
+class projectM;
+void default_key_handler(projectM *PM, projectMEvent event, projectMKeycode keycode);
+void refreshConsole();
+#if defined(__CPLUSPLUS) && !defined(MACOS)
+extern "C" void key_handler(projectM *PM, projectMEvent event, projectMKeycode keycode, projectMModifier modifier );
+#else
+extern void key_handler(projectM *PM, projectMEvent event, projectMKeycode keycode, projectMModifier modifier );
+#endif
+#endif /** !_KEY_HANDLER_HPP */
diff --git a/src/libprojectM/MilkdropPresetFactory/BuiltinFuncs.cpp b/src/libprojectM/MilkdropPresetFactory/BuiltinFuncs.cpp
index 1063fd9..a539154 100644
--- a/src/libprojectM/MilkdropPresetFactory/BuiltinFuncs.cpp
+++ b/src/libprojectM/MilkdropPresetFactory/BuiltinFuncs.cpp
@@ -1,8 +1,8 @@
 //
 // C++ Implementation: BuiltinFuncs
 //
-// Description: 
-//  
+// Description:
+//
 //
 // Author: Carmelo Piccione <carmelo.piccione@gmail.com>, (C) 2007
 //
@@ -19,97 +19,104 @@
 #include <iostream>
 #include "fatal.h"
 
+
 std::map<std::string, Func*> BuiltinFuncs::builtin_func_tree;
 
-int BuiltinFuncs::load_builtin_func(const std::string & name, float (*func_ptr)(float*), int num_args) {
-	
-  Func * func; 
-  int retval; 
+
+int
+BuiltinFuncs::load_builtin_func (
+const std::string & name,
+float             (*func_ptr)(float*),
+int               num_args
+)
+{
+  Func * func;
+  int retval;
 
   /* Create new function */
-  func = new Func(name, func_ptr, num_args);
+  func = new Func (name, func_ptr, num_args);
 
   if (func == 0)
     return PROJECTM_OUTOFMEM_ERROR;
 
-  retval = insert_func( func );
+  retval = insert_func (func);
 
   return retval;
-
 }
 
-Func * BuiltinFuncs::find_func(const std::string & name) {
-
-  std::map<std::string, Func*>::iterator pos = builtin_func_tree.find(name);
+Func *
+BuiltinFuncs::find_func (const std::string & name)
+{
+  std::map<std::string, Func*>::iterator pos = builtin_func_tree.find (name);
 
   // Case: function not found, return null
   if (pos == builtin_func_tree.end())
-	return 0;
+  return 0;
 
   // Case: function found, return a pointer to it
   return pos->second;
-
 }
 
-int BuiltinFuncs::load_all_builtin_func() {
-
-  if (load_builtin_func("int", FuncWrappers::int_wrapper, 1) < 0)
+int
+BuiltinFuncs::load_all_builtin_func()
+{
+  if (load_builtin_func ("int", FuncWrappers::int_wrapper, 1) < 0)
     return PROJECTM_ERROR;
-  if (load_builtin_func("abs", FuncWrappers::abs_wrapper, 1) < 0)
+  if (load_builtin_func ("abs", FuncWrappers::abs_wrapper, 1) < 0)
     return PROJECTM_ERROR;
-  if (load_builtin_func("sin", FuncWrappers::sin_wrapper, 1) < 0)
+  if (load_builtin_func ("sin", FuncWrappers::sin_wrapper, 1) < 0)
     return PROJECTM_ERROR;
-  if (load_builtin_func("cos", FuncWrappers::cos_wrapper, 1) < 0)
+  if (load_builtin_func ("cos", FuncWrappers::cos_wrapper, 1) < 0)
     return PROJECTM_ERROR;
-  if (load_builtin_func("tan", FuncWrappers::tan_wrapper, 1) < 0)
+  if (load_builtin_func ("tan", FuncWrappers::tan_wrapper, 1) < 0)
     return PROJECTM_ERROR;
-  if (load_builtin_func("asin", FuncWrappers::asin_wrapper, 1) < 0)
+  if (load_builtin_func ("asin", FuncWrappers::asin_wrapper, 1) < 0)
     return PROJECTM_ERROR;
-  if (load_builtin_func("acos", FuncWrappers::acos_wrapper, 1) < 0)
+  if (load_builtin_func ("acos", FuncWrappers::acos_wrapper, 1) < 0)
     return PROJECTM_ERROR;
-  if (load_builtin_func("atan", FuncWrappers::atan_wrapper, 1) < 0)
+  if (load_builtin_func ("atan", FuncWrappers::atan_wrapper, 1) < 0)
     return PROJECTM_ERROR;
-  if (load_builtin_func("sqr", FuncWrappers::sqr_wrapper, 1) < 0)
+  if (load_builtin_func ("sqr", FuncWrappers::sqr_wrapper, 1) < 0)
     return PROJECTM_ERROR;
-  if (load_builtin_func("sqrt", FuncWrappers::sqrt_wrapper, 1) < 0)
+  if (load_builtin_func ("sqrt", FuncWrappers::sqrt_wrapper, 1) < 0)
     return PROJECTM_ERROR;
-  if (load_builtin_func("pow", FuncWrappers::pow_wrapper, 2) < 0)
+  if (load_builtin_func ("pow", FuncWrappers::pow_wrapper, 2) < 0)
     return PROJECTM_ERROR;
-  if (load_builtin_func("exp", FuncWrappers::exp_wrapper, 1) < 0)
+  if (load_builtin_func ("exp", FuncWrappers::exp_wrapper, 1) < 0)
     return PROJECTM_ERROR;
-  if (load_builtin_func("log", FuncWrappers::log_wrapper, 1) < 0)
+  if (load_builtin_func ("log", FuncWrappers::log_wrapper, 1) < 0)
     return PROJECTM_ERROR;
-  if (load_builtin_func("log10", FuncWrappers::log10_wrapper, 1) < 0)
+  if (load_builtin_func ("log10", FuncWrappers::log10_wrapper, 1) < 0)
     return PROJECTM_ERROR;
-  if (load_builtin_func("sign", FuncWrappers::sign_wrapper, 1) < 0)
+  if (load_builtin_func ("sign", FuncWrappers::sign_wrapper, 1) < 0)
     return PROJECTM_ERROR;
-  if (load_builtin_func("min", FuncWrappers::min_wrapper, 2) < 0)
+  if (load_builtin_func ("min", FuncWrappers::min_wrapper, 2) < 0)
     return PROJECTM_ERROR;
-  if (load_builtin_func("max", FuncWrappers::max_wrapper, 2) < 0)
+  if (load_builtin_func ("max", FuncWrappers::max_wrapper, 2) < 0)
     return PROJECTM_ERROR;
-  if (load_builtin_func("sigmoid", FuncWrappers::sigmoid_wrapper, 2) < 0)
+  if (load_builtin_func ("sigmoid", FuncWrappers::sigmoid_wrapper, 2) < 0)
     return PROJECTM_ERROR;
-  if (load_builtin_func("atan2", FuncWrappers::atan2_wrapper, 2) < 0)
+  if (load_builtin_func ("atan2", FuncWrappers::atan2_wrapper, 2) < 0)
     return PROJECTM_ERROR;
-  if (load_builtin_func("rand", FuncWrappers::rand_wrapper, 1) < 0)
+  if (load_builtin_func ("rand", FuncWrappers::rand_wrapper, 1) < 0)
     return PROJECTM_ERROR;
-  if (load_builtin_func("band", FuncWrappers::band_wrapper, 2) < 0)
+  if (load_builtin_func ("band", FuncWrappers::band_wrapper, 2) < 0)
     return PROJECTM_ERROR;
-  if (load_builtin_func("bor", FuncWrappers::bor_wrapper, 2) < 0)
+  if (load_builtin_func ("bor", FuncWrappers::bor_wrapper, 2) < 0)
     return PROJECTM_ERROR;
-  if (load_builtin_func("bnot", FuncWrappers::bnot_wrapper, 1) < 0)
+  if (load_builtin_func ("bnot", FuncWrappers::bnot_wrapper, 1) < 0)
     return PROJECTM_ERROR;
-  if (load_builtin_func("if", FuncWrappers::if_wrapper, 3) < 0)
+  if (load_builtin_func ("if", FuncWrappers::if_wrapper, 3) < 0)
     return PROJECTM_ERROR;
-  if (load_builtin_func("equal", FuncWrappers::equal_wrapper, 2) < 0)
+  if (load_builtin_func ("equal", FuncWrappers::equal_wrapper, 2) < 0)
     return PROJECTM_ERROR;
-  if (load_builtin_func("above", FuncWrappers::above_wrapper, 2) < 0)
+  if (load_builtin_func ("above", FuncWrappers::above_wrapper, 2) < 0)
     return PROJECTM_ERROR;
-  if (load_builtin_func("below", FuncWrappers::below_wrapper, 2) < 0)
+  if (load_builtin_func ("below", FuncWrappers::below_wrapper, 2) < 0)
     return PROJECTM_ERROR;
-  if (load_builtin_func("nchoosek", FuncWrappers::nchoosek_wrapper, 2) < 0)
+  if (load_builtin_func ("nchoosek", FuncWrappers::nchoosek_wrapper, 2) < 0)
     return PROJECTM_ERROR;
-  if (load_builtin_func("fact", FuncWrappers::fact_wrapper, 1) < 0)
+  if (load_builtin_func ("fact", FuncWrappers::fact_wrapper, 1) < 0)
     return PROJECTM_ERROR;
 
   return PROJECTM_SUCCESS;
@@ -119,14 +126,16 @@
 
 /* Initialize the builtin function database.
    Should only be necessary once */
-int BuiltinFuncs::init_builtin_func_db() {
+int
+BuiltinFuncs::init_builtin_func_db()
+{
   int retval;
 
   if (initialized) {
     return 0;
   } else
     initialized = true;
-  
+
   retval = load_all_builtin_func();
   return retval;
 }
@@ -135,40 +144,40 @@
 
 /* Destroy the builtin function database.
    Generally, do this on projectm exit */
-int BuiltinFuncs::destroy_builtin_func_db() {
+int
+BuiltinFuncs::destroy_builtin_func_db()
+{
+  traverse<TraverseFunctors::Delete<Func> >(builtin_func_tree);
 
-traverse<TraverseFunctors::Delete<Func> >(builtin_func_tree);
-
-builtin_func_tree.clear();
-initialized = false;
-return PROJECTM_SUCCESS;
+  builtin_func_tree.clear();
+  initialized = false;
+  return PROJECTM_SUCCESS;
 }
 
 /* Insert a function into the database */
-int BuiltinFuncs::insert_func( Func *func ) {
+int
+BuiltinFuncs::insert_func (Func *func)
+{
+  assert (func);
 
-  assert(func);
-  
   if (func == 0) {
-      std::cerr << "Received a null function object, ignoring...." << std::endl;
-      return PROJECTM_ERROR;
+    std::cerr << "Received a null function object, ignoring...." << std::endl;
+    return PROJECTM_ERROR;
   }
-  
+
 //   //std::cout << "inserting function " << func->getName() << std::endl;
-  
-  const std::pair<std::string, Func*> pair = std::make_pair(std::string(func->getName()), func);
-  
-  assert(pair.second);
-  
+
+  const std::pair<std::string, Func*> pair = std::make_pair (std::string (func->getName()), func);
+
+  assert (pair.second);
+
   const std::pair<std::map<std::string, Func*>::iterator, bool> inserteePair =
-  	builtin_func_tree.insert(pair);
-  	
+    builtin_func_tree.insert (pair);
+
   if (!inserteePair.second) {
-	std::cerr << "Failed to insert builtin function \"" << func->getName() << "\" into collection! Bailing..." << std::endl;
-	abort();
+    std::cerr << "Failed to insert builtin function \"" << func->getName() << "\" into collection! Bailing..." << std::endl;
+    abort();
   }
 
   return PROJECTM_SUCCESS;
 }
-
-
diff --git a/src/libprojectM/MilkdropPresetFactory/BuiltinFuncs.hpp b/src/libprojectM/MilkdropPresetFactory/BuiltinFuncs.hpp
index 8b1e7e2..777eb5c 100644
--- a/src/libprojectM/MilkdropPresetFactory/BuiltinFuncs.hpp
+++ b/src/libprojectM/MilkdropPresetFactory/BuiltinFuncs.hpp
@@ -21,6 +21,7 @@
 
 #include "RandomNumberGenerators.hpp"
 
+
 /* Wrappers for all the builtin functions
    The arg_list pointer is a list of floats. Its
    size is equal to the number of arguments the parameter
@@ -33,203 +34,252 @@
 
 public:
 
-static inline float int_wrapper(float * arg_list) {
-
-return floor(arg_list[0]);
-
-}
-
-
-static inline float sqr_wrapper(float * arg_list) {
-	return pow(arg_list[0], 2);
-}
-
-
-static inline float sigmoid_wrapper(float * arg_list)
+static inline float
+int_wrapper(float * arg_list)
 {
-	const double t = (1+exp(-arg_list[0]*arg_list[1]));
-	return (fabs(t) > 0.00001) ? 1.0/t : 0;
-}
-
-static inline float sign_wrapper(float * arg_list) {
-
-return -arg_list[0];
-}
-
-static inline float min_wrapper(float * arg_list) {
-
-if (arg_list[0] > arg_list[1])
-return arg_list[1];
-
-return arg_list[0];
-}
-
-static inline float max_wrapper(float * arg_list) {
-
-if (arg_list[0] > arg_list[1])
-return arg_list[0];
-
-return arg_list[1];
+  return floor(arg_list[0]);
 }
 
 
-static inline float bor_wrapper(float * arg_list) {
-
-return (float)((int)arg_list[0] || (int)arg_list[1]);
-}
-
-static inline float band_wrapper(float * arg_list) {
-return (float)((int)arg_list[0] && (int)arg_list[1]);
-}
-
-static inline float bnot_wrapper(float * arg_list) {
-return (float)(!(int)arg_list[0]);
-}
-
-static inline float if_wrapper(float * arg_list) {
-
-if ((int)arg_list[0] == 0)
-return arg_list[2];
-return arg_list[1];
+static inline float
+sqr_wrapper(float * arg_list)
+{
+  return pow(arg_list[0], 2);
 }
 
 
-static inline float rand_wrapper(float * arg_list) {
-float l=1;
-
-//  printf("RAND ARG:(%d)\n", (int)arg_list[0]);
-if ((int)arg_list[0] > 0)
-	l  = (float) RandomNumberGenerators::uniformInteger((int)arg_list[0]);
-
-return l;
+static inline float
+sigmoid_wrapper(float * arg_list)
+{
+  const double t = (1+exp(-arg_list[0]*arg_list[1]));
+  return (fabs(t) > 0.00001) ? 1.0/t : 0;
 }
 
-static inline float equal_wrapper(float * arg_list) {
-	return (arg_list[0] == arg_list[1]);
+static inline float
+sign_wrapper(float * arg_list)
+{
+  return -arg_list[0];
+}
+
+static inline float
+min_wrapper(float * arg_list)
+{
+  if (arg_list[0] > arg_list[1])
+    return arg_list[1];
+
+  return arg_list[0];
+}
+
+static inline float
+max_wrapper(float * arg_list)
+{
+  if (arg_list[0] > arg_list[1])
+    return arg_list[0];
+
+  return arg_list[1];
 }
 
 
-static inline float above_wrapper(float * arg_list) {
+static inline float
+bor_wrapper(float * arg_list)
+{
+  return (float)((int)arg_list[0] || (int)arg_list[1]);
+}
 
-return (arg_list[0] > arg_list[1]);
+static inline float
+band_wrapper(float * arg_list)
+{
+  return (float)((int)arg_list[0] && (int)arg_list[1]);
+}
+
+static inline float
+bnot_wrapper(float * arg_list)
+{
+  return (float)(!(int)arg_list[0]);
+}
+
+static inline float
+if_wrapper(float * arg_list)
+{
+  if ((int)arg_list[0] == 0)
+    return arg_list[2];
+  return arg_list[1];
 }
 
 
-static inline float below_wrapper(float * arg_list) {
+static inline float
+rand_wrapper(float * arg_list)
+{
+  float l=1;
 
-return (arg_list[0] < arg_list[1]);
+  //  printf("RAND ARG:(%d)\n", (int)arg_list[0]);
+  if ((int)arg_list[0] > 0)
+    l  = (float) RandomNumberGenerators::uniformInteger((int)arg_list[0]);
+
+  return l;
 }
 
-static float sin_wrapper(float * arg_list) {
+static inline float
+equal_wrapper(float * arg_list)
+{
+  return (arg_list[0] == arg_list[1]);
+}
 
+
+static inline float
+above_wrapper(float * arg_list)
+{
+  return (arg_list[0] > arg_list[1]);
+}
+
+
+static inline float
+below_wrapper(float * arg_list)
+{
+  return (arg_list[0] < arg_list[1]);
+}
+
+static float
+sin_wrapper(float * arg_list)
+{
   assert(arg_list);
-//return .5;
-float d = sinf(*arg_list);
-return d;
-//return (sin (arg_list[0]));
+  //return .5;
+  float d = sinf(*arg_list);
+  return d;
+  //return (sin (arg_list[0]));
 }
 
 
-static inline float cos_wrapper(float * arg_list) {
-return (cos (arg_list[0]));
-}
-
-static inline float tan_wrapper(float * arg_list) {
-return (tan(arg_list[0]));
-}
-
-static inline float asin_wrapper(float * arg_list) {
-return (asin (arg_list[0]));
-}
-
-static inline float acos_wrapper(float * arg_list) {
-return (acos (arg_list[0]));
-}
-
-static inline float atan_wrapper(float * arg_list) {
-return (atan (arg_list[0]));
-}
-
-static inline float atan2_wrapper(float * arg_list) {
-return (atan2 (arg_list[0], arg_list[1]));
-}
-
-static inline float pow_wrapper(float * arg_list) {
-return (pow (arg_list[0], arg_list[1]));
-}
-
-static inline float exp_wrapper(float * arg_list) {
-return (exp(arg_list[0]));
-}
-
-static inline float abs_wrapper(float * arg_list) {
-return (fabs(arg_list[0]));
-}
-
-static inline float log_wrapper(float* arg_list) {
-return (log (arg_list[0]));
-}
-
-static inline float log10_wrapper(float * arg_list) {
-return (log10 (arg_list[0]));
-}
-
-static inline float sqrt_wrapper(float * arg_list) {
-return (sqrt (arg_list[0]));
-}
-
-
-static inline float nchoosek_wrapper(float * arg_list) {
-unsigned long cnm = 1UL;
-int i, f;
-int n, m;
-
-n = (int)arg_list[0];
-m = (int)arg_list[1];
-
-if (m*2 >n) m = n-m;
-for (i=1 ; i <= m; n--, i++)
+static inline float
+cos_wrapper(float * arg_list)
 {
-if ((f=n) % i == 0)
-f   /= i;
-else  cnm /= i;
-cnm *= f;
+  return (cos (arg_list[0]));
 }
-return (float)cnm;
+
+static inline float
+tan_wrapper(float * arg_list)
+{
+  return (tan(arg_list[0]));
+}
+
+static inline float
+asin_wrapper(float * arg_list)
+{
+  return (asin (arg_list[0]));
+}
+
+static inline float
+acos_wrapper(float * arg_list)
+{
+  return (acos (arg_list[0]));
+}
+
+static inline float
+atan_wrapper(float * arg_list)
+{
+  return (atan (arg_list[0]));
+}
+
+static inline float
+atan2_wrapper(float * arg_list)
+{
+  return (atan2 (arg_list[0], arg_list[1]));
+}
+
+static inline float
+pow_wrapper(float * arg_list)
+{
+  return (pow (arg_list[0], arg_list[1]));
+}
+
+static inline float
+exp_wrapper(float * arg_list)
+{
+  return (exp(arg_list[0]));
+}
+
+static inline float
+abs_wrapper(float * arg_list)
+{
+  return (fabs(arg_list[0]));
+}
+
+static inline float
+log_wrapper(float* arg_list)
+{
+  return (log (arg_list[0]));
+}
+
+static inline float
+log10_wrapper(float * arg_list)
+{
+  return (log10 (arg_list[0]));
+}
+
+static inline float
+sqrt_wrapper(float * arg_list)
+{
+  return (sqrt (arg_list[0]));
 }
 
 
-static inline float fact_wrapper(float * arg_list) {
+static inline float
+nchoosek_wrapper(float * arg_list)
+{
+  unsigned long cnm = 1UL;
+  int           i, f;
+  int           n, m;
 
+  n = (int)arg_list[0];
+  m = (int)arg_list[1];
 
-int result = 1;
-
-int n = (int)arg_list[0];
-
-while (n > 1) {
-result = result * n;
-n--;
+  if (m * 2 > n)
+    m = n - m;
+  for (i = 1;  i <= m;  n--, i++)
+  {
+    if ((f = n) % i == 0)
+      f   /= i;
+    else
+      cnm /= i;
+    cnm *= f;
+  }
+  return (float)cnm;
 }
-return (float)result;
+
+
+static inline float
+fact_wrapper(float * arg_list)
+{
+  int result = 1;
+
+  int n = (int)arg_list[0];
+
+  while (n > 1) {
+    result = result * n;
+    n--;
+  }
+  return (float)result;
 }
-};
+
+};  /*  class FuncWrappers  */
 
 #include <map>
+
+
 class BuiltinFuncs {
-
 public:
-    
-    static int init_builtin_func_db();
-    static int destroy_builtin_func_db();
-    static int load_all_builtin_func();
-    static int load_builtin_func( const std::string & name, float (*func_ptr)(float*), int num_args );
+  static int  init_builtin_func_db();
+  static int  destroy_builtin_func_db();
+  static int  load_all_builtin_func();
+  static int  load_builtin_func( const std::string & name, float (*func_ptr)(float*), int num_args );
 
-    static int insert_func( Func *func );
-    static int remove_func( Func *func );
-    static Func *find_func( const std::string & name );
+  static int  insert_func( Func *func );
+  static int  remove_func( Func *func );
+  static Func *find_func( const std::string & name );
+
 private:
-     static std::map<std::string, Func*> builtin_func_tree;
-     static volatile bool initialized;
+  static std::map<std::string, Func*> builtin_func_tree;
+  static volatile bool                initialized;
 };
 
 #endif
diff --git a/src/libprojectM/MilkdropPresetFactory/BuiltinParams.cpp b/src/libprojectM/MilkdropPresetFactory/BuiltinParams.cpp
index e33149b..880caa7 100644
--- a/src/libprojectM/MilkdropPresetFactory/BuiltinParams.cpp
+++ b/src/libprojectM/MilkdropPresetFactory/BuiltinParams.cpp
@@ -1,4 +1,3 @@
-
 #include "fatal.h"
 #include "BuiltinParams.hpp"
 #include <cassert>
@@ -9,18 +8,18 @@
 #include <stdio.h>
 #include "Common.hpp"
 
+
 BuiltinParams::BuiltinParams() {}
 
 BuiltinParams::BuiltinParams(PresetInputs & presetInputs, PresetOutputs & presetOutputs)
 {
-
   presetInputs.Initialize(presetOutputs.gx, presetOutputs.gy);
 
   int ret;
   if ((ret = init_builtin_param_db(presetInputs, presetOutputs)) != PROJECTM_SUCCESS)
   {
-	std::cout << "failed to allocate builtin parameter database with error " << ret << std::endl;;
-        throw ret;
+    std::cout << "failed to allocate builtin parameter database with error " << ret << std::endl;;
+    throw ret;
   }
 
 }
@@ -31,12 +30,20 @@
 }
 
 /* Loads a float parameter into the builtin database */
-int BuiltinParams::load_builtin_param_float(const std::string & name, void * engine_val, void * matrix, short int flags,
-    float init_val, float upper_bound, float lower_bound, const std::string & alt_name)
+int
+BuiltinParams::load_builtin_param_float (
+const std::string & name,
+void              * engine_val,
+void              * matrix,
+short int         flags,
+float             init_val,
+float             upper_bound,
+float             lower_bound,
+const std::string & alt_name
+)
 {
-
-  Param * param = NULL;
-  CValue iv, ub, lb;
+  Param   * param = NULL;
+  CValue  iv, ub, lb;
 
   iv.float_val = init_val;
   ub.float_val = upper_bound;
@@ -49,8 +56,9 @@
     fflush(stdout);
   }
 
-std::string lowerName(name);
-std::transform(lowerName.begin(), lowerName.end(), lowerName.begin(), tolower);
+  std::string lowerName(name);
+
+  std::transform(lowerName.begin(), lowerName.end(), lowerName.begin(), tolower);
 
   if ((param = new Param(lowerName, P_TYPE_DOUBLE, flags, engine_val, matrix, iv, ub, lb)) == NULL)
   {
@@ -82,6 +90,7 @@
   if (alt_name != "")
   {
     std::string alt_lower_name(alt_name);
+
     std::transform(alt_lower_name.begin(), alt_lower_name.end(), alt_lower_name.begin(), tolower);
     insert_param_alt_name(param,alt_lower_name);
 
@@ -90,8 +99,6 @@
       printf("alt_name inserted...");
       fflush(stdout);
     }
-
-
   }
 
   if (BUILTIN_PARAMS_DEBUG == 2) printf("finished\n");
@@ -104,18 +111,18 @@
 
 /* Destroy the builtin parameter database.
    Generally, do this on projectm exit */
-int BuiltinParams::destroy_builtin_param_db()
+int
+BuiltinParams::destroy_builtin_param_db()
 {
-
   traverse<TraverseFunctors::Delete<Param> >(builtin_param_tree);
   return PROJECTM_SUCCESS;
 }
 
 
 /* Insert a parameter into the database with an alternate name */
-int BuiltinParams::insert_param_alt_name(Param * param, const std::string & alt_name)
+int
+BuiltinParams::insert_param_alt_name(Param * param, const std::string & alt_name)
 {
-
   assert(param);
 
   aliasMap.insert(std::make_pair(alt_name, param->name));
@@ -123,45 +130,49 @@
   return PROJECTM_SUCCESS;
 }
 
-Param * BuiltinParams::find_builtin_param(const std::string & name)
+Param *
+BuiltinParams::find_builtin_param(const std::string & name)
 {
+  AliasMap::iterator  pos = aliasMap.find(name);
+  Param               * param = 0;
 
-
-
-  AliasMap::iterator pos = aliasMap.find(name);
-  Param * param = 0;
   //std::cerr << "[BuiltinParams] find_builtin_param: name is " << name << std::endl;
   if (pos == aliasMap.end())
   {
     std::map<std::string, Param*>::iterator builtinPos = builtin_param_tree.find(name);
 
     if (builtinPos != builtin_param_tree.end()) {
-    //  std::cerr << "[BuiltinParams] find_builtin_param: found it directly." << std::endl;
+      //  std::cerr << "[BuiltinParams] find_builtin_param: found it directly." << std::endl;
       param = builtinPos->second;
-     }
+    }
   }
   else
   {
-
     std::map<std::string, Param*>::iterator builtinPos = builtin_param_tree.find(pos->second);
 
     if (builtinPos != builtin_param_tree.end()) {
       //std::cerr << "[BuiltinParams] find_builtin_param: found it indirectly." << std::endl;
       param = builtinPos->second;
-
-}
+    }
   }
   return param;
 }
 
 
 /* Loads a integer parameter into the builtin database */
-int BuiltinParams::load_builtin_param_int(const std::string & name, void * engine_val, short int flags,
-    int init_val, int upper_bound, int lower_bound, const std::string &alt_name)
+int
+BuiltinParams::load_builtin_param_int (
+const std::string &name,
+void              *engine_val,
+short int         flags,
+int               init_val,
+int               upper_bound,
+int               lower_bound,
+const std::string &alt_name
+)
 {
-
-  Param * param;
-  CValue iv, ub, lb;
+  Param   * param;
+  CValue  iv, ub, lb;
 
   iv.int_val = init_val;
   ub.int_val = upper_bound;
@@ -169,6 +180,7 @@
 
   // normalize to lower case as milkdrop scripts depend on this
   std::string lowerName(name);
+
   std::transform(lowerName.begin(), lowerName.end(), lowerName.begin(), tolower);
 
   param = new Param(lowerName, P_TYPE_INT, flags, engine_val, NULL, iv, ub, lb);
@@ -187,42 +199,52 @@
   if (alt_name != "")
   {
     std::string alt_lower_name(alt_name);
+
     std::transform(alt_lower_name.begin(), alt_lower_name.end(), alt_lower_name.begin(), tolower);
     insert_param_alt_name(param,alt_lower_name);
-
   }
 
   return PROJECTM_SUCCESS;
-
 }
 
-int BuiltinParams::load_builtin_param_string( const std::string & name, std::string * engine_val, short int flags) {
+int
+BuiltinParams::load_builtin_param_string (
+const std::string &name,
+std::string       *engine_val,
+short int         flags
+)
+{
+  /* Creates a new parameter of type string */
+  Param * param = Param::new_param_string(name.c_str(), flags, engine_val);
 
-	/* Creates a new parameter of type string */
-	Param * param = Param::new_param_string(name.c_str(), flags, engine_val);
-
-	if (insert_builtin_param( param ) < 0)
-	{
-		delete param;
-		return PROJECTM_ERROR;
-	}
-	return PROJECTM_SUCCESS;
+  if (insert_builtin_param( param ) < 0)
+  {
+    delete param;
+    return PROJECTM_ERROR;
+  }
+  return PROJECTM_SUCCESS;
 }
 
 /* Loads a boolean parameter */
-int BuiltinParams::load_builtin_param_bool(const std:: string & name, void * engine_val, short int flags,
-    int init_val, const std::string &alt_name)
+int
+BuiltinParams::load_builtin_param_bool (
+const std::string &name,
+void              *engine_val,
+short int         flags,
+int               init_val,
+const std::string &alt_name
+)
 {
-
-  Param * param;
-  CValue iv, ub, lb;
+  Param   * param;
+  CValue  iv, ub, lb;
 
   iv.int_val = init_val;
   ub.int_val = TRUE;
   lb.int_val = false;
 
-std::string lowerName(name);
-std::transform(lowerName.begin(), lowerName.end(), lowerName.begin(), tolower);
+  std::string lowerName(name);
+
+  std::transform(lowerName.begin(), lowerName.end(), lowerName.begin(), tolower);
 
   param = new Param(lowerName, P_TYPE_BOOL, flags, engine_val, NULL, iv, ub, lb);
 
@@ -240,16 +262,17 @@
   if (alt_name != "")
   {
     std::string alt_lower_name(alt_name);
+
     std::transform(alt_lower_name.begin(), alt_lower_name.end(), alt_lower_name.begin(), tolower);
     insert_param_alt_name(param,alt_lower_name);
   }
 
   return PROJECTM_SUCCESS;
-
 }
 
 /* Inserts a parameter into the builtin database */
-int BuiltinParams::insert_builtin_param( Param *param )
+int
+BuiltinParams::insert_builtin_param( Param *param )
 {
   std::pair<std::map<std::string, Param*>::iterator, bool> inserteePos = builtin_param_tree.insert(std::make_pair(param->name, param));
 
@@ -260,9 +283,12 @@
 
 /* Initialize the builtin parameter database.
    Should only be necessary once */
-int BuiltinParams::init_builtin_param_db(const PresetInputs & presetInputs, PresetOutputs & presetOutputs)
+int
+BuiltinParams::init_builtin_param_db (
+const PresetInputs  & presetInputs,
+PresetOutputs       & presetOutputs
+)
 {
-
   if (BUILTIN_PARAMS_DEBUG)
   {
     printf("init_builtin_param: loading database...");
@@ -273,7 +299,7 @@
   if (load_all_builtin_param(presetInputs, presetOutputs) < 0)
   {
     if (BUILTIN_PARAMS_DEBUG) printf("failed loading builtin parameters (FATAL)\n");
-    return PROJECTM_ERROR;
+      return PROJECTM_ERROR;
   }
 
   if (BUILTIN_PARAMS_DEBUG) printf("success!\n");
@@ -285,9 +311,12 @@
 
 
 /* Loads all builtin parameters, limits are also defined here */
-int BuiltinParams::load_all_builtin_param(const PresetInputs & presetInputs, PresetOutputs & presetOutputs)
+int
+BuiltinParams::load_all_builtin_param (
+const PresetInputs  & presetInputs,
+PresetOutputs       & presetOutputs
+)
 {
-
   load_builtin_param_float("frating", (void*)&presetOutputs.fRating, NULL, P_FLAG_NONE, 0.0 , 5.0, 0.0, "");
   load_builtin_param_float("fwavescale", (void*)&presetOutputs.wave.scale, NULL, P_FLAG_NONE, 0.0, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, "");
   load_builtin_param_float("gamma", (void*)&presetOutputs.fGammaAdj, NULL, P_FLAG_NONE, 0.0, MAX_DOUBLE_SIZE, 0, "fGammaAdj");
@@ -386,19 +415,25 @@
   load_builtin_param_int("fps", (void*)&presetInputs.fps, P_FLAG_READONLY, 15, MAX_INT_SIZE, 0, "");
 
   load_builtin_param_float("x", (void*)&presetInputs.x_per_pixel, presetInputs.origx,  P_FLAG_PER_PIXEL |P_FLAG_ALWAYS_MATRIX | P_FLAG_READONLY | P_FLAG_NONE,
-                           0, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, "");
+  0, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, "");
   load_builtin_param_float("y", (void*)&presetInputs.y_per_pixel, presetInputs.origy,  P_FLAG_PER_PIXEL |P_FLAG_ALWAYS_MATRIX |P_FLAG_READONLY | P_FLAG_NONE,
-                           0, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, "");
+  0, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, "");
   load_builtin_param_float("ang", (void*)&presetInputs.ang_per_pixel, presetInputs.origtheta,  P_FLAG_PER_PIXEL |P_FLAG_ALWAYS_MATRIX | P_FLAG_READONLY | P_FLAG_NONE,
-                           0, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, "");
+  0, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, "");
   load_builtin_param_float("rad", (void*)&presetInputs.rad_per_pixel, presetInputs.origrad,  P_FLAG_PER_PIXEL |P_FLAG_ALWAYS_MATRIX | P_FLAG_READONLY | P_FLAG_NONE,
-                           0, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, "");
+  0, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, "");
 
-  for (unsigned int i = 0; i < NUM_Q_VARIABLES;i++) {
-	std::ostringstream os;
-	os << "q" << i;
-	load_builtin_param_float(os.str().c_str(), (void*)&presetOutputs.q[i],  NULL, P_FLAG_PER_PIXEL |P_FLAG_QVAR, 0, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, "");
+  for (unsigned int i = 0;  i < NUM_Q_VARIABLES;  i++) {
+    std::ostringstream os;
 
+    os << "q" << i;
+    load_builtin_param_float (os.str().c_str(),
+                              (void*)&presetOutputs.q[i],
+                              NULL,
+                              P_FLAG_PER_PIXEL | P_FLAG_QVAR,
+                              0,
+                              MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE,
+                              "");
   }
 
   /* variables added in 1.04 */
@@ -406,6 +441,4 @@
   load_builtin_param_int("meshy", (void*)&presetInputs.gy, P_FLAG_READONLY, 24, 72, 6, "");
 
   return PROJECTM_SUCCESS;
-
 }
-
diff --git a/src/libprojectM/MilkdropPresetFactory/BuiltinParams.hpp b/src/libprojectM/MilkdropPresetFactory/BuiltinParams.hpp
index dbe60f1..3cf3f9d 100644
--- a/src/libprojectM/MilkdropPresetFactory/BuiltinParams.hpp
+++ b/src/libprojectM/MilkdropPresetFactory/BuiltinParams.hpp
@@ -33,54 +33,56 @@
 #include <map>
 #include <cstdio>
 
+
 class BuiltinParams {
 
 public:
-   typedef std::map<std::string, std::string> AliasMap;
+  typedef std::map<std::string, std::string> AliasMap;
 
-    /** Default constructor leaves database in an uninitialized state.  */
-    BuiltinParams();
+  /** Default constructor leaves database in an uninitialized state.  */
+  BuiltinParams();
 
-    /** Construct a new builtin parameter database with variables references given by
-     * the preset input and output structures */
-     BuiltinParams(PresetInputs &  presetInputs, PresetOutputs & presetOutputs);
+  /** Construct a new builtin parameter database with variables references given by
+  * the preset input and output structures */
+  BuiltinParams(PresetInputs &  presetInputs, PresetOutputs & presetOutputs);
 
-    ~BuiltinParams();
+  ~BuiltinParams();
 
-    /** Param database initalizer / destructor functions */
-    int init_builtin_param_db(const PresetInputs & presetInputs, PresetOutputs & presetOutputs);
-    int load_all_builtin_param(const PresetInputs & presetInputs, PresetOutputs & presetOutputs);
-    int destroy_builtin_param_db();
+  /** Param database initalizer / destructor functions */
+  int init_builtin_param_db(const PresetInputs & presetInputs, PresetOutputs & presetOutputs);
+  int load_all_builtin_param(const PresetInputs & presetInputs, PresetOutputs & presetOutputs);
+  int destroy_builtin_param_db();
 
-    int insert_param_alt_name( Param *param, const std::string& salt_name );
-    Param *find_builtin_param( const std::string & name );
-    int load_builtin_param_float( const std::string & name, void *engine_val, void *matrix,
-                                  short int flags,
-                                  float init_val, float upper_bound,
-                                  float lower_bound, const std::string & alt_name );
-    int load_builtin_param_int( const std::string & name, void *engine_val, short int flags,
-                                int init_val, int upper_bound,
-                                int lower_bound, const std::string & alt_name );
-    int load_builtin_param_bool( const std::string & name, void *engine_val, short int flags,
-                                int init_val, const std::string & alt_name );
+  int insert_param_alt_name( Param *param, const std::string& salt_name );
+  Param *find_builtin_param( const std::string & name );
+  int load_builtin_param_float( const std::string & name, void *engine_val, void *matrix,
+                                short int flags,
+                                float init_val, float upper_bound,
+                                float lower_bound, const std::string & alt_name );
+  int load_builtin_param_int( const std::string & name, void *engine_val, short int flags,
+                              int init_val, int upper_bound,
+                              int lower_bound, const std::string & alt_name );
+  int load_builtin_param_bool( const std::string & name, void *engine_val, short int flags,
+                               int init_val, const std::string & alt_name );
 
-    int load_builtin_param_string( const std::string & name, std::string * engine_val, short int flags);
+  int load_builtin_param_string( const std::string & name, std::string * engine_val, short int flags);
 
-    int insert_builtin_param( Param *param );
+  int insert_builtin_param( Param *param );
 
-    template <class Fun>
-    void apply(Fun & fun) {
-	traverse(builtin_param_tree, fun);
-    }
+  template <class Fun>
+  void apply(Fun & fun) {
+    traverse(builtin_param_tree, fun);
+  }
 
 
 private:
-    static const bool BUILTIN_PARAMS_DEBUG = false;
+  static const bool BUILTIN_PARAMS_DEBUG = false;
 
-    // Used to associate multiple string names to one parameter
-    AliasMap aliasMap;
+  // Used to associate multiple string names to one parameter
+  AliasMap aliasMap;
 
-    // Internal datastructure to store the parameters
-    std::map<std::string,Param*> builtin_param_tree;
+  // Internal datastructure to store the parameters
+  std::map<std::string,Param*> builtin_param_tree;
 };
+
 #endif
diff --git a/src/libprojectM/MilkdropPresetFactory/CValue.hpp b/src/libprojectM/MilkdropPresetFactory/CValue.hpp
index 7c2f557..aa8eb5b 100644
--- a/src/libprojectM/MilkdropPresetFactory/CValue.hpp
+++ b/src/libprojectM/MilkdropPresetFactory/CValue.hpp
@@ -30,9 +30,9 @@
 #define _CVALUE_H
 
 typedef union CValue_t {
-    bool bool_val;
-    int int_val;
-    float float_val;
-  } CValue;
+  bool  bool_val;
+  int   int_val;
+  float float_val;
+} CValue;
 
 #endif /** _CVALUE_H */
diff --git a/src/libprojectM/MilkdropPresetFactory/CustomShape.cpp b/src/libprojectM/MilkdropPresetFactory/CustomShape.cpp
index 4d2c283..5be0daa 100644
--- a/src/libprojectM/MilkdropPresetFactory/CustomShape.cpp
+++ b/src/libprojectM/MilkdropPresetFactory/CustomShape.cpp
@@ -39,217 +39,216 @@
 
 CustomShape::CustomShape() : Shape()
 {
-	CustomShape(0);
+  CustomShape(0);
 };
 
 CustomShape::CustomShape ( int id ) : Shape()
 {
+  Param * param;
 
-	Param * param;
+  this->id = id;
+  this->per_frame_count = 0;
 
-	this->id = id;
-	this->per_frame_count = 0;
-
-	/* Start: Load custom shape parameters */
-	param = Param::new_param_float ( "r", P_FLAG_NONE, &this->r, NULL, 1.0, 0.0, 0.5 );
-	if ( !ParamUtils::insert( param, &this->param_tree ) )
-	{
-		abort();
-	}
-	param = Param::new_param_float ( "g", P_FLAG_NONE, &this->g, NULL, 1.0, 0.0, .5 );
-	if ( !ParamUtils::insert( param, &this->param_tree ) )
-	{
-		abort();
-	}
-	param = Param::new_param_float ( "b", P_FLAG_NONE, &this->b, NULL, 1.0, 0.0, .5 );
-	if ( !ParamUtils::insert( param, &this->param_tree ) )
-	{
-		abort();
-	}
-	param = Param::new_param_float ( "a", P_FLAG_NONE, &this->a, NULL, 1.0, 0.0, .5 );
-	if ( !ParamUtils::insert( param, &this->param_tree ) )
-	{
-		abort();
-	}
-	param = Param::new_param_float ( "border_r", P_FLAG_NONE, &this->border_r, NULL, 1.0, 0.0, .5 );
-	if ( !ParamUtils::insert( param, &this->param_tree ) )
-	{
-		abort();
-	}
-	param = Param::new_param_float ( "border_g", P_FLAG_NONE, &this->border_g, NULL, 1.0, 0.0, .5 );
-	if ( !ParamUtils::insert( param, &this->param_tree ) )
-	{
-		abort();
-	}
-	param = Param::new_param_float ( "border_b", P_FLAG_NONE, &this->border_b, NULL, 1.0, 0.0, .5 );
-	if ( !ParamUtils::insert( param, &this->param_tree ) )
-	{
-		abort();
-	}
-	param = Param::new_param_float ( "border_a", P_FLAG_NONE, &this->border_a, NULL, 1.0, 0.0, .5 );
-	if ( !ParamUtils::insert( param, &this->param_tree ) )
-	{
-		abort();
-	}
-	param = Param::new_param_float ( "r2", P_FLAG_NONE, &this->r2, NULL, 1.0, 0.0, .5 );
-	if ( !ParamUtils::insert( param, &this->param_tree ) )
-	{
-		abort();
-	}
-	param = Param::new_param_float ( "g2", P_FLAG_NONE, &this->g2, NULL, 1.0, 0.0, .5 );
-	if ( !ParamUtils::insert( param, &this->param_tree ) )
-	{
-		abort();
-	}
-	param = Param::new_param_float ( "b2", P_FLAG_NONE, &this->b2, NULL, 1.0, 0.0, .5 );
-	if ( !ParamUtils::insert( param, &this->param_tree ) )
-	{
-		abort();
-	}
-	param = Param::new_param_float ( "a2", P_FLAG_NONE, &this->a2, NULL, 1.0, 0.0, .5 );
-	if ( !ParamUtils::insert( param, &this->param_tree ) )
-	{
-		abort();
-	}
-	param = Param::new_param_float ( "x", P_FLAG_NONE, &this->x, NULL, 1.0, 0.0, .5 );
-	if ( !ParamUtils::insert( param, &this->param_tree ) )
-	{
-		abort();
-	}
-	param = Param::new_param_float ( "y", P_FLAG_NONE, &this->y, NULL, 1.0, 0.0, .5 );
-	if ( !ParamUtils::insert( param, &this->param_tree ) )
-	{
-		abort();
-	}
-	param = Param::new_param_bool ( "thickoutline", P_FLAG_NONE, &this->thickOutline, 1, 0, 0 );
-	if ( !ParamUtils::insert( param, &this->param_tree ) )
-	{
-		abort();
-	}
-	param = Param::new_param_bool ( "enabled", P_FLAG_NONE, &this->enabled, 1, 0, 0 );
-	if ( !ParamUtils::insert( param, &this->param_tree ) )
-	{
-		abort();
-	}
-	param = Param::new_param_int ( "sides", P_FLAG_NONE, &this->sides, 100, 3, 3 );
-	if ( !ParamUtils::insert( param, &this->param_tree ) )
-	{
-		abort();
-	}
-	param = Param::new_param_bool ( "additive", P_FLAG_NONE, &this->additive, 1, 0, 0 );
-	if ( !ParamUtils::insert( param, &this->param_tree ) )
-	{
-		abort();
-	}
-	param = Param::new_param_bool ( "textured", P_FLAG_NONE, &this->textured, 1, 0, 0 );
-	if ( !ParamUtils::insert( param, &this->param_tree ) )
-	{
-		abort();
-	}
-	param = Param::new_param_float ( "rad", P_FLAG_NONE, &this->radius, NULL, MAX_DOUBLE_SIZE, 0, 0.0 );
-	if ( !ParamUtils::insert( param, &this->param_tree ) )
-	{
-		abort();
-	}
-	param = Param::new_param_float ( "ang", P_FLAG_NONE, &this->ang, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0 );
-	if ( !ParamUtils::insert( param, &this->param_tree ) )
-	{
-		abort();
-	}
-	param = Param::new_param_float ( "tex_zoom", P_FLAG_NONE, &this->tex_zoom, NULL, MAX_DOUBLE_SIZE, .00000000001, 0.0 );
-	if ( !ParamUtils::insert( param, &this->param_tree ) )
-	{
-		abort();
-	}
-	param = Param::new_param_float ( "tex_ang", P_FLAG_NONE, &this->tex_ang, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0 );
-	if ( !ParamUtils::insert( param, &this->param_tree ) )
-	{
-		abort();
-	}
-
-	param = Param::new_param_float ( "t1", P_FLAG_TVAR, &this->t1, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0 );
-	if ( !ParamUtils::insert( param, &this->param_tree ) )
-	{
-		abort();
-	}
-	param = Param::new_param_float ( "t2", P_FLAG_TVAR, &this->t2, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0 );
-	if ( !ParamUtils::insert( param, &this->param_tree ) )
-	{
-		abort();
-	}
-	param = Param::new_param_float ( "t3", P_FLAG_TVAR, &this->t3, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0 );
-	if ( !ParamUtils::insert( param, &this->param_tree ) )
-	{
-		abort();
-	}
-	param = Param::new_param_float ( "t4", P_FLAG_TVAR, &this->t4, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0 );
-	if ( !ParamUtils::insert( param, &this->param_tree ) )
-	{
-		abort();
-	}
-	param = Param::new_param_float ( "t5", P_FLAG_TVAR, &this->t5, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0 );
-	if ( !ParamUtils::insert( param, &this->param_tree ) )
-	{
-		abort();
-	}
-	param = Param::new_param_float ( "t6", P_FLAG_TVAR, &this->t6, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0 );
-	if ( !ParamUtils::insert( param, &this->param_tree ) )
-	{
-		abort();
-	}
-	param = Param::new_param_float ( "t7", P_FLAG_TVAR, &this->t7, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0 );
-	if ( !ParamUtils::insert( param, &this->param_tree ) )
-	{
-		abort();
-	}
-	param = Param::new_param_float ( "t8", P_FLAG_TVAR, &this->t8, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0 );
-	if ( !ParamUtils::insert( param, &this->param_tree ) )
-	{
-		abort();
-	}
-
-   for (unsigned int i = 1; i <= NUM_Q_VARIABLES;i++) {
-	std::ostringstream os;
-	os << "q" << i;
-	param = Param::new_param_float ( os.str().c_str(), P_FLAG_QVAR, &this->q[i], NULL, MAX_DOUBLE_SIZE,
-		 -MAX_DOUBLE_SIZE, 0.0 );
-	if ( ParamUtils::insert ( param, &this->param_tree ) < 0 )
-	{
-		abort();
-	}
+  /* Start: Load custom shape parameters */
+  param = Param::new_param_float ( "r", P_FLAG_NONE, &this->r, NULL, 1.0, 0.0, 0.5 );
+  if ( !ParamUtils::insert( param, &this->param_tree ) )
+  {
+    abort();
+  }
+  param = Param::new_param_float ( "g", P_FLAG_NONE, &this->g, NULL, 1.0, 0.0, .5 );
+  if ( !ParamUtils::insert( param, &this->param_tree ) )
+  {
+    abort();
+  }
+  param = Param::new_param_float ( "b", P_FLAG_NONE, &this->b, NULL, 1.0, 0.0, .5 );
+  if ( !ParamUtils::insert( param, &this->param_tree ) )
+  {
+    abort();
+  }
+  param = Param::new_param_float ( "a", P_FLAG_NONE, &this->a, NULL, 1.0, 0.0, .5 );
+  if ( !ParamUtils::insert( param, &this->param_tree ) )
+  {
+    abort();
+  }
+  param = Param::new_param_float ( "border_r", P_FLAG_NONE, &this->border_r, NULL, 1.0, 0.0, .5 );
+  if ( !ParamUtils::insert( param, &this->param_tree ) )
+  {
+    abort();
+  }
+  param = Param::new_param_float ( "border_g", P_FLAG_NONE, &this->border_g, NULL, 1.0, 0.0, .5 );
+  if ( !ParamUtils::insert( param, &this->param_tree ) )
+  {
+    abort();
+  }
+  param = Param::new_param_float ( "border_b", P_FLAG_NONE, &this->border_b, NULL, 1.0, 0.0, .5 );
+  if ( !ParamUtils::insert( param, &this->param_tree ) )
+  {
+    abort();
+  }
+  param = Param::new_param_float ( "border_a", P_FLAG_NONE, &this->border_a, NULL, 1.0, 0.0, .5 );
+  if ( !ParamUtils::insert( param, &this->param_tree ) )
+  {
+    abort();
+  }
+  param = Param::new_param_float ( "r2", P_FLAG_NONE, &this->r2, NULL, 1.0, 0.0, .5 );
+  if ( !ParamUtils::insert( param, &this->param_tree ) )
+  {
+    abort();
+  }
+  param = Param::new_param_float ( "g2", P_FLAG_NONE, &this->g2, NULL, 1.0, 0.0, .5 );
+  if ( !ParamUtils::insert( param, &this->param_tree ) )
+  {
+    abort();
+  }
+  param = Param::new_param_float ( "b2", P_FLAG_NONE, &this->b2, NULL, 1.0, 0.0, .5 );
+  if ( !ParamUtils::insert( param, &this->param_tree ) )
+  {
+    abort();
+  }
+  param = Param::new_param_float ( "a2", P_FLAG_NONE, &this->a2, NULL, 1.0, 0.0, .5 );
+  if ( !ParamUtils::insert( param, &this->param_tree ) )
+  {
+    abort();
+  }
+  param = Param::new_param_float ( "x", P_FLAG_NONE, &this->x, NULL, 1.0, 0.0, .5 );
+  if ( !ParamUtils::insert( param, &this->param_tree ) )
+  {
+    abort();
+  }
+  param = Param::new_param_float ( "y", P_FLAG_NONE, &this->y, NULL, 1.0, 0.0, .5 );
+  if ( !ParamUtils::insert( param, &this->param_tree ) )
+  {
+    abort();
+  }
+  param = Param::new_param_bool ( "thickoutline", P_FLAG_NONE, &this->thickOutline, 1, 0, 0 );
+  if ( !ParamUtils::insert( param, &this->param_tree ) )
+  {
+    abort();
+  }
+  param = Param::new_param_bool ( "enabled", P_FLAG_NONE, &this->enabled, 1, 0, 0 );
+  if ( !ParamUtils::insert( param, &this->param_tree ) )
+  {
+    abort();
+  }
+  param = Param::new_param_int ( "sides", P_FLAG_NONE, &this->sides, 100, 3, 3 );
+  if ( !ParamUtils::insert( param, &this->param_tree ) )
+  {
+    abort();
+  }
+  param = Param::new_param_bool ( "additive", P_FLAG_NONE, &this->additive, 1, 0, 0 );
+  if ( !ParamUtils::insert( param, &this->param_tree ) )
+  {
+    abort();
+  }
+  param = Param::new_param_bool ( "textured", P_FLAG_NONE, &this->textured, 1, 0, 0 );
+  if ( !ParamUtils::insert( param, &this->param_tree ) )
+  {
+    abort();
+  }
+  param = Param::new_param_float ( "rad", P_FLAG_NONE, &this->radius, NULL, MAX_DOUBLE_SIZE, 0, 0.0 );
+  if ( !ParamUtils::insert( param, &this->param_tree ) )
+  {
+    abort();
+  }
+  param = Param::new_param_float ( "ang", P_FLAG_NONE, &this->ang, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0 );
+  if ( !ParamUtils::insert( param, &this->param_tree ) )
+  {
+    abort();
+  }
+  param = Param::new_param_float ( "tex_zoom", P_FLAG_NONE, &this->tex_zoom, NULL, MAX_DOUBLE_SIZE, .00000000001, 0.0 );
+  if ( !ParamUtils::insert( param, &this->param_tree ) )
+  {
+    abort();
+  }
+  param = Param::new_param_float ( "tex_ang", P_FLAG_NONE, &this->tex_ang, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0 );
+  if ( !ParamUtils::insert( param, &this->param_tree ) )
+  {
+    abort();
   }
 
-	param = Param::new_param_string ( "imageurl", P_FLAG_NONE, &this->imageUrl);
-	if ( !ParamUtils::insert( param, &this->text_properties_tree ) )
-	{
-		abort();
-	}
+  param = Param::new_param_float ( "t1", P_FLAG_TVAR, &this->t1, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0 );
+  if ( !ParamUtils::insert( param, &this->param_tree ) )
+  {
+    abort();
+  }
+  param = Param::new_param_float ( "t2", P_FLAG_TVAR, &this->t2, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0 );
+  if ( !ParamUtils::insert( param, &this->param_tree ) )
+  {
+    abort();
+  }
+  param = Param::new_param_float ( "t3", P_FLAG_TVAR, &this->t3, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0 );
+  if ( !ParamUtils::insert( param, &this->param_tree ) )
+  {
+    abort();
+  }
+  param = Param::new_param_float ( "t4", P_FLAG_TVAR, &this->t4, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0 );
+  if ( !ParamUtils::insert( param, &this->param_tree ) )
+  {
+    abort();
+  }
+  param = Param::new_param_float ( "t5", P_FLAG_TVAR, &this->t5, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0 );
+  if ( !ParamUtils::insert( param, &this->param_tree ) )
+  {
+    abort();
+  }
+  param = Param::new_param_float ( "t6", P_FLAG_TVAR, &this->t6, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0 );
+  if ( !ParamUtils::insert( param, &this->param_tree ) )
+  {
+    abort();
+  }
+  param = Param::new_param_float ( "t7", P_FLAG_TVAR, &this->t7, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0 );
+  if ( !ParamUtils::insert( param, &this->param_tree ) )
+  {
+    abort();
+  }
+  param = Param::new_param_float ( "t8", P_FLAG_TVAR, &this->t8, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0 );
+  if ( !ParamUtils::insert( param, &this->param_tree ) )
+  {
+    abort();
+  }
 
+  for (unsigned int i = 1;  i <= NUM_Q_VARIABLES;  i++) {
+    std::ostringstream os;
+
+    os << "q" << i;
+    param = Param::new_param_float ( os.str().c_str(), P_FLAG_QVAR, &this->q[i], NULL,
+                                     MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0 );
+    if ( ParamUtils::insert ( param, &this->param_tree ) < 0 )
+    {
+      abort();
+    }
+  }
+
+  param = Param::new_param_string ( "imageurl", P_FLAG_NONE, &this->imageUrl);
+  if ( !ParamUtils::insert( param, &this->text_properties_tree ) )
+  {
+    abort();
+  }
 }
 
 /* Frees a custom shape form object */
 CustomShape::~CustomShape()
 {
-
-	traverseVector<TraverseFunctors::Delete<PerFrameEqn> > ( per_frame_eqn_tree );
-	traverse<TraverseFunctors::Delete<InitCond> > ( init_cond_tree );
-	traverse<TraverseFunctors::Delete<Param> > ( param_tree );
-	traverse<TraverseFunctors::Delete<InitCond> > ( per_frame_init_eqn_tree );
-	traverse<TraverseFunctors::Delete<Param> > ( text_properties_tree );
-
+  traverseVector<TraverseFunctors::Delete<PerFrameEqn> > ( per_frame_eqn_tree );
+  traverse<TraverseFunctors::Delete<InitCond> > ( init_cond_tree );
+  traverse<TraverseFunctors::Delete<Param> > ( param_tree );
+  traverse<TraverseFunctors::Delete<InitCond> > ( per_frame_init_eqn_tree );
+  traverse<TraverseFunctors::Delete<Param> > ( text_properties_tree );
 }
 
-void CustomShape::loadUnspecInitConds()
+void
+CustomShape::loadUnspecInitConds()
 {
-
-	InitCondUtils::LoadUnspecInitCond fun ( this->init_cond_tree, this->per_frame_init_eqn_tree );
-	traverse ( param_tree, fun );
+  InitCondUtils::LoadUnspecInitCond fun ( this->init_cond_tree, this->per_frame_init_eqn_tree );
+  traverse ( param_tree, fun );
 }
 
-void CustomShape::evalInitConds()
+void
+CustomShape::evalInitConds()
 {
-	// NOTE: This is verified to be same behavior as trunk
-	for ( std::map<std::string, InitCond*>::iterator pos = per_frame_init_eqn_tree.begin(); 
-		     pos != per_frame_init_eqn_tree.end();++pos )
-		pos->second->evaluate();
+  // NOTE: This is verified to be same behavior as trunk
+  for (std::map<std::string, InitCond*>::iterator pos = per_frame_init_eqn_tree.begin();
+       pos != per_frame_init_eqn_tree.end();
+       ++pos)
+    pos->second->evaluate();
 }
diff --git a/src/libprojectM/MilkdropPresetFactory/CustomShape.hpp b/src/libprojectM/MilkdropPresetFactory/CustomShape.hpp
index eb9a8e8..6fbbe34 100644
--- a/src/libprojectM/MilkdropPresetFactory/CustomShape.hpp
+++ b/src/libprojectM/MilkdropPresetFactory/CustomShape.hpp
@@ -25,7 +25,6 @@
  *
  * $Log$
  */
-
 #ifndef _CUSTOM_SHAPE_H
 #define _CUSTOM_SHAPE_H
 
@@ -37,54 +36,53 @@
 #include "Renderer/Renderable.hpp"
 #include <vector>
 
+
 class Preset;
 
 
 class CustomShape : public Shape {
 public:
-    /* Numerical id */
-    int id;
-    int per_frame_count;
+  /* Numerical id */
+  int id;
+  int per_frame_count;
 
-    /* Parameter tree associated with this custom shape */
-    std::map<std::string,Param*> param_tree;
+  /* Parameter tree associated with this custom shape */
+  std::map<std::string,Param*> param_tree;
 
-    /* Engine variables */
+  /* Engine variables */
 
-    bool enabled;
+  bool enabled;
 
-    /* stupid t variables */
-    float t1;
-    float t2;
-    float t3;
-    float t4;
-    float t5;
-    float t6;
-    float t7;
-    float t8;
+  /* stupid t variables */
+  float t1;
+  float t2;
+  float t3;
+  float t4;
+  float t5;
+  float t6;
+  float t7;
+  float t8;
 
-    /* stupider q variables */
-    float q[NUM_Q_VARIABLES];
+  /* stupider q variables */
+  float q[NUM_Q_VARIABLES];
 
-    // Data structure to hold per frame  / per frame init equations
-    std::map<std::string,InitCond*>  init_cond_tree;
-    std::vector<PerFrameEqn*>  per_frame_eqn_tree;
-    std::map<std::string,InitCond*>  per_frame_init_eqn_tree;
+  // Data structure to hold per frame  / per frame init equations
+  std::map<std::string,InitCond*> init_cond_tree;
+  std::vector<PerFrameEqn*>       per_frame_eqn_tree;
+  std::map<std::string,InitCond*> per_frame_init_eqn_tree;
 
-    std::map<std::string, Param*> text_properties_tree;
+  std::map<std::string, Param*>   text_properties_tree;
 
 
-    /// Allocate a new custom shape, including param associations, per point equations, and initial values.
-    /// \param id an integer id to associate with this custom wave. Future line parsing uses this as a reference key.
-    CustomShape( int id );
-    CustomShape();
-    ~CustomShape();
+  /// Allocate a new custom shape, including param associations, per point equations, and initial values.
+  /// \param id an integer id to associate with this custom wave. Future line parsing uses this as a reference key.
+  CustomShape( int id );
+  CustomShape();
+  ~CustomShape();
 
-    void loadUnspecInitConds();
-    void evalInitConds();
-
-  };
+  void loadUnspecInitConds();
+  void evalInitConds();
+};
 
 
 #endif /** !_CUSTOM_SHAPE_H */
-
diff --git a/src/libprojectM/MilkdropPresetFactory/CustomWave.cpp b/src/libprojectM/MilkdropPresetFactory/CustomWave.cpp
index 935cea7..305d663 100644
--- a/src/libprojectM/MilkdropPresetFactory/CustomWave.cpp
+++ b/src/libprojectM/MilkdropPresetFactory/CustomWave.cpp
@@ -40,10 +40,12 @@
 #include "ParamUtils.hpp"
 #include "InitCondUtils.hpp"
 #include "wipemalloc.h"
+
 #define MAX_SAMPLE_SIZE 4096
 
 
-CustomWave::CustomWave(int _id) : Waveform(512),
+CustomWave::CustomWave(int _id)
+  : Waveform(512),
     id(_id),
     per_frame_count(0),
     r(0),
@@ -51,7 +53,6 @@
     b(0),
     a(0)
 {
-
   Param * param;
 
   /// @bug deprecate the use of wipemalloc
@@ -147,10 +148,8 @@
   if (ParamUtils::insert(param, &this->param_tree) < 0)
   {
     ;
-
     /// @bug make exception
     abort();
-
   }
 
   if ((param = Param::new_param_bool("enabled", P_FLAG_NONE, &this->enabled, 1, 0, 0)) == NULL)
@@ -158,17 +157,13 @@
     ;
     /// @bug make exception
     abort();
-
-
   }
 
   if (ParamUtils::insert(param, &this->param_tree) < 0)
   {
     ;
-
     /// @bug make exception
     abort();
-
   }
 
   if ((param = Param::new_param_int("sep", P_FLAG_NONE, &this->sep, 100, -100, 0)) == NULL)
@@ -176,8 +171,6 @@
     ;
     /// @bug make exception
     abort();
-
-
   }
 
   if (ParamUtils::insert(param, &this->param_tree) < 0)
@@ -185,23 +178,18 @@
     ;
     /// @bug make exception
     abort();
-
-
   }
 
   if ((param = Param::new_param_bool("bspectrum", P_FLAG_NONE, &this->spectrum, 1, 0, 0)) == NULL)
   {
     /// @bug make exception
     abort();
-
-
   }
 
   if (ParamUtils::insert(param, &this->param_tree) < 0)
   {
     /// @bug make exception
     abort();
-
   }
 
   if ((param = Param::new_param_bool("bdrawthick", P_FLAG_NONE, &this->thick, 1, 0, 0)) == NULL)
@@ -214,12 +202,10 @@
   {
     /// @bug make exception
     abort();
-
   }
 
   if ((param = Param::new_param_bool("busedots", P_FLAG_NONE, &this->dots, 1, 0, 0)) == NULL)
   {
-
     /// @bug make exception
     abort();
   }
@@ -255,7 +241,7 @@
   }
 
   if ((param = Param::new_param_float("sample", P_FLAG_READONLY | P_FLAG_NONE | P_FLAG_ALWAYS_MATRIX | P_FLAG_PER_POINT,
-                                      &this->sample, this->sample_mesh, 1.0, 0.0, 0.0)) == NULL)
+                      &this->sample, this->sample_mesh, 1.0, 0.0, 0.0)) == NULL)
   {
     ;
     abort();
@@ -341,12 +327,11 @@
 
   if (ParamUtils::insert(param, &this->param_tree) < 0)
   {
-
     abort();
   }
+
   if ((param = Param::new_param_float("t4",  P_FLAG_PER_POINT |P_FLAG_TVAR, &this->t4, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0)) == NULL)
   {
-
     abort();
   }
 
@@ -354,6 +339,7 @@
   {
     abort();
   }
+
   if ((param = Param::new_param_float("t5", P_FLAG_TVAR, &this->t5, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0)) == NULL)
   {
     abort();
@@ -363,7 +349,7 @@
   {
     abort();
   }
-  
+
   if ((param = Param::new_param_float("t6", P_FLAG_TVAR | P_FLAG_PER_POINT, &this->t6, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0)) == NULL)
   {
     abort();
@@ -371,12 +357,11 @@
 
   if (ParamUtils::insert(param, &this->param_tree) < 0)
   {
-
     abort();
   }
+
   if ((param = Param::new_param_float("t7", P_FLAG_TVAR | P_FLAG_PER_POINT, &this->t7, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0)) == NULL)
   {
-
     abort();
   }
 
@@ -398,27 +383,25 @@
     abort();
   }
 
-  for (unsigned int i = 1; i <= NUM_Q_VARIABLES;i++) {
-	std::ostringstream os;
-	os << "q" << i;
-	param = Param::new_param_float ( os.str().c_str(), P_FLAG_QVAR, &this->q[i], NULL, MAX_DOUBLE_SIZE,
-		 -MAX_DOUBLE_SIZE, 0.0 );
-	if ( ParamUtils::insert ( param, &this->param_tree ) < 0 )
-	{
-		abort();
-	}
+  for (unsigned int i = 1;  i <= NUM_Q_VARIABLES;  i++) {
+    std::ostringstream os;
+
+    os << "q" << i;
+    param = Param::new_param_float ( os.str().c_str(), P_FLAG_QVAR, &this->q[i], NULL,
+                                     MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0 );
+    if ( ParamUtils::insert ( param, &this->param_tree ) < 0 )
+    {
+      abort();
+    }
   }
-	
-     /* End of parameter loading. Note that the read only parameters associated
+
+  /* End of parameter loading. Note that the read only parameters associated
      with custom waves (ie, sample) are variables stored in PresetFrameIO.hpp,
      and not specific to the custom wave datastructure. */
-
 }
 
 CustomWave::~CustomWave()
 {
-
-
   for (std::vector<PerPointEqn*>::iterator pos = per_point_eqn_tree.begin(); pos != per_point_eqn_tree.end(); ++pos)
     delete(*pos);
 
@@ -434,23 +417,23 @@
   for (std::map<std::string, Param*>::iterator pos = param_tree.begin(); pos != param_tree.end(); ++pos)
     delete(pos->second);
 
-  free(r_mesh);
-  free(g_mesh);
-  free(b_mesh);
-  free(a_mesh);
-  free(x_mesh);
-  free(y_mesh);
-  free(value1);
-  free(value2);
-  free(sample_mesh);
-
+  free (r_mesh);
+  free (g_mesh);
+  free (b_mesh);
+  free (a_mesh);
+  free (x_mesh);
+  free (y_mesh);
+  free (value1);
+  free (value2);
+  free (sample_mesh);
 }
 
 
 
 
 // Comments: index is not passed, so we assume monotonic increment by 1 is ok here
-int CustomWave::add_per_point_eqn(char * name, GenExpr * gen_expr)
+int
+CustomWave::add_per_point_eqn(char * name, GenExpr * gen_expr)
 {
 
   PerPointEqn * per_point_eqn;
@@ -469,9 +452,9 @@
 
   if ((param = ParamUtils::find<ParamUtils::AUTO_CREATE>(name,&param_tree)) == NULL)
   {
-    if (CUSTOM_WAVE_DEBUG) printf("add_per_point_eqn: failed to allocate a new parameter!\n");
+    if (CUSTOM_WAVE_DEBUG)
+      printf("add_per_point_eqn: failed to allocate a new parameter!\n");
     return PROJECTM_FAILURE;
-
   }
 
   /* Get largest index in the tree */
@@ -480,6 +463,7 @@
   /* Create the per point equation given the index, parameter, and general expression */
   if ((per_point_eqn = new PerPointEqn(index, param, gen_expr, samples)) == NULL)
     return PROJECTM_FAILURE;
+
   if (CUSTOM_WAVE_DEBUG)
     printf("add_per_point_eqn: created new equation (index = %d) (name = \"%s\")\n", per_point_eqn->index, per_point_eqn->param->name.c_str());
 
@@ -492,48 +476,51 @@
 }
 
 
-void CustomWave::evalInitConds()
+void
+CustomWave::evalInitConds()
 {
-
-  for (std::map<std::string, InitCond*>::iterator pos = per_frame_init_eqn_tree.begin(); pos != per_frame_init_eqn_tree.end(); ++pos)
+  for (std::map<std::string, InitCond*>::iterator pos = per_frame_init_eqn_tree.begin();
+       pos != per_frame_init_eqn_tree.end();
+       ++pos)
   {
     assert(pos->second);
     pos->second->evaluate();
   }
-
 }
 
-ColoredPoint CustomWave::PerPoint(ColoredPoint p, const WaveformContext context)
+ColoredPoint
+CustomWave::PerPoint (ColoredPoint p, const WaveformContext context)
 {
-	    r_mesh[context.sample_int] = r;
-	    g_mesh[context.sample_int] = g;
-	    b_mesh[context.sample_int] = b;
-	    a_mesh[context.sample_int] = a;
-	    x_mesh[context.sample_int] = x;
-	    y_mesh[context.sample_int] = y;
-	    sample = context.sample;
-	    sample_mesh[context.sample_int] = context.sample;
-	    v1 = context.left;
-	    v2 = context.right;
+  r_mesh[context.sample_int] = r;
+  g_mesh[context.sample_int] = g;
+  b_mesh[context.sample_int] = b;
+  a_mesh[context.sample_int] = a;
+  x_mesh[context.sample_int] = x;
+  y_mesh[context.sample_int] = y;
+  sample = context.sample;
+  sample_mesh[context.sample_int] = context.sample;
+  v1 = context.left;
+  v2 = context.right;
 
-	for (std::vector<PerPointEqn*>::iterator pos = per_point_eqn_tree.begin(); pos != per_point_eqn_tree.end();++pos)
-	    (*pos)->evaluate(context.sample_int);
+  for (std::vector<PerPointEqn*>::iterator pos = per_point_eqn_tree.begin();
+       pos != per_point_eqn_tree.end();
+       ++pos)
+    (*pos)->evaluate(context.sample_int);
 
-	    p.a = a_mesh[context.sample_int];
-	    p.r = r_mesh[context.sample_int];
-	    p.g = g_mesh[context.sample_int];
-	    p.b = b_mesh[context.sample_int];
-	    p.x = x_mesh[context.sample_int];
-	    p.y = y_mesh[context.sample_int];
+  p.a = a_mesh[context.sample_int];
+  p.r = r_mesh[context.sample_int];
+  p.g = g_mesh[context.sample_int];
+  p.b = b_mesh[context.sample_int];
+  p.x = x_mesh[context.sample_int];
+  p.y = y_mesh[context.sample_int];
 
-	    return p;
+  return p;
 }
 
 
-void CustomWave::loadUnspecInitConds()
+void
+CustomWave::loadUnspecInitConds()
 {
-
   InitCondUtils::LoadUnspecInitCond fun(this->init_cond_tree, this->per_frame_init_eqn_tree);
   traverse(param_tree, fun);
 }
-
diff --git a/src/libprojectM/MilkdropPresetFactory/CustomWave.hpp b/src/libprojectM/MilkdropPresetFactory/CustomWave.hpp
index a951fed..a29a4e3 100644
--- a/src/libprojectM/MilkdropPresetFactory/CustomWave.hpp
+++ b/src/libprojectM/MilkdropPresetFactory/CustomWave.hpp
@@ -29,6 +29,7 @@
 #ifndef _CUSTOM_WAVE_H
 #define _CUSTOM_WAVE_H
 
+
 #define CUSTOM_WAVE_DEBUG 0
 
 class CustomWave;
@@ -45,84 +46,84 @@
 
 #include <map>
 
+
 class CustomWave : public Waveform
 {
-public:
+  public:
 
-     /** Empty constructor leaves wave in undefined state **/
-     //CustomWave() {}
+  /** Empty constructor leaves wave in undefined state **/
+  //CustomWave() {}
 
-     /** Initializes a custom wave id given the integer id */
-     CustomWave(int id);
+  /** Initializes a custom wave id given the integer id */
+  CustomWave(int id);
 
-    /** Destructor is necessary so we can free the per point matrices **/
-    ~CustomWave();
+  /** Destructor is necessary so we can free the per point matrices **/
+  ~CustomWave();
 
-    ColoredPoint PerPoint(ColoredPoint p, const WaveformContext context);
+  ColoredPoint PerPoint(ColoredPoint p, const WaveformContext context);
 
-    /* Numerical id */
-    int id;
-    int per_frame_count;
+  /* Numerical id */
+  int id;
+  int per_frame_count;
 
-    /* Parameter tree associated with this custom wave */
-    std::map<std::string,Param*> param_tree;
+  /* Parameter tree associated with this custom wave */
+  std::map<std::string,Param*> param_tree;
 
-    /* Engine variables */
-    float x; /* x position for per point equations */
-    float y; /* y position for per point equations */
-    float r; /* red color value */
-    float g; /* green color value */
-    float b; /* blue color value */
-    float a; /* alpha color value */
-    float * x_mesh;
-    float * y_mesh;
-    float * r_mesh;
-    float * b_mesh;
-    float * g_mesh;
-    float * a_mesh;
-    float * value1;
-    float * value2;
-    float * sample_mesh;
+  /* Engine variables */
+  float x; /* x position for per point equations */
+  float y; /* y position for per point equations */
+  float r; /* red color value */
+  float g; /* green color value */
+  float b; /* blue color value */
+  float a; /* alpha color value */
+  float * x_mesh;
+  float * y_mesh;
+  float * r_mesh;
+  float * b_mesh;
+  float * g_mesh;
+  float * a_mesh;
+  float * value1;
+  float * value2;
+  float * sample_mesh;
 
-    bool enabled; /* if true then wave is visible, hidden otherwise */
+  bool  enabled; /* if true then wave is visible, hidden otherwise */
 
-    float sample;
+  float sample;
 
-    /* stupid t variables */
-    float t1;
-    float t2;
-    float t3;
-    float t4;
-    float t5;
-    float t6;
-    float t7;
-    float t8;
+  /* stupid t variables */
+  float t1;
+  float t2;
+  float t3;
+  float t4;
+  float t5;
+  float t6;
+  float t7;
+  float t8;
 
 
-    /* stupider q variables */
-    float q[NUM_Q_VARIABLES];
+  /* stupider q variables */
+  float q[NUM_Q_VARIABLES];
 
-    float v1,v2;
+  float v1,v2;
 
-    /* Data structures to hold per frame and per point equations */
-    std::map<std::string,InitCond*>  init_cond_tree;
-    std::vector<PerFrameEqn*>  per_frame_eqn_tree;
-    std::vector<PerPointEqn*>  per_point_eqn_tree;
-    std::map<std::string,InitCond*>  per_frame_init_eqn_tree;
+  /* Data structures to hold per frame and per point equations */
+  std::map<std::string,InitCond*> init_cond_tree;
+  std::vector<PerFrameEqn*>       per_frame_eqn_tree;
+  std::vector<PerPointEqn*>       per_point_eqn_tree;
+  std::map<std::string,InitCond*> per_frame_init_eqn_tree;
 
-    /* Denotes the index of the last character for each string buffer */
-    int per_point_eqn_string_index;
-    int per_frame_eqn_string_index;
-    int per_frame_init_eqn_string_index;
+  /* Denotes the index of the last character for each string buffer */
+  int per_point_eqn_string_index;
+  int per_frame_eqn_string_index;
+  int per_frame_init_eqn_string_index;
 
-    int add_per_point_eqn(char * name, GenExpr * gen_expr);
-    void evalCustomWaveInitConditions(Preset *preset);
-    
+  int add_per_point_eqn(char * name, GenExpr * gen_expr);
+  void evalCustomWaveInitConditions(Preset *preset);
 
-    void loadUnspecInitConds();
 
-    void evalInitConds();
+  void loadUnspecInitConds();
 
+  void evalInitConds();
 };
 
 #endif /** !_CUSTOM_WAVE_H */
diff --git a/src/libprojectM/MilkdropPresetFactory/Eval.cpp b/src/libprojectM/MilkdropPresetFactory/Eval.cpp
index 1810f74..3183754 100644
--- a/src/libprojectM/MilkdropPresetFactory/Eval.cpp
+++ b/src/libprojectM/MilkdropPresetFactory/Eval.cpp
@@ -34,58 +34,61 @@
 
 #include "BuiltinFuncs.hpp"
 
-InfixOp *Eval::infix_add = NULL;
-InfixOp *Eval::infix_minus = NULL;
-InfixOp *Eval::infix_div = NULL;
-InfixOp *Eval::infix_mult = NULL;
-InfixOp *Eval::infix_or = NULL;
-InfixOp *Eval::infix_and = NULL;
-InfixOp *Eval::infix_mod = NULL;
+
+InfixOp *Eval::infix_add      = NULL;
+InfixOp *Eval::infix_minus    = NULL;
+InfixOp *Eval::infix_div      = NULL;
+InfixOp *Eval::infix_mult     = NULL;
+InfixOp *Eval::infix_or       = NULL;
+InfixOp *Eval::infix_and      = NULL;
+InfixOp *Eval::infix_mod      = NULL;
 InfixOp *Eval::infix_negative = NULL;
 InfixOp *Eval::infix_positive = NULL;
 
+
 /* Initializes all infix operators */
-int Eval::init_infix_ops() {
+int
+Eval::init_infix_ops()
+{
+  Eval::infix_add       = new InfixOp (INFIX_ADD, 4);
+  Eval::infix_minus     = new InfixOp (INFIX_MINUS, 3);
+  Eval::infix_div       = new InfixOp (INFIX_DIV, 2);
+  Eval::infix_or        = new InfixOp (INFIX_OR, 5);
+  Eval::infix_and       = new InfixOp (INFIX_AND,4);
+  Eval::infix_mod       = new InfixOp (INFIX_MOD, 1);
+  Eval::infix_mult      = new InfixOp (INFIX_MULT, 2);
 
-	Eval::infix_add = new InfixOp(INFIX_ADD, 4);
-	Eval::infix_minus = new InfixOp(INFIX_MINUS, 3);
-	Eval::infix_div = new InfixOp(INFIX_DIV, 2);
-	Eval::infix_or = new InfixOp(INFIX_OR, 5);
-	Eval::infix_and = new InfixOp(INFIX_AND,4);
-	Eval::infix_mod = new InfixOp(INFIX_MOD, 1);
-	Eval::infix_mult = new InfixOp(INFIX_MULT, 2);
-	
-	/* Prefix operators */
-	Eval::infix_positive = new InfixOp(INFIX_ADD, 0);
-	Eval::infix_negative = new InfixOp(INFIX_MINUS, 0);
+  /* Prefix operators */
+  Eval::infix_positive  = new InfixOp (INFIX_ADD, 0);
+  Eval::infix_negative  = new InfixOp (INFIX_MINUS, 0);
 
-	return PROJECTM_SUCCESS;
+  return PROJECTM_SUCCESS;
 }
 
 /* Destroys the infix operator list. This should
    be done on program exit */
-int Eval::destroy_infix_ops()
+int
+Eval::destroy_infix_ops()
 {
+  delete (Eval::infix_add);
+  delete (Eval::infix_minus);
+  delete (Eval::infix_div);
+  delete (Eval::infix_or);
+  delete (Eval::infix_and);
+  delete (Eval::infix_mod);
+  delete (Eval::infix_mult);
+  delete (Eval::infix_positive);
+  delete (Eval::infix_negative);
 
-  delete(Eval::infix_add);
-  delete(Eval::infix_minus);
-  delete(Eval::infix_div);
-  delete(Eval::infix_or);
-  delete(Eval::infix_and);
-  delete(Eval::infix_mod);
-  delete(Eval::infix_mult);
-  delete(Eval::infix_positive);
-  delete(Eval::infix_negative);
-
-  Eval::infix_add = NULL;
-  Eval::infix_minus = NULL;
-  Eval::infix_div = NULL;
-  Eval::infix_or = NULL;
-  Eval::infix_and = NULL;
-  Eval::infix_mod = NULL;
-  Eval::infix_mult = NULL;
-  Eval::infix_positive = NULL;
-  Eval::infix_negative = NULL;
+  Eval::infix_add       = NULL;
+  Eval::infix_minus     = NULL;
+  Eval::infix_div       = NULL;
+  Eval::infix_or        = NULL;
+  Eval::infix_and       = NULL;
+  Eval::infix_mod       = NULL;
+  Eval::infix_mult      = NULL;
+  Eval::infix_positive  = NULL;
+  Eval::infix_negative  = NULL;
 
   return PROJECTM_SUCCESS;
 }
diff --git a/src/libprojectM/MilkdropPresetFactory/Eval.hpp b/src/libprojectM/MilkdropPresetFactory/Eval.hpp
index 51bd22f..6be653c 100644
--- a/src/libprojectM/MilkdropPresetFactory/Eval.hpp
+++ b/src/libprojectM/MilkdropPresetFactory/Eval.hpp
@@ -36,59 +36,62 @@
 #include "Func.hpp"
 #include "Param.hpp"
 
-#define EVAL_DEBUG 0
+
+#define EVAL_DEBUG      0
 //#define EVAL_DEBUG_DOUBLE 2
 
-#define VAL_T 1
-#define PREFUN_T 3
-#define TREE_T 4
-#define NONE_T 0
+#define VAL_T           1
+#define PREFUN_T        3
+#define TREE_T          4
+#define NONE_T          0
 
 #define CONSTANT_TERM_T 0
-#define PARAM_TERM_T 1
+#define PARAM_TERM_T    1
 
-#define INFIX_ADD 0
-#define INFIX_MINUS 1
-#define INFIX_MOD 2
-#define INFIX_DIV 3
-#define INFIX_MULT 4
-#define INFIX_OR 5
-#define INFIX_AND 6
+#define INFIX_ADD       0
+#define INFIX_MINUS     1
+#define INFIX_MOD       2
+#define INFIX_DIV       3
+#define INFIX_MULT      4
+#define INFIX_OR        5
+#define INFIX_AND       6
+
 
 class DLLEXPORT InfixOp;
 
+
 class Eval {
 public:
-    static InfixOp *infix_add,
-                   *infix_minus,
-                   *infix_div,
-                   *infix_mult,
-                   *infix_or,
-                   *infix_and,
-                   *infix_mod,
-                   *infix_negative,
-                   *infix_positive;
+  static InfixOp *infix_add,
+                 *infix_minus,
+                 *infix_div,
+                 *infix_mult,
+                 *infix_or,
+                 *infix_and,
+                 *infix_mod,
+                 *infix_negative,
+                 *infix_positive;
 
-    float eval_gen_expr(GenExpr * gen_expr);
-    inline GenExpr * opt_gen_expr(GenExpr * gen_expr, int ** param_list);
+  float eval_gen_expr(GenExpr * gen_expr);
+  inline GenExpr * opt_gen_expr(GenExpr * gen_expr, int ** param_list);
 
-    GenExpr * const_to_expr(float val);
-    GenExpr * param_to_expr(Param * param);
-    GenExpr * prefun_to_expr(float (*func_ptr)(), GenExpr ** expr_list, int num_args);
+  GenExpr * const_to_expr(float val);
+  GenExpr * param_to_expr(Param * param);
+  GenExpr * prefun_to_expr(float (*func_ptr)(), GenExpr ** expr_list, int num_args);
 
-    static TreeExpr * new_tree_expr(InfixOp * infix_op, GenExpr * gen_expr, TreeExpr * left, TreeExpr * right);
-    static GenExpr * new_gen_expr(int type, void * item);
-    static ValExpr * new_val_expr(int type, Term *term);
+  static TreeExpr * new_tree_expr(InfixOp * infix_op, GenExpr * gen_expr, TreeExpr * left, TreeExpr * right);
+  static GenExpr * new_gen_expr(int type, void * item);
+  static ValExpr * new_val_expr(int type, Term *term);
 
-    static InfixOp * new_infix_op(int type, int precedence);
-    static int init_infix_ops();
-    static int destroy_infix_ops();
-    void reset_engine_vars();
-    
-    GenExpr * clone_gen_expr(GenExpr * gen_expr);
-    TreeExpr * clone_tree_expr(TreeExpr * tree_expr);
-    ValExpr * clone_val_expr(ValExpr * val_expr);
-    PrefunExpr * clone_prefun_expr(PrefunExpr * prefun_expr);
-  };
+  static InfixOp * new_infix_op(int type, int precedence);
+  static int init_infix_ops();
+  static int destroy_infix_ops();
+  void reset_engine_vars();
+
+  GenExpr * clone_gen_expr(GenExpr * gen_expr);
+  TreeExpr * clone_tree_expr(TreeExpr * tree_expr);
+  ValExpr * clone_val_expr(ValExpr * val_expr);
+  PrefunExpr * clone_prefun_expr(PrefunExpr * prefun_expr);
+};
 
 #endif /** !_EVAL_H */
diff --git a/src/libprojectM/MilkdropPresetFactory/Expr.cpp b/src/libprojectM/MilkdropPresetFactory/Expr.cpp
index 58142ad..877fc12 100644
--- a/src/libprojectM/MilkdropPresetFactory/Expr.cpp
+++ b/src/libprojectM/MilkdropPresetFactory/Expr.cpp
@@ -27,308 +27,310 @@
 #include <iostream>
 #include "Eval.hpp"
 
-float GenExpr::eval_gen_expr ( int mesh_i, int mesh_j )
+
+float
+GenExpr::eval_gen_expr ( int mesh_i, int mesh_j )
 {
-	float l;
+  float l;
 
-	assert ( item );
-	switch ( this->type )
-	{
-		case VAL_T:
-			return ( ( ValExpr* ) item )->eval_val_expr ( mesh_i, mesh_j );
-		case PREFUN_T:
-			l = ( ( PrefunExpr * ) item )->eval_prefun_expr ( mesh_i, mesh_j );
-			//if (EVAL_DEBUG) DWRITE( "eval_gen_expr: prefix function return value: %f\n", l);
-			return l;
-		case TREE_T:
-			return ( ( TreeExpr* ) ( item ) )->eval_tree_expr ( mesh_i, mesh_j );
-		default:
-			return EVAL_ERROR;
-	}
-
+  assert ( item );
+  switch ( this->type )
+  {
+  case VAL_T:
+    return ( ( ValExpr* ) item )->eval_val_expr ( mesh_i, mesh_j );
+  case PREFUN_T:
+    l = ( ( PrefunExpr * ) item )->eval_prefun_expr ( mesh_i, mesh_j );
+    //if (EVAL_DEBUG) DWRITE( "eval_gen_expr: prefix function return value: %f\n", l);
+    return l;
+  case TREE_T:
+    return ( ( TreeExpr* ) ( item ) )->eval_tree_expr ( mesh_i, mesh_j );
+  default:
+    return EVAL_ERROR;
+  }
 }
 
 /* Evaluates functions in prefix form */
-float PrefunExpr::eval_prefun_expr ( int mesh_i, int mesh_j )
+float
+PrefunExpr::eval_prefun_expr ( int mesh_i, int mesh_j )
 {
+  assert ( func_ptr );
 
+  float * arg_list = new float[this->num_args];
 
-	assert ( func_ptr );
+  assert(arg_list);
 
-	float * arg_list = new float[this->num_args];
+  //printf("numargs %d", num_args);
 
-	assert(arg_list);
+  /* Evaluate each argument before calling the function itself */
+  for ( int i = 0; i < num_args; i++ )
+  {
+    arg_list[i] = expr_list[i]->eval_gen_expr ( mesh_i, mesh_j );
+    //printf("numargs %x", arg_list[i]);
+  }
+  /* Now we call the function, passing a list of
+     floats as its argument */
 
-	//printf("numargs %d", num_args);
+  const float value = ( func_ptr ) ( arg_list );
 
-	/* Evaluate each argument before calling the function itself */
-	for ( int i = 0; i < num_args; i++ )
-	{
-		arg_list[i] = expr_list[i]->eval_gen_expr ( mesh_i, mesh_j );
-		//printf("numargs %x", arg_list[i]);
-
-
-	}
-	/* Now we call the function, passing a list of
-	   floats as its argument */
-
-	const float value = ( func_ptr ) ( arg_list );
-
-	delete[](arg_list);
-	return value;
+  delete[](arg_list);
+  return value;
 }
 
 
 /* Evaluates a value expression */
-float ValExpr::eval_val_expr ( int mesh_i, int mesh_j )
+float
+ValExpr::eval_val_expr ( int mesh_i, int mesh_j )
 {
+  /* Value is a constant, return the float value */
+  if ( type == CONSTANT_TERM_T )
+  {
+    return ( term.constant );
+  }
 
+  /* Value is variable, dereference it */
+  if ( type == PARAM_TERM_T )
+  {
+    switch ( term.param->type )
+    {
+    case P_TYPE_BOOL:
+      return ( float ) ( * ( ( bool* ) ( term.param->engine_val ) ) );
 
-	/* Value is a constant, return the float value */
-	if ( type == CONSTANT_TERM_T )
-	{
-		return ( term.constant );
-	}
+    case P_TYPE_INT:
+      return ( float ) ( * ( ( int* ) ( term.param->engine_val ) ) );
 
-	/* Value is variable, dereference it */
-	if ( type == PARAM_TERM_T )
-	{
-		switch ( term.param->type )
-		{
+    case P_TYPE_DOUBLE:
+      if ( term.param->matrix_flag | ( term.param->flags & P_FLAG_ALWAYS_MATRIX ) )
+      {
+        /* Sanity check the matrix is there... */
+        assert ( term.param->matrix != NULL );
 
-			case P_TYPE_BOOL:
+        /// @slow boolean check could be expensive in this critical (and common) step of evaluation
+        if ( mesh_i >= 0 )
+        {
+          if ( mesh_j >= 0 )
+          {
+            return ( ( ( float** ) term.param->matrix ) [mesh_i][mesh_j] );
+          }
+          else
+          {
+            return ( ( ( float* ) term.param->matrix ) [mesh_i] );
+          }
+        }
+        //assert(mesh_i >=0);
+      }
+      //std::cout << term.param->name << ": " << (*((float*)term.param->engine_val)) << std::endl;
+      return * ( ( float* ) ( term.param->engine_val ) );
 
-
-				return ( float ) ( * ( ( bool* ) ( term.param->engine_val ) ) );
-			case P_TYPE_INT:
-
-
-				return ( float ) ( * ( ( int* ) ( term.param->engine_val ) ) );
-			case P_TYPE_DOUBLE:
-
-				
-				if ( term.param->matrix_flag | ( term.param->flags & P_FLAG_ALWAYS_MATRIX ) )
-				{
-
-					/* Sanity check the matrix is there... */
-					assert ( term.param->matrix != NULL );
-
-					/// @slow boolean check could be expensive in this critical (and common) step of evaluation
-					if ( mesh_i >= 0 )
-					{
-						if ( mesh_j >= 0 )
-						{
-							return ( ( ( float** ) term.param->matrix ) [mesh_i][mesh_j] );
-						}
-						else
-						{
-							return ( ( ( float* ) term.param->matrix ) [mesh_i] );
-						}
-					}
-					//assert(mesh_i >=0);
-				}
-				//std::cout << term.param->name << ": " << (*((float*)term.param->engine_val)) << std::endl;
-				return * ( ( float* ) ( term.param->engine_val ) );			
-			default:
-				return EVAL_ERROR;
-		}
-	}
-	/* Unknown type, return failure */
-	return PROJECTM_FAILURE;
+    default:
+      return EVAL_ERROR;
+    }
+  }
+  /* Unknown type, return failure */
+  return PROJECTM_FAILURE;
 }
 
 /* Evaluates an expression tree */
-float TreeExpr::eval_tree_expr ( int mesh_i, int mesh_j )
+float
+TreeExpr::eval_tree_expr ( int mesh_i, int mesh_j )
 {
 
-	float left_arg, right_arg;
+  float left_arg, right_arg;
 
-	/* A leaf node, evaluate the general expression. If the expression is null as well, return zero */
-	if ( infix_op == NULL )
-	{
-		if ( gen_expr == NULL )
-			return 0;
-		else
-			return gen_expr->eval_gen_expr ( mesh_i, mesh_j );
-	}
+  /* A leaf node, evaluate the general expression. If the expression is null as well, return zero */
+  if ( infix_op == NULL )
+  {
+    if ( gen_expr == NULL )
+      return 0;
+    else
+      return gen_expr->eval_gen_expr ( mesh_i, mesh_j );
+  }
 
-	/* Otherwise, this node is an infix operator. Evaluate
-	   accordingly */
+  /* Otherwise, this node is an infix operator. Evaluate
+     accordingly */
 
-	assert(left);
-	left_arg = left->eval_tree_expr ( mesh_i, mesh_j );
+  assert(left);
+  left_arg = left->eval_tree_expr ( mesh_i, mesh_j );
 
-	assert(right);
-	right_arg = right->eval_tree_expr ( mesh_i, mesh_j );
+  assert(right);
+  right_arg = right->eval_tree_expr ( mesh_i, mesh_j );
 
 
-	switch ( infix_op->type )
-	{
-		case INFIX_ADD:
-			return ( left_arg + right_arg );
-		case INFIX_MINUS:
-			return ( left_arg - right_arg );
-		case INFIX_MULT:
-			return ( left_arg * right_arg );
-		case INFIX_MOD:
-			if ( ( int ) right_arg == 0 )
-			{
-				return PROJECTM_DIV_BY_ZERO;
-			}
-			return ( ( int ) left_arg % ( int ) right_arg );
-		case INFIX_OR:
-			return ( ( int ) left_arg | ( int ) right_arg );
-		case INFIX_AND:
-			return ( ( int ) left_arg & ( int ) right_arg );
-		case INFIX_DIV:
-			if ( right_arg == 0 )
-			{
-				return MAX_DOUBLE_SIZE;
-			}
-			return ( left_arg / right_arg );
-		default:
-			return EVAL_ERROR;
-	}
+  switch ( infix_op->type )
+  {
+  case INFIX_ADD:
+    return ( left_arg + right_arg );
+  case INFIX_MINUS:
+    return ( left_arg - right_arg );
+  case INFIX_MULT:
+    return ( left_arg * right_arg );
+  case INFIX_MOD:
+    if ( ( int ) right_arg == 0 )
+    {
+      return PROJECTM_DIV_BY_ZERO;
+    }
+    return ( ( int ) left_arg % ( int ) right_arg );
+  case INFIX_OR:
+    return ( ( int ) left_arg | ( int ) right_arg );
+  case INFIX_AND:
+    return ( ( int ) left_arg & ( int ) right_arg );
+  case INFIX_DIV:
+    if ( right_arg == 0 )
+    {
+      return MAX_DOUBLE_SIZE;
+    }
+    return ( left_arg / right_arg );
+  default:
+    return EVAL_ERROR;
+  }
 
-	return EVAL_ERROR;
+  return EVAL_ERROR;
 }
 
 /* Converts a float value to a general expression */
-GenExpr * GenExpr::const_to_expr ( float val )
+GenExpr *
+GenExpr::const_to_expr ( float val )
 {
 
-	GenExpr * gen_expr;
-	ValExpr * val_expr;
-	Term term;
+  GenExpr * gen_expr;
+  ValExpr * val_expr;
+  Term term;
 
-	term.constant = val;
+  term.constant = val;
 
-	if ( ( val_expr = new ValExpr ( CONSTANT_TERM_T, &term ) ) == NULL )
-		return NULL;
+  if ( ( val_expr = new ValExpr ( CONSTANT_TERM_T, &term ) ) == NULL )
+    return NULL;
 
-	gen_expr = new GenExpr ( VAL_T, ( void* ) val_expr );
+  gen_expr = new GenExpr ( VAL_T, ( void* ) val_expr );
 
-	if ( gen_expr == NULL )
-	{
-		delete val_expr;
-	}
+  if ( gen_expr == NULL )
+  {
+    delete val_expr;
+  }
 
-	return gen_expr;
+  return gen_expr;
 }
 
 /* Converts a regular parameter to an expression */
-GenExpr * GenExpr::param_to_expr ( Param * param )
+GenExpr *
+GenExpr::param_to_expr ( Param * param )
 {
 
-	GenExpr * gen_expr = NULL;
-	ValExpr * val_expr = NULL;
-	Term term;
+  GenExpr * gen_expr = NULL;
+  ValExpr * val_expr = NULL;
+  Term term;
 
-	if ( param == NULL )
-		return NULL;
+  if ( param == NULL )
+    return NULL;
 
-	/* This code is still a work in progress. We need
-	   to figure out if the initial condition is used for
-	   each per frame equation or not. I am guessing that
-	   it isn't, and it is thusly implemented this way */
+  /* This code is still a work in progress. We need
+     to figure out if the initial condition is used for
+     each per frame equation or not. I am guessing that
+     it isn't, and it is thusly implemented this way */
 
-	/* Current guess of true behavior (08/01/03) note from carm
-	   First try to use the per_pixel_expr (with cloning)
-	   If it is null however, use the engine variable instead. */
+  /* Current guess of true behavior (08/01/03) note from carm
+     First try to use the per_pixel_expr (with cloning)
+     If it is null however, use the engine variable instead. */
 
-	/* 08/20/03 : Presets are now objects, as well as per pixel equations. This ends up
-	   making the parser handle the case where parameters are essentially per pixel equation
-	   substitutions */
+  /* 08/20/03 : Presets are now objects, as well as per pixel equations. This ends up
+     making the parser handle the case where parameters are essentially per pixel equation
+     substitutions */
 
 
-	term.param = param;
-	if ( ( val_expr = new ValExpr ( PARAM_TERM_T, &term ) ) == NULL )
-		return NULL;
+  term.param = param;
+  if ( ( val_expr = new ValExpr ( PARAM_TERM_T, &term ) ) == NULL )
+    return NULL;
 
-	if ( ( gen_expr = new GenExpr ( VAL_T, ( void* ) val_expr ) ) == NULL )
-	{
-		delete val_expr;
-		return NULL;
-	}
-	return gen_expr;
+  if ( ( gen_expr = new GenExpr ( VAL_T, ( void* ) val_expr ) ) == NULL )
+  {
+    delete val_expr;
+    return NULL;
+  }
+  return gen_expr;
 }
 
 /* Converts a prefix function to an expression */
-GenExpr * GenExpr::prefun_to_expr ( float ( *func_ptr ) ( void * ), GenExpr ** expr_list, int num_args )
+GenExpr *
+GenExpr::prefun_to_expr ( float ( *func_ptr ) ( void * ), GenExpr ** expr_list, int num_args )
 {
 
-	GenExpr * gen_expr;
-	PrefunExpr * prefun_expr;
+  GenExpr * gen_expr;
+  PrefunExpr * prefun_expr;
 
-	prefun_expr = new PrefunExpr();
+  prefun_expr = new PrefunExpr();
 
-	if ( prefun_expr == NULL )
-		return NULL;
+  if ( prefun_expr == NULL )
+    return NULL;
 
-	prefun_expr->num_args = num_args;
-	prefun_expr->func_ptr = ( float ( * ) ( void* ) ) func_ptr;
-	prefun_expr->expr_list = expr_list;
+  prefun_expr->num_args = num_args;
+  prefun_expr->func_ptr = ( float ( * ) ( void* ) ) func_ptr;
+  prefun_expr->expr_list = expr_list;
 
-	gen_expr = new GenExpr ( PREFUN_T, ( void* ) prefun_expr );
+  gen_expr = new GenExpr ( PREFUN_T, ( void* ) prefun_expr );
 
-	if ( gen_expr == NULL )
-		delete prefun_expr;
+  if ( gen_expr == NULL )
+    delete prefun_expr;
 
-	return gen_expr;
+  return gen_expr;
 }
 
 /* Creates a new tree expression */
-TreeExpr::TreeExpr ( InfixOp * _infix_op, GenExpr * _gen_expr, TreeExpr * _left, TreeExpr * _right ) :
-		infix_op ( _infix_op ), gen_expr ( _gen_expr ),
-	left ( _left ), right ( _right ) {}
+TreeExpr::TreeExpr (
+InfixOp   * _infix_op,
+GenExpr   * _gen_expr,
+TreeExpr  * _left,
+TreeExpr  * _right
+)
+  : infix_op ( _infix_op ),
+    gen_expr ( _gen_expr ),
+    left ( _left ),
+    right ( _right )
+{}
 
 
 /* Creates a new value expression */
 ValExpr::ValExpr ( int _type, Term * _term ) :type ( _type )
 {
+  //val_expr->type = _type;
+  term.constant = _term->constant;
+  term.param = _term->param;
 
-
-	//val_expr->type = _type;
-	term.constant = _term->constant;
-	term.param = _term->param;
-
-	//return val_expr;
+  //return val_expr;
 }
 
 /* Creates a new general expression */
 
-GenExpr::GenExpr ( int _type, void * _item ) :type ( _type ), item ( _item ) {}
+GenExpr::GenExpr ( int _type, void * _item )
+  : type ( _type ), item ( _item )
+{}
 
 /* Frees a general expression */
 GenExpr::~GenExpr()
 {
-
-	switch ( type )
-	{
-		case VAL_T:
-			delete ( ( ValExpr* ) item );
-			break;
-		case PREFUN_T:
-			delete ( ( PrefunExpr* ) item );
-			break;
-		case TREE_T:
-			delete ( ( TreeExpr* ) item );
-			break;
-	}
+  switch ( type )
+  {
+  case VAL_T:
+    delete ( ( ValExpr* ) item );
+    break;
+  case PREFUN_T:
+    delete ( ( PrefunExpr* ) item );
+    break;
+  case TREE_T:
+    delete ( ( TreeExpr* ) item );
+    break;
+  }
 }
 
 /* Frees a function in prefix notation */
 PrefunExpr::~PrefunExpr()
 {
+  int i;
 
-	int i;
-
-	/* Free every element in expression list */
-	for ( i = 0 ; i < num_args; i++ )
-	{
-		delete expr_list[i];
-	}
-	free ( expr_list );
+  /* Free every element in expression list */
+  for ( i = 0 ; i < num_args; i++ )
+  {
+    delete expr_list[i];
+  }
+  free ( expr_list );
 }
 
 /* Frees values of type VARIABLE and CONSTANT */
@@ -338,36 +340,34 @@
 /* Frees a tree expression */
 TreeExpr::~TreeExpr()
 {
+  /* free left tree */
+  if ( left != NULL )
+  {
+    delete left;
+  }
 
-	/* free left tree */
-	if ( left != NULL )
-	{
-		delete left;
-	}
+  /* free general expression object */
+  if ( gen_expr != NULL )
+  {
+    delete gen_expr;
+  }
 
-	/* free general expression object */
-	if ( gen_expr != NULL )
-	{
-		delete gen_expr;
-	}
+  /* Note that infix operators are always
+     stored in memory unless the program
+     exits, so we don't remove them here */
 
-	/* Note that infix operators are always
-	   stored in memory unless the program
-	   exits, so we don't remove them here */
-
-	/* free right tree */
-	if ( right != NULL )
-	{
-		delete right;
-	}
+  /* free right tree */
+  if ( right != NULL )
+  {
+    delete right;
+  }
 }
 
 /* Initializes an infix operator */
 InfixOp::InfixOp ( int type, int precedence )
 {
-
-	this->type = type;
-	this->precedence = precedence;
+  this->type = type;
+  this->precedence = precedence;
 }
 
 
diff --git a/src/libprojectM/MilkdropPresetFactory/Expr.hpp b/src/libprojectM/MilkdropPresetFactory/Expr.hpp
index b732531..be6af29 100644
--- a/src/libprojectM/MilkdropPresetFactory/Expr.hpp
+++ b/src/libprojectM/MilkdropPresetFactory/Expr.hpp
@@ -25,13 +25,13 @@
  *
  * $Log$
  */
-
 #ifndef _EXPR_H
 #define _EXPR_H
 
 #include "dlldefs.h"
 #include "CValue.hpp"
 
+
 class Param;
 
 #define CONST_STACK_ELEMENT 0
@@ -39,6 +39,7 @@
 
 #define EVAL_ERROR -1
 
+
 /* Infix Operator Function */
 class InfixOp
 {
@@ -70,7 +71,7 @@
 
   GenExpr( int type, void *item );
   float eval_gen_expr(int mesh_i, int mesh_j);
- 
+
   static GenExpr *const_to_expr( float val );
   static GenExpr *param_to_expr( Param *param );
   static GenExpr *prefun_to_expr( float (*func_ptr)(void *), GenExpr **expr_list, int num_args );
@@ -85,7 +86,7 @@
 
   ~ValExpr();
   ValExpr( int type, Term *term );
-  
+
   float eval_val_expr(int mesh_i, int mesh_j);
 };
 
@@ -100,7 +101,7 @@
   ~TreeExpr();
   TreeExpr( InfixOp *infix_op, GenExpr *gen_expr,
                                   TreeExpr *left, TreeExpr *right );
-  
+
   float eval_tree_expr(int mesh_i, int mesh_j);
 };
 
diff --git a/src/libprojectM/MilkdropPresetFactory/Func.cpp b/src/libprojectM/MilkdropPresetFactory/Func.cpp
index 71a9b29..4385f6f 100644
--- a/src/libprojectM/MilkdropPresetFactory/Func.cpp
+++ b/src/libprojectM/MilkdropPresetFactory/Func.cpp
@@ -30,8 +30,9 @@
 #include "Func.hpp"
 #include <map>
 
+
 Func::Func (const std::string & _name, float (*_func_ptr)(float*), int _num_args):
-	name(_name), func_ptr(_func_ptr), num_args(_num_args) {}
+  name(_name), func_ptr(_func_ptr), num_args(_num_args) {}
 
 /* Frees a function type, real complicated... */
 Func::~Func() {}
diff --git a/src/libprojectM/MilkdropPresetFactory/Func.hpp b/src/libprojectM/MilkdropPresetFactory/Func.hpp
index ae571b7..6a240f4 100644
--- a/src/libprojectM/MilkdropPresetFactory/Func.hpp
+++ b/src/libprojectM/MilkdropPresetFactory/Func.hpp
@@ -32,32 +32,33 @@
 #include "Common.hpp"
 #include <string>
 
+
 /* Function Type */
 class DLLEXPORT Func {
 public:
 
-    /// Create a new function wrapper object
-    /// \param name a name to uniquely identify the function. 
-    /// \param func_ptr a pointer to a function of floating point arguments
-    /// \param num_args the number of floating point arguments this function requires
-    Func(const std::string & name, float (*func_ptr)(float*), int num_args );
+  /// Create a new function wrapper object
+  /// \param name a name to uniquely identify the function.
+  /// \param func_ptr a pointer to a function of floating point arguments
+  /// \param num_args the number of floating point arguments this function requires
+  Func(const std::string & name, float (*func_ptr)(float*), int num_args );
 
-    /* Public Prototypes */
-    ~Func();
+  /* Public Prototypes */
+  ~Func();
 
-	inline const std::string & getName() const {
-		return name;
-	}
+  inline const std::string & getName() const {
+    return name;
+  }
 
-	inline int getNumArgs() const {
-		return num_args;
-	}
+  inline int getNumArgs() const {
+    return num_args;
+  }
 
-    float (*func_ptr)(float*);
-private:	
-    std::string name;
-    int num_args;
+  float (*func_ptr)(float*);
 
+private:
+  std::string name;
+  int num_args;
 };
 
 #endif /** !_FUNC_H */
diff --git a/src/libprojectM/MilkdropPresetFactory/IdlePreset.cpp b/src/libprojectM/MilkdropPresetFactory/IdlePreset.cpp
index 5a48532..4dcd008 100644
--- a/src/libprojectM/MilkdropPresetFactory/IdlePreset.cpp
+++ b/src/libprojectM/MilkdropPresetFactory/IdlePreset.cpp
@@ -2,208 +2,211 @@
 #include <sstream>
 #include <string>
 #include "MilkdropPreset.hpp"
+
+
 const std::string IdlePresets::IDLE_PRESET_NAME
-	("Geiss & Sperl - Feedback (projectM idle HDR mix).milk");
+  ("Geiss & Sperl - Feedback (projectM idle HDR mix).milk");
 
-std::string IdlePresets::presetText() {
 
-std::ostringstream out;
+std::string
+IdlePresets::presetText()
+{
+  std::ostringstream out;
 
-out << "[preset00]\n" <<
-"fRating=2.000000\n" <<
-"fGammaAdj=1.700000\n" <<
-"fDecay=0.940000\n" <<
-"fVideoEchoZoom=1.000000\n" <<
-"fVideoEchoAlpha=0.000000\n" <<
-"nVideoEchoOrientation=0\n" <<
-"nWaveMode=0\n" <<
-"bAdditiveWaves=1\n" <<
-"bWaveDots=0\n" <<
-"bWaveThick=0\n" <<
-"bModWaveAlphaByVolume=0\n" <<
-"bMaximizeWaveColor=0\n" <<
-"bTexWrap=1\n" <<
-"bDarkenCenter=0\n" <<
-"bRedBlueStereo=0\n" <<
-"bBrighten=0\n" <<
-"bDarken=0\n" <<
-"bSolarize=0\n" <<
-"bInvert=0\n" <<
-"fWaveAlpha=0.001000\n" <<
-"fWaveScale=0.010000\n" <<
-"fWaveSmoothing=0.630000\n" <<
-"fWaveParam=-1.000000\n" <<
-"fModWaveAlphaStart=0.710000\n" <<
-"fModWaveAlphaEnd=1.300000\n" <<
-"fWarpAnimSpeed=1.000000\n" <<
-"fWarpScale=1.331000\n" <<
-"fZoomExponent=1.000000\n" <<
-"fShader=0.000000\n" <<
-"zoom=13.290894\n" <<
-"rot=-0.020000\n" <<
-"cx=0.500000\n" <<
-"cy=0.500000\n" <<
-"dx=-0.280000\n" <<
-"dy=-0.320000\n" <<
-"warp=0.010000\n" <<
-"sx=1.000000\n" <<
-"sy=1.000000\n" <<
-"wave_r=0.650000\n" <<
-"wave_g=0.650000\n" <<
-"wave_b=0.650000\n" <<
-"wave_x=0.500000\n" <<
-"wave_y=0.500000\n" <<
-"ob_size=0.000000\n" <<
-"ob_r=0.010000\n" <<
-"ob_g=0.000000\n" <<
-"ob_b=0.000000\n" <<
-"ob_a=1.000000\n" <<
-"ib_size=0.000000\n" <<
-"ib_r=0.950000\n" <<
-"ib_g=0.850000\n" <<
-"ib_b=0.650000\n" <<
-"ib_a=1.000000\n" <<
-"nMotionVectorsX=64.000000\n" <<
-"nMotionVectorsY=0.000000\n" <<
-"mv_dx=0.000000\n" <<
-"mv_dy=0.000000\n" <<
-"mv_l=0.900000\n" <<
-"mv_r=1.000000\n" <<
-"mv_g=1.000000\n" <<
-"mv_b=1.000000\n" <<
-"mv_a=0.000000\n" <<
-"shapecode_3_enabled=1\n" <<
-"shapecode_3_sides=20\n" <<
-"shapecode_3_additive=0\n" <<
-"shapecode_3_thickOutline=0\n" <<
-"shapecode_3_textured=1\n" <<
-"shapecode_3_ImageURL=M.tga\n" <<
-"shapecode_3_x=0.68\n" <<
-"shapecode_3_y=0.5\n" <<
-"shapecode_3_rad=0.41222\n" <<
-"shapecode_3_ang=0\n" <<
-"shapecode_3_tex_ang=0\n" <<
-"shapecode_3_tex_zoom=0.71\n" <<
-"shapecode_3_r=1\n" <<
-"shapecode_3_g=1\n" <<
-"shapecode_3_b=1\n" <<
-"shapecode_3_a=1\n" <<
-"shapecode_3_r2=1\n" <<
-"shapecode_3_g2=1\n" <<
-"shapecode_3_b2=1\n" <<
-"shapecode_3_a2=1\n" <<
-"shapecode_3_border_r=0\n" <<
-"shapecode_3_border_g=0\n" <<
-"shapecode_3_border_b=0\n" <<
-"shapecode_3_border_a=0\n" <<
-"shape_3_per_frame1=x = x + q1;\n" <<
-"shape_3_per_frame2=y = y + q2;\n" <<
-"shape_3_per_frame3=r =0.5 + 0.5*sin(q8*0.613 + 1);\n" <<
-"shape_3_per_frame4=g = 0.5 + 0.5*sin(q8*0.763 + 2);\n" <<
-"shape_3_per_frame5=b = 0.5 + 0.5*sin(q8*0.771 + 5);\n" <<
-"shape_3_per_frame6=r2 = 0.5 + 0.5*sin(q8*0.635 + 4);\n" <<
-"shape_3_per_frame7=g2 = 0.5 + 0.5*sin(q8*0.616+ 1);\n" <<
-"shape_3_per_frame8=b2 = 0.5 + 0.5*sin(q8*0.538 + 3);\n" <<
-"shapecode_4_enabled=1\n" <<
-"shapecode_4_sides=4\n" <<
-"shapecode_4_additive=0\n" <<
-"shapecode_4_thickOutline=0\n" <<
-"shapecode_4_textured=1\n" <<
-"shapecode_4_ImageURL=headphones.tga\n" <<
-"shapecode_4_x=0.68\n" <<
-"shapecode_4_y=0.58\n" <<
-"shapecode_4_rad=0.6\n" <<
-"shapecode_4_ang=0\n" <<
-"shapecode_4_tex_ang=0\n" <<
-"shapecode_4_tex_zoom=0.71\n" <<
-"shapecode_4_r=1\n" <<
-"shapecode_4_g=1\n" <<
-"shapecode_4_b=1\n" <<
-"shapecode_4_a=1\n" <<
-"shapecode_4_r2=1\n" <<
-"shapecode_4_g2=1\n" <<
-"shapecode_4_b2=1\n" <<
-"shapecode_4_a2=1\n" <<
-"shapecode_4_border_r=0\n" <<
-"shapecode_4_border_g=0\n" <<
-"shapecode_4_border_b=0\n" <<
-"shapecode_4_border_a=0\n" <<
-"shape_4_per_frame1=x = x + q1;\n" <<
-"shape_4_per_frame2=y = y + q2;\n" <<
-"shape_4_per_frame3=rad = rad + bass * 0.1;\n" <<
-"shape_4_per_frame4=a = q3;\n" <<
-"shape_4_per_frame5=a2 = q3;\n" <<
-"shapecode_6_enabled=1\n" <<
-"shapecode_6_sides=4\n" <<
-"shapecode_6_additive=0\n" <<
-"shapecode_6_thickOutline=0\n" <<
-"shapecode_6_textured=1\n" <<
-"shapecode_6_ImageURL=project.tga\n" <<
-"shapecode_6_x=0.38\n" <<
-"shapecode_6_y=0.435\n" <<
-"shapecode_6_rad=0.8\n" <<
-"shapecode_6_ang=0\n" <<
-"shapecode_6_tex_ang=0\n" <<
-"shapecode_6_tex_zoom=0.71\n" <<
-"shapecode_6_r=1\n" <<
-"shapecode_6_g=1\n" <<
-"shapecode_6_b=1\n" <<
-"shapecode_6_a=1\n" <<
-"shapecode_6_r2=1\n" <<
-"shapecode_6_g2=1\n" <<
-"shapecode_6_b2=1\n" <<
-"shapecode_6_a2=1\n" <<
-"shapecode_6_border_r=0\n" <<
-"shapecode_6_border_g=0\n" <<
-"shapecode_6_border_b=0\n" <<
-"shapecode_6_border_a=0\n" <<
-"shape_6_per_frame1=x = x + q1;\n" <<
-"shape_6_per_frame2=y = y + q2;\n" <<
-"shape_6_per_frame3=a = q3;\n" <<
-"shape_6_per_frame4=a2 = q3;\n" <<
-"per_frame_1=ob_r = 0.5 + 0.4*sin(time*1.324);\n" <<
-"per_frame_2=ob_g = 0.5 + 0.4*cos(time*1.371);\n" <<
-"per_frame_3=ob_b = 0.5+0.4*sin(2.332*time);\n" <<
-"per_frame_4=ib_r = 0.5 + 0.25*sin(time*1.424);\n" <<
-"per_frame_5=ib_g = 0.25 + 0.25*cos(time*1.871);\n" <<
-"per_frame_6=ib_b = 1-ob_b;\n" <<
-"per_frame_7=volume = 0.15*(bass+bass_att+treb+treb_att+mid+mid_att);\n" <<
-"per_frame_8=xamptarg = if(equal(frame%15,0),min(0.5*volume*bass_att,0.5),xamptarg);\n" <<
-"per_frame_9=xamp = xamp + 0.5*(xamptarg-xamp);\n" <<
-"per_frame_10=xdir = if(above(abs(xpos),xamp),-sign(xpos),if(below(abs(xspeed),0.1),2*above(xpos,0)-1,xdir));\n" <<
-"per_frame_11=xaccel = xdir*xamp - xpos - xspeed*0.055*below(abs(xpos),xamp);\n" <<
-"per_frame_12=xspeed = xspeed + xdir*xamp - xpos - xspeed*0.055*below(abs(xpos),xamp);\n" <<
-"per_frame_13=xpos = xpos + 0.001*xspeed;\n" <<
-"per_frame_14=dx = xpos*0.05;\n" <<
-"per_frame_15=yamptarg = if(equal(frame%15,0),min(0.3*volume*treb_att,0.5),yamptarg);\n" <<
-"per_frame_16=yamp = yamp + 0.5*(yamptarg-yamp);\n" <<
-"per_frame_17=ydir = if(above(abs(ypos),yamp),-sign(ypos),if(below(abs(yspeed),0.1),2*above(ypos,0)-1,ydir));\n" <<
-"per_frame_18=yaccel = ydir*yamp - ypos - yspeed*0.055*below(abs(ypos),yamp);\n" <<
-"per_frame_19=yspeed = yspeed + ydir*yamp - ypos - yspeed*0.055*below(abs(ypos),yamp);\n" <<
-"per_frame_20=ypos = ypos + 0.001*yspeed;\n" <<
-"per_frame_21=dy = ypos*0.05;\n" <<
-"per_frame_22=wave_a = 0;\n" <<
-"per_frame_23=q8 = oldq8 + 0.0003*(pow(1+1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,6)/fps);\n" <<
-"per_frame_24=oldq8 = q8;\n" <<
-"per_frame_25=q7 = 0.003*(pow(1+1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,6)/fps);\n" <<
-"per_frame_26=rot = 0.4 + 1.5*sin(time*0.273) + 0.4*sin(time*0.379+3);\n" <<
-"per_frame_27=q1 = 0.05*sin(time*1.14);\n" <<
-"per_frame_28=q2 = 0.03*sin(time*0.93+2);\n" <<
-"per_frame_29=q3 = if(above(frame,60),1, frame/60.0);\n" <<
-"per_frame_30=oldq8 = if(above(oldq8,1000),0,oldq8);\n" <<
-"per_pixel_1=zoom =( log(sqrt(2)-rad) -0.24)*1;\n";
+  out << "[preset00]\n"
+      << "fRating=2.000000\n"
+      << "fGammaAdj=1.700000\n"
+      << "fDecay=0.940000\n"
+      << "fVideoEchoZoom=1.000000\n"
+      << "fVideoEchoAlpha=0.000000\n"
+      << "nVideoEchoOrientation=0\n"
+      << "nWaveMode=0\n"
+      << "bAdditiveWaves=1\n"
+      << "bWaveDots=0\n"
+      << "bWaveThick=0\n"
+      << "bModWaveAlphaByVolume=0\n"
+      << "bMaximizeWaveColor=0\n"
+      << "bTexWrap=1\n"
+      << "bDarkenCenter=0\n"
+      << "bRedBlueStereo=0\n"
+      << "bBrighten=0\n"
+      << "bDarken=0\n"
+      << "bSolarize=0\n"
+      << "bInvert=0\n"
+      << "fWaveAlpha=0.001000\n"
+      << "fWaveScale=0.010000\n"
+      << "fWaveSmoothing=0.630000\n"
+      << "fWaveParam=-1.000000\n"
+      << "fModWaveAlphaStart=0.710000\n"
+      << "fModWaveAlphaEnd=1.300000\n"
+      << "fWarpAnimSpeed=1.000000\n"
+      << "fWarpScale=1.331000\n"
+      << "fZoomExponent=1.000000\n"
+      << "fShader=0.000000\n"
+      << "zoom=13.290894\n"
+      << "rot=-0.020000\n"
+      << "cx=0.500000\n"
+      << "cy=0.500000\n"
+      << "dx=-0.280000\n"
+      << "dy=-0.320000\n"
+      << "warp=0.010000\n"
+      << "sx=1.000000\n"
+      << "sy=1.000000\n"
+      << "wave_r=0.650000\n"
+      << "wave_g=0.650000\n"
+      << "wave_b=0.650000\n"
+      << "wave_x=0.500000\n"
+      << "wave_y=0.500000\n"
+      << "ob_size=0.000000\n"
+      << "ob_r=0.010000\n"
+      << "ob_g=0.000000\n"
+      << "ob_b=0.000000\n"
+      << "ob_a=1.000000\n"
+      << "ib_size=0.000000\n"
+      << "ib_r=0.950000\n"
+      << "ib_g=0.850000\n"
+      << "ib_b=0.650000\n"
+      << "ib_a=1.000000\n"
+      << "nMotionVectorsX=64.000000\n"
+      << "nMotionVectorsY=0.000000\n"
+      << "mv_dx=0.000000\n"
+      << "mv_dy=0.000000\n"
+      << "mv_l=0.900000\n"
+      << "mv_r=1.000000\n"
+      << "mv_g=1.000000\n"
+      << "mv_b=1.000000\n"
+      << "mv_a=0.000000\n"
+      << "shapecode_3_enabled=1\n"
+      << "shapecode_3_sides=20\n"
+      << "shapecode_3_additive=0\n"
+      << "shapecode_3_thickOutline=0\n"
+      << "shapecode_3_textured=1\n"
+      << "shapecode_3_ImageURL=M.tga\n"
+      << "shapecode_3_x=0.68\n"
+      << "shapecode_3_y=0.5\n"
+      << "shapecode_3_rad=0.41222\n"
+      << "shapecode_3_ang=0\n"
+      << "shapecode_3_tex_ang=0\n"
+      << "shapecode_3_tex_zoom=0.71\n"
+      << "shapecode_3_r=1\n"
+      << "shapecode_3_g=1\n"
+      << "shapecode_3_b=1\n"
+      << "shapecode_3_a=1\n"
+      << "shapecode_3_r2=1\n"
+      << "shapecode_3_g2=1\n"
+      << "shapecode_3_b2=1\n"
+      << "shapecode_3_a2=1\n"
+      << "shapecode_3_border_r=0\n"
+      << "shapecode_3_border_g=0\n"
+      << "shapecode_3_border_b=0\n"
+      << "shapecode_3_border_a=0\n"
+      << "shape_3_per_frame1=x = x + q1;\n"
+      << "shape_3_per_frame2=y = y + q2;\n"
+      << "shape_3_per_frame3=r =0.5 + 0.5*sin(q8*0.613 + 1);\n"
+      << "shape_3_per_frame4=g = 0.5 + 0.5*sin(q8*0.763 + 2);\n"
+      << "shape_3_per_frame5=b = 0.5 + 0.5*sin(q8*0.771 + 5);\n"
+      << "shape_3_per_frame6=r2 = 0.5 + 0.5*sin(q8*0.635 + 4);\n"
+      << "shape_3_per_frame7=g2 = 0.5 + 0.5*sin(q8*0.616+ 1);\n"
+      << "shape_3_per_frame8=b2 = 0.5 + 0.5*sin(q8*0.538 + 3);\n"
+      << "shapecode_4_enabled=1\n"
+      << "shapecode_4_sides=4\n"
+      << "shapecode_4_additive=0\n"
+      << "shapecode_4_thickOutline=0\n"
+      << "shapecode_4_textured=1\n"
+      << "shapecode_4_ImageURL=headphones.tga\n"
+      << "shapecode_4_x=0.68\n"
+      << "shapecode_4_y=0.58\n"
+      << "shapecode_4_rad=0.6\n"
+      << "shapecode_4_ang=0\n"
+      << "shapecode_4_tex_ang=0\n"
+      << "shapecode_4_tex_zoom=0.71\n"
+      << "shapecode_4_r=1\n"
+      << "shapecode_4_g=1\n"
+      << "shapecode_4_b=1\n"
+      << "shapecode_4_a=1\n"
+      << "shapecode_4_r2=1\n"
+      << "shapecode_4_g2=1\n"
+      << "shapecode_4_b2=1\n"
+      << "shapecode_4_a2=1\n"
+      << "shapecode_4_border_r=0\n"
+      << "shapecode_4_border_g=0\n"
+      << "shapecode_4_border_b=0\n"
+      << "shapecode_4_border_a=0\n"
+      << "shape_4_per_frame1=x = x + q1;\n"
+      << "shape_4_per_frame2=y = y + q2;\n"
+      << "shape_4_per_frame3=rad = rad + bass * 0.1;\n"
+      << "shape_4_per_frame4=a = q3;\n"
+      << "shape_4_per_frame5=a2 = q3;\n"
+      << "shapecode_6_enabled=1\n"
+      << "shapecode_6_sides=4\n"
+      << "shapecode_6_additive=0\n"
+      << "shapecode_6_thickOutline=0\n"
+      << "shapecode_6_textured=1\n"
+      << "shapecode_6_ImageURL=project.tga\n"
+      << "shapecode_6_x=0.38\n"
+      << "shapecode_6_y=0.435\n"
+      << "shapecode_6_rad=0.8\n"
+      << "shapecode_6_ang=0\n"
+      << "shapecode_6_tex_ang=0\n"
+      << "shapecode_6_tex_zoom=0.71\n"
+      << "shapecode_6_r=1\n"
+      << "shapecode_6_g=1\n"
+      << "shapecode_6_b=1\n"
+      << "shapecode_6_a=1\n"
+      << "shapecode_6_r2=1\n"
+      << "shapecode_6_g2=1\n"
+      << "shapecode_6_b2=1\n"
+      << "shapecode_6_a2=1\n"
+      << "shapecode_6_border_r=0\n"
+      << "shapecode_6_border_g=0\n"
+      << "shapecode_6_border_b=0\n"
+      << "shapecode_6_border_a=0\n"
+      << "shape_6_per_frame1=x = x + q1;\n"
+      << "shape_6_per_frame2=y = y + q2;\n"
+      << "shape_6_per_frame3=a = q3;\n"
+      << "shape_6_per_frame4=a2 = q3;\n"
+      << "per_frame_1=ob_r = 0.5 + 0.4*sin(time*1.324);\n"
+      << "per_frame_2=ob_g = 0.5 + 0.4*cos(time*1.371);\n"
+      << "per_frame_3=ob_b = 0.5+0.4*sin(2.332*time);\n"
+      << "per_frame_4=ib_r = 0.5 + 0.25*sin(time*1.424);\n"
+      << "per_frame_5=ib_g = 0.25 + 0.25*cos(time*1.871);\n"
+      << "per_frame_6=ib_b = 1-ob_b;\n"
+      << "per_frame_7=volume = 0.15*(bass+bass_att+treb+treb_att+mid+mid_att);\n"
+      << "per_frame_8=xamptarg = if(equal(frame%15,0),min(0.5*volume*bass_att,0.5),xamptarg);\n"
+      << "per_frame_9=xamp = xamp + 0.5*(xamptarg-xamp);\n"
+      << "per_frame_10=xdir = if(above(abs(xpos),xamp),-sign(xpos),if(below(abs(xspeed),0.1),2*above(xpos,0)-1,xdir));\n"
+      << "per_frame_11=xaccel = xdir*xamp - xpos - xspeed*0.055*below(abs(xpos),xamp);\n"
+      << "per_frame_12=xspeed = xspeed + xdir*xamp - xpos - xspeed*0.055*below(abs(xpos),xamp);\n"
+      << "per_frame_13=xpos = xpos + 0.001*xspeed;\n"
+      << "per_frame_14=dx = xpos*0.05;\n"
+      << "per_frame_15=yamptarg = if(equal(frame%15,0),min(0.3*volume*treb_att,0.5),yamptarg);\n"
+      << "per_frame_16=yamp = yamp + 0.5*(yamptarg-yamp);\n"
+      << "per_frame_17=ydir = if(above(abs(ypos),yamp),-sign(ypos),if(below(abs(yspeed),0.1),2*above(ypos,0)-1,ydir));\n"
+      << "per_frame_18=yaccel = ydir*yamp - ypos - yspeed*0.055*below(abs(ypos),yamp);\n"
+      << "per_frame_19=yspeed = yspeed + ydir*yamp - ypos - yspeed*0.055*below(abs(ypos),yamp);\n"
+      << "per_frame_20=ypos = ypos + 0.001*yspeed;\n"
+      << "per_frame_21=dy = ypos*0.05;\n"
+      << "per_frame_22=wave_a = 0;\n"
+      << "per_frame_23=q8 = oldq8 + 0.0003*(pow(1+1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,6)/fps);\n"
+      << "per_frame_24=oldq8 = q8;\n"
+      << "per_frame_25=q7 = 0.003*(pow(1+1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,6)/fps);\n"
+      << "per_frame_26=rot = 0.4 + 1.5*sin(time*0.273) + 0.4*sin(time*0.379+3);\n"
+      << "per_frame_27=q1 = 0.05*sin(time*1.14);\n"
+      << "per_frame_28=q2 = 0.03*sin(time*0.93+2);\n"
+      << "per_frame_29=q3 = if(above(frame,60),1, frame/60.0);\n"
+      << "per_frame_30=oldq8 = if(above(oldq8,1000),0,oldq8);\n"
+      << "per_pixel_1=zoom =( log(sqrt(2)-rad) -0.24)*1;\n";
 
-return out.str();
-
+  return out.str();
 }
 
-std::auto_ptr<Preset> IdlePresets::allocate(const std::string & name, PresetOutputs & presetOutputs)
+std::auto_ptr<Preset>
+IdlePresets::allocate(const std::string & name, PresetOutputs & presetOutputs)
 {
-
   if (name == IDLE_PRESET_NAME) {
-  	std::istringstream in(presetText());
-  	return std::auto_ptr<Preset>(new MilkdropPreset(in, IDLE_PRESET_NAME, presetOutputs));
+    std::istringstream in(presetText());
+    return std::auto_ptr<Preset>(new MilkdropPreset(in, IDLE_PRESET_NAME, presetOutputs));
   }
   else
-	return std::auto_ptr<Preset>(0);
+    return std::auto_ptr<Preset>(0);
 }
diff --git a/src/libprojectM/MilkdropPresetFactory/IdlePreset.hpp b/src/libprojectM/MilkdropPresetFactory/IdlePreset.hpp
index 3231d43..31bb01a 100644
--- a/src/libprojectM/MilkdropPresetFactory/IdlePreset.hpp
+++ b/src/libprojectM/MilkdropPresetFactory/IdlePreset.hpp
@@ -3,18 +3,20 @@
 #include <memory>
 #include <string>
 
+
 class PresetOutputs;
 class Preset;
 /// A preset that does not depend on the file system to be loaded. This allows projectM to render
 /// something (ie. self indulgent project advertising) even when no valid preset directory is found.
 class IdlePresets {
 
-  public:
-	/// Allocate a new idle preset instance
-	/// \returns a newly allocated auto pointer of an idle preset instance
-	static std::auto_ptr<Preset> allocate(const std::string & path, PresetOutputs & outputs);
-  private:
-	static std::string presetText();
-	static const std::string IDLE_PRESET_NAME;
+public:
+  /// Allocate a new idle preset instance
+  /// \returns a newly allocated auto pointer of an idle preset instance
+  static std::auto_ptr<Preset> allocate(const std::string & path, PresetOutputs & outputs);
+private:
+  static std::string presetText();
+  static const std::string IDLE_PRESET_NAME;
 };
+
 #endif
diff --git a/src/libprojectM/MilkdropPresetFactory/InitCond.cpp b/src/libprojectM/MilkdropPresetFactory/InitCond.cpp
index 2dae471..e171ce5 100644
--- a/src/libprojectM/MilkdropPresetFactory/InitCond.cpp
+++ b/src/libprojectM/MilkdropPresetFactory/InitCond.cpp
@@ -36,15 +36,16 @@
 #include <cassert>
 #include <iostream>
 
+
 char InitCond::init_cond_string_buffer[STRING_BUFFER_SIZE];
 int InitCond::init_cond_string_buffer_index = 0;
 
+
 /* Creates a new initial condition */
-InitCond::InitCond( Param * _param, CValue _init_val ):param(_param), init_val(_init_val) {
-
-
+InitCond::InitCond( Param * _param, CValue _init_val ):param(_param), init_val(_init_val)
+{
   //  std::cerr <<  "InitCond::InitCond: " << this->param->name << std::endl;
- 
+
   assert(param);
   assert(param->engine_val);
 }
@@ -52,55 +53,55 @@
 /* Frees initial condition structure */
 InitCond::~InitCond() {}
 
-void InitCond::evaluate() 
+void
+InitCond::evaluate()
 {
   evaluate(false);
 }
 
 /* Evaluate an initial conditon */
-void InitCond::evaluate(bool evalUser) {
+void
+InitCond::evaluate(bool evalUser)
+{
+  assert(this);
+  assert(param);
 
+  if (param->flags & P_FLAG_USERDEF && !evalUser)
+    return;
 
-
-   assert(this);
-   assert(param);
-
-if (param->flags & P_FLAG_USERDEF && !evalUser)
-	return;
-
-   /* Set matrix flag to zero. This ensures
-     its constant value will be used rather than a matrix value 
+  /* Set matrix flag to zero. This ensures
+     its constant value will be used rather than a matrix value
   */
-param->matrix_flag = false;
-  
+  param->matrix_flag = false;
+
   /* Parameter is of boolean type, either true/false */
-  
+
   if (param->type == P_TYPE_BOOL) {
 
-    //        printf( "init_cond: %s = %d (TYPE BOOL)\n", param->name.c_str(), init_val.bool_val); 
-	//std::cerr << "[InitCond] param is a boolean of with name " 
-	//	<< param->name << std::endl;
+    //        printf( "init_cond: %s = %d (TYPE BOOL)\n", param->name.c_str(), init_val.bool_val);
+    //std::cerr << "[InitCond] param is a boolean of with name "
+    //  << param->name << std::endl;
 
-	assert(param->engine_val);
+    assert(param->engine_val);
 
-	 *((bool*)param->engine_val) = init_val.bool_val;
+    *((bool*)param->engine_val) = init_val.bool_val;
 
-     return;
+    return;
   }
-  
+
   /* Parameter is an integer type, just like C */
-  
+
   if ( param->type == P_TYPE_INT) {
- 	assert(param->engine_val);
-	 *((int*)param->engine_val) = init_val.int_val;
-     return;
+    assert(param->engine_val);
+    *((int*)param->engine_val) = init_val.int_val;
+    return;
   }
 
   /* Parameter is of a float type, just like C */
 
   if (param->type == P_TYPE_DOUBLE) {
-	assert(param->engine_val);
-	*((float*)param->engine_val) = init_val.float_val;
+    assert(param->engine_val);
+    *((float*)param->engine_val) = init_val.float_val;
     return;
   }
 
@@ -109,39 +110,39 @@
 }
 
 /* WIP */
-void InitCond::init_cond_to_string() {
-	
-	int string_length;
-	char string[MAX_TOKEN_SIZE];
-	
-	/* Create a string "param_name=val" */
-	switch (param->type) {
-		
-		case P_TYPE_BOOL:
-			sprintf(string, "%s=%d\n", param->name.c_str(), init_val.bool_val);
-			break; 
-		case P_TYPE_INT:
-			sprintf(string, "%s=%d\n", param->name.c_str(), init_val.int_val);
-			break;
-		case P_TYPE_DOUBLE:
-			sprintf(string, "%s=%f\n", param->name.c_str(), init_val.float_val);
-			break;
-		default:
-			return;
-	}
-		
-	/* Compute the length of the string */
-	string_length = strlen(string);
-	
-	/* Buffer overflow check */
-	if ((init_cond_string_buffer_index + string_length + 1)  > (STRING_BUFFER_SIZE - 1))
-		return;
-	
-	/* Copy the string into the initial condition string buffer */	
-	strncpy(init_cond_string_buffer + init_cond_string_buffer_index, string, string_length);
-	
-	/* Increment the string buffer, offset by one for the null terminator, which will be
-	   overwritten by the next call to this function */
-	init_cond_string_buffer_index+= string_length + 1;
-}
+void
+InitCond::init_cond_to_string()
+{
+  int   string_length;
+  char  string[MAX_TOKEN_SIZE];
 
+  /* Create a string "param_name=val" */
+  switch (param->type) {
+
+  case P_TYPE_BOOL:
+    sprintf(string, "%s=%d\n", param->name.c_str(), init_val.bool_val);
+    break;
+  case P_TYPE_INT:
+    sprintf(string, "%s=%d\n", param->name.c_str(), init_val.int_val);
+    break;
+  case P_TYPE_DOUBLE:
+    sprintf(string, "%s=%f\n", param->name.c_str(), init_val.float_val);
+    break;
+  default:
+    return;
+  }
+
+  /* Compute the length of the string */
+  string_length = strlen(string);
+
+  /* Buffer overflow check */
+  if ((init_cond_string_buffer_index + string_length + 1)  > (STRING_BUFFER_SIZE - 1))
+    return;
+
+  /* Copy the string into the initial condition string buffer */
+  strncpy(init_cond_string_buffer + init_cond_string_buffer_index, string, string_length);
+
+  /* Increment the string buffer, offset by one for the null terminator, which will be
+     overwritten by the next call to this function */
+  init_cond_string_buffer_index+= string_length + 1;
+}
diff --git a/src/libprojectM/MilkdropPresetFactory/InitCond.hpp b/src/libprojectM/MilkdropPresetFactory/InitCond.hpp
index a4b124b..43717b3 100644
--- a/src/libprojectM/MilkdropPresetFactory/InitCond.hpp
+++ b/src/libprojectM/MilkdropPresetFactory/InitCond.hpp
@@ -39,22 +39,23 @@
 class Param;
 #include <map>
 
+
 class InitCond {
 public:
-    Param *param;
-    CValue init_val;
+  Param *param;
+  CValue init_val;
 
-    static char init_cond_string_buffer[STRING_BUFFER_SIZE];
-    static int init_cond_string_buffer_index;
+  static char init_cond_string_buffer[STRING_BUFFER_SIZE];
+  static int init_cond_string_buffer_index;
 
-    InitCond( Param * param, CValue init_val);
-    ~InitCond();
-    void evaluate();  //Wrapper around following declaration
-    void evaluate(bool evalUser);
+  InitCond( Param * param, CValue init_val);
+  ~InitCond();
+  void evaluate();  //Wrapper around following declaration
+  void evaluate(bool evalUser);
 
-    void init_cond_to_string();
-    void write_init();
-  };
+  void init_cond_to_string();
+  void write_init();
+};
 
 
 #endif /** !_INIT_COND_H */
diff --git a/src/libprojectM/MilkdropPresetFactory/InitCondUtils.hpp b/src/libprojectM/MilkdropPresetFactory/InitCondUtils.hpp
index 2186199..493d249 100644
--- a/src/libprojectM/MilkdropPresetFactory/InitCondUtils.hpp
+++ b/src/libprojectM/MilkdropPresetFactory/InitCondUtils.hpp
@@ -5,75 +5,78 @@
 #include <iostream>
 #include <stdlib.h>
 
+
 namespace InitCondUtils {
+
 class LoadUnspecInitCond {
-	public:
+public:
 
-	LoadUnspecInitCond(std::map<std::string,InitCond*> & initCondTree, std::map<std::string,InitCond*> & perFrameInitEqnTree):
-		 m_initCondTree(initCondTree), m_perFrameInitEqnTree(perFrameInitEqnTree) {}
+  LoadUnspecInitCond(std::map<std::string,InitCond*> & initCondTree, std::map<std::string,InitCond*> & perFrameInitEqnTree):
+    m_initCondTree(initCondTree), m_perFrameInitEqnTree(perFrameInitEqnTree) {}
 
-	void operator()(Param * param);
+  void operator()(Param * param);
 
-	private:
-		std::map<std::string,InitCond*> & m_initCondTree;
-		std::map<std::string,InitCond*> & m_perFrameInitEqnTree;
+private:
+  std::map<std::string,InitCond*> & m_initCondTree;
+  std::map<std::string,InitCond*> & m_perFrameInitEqnTree;
 };
 
 
-inline void LoadUnspecInitCond::operator() (Param * param) {
+inline void
+LoadUnspecInitCond::operator() (Param * param)
+{
+  InitCond  * init_cond = 0;
+  CValue    init_val;
 
-    InitCond * init_cond = 0;
-    CValue init_val;
-
-    assert(param);
-    assert(param->engine_val);
+  assert(param);
+  assert(param->engine_val);
 
 
-    /* Don't count these parameters as initial conditions */
-    if (param->flags & P_FLAG_READONLY)
-        return;
-    if (param->flags & P_FLAG_QVAR)
-        return;
-//    if (param->flags & P_FLAG_TVAR)
- //       return;
-    if (param->flags & P_FLAG_USERDEF)
-        return;
+  /* Don't count these parameters as initial conditions */
+  if (param->flags & P_FLAG_READONLY)
+    return;
+  if (param->flags & P_FLAG_QVAR)
+    return;
+  //if (param->flags & P_FLAG_TVAR)
+  //  return;
+  if (param->flags & P_FLAG_USERDEF)
+    return;
 
-    /* If initial condition was not defined by the preset file, force a default one
-       with the following code */
+  /* If initial condition was not defined by the preset file, force a default one
+     with the following code */
 
-    if (m_initCondTree.find(param->name) == m_initCondTree.end()) {
+  if (m_initCondTree.find(param->name) == m_initCondTree.end()) {
 
-        /* Make sure initial condition does not exist in the set of per frame initial equations */
-	if (m_perFrameInitEqnTree.find(param->name) != m_perFrameInitEqnTree.end())
-		return;
+    /* Make sure initial condition does not exist in the set of per frame initial equations */
+    if (m_perFrameInitEqnTree.find(param->name) != m_perFrameInitEqnTree.end())
+      return;
 
-	// Set an initial vialue via correct union member
-        if (param->type == P_TYPE_BOOL)
-            init_val.bool_val = param->default_init_val.bool_val;
-        else if (param->type == P_TYPE_INT)
-            init_val.int_val = param->default_init_val.int_val;
+    // Set an initial vialue via correct union member
+    if (param->type == P_TYPE_BOOL)
+      init_val.bool_val = param->default_init_val.bool_val;
+    else if (param->type == P_TYPE_INT)
+      init_val.int_val = param->default_init_val.int_val;
 
-        else if (param->type == P_TYPE_DOUBLE) {
-           		init_val.float_val = param->default_init_val.float_val;
-	}
+    else if (param->type == P_TYPE_DOUBLE) {
+      init_val.float_val = param->default_init_val.float_val;
+    }
 
-        //printf("%s\n", param->name);
-        /* Create new initial condition */
-	//std::cerr << "[InitCondUtils] creating an unspecified initial condition of name " << param->name << std::endl;
-        if ((init_cond = new InitCond(param, init_val)) == NULL) {
-	    abort();
-        }
+    //printf("%s\n", param->name);
+    /* Create new initial condition */
+    //std::cerr << "[InitCondUtils] creating an unspecified initial condition of name " << param->name << std::endl;
+    if ((init_cond = new InitCond(param, init_val)) == NULL) {
+      abort();
+    }
 
-        /* Insert the initial condition into this presets tree */
-	std::pair<std::map<std::string, InitCond*>::iterator, bool> inserteePair =
-		m_initCondTree.insert(std::make_pair(init_cond->param->name, init_cond));
-	assert(inserteePair.second);
-	assert(inserteePair.first->second);
-    } else
-	assert(m_initCondTree.find(param->name)->second);
+    /* Insert the initial condition into this presets tree */
+    std::pair<std::map<std::string, InitCond*>::iterator, bool> inserteePair =
+    m_initCondTree.insert(std::make_pair(init_cond->param->name, init_cond));
 
-
+    assert(inserteePair.second);
+    assert(inserteePair.first->second);
+  } else
+    assert(m_initCondTree.find(param->name)->second);
 }
-}
+
+}   /*  namespace InitCondUtils  */
 #endif
diff --git a/src/libprojectM/MilkdropPresetFactory/MilkdropPreset.cpp b/src/libprojectM/MilkdropPresetFactory/MilkdropPreset.cpp
index d6acc7b..8f2d429 100644
--- a/src/libprojectM/MilkdropPresetFactory/MilkdropPreset.cpp
+++ b/src/libprojectM/MilkdropPresetFactory/MilkdropPreset.cpp
@@ -18,7 +18,6 @@
  * See 'LICENSE.txt' included within this release
  *
  */
-
 #include <cstdio>
 #include <cstring>
 #include <cstdlib>
@@ -40,29 +39,27 @@
 
 #include "PresetFrameIO.hpp"
 
-MilkdropPreset::MilkdropPreset(std::istream & in, const std::string & presetName,  PresetOutputs & presetOutputs):
-	Preset(presetName),
-    	builtinParams(_presetInputs, presetOutputs),
-    	_presetOutputs(presetOutputs)
+
+MilkdropPreset::MilkdropPreset(std::istream & in, const std::string & presetName,  PresetOutputs & presetOutputs)
+  : Preset(presetName),
+    builtinParams(_presetInputs, presetOutputs),
+    _presetOutputs(presetOutputs)
 {
   initialize(in);
-
 }
 
-MilkdropPreset::MilkdropPreset(const std::string & absoluteFilePath, const std::string & presetName, PresetOutputs & presetOutputs):
-	Preset(presetName),
+MilkdropPreset::MilkdropPreset (const std::string & absoluteFilePath, const std::string & presetName, PresetOutputs & presetOutputs)
+  : Preset(presetName),
     builtinParams(_presetInputs, presetOutputs),
     _absoluteFilePath(absoluteFilePath),
     _presetOutputs(presetOutputs),
     _filename(parseFilename(absoluteFilePath))
 {
-
   initialize(absoluteFilePath);
-
 }
+
 MilkdropPreset::~MilkdropPreset()
 {
-
   traverse<TraverseFunctors::Delete<InitCond> >(init_cond_tree);
 
   traverse<TraverseFunctors::Delete<InitCond> >(per_frame_init_eqn_tree);
@@ -73,38 +70,41 @@
 
   traverse<TraverseFunctors::Delete<Param> >(user_param_tree);
 
-  /// Testing deletion of render items by the preset. would be nice if it worked, 
+  /// Testing deletion of render items by the preset. would be nice if it worked,
   /// and seems to be working if you use a mutex on the preset switching.
-  
-  for (PresetOutputs::cwave_container::iterator pos = customWaves.begin(); 
-	pos != customWaves.end(); ++pos ) {
-  //  __android_log_print(ANDROID_LOG_ERROR, "projectM", "not freeing wave %x", *pos);
+
+  for (PresetOutputs::cwave_container::iterator pos = customWaves.begin();
+       pos != customWaves.end();
+       ++pos )
+  {
+    //  __android_log_print(ANDROID_LOG_ERROR, "projectM", "not freeing wave %x", *pos);
     delete(*pos);
   }
 
-  for (PresetOutputs::cshape_container::iterator pos = customShapes.begin(); 
-	pos != customShapes.end(); ++pos ) {
-//__android_log_print(ANDROID_LOG_ERROR, "projectM", "not freeing shape %x", *pos);
-
-	delete(*pos);
+  for (PresetOutputs::cshape_container::iterator pos = customShapes.begin();
+       pos != customShapes.end();
+       ++pos )
+  {
+    //__android_log_print(ANDROID_LOG_ERROR, "projectM", "not freeing shape %x", *pos);
+    delete(*pos);
   }
-  customWaves.clear();
- customShapes.clear();
- presetOutputs().customWaves.clear();
- presetOutputs().customShapes.clear();
-  presetOutputs().drawables.clear();
 
+  customWaves.clear();
+  customShapes.clear();
+  presetOutputs().customWaves.clear();
+  presetOutputs().customShapes.clear();
+  presetOutputs().drawables.clear();
 }
 
 /* Adds a per pixel equation according to its string name. This
    will be used only by the parser */
 
-int MilkdropPreset::add_per_pixel_eqn(char * name, GenExpr * gen_expr)
+int
+MilkdropPreset::add_per_pixel_eqn(char * name, GenExpr * gen_expr)
 {
-
   PerPixelEqn * per_pixel_eqn = NULL;
-  int index;
-  Param * param = NULL;
+  int         index;
+  Param       * param = NULL;
 
   assert(gen_expr);
   assert(name);
@@ -117,7 +117,7 @@
   if ( !param )
   {
     if (PER_PIXEL_EQN_DEBUG) printf("add_per_pixel_eqn: failed to allocate a new parameter!\n");
-    return PROJECTM_FAILURE;
+      return PROJECTM_FAILURE;
   }
 
   index = per_pixel_eqn_tree.size();
@@ -126,14 +126,14 @@
   if ((per_pixel_eqn = new PerPixelEqn(index, param, gen_expr)) == NULL)
   {
     if (PER_PIXEL_EQN_DEBUG) printf("add_per_pixel_eqn: failed to create new per pixel equation!\n");
-    return PROJECTM_FAILURE;
+      return PROJECTM_FAILURE;
   }
 
 
 
   /* Insert the per pixel equation into the preset per pixel database */
-  std::pair<std::map<int, PerPixelEqn*>::iterator, bool> inserteeOption = per_pixel_eqn_tree.insert
-      (std::make_pair(per_pixel_eqn->index, per_pixel_eqn));
+  std::pair<std::map<int, PerPixelEqn*>::iterator, bool> inserteeOption =
+      per_pixel_eqn_tree.insert (std::make_pair(per_pixel_eqn->index, per_pixel_eqn));
 
   if (!inserteeOption.second)
   {
@@ -146,99 +146,124 @@
   return PROJECTM_SUCCESS;
 }
 
-void MilkdropPreset::evalCustomShapeInitConditions()
+void
+MilkdropPreset::evalCustomShapeInitConditions()
 {
 
-  for (PresetOutputs::cshape_container::iterator pos = customShapes.begin(); pos != customShapes.end(); ++pos) {
+  for (PresetOutputs::cshape_container::iterator pos = customShapes.begin();
+       pos != customShapes.end();
+       ++pos)
+  {
     assert(*pos);
     (*pos)->evalInitConds();
   }
 }
 
 
-void MilkdropPreset::evalCustomWaveInitConditions()
+void
+MilkdropPreset::evalCustomWaveInitConditions()
 {
 
-  for (PresetOutputs::cwave_container::iterator pos = customWaves.begin(); pos != customWaves.end(); ++pos) {
+  for (PresetOutputs::cwave_container::iterator pos = customWaves.begin();
+       pos != customWaves.end();
+       ++pos)
+  {
     assert(*pos);
-   (*pos)->evalInitConds();
-}
+    (*pos)->evalInitConds();
+  }
 }
 
 
-void MilkdropPreset::evalCustomWavePerFrameEquations()
+void
+MilkdropPreset::evalCustomWavePerFrameEquations()
 {
 
-  for (PresetOutputs::cwave_container::iterator pos = customWaves.begin(); pos != customWaves.end(); ++pos)
+  for (PresetOutputs::cwave_container::iterator pos = customWaves.begin();
+       pos != customWaves.end();
+       ++pos)
   {
-
     std::map<std::string, InitCond*> & init_cond_tree = (*pos)->init_cond_tree;
-    for (std::map<std::string, InitCond*>::iterator _pos = init_cond_tree.begin(); _pos != init_cond_tree.end(); ++_pos)
+
+    for (std::map<std::string, InitCond*>::iterator _pos = init_cond_tree.begin();
+         _pos != init_cond_tree.end();
+         ++_pos)
     {
       assert(_pos->second);
       _pos->second->evaluate();
     }
 
     std::vector<PerFrameEqn*> & per_frame_eqn_tree = (*pos)->per_frame_eqn_tree;
-    for (std::vector<PerFrameEqn*>::iterator _pos = per_frame_eqn_tree.begin(); _pos != per_frame_eqn_tree.end(); ++_pos)
+    for (std::vector<PerFrameEqn*>::iterator _pos = per_frame_eqn_tree.begin();
+         _pos != per_frame_eqn_tree.end();
+         ++_pos)
     {
       (*_pos)->evaluate();
     }
   }
-
 }
 
-void MilkdropPreset::evalCustomShapePerFrameEquations()
+void
+MilkdropPreset::evalCustomShapePerFrameEquations()
 {
 
-  for (PresetOutputs::cshape_container::iterator pos = customShapes.begin(); pos != customShapes.end(); ++pos)
+  for (PresetOutputs::cshape_container::iterator pos = customShapes.begin();
+       pos != customShapes.end();
+       ++pos)
   {
-
     std::map<std::string, InitCond*> & init_cond_tree = (*pos)->init_cond_tree;
-    for (std::map<std::string, InitCond*>::iterator _pos = init_cond_tree.begin(); _pos != init_cond_tree.end(); ++_pos)
+
+    for (std::map<std::string, InitCond*>::iterator _pos = init_cond_tree.begin();
+         _pos != init_cond_tree.end();
+         ++_pos)
     {
       assert(_pos->second);
       _pos->second->evaluate();
     }
 
     std::vector<PerFrameEqn*> & per_frame_eqn_tree = (*pos)->per_frame_eqn_tree;
-    for (std::vector<PerFrameEqn*>::iterator _pos = per_frame_eqn_tree.begin(); _pos != per_frame_eqn_tree.end(); ++_pos)
+    for (std::vector<PerFrameEqn*>::iterator _pos = per_frame_eqn_tree.begin();
+         _pos != per_frame_eqn_tree.end();
+         ++_pos)
     {
       (*_pos)->evaluate();
     }
   }
-
 }
 
-void MilkdropPreset::evalPerFrameInitEquations()
+void
+MilkdropPreset::evalPerFrameInitEquations()
 {
+  for (std::map<std::string, InitCond*>::iterator pos = per_frame_init_eqn_tree.begin();
+       pos != per_frame_init_eqn_tree.end();
+       ++pos)
+  {
+    assert(pos->second);
+    pos->second->evaluate();
+  }
+}
 
-  for (std::map<std::string, InitCond*>::iterator pos = per_frame_init_eqn_tree.begin(); pos != per_frame_init_eqn_tree.end(); ++pos)
+void
+MilkdropPreset::evalPerFrameEquations()
+{
+  for (std::map<std::string, InitCond*>::iterator pos = init_cond_tree.begin();
+       pos != init_cond_tree.end();
+       ++pos)
   {
     assert(pos->second);
     pos->second->evaluate();
   }
 
-}
-
-void MilkdropPreset::evalPerFrameEquations()
-{
-
-  for (std::map<std::string, InitCond*>::iterator pos = init_cond_tree.begin(); pos != init_cond_tree.end(); ++pos)
-  {
-    assert(pos->second);
-    pos->second->evaluate();
-  }
-
-  for (std::vector<PerFrameEqn*>::iterator pos = per_frame_eqn_tree.begin(); pos != per_frame_eqn_tree.end(); ++pos)
+  for (std::vector<PerFrameEqn*>::iterator pos = per_frame_eqn_tree.begin();
+       pos != per_frame_eqn_tree.end();
+       ++pos)
   {
     (*pos)->evaluate();
   }
-
 }
 
-void MilkdropPreset::preloadInitialize() {
-
+void
+MilkdropPreset::preloadInitialize()
+{
   /// @note commented this out because it should be unnecessary
   // Clear equation trees
   //init_cond_tree.clear();
@@ -246,12 +271,11 @@
   //per_frame_eqn_tree.clear();
   //per_pixel_eqn_tree.clear();
   //per_frame_init_eqn_tree.clear();
-
-
 }
 
-void MilkdropPreset::postloadInitialize() {
-
+void
+MilkdropPreset::postloadInitialize()
+{
   /* It's kind of ugly to reset these values here. Should definitely be placed in the parser somewhere */
   this->per_frame_eqn_count = 0;
   this->per_frame_init_eqn_count = 0;
@@ -261,41 +285,42 @@
   this->loadCustomShapeUnspecInitConds();
 
 
-/// @bug are you handling all the q variables conditions? in particular, the un-init case?
-//m_presetOutputs.q1 = 0;
-//m_presetOutputs.q2 = 0;
-//m_presetOutputs.q3 = 0;
-//m_presetOutputs.q4 = 0;
-//m_presetOutputs.q5 = 0;
-//m_presetOutputs.q6 = 0;
-//m_presetOutputs.q7 = 0;
-//m_presetOutputs.q8 = 0;
-
+  /// @bug are you handling all the q variables conditions? in particular, the un-init case?
+  //m_presetOutputs.q1 = 0;
+  //m_presetOutputs.q2 = 0;
+  //m_presetOutputs.q3 = 0;
+  //m_presetOutputs.q4 = 0;
+  //m_presetOutputs.q5 = 0;
+  //m_presetOutputs.q6 = 0;
+  //m_presetOutputs.q7 = 0;
+  //m_presetOutputs.q8 = 0;
 }
 
-void MilkdropPreset::Render(const BeatDetect &music, const PipelineContext &context)
+void
+MilkdropPreset::Render(const BeatDetect &music, const PipelineContext &context)
 {
-	_presetInputs.update(music, context);
+  _presetInputs.update(music, context);
 
-	evaluateFrame();
-	pipeline().Render(music, context);
-
+  evaluateFrame();
+  pipeline().Render(music, context);
 }
 
-void MilkdropPreset::initialize(const std::string & pathname)
+void
+MilkdropPreset::initialize(const std::string & pathname)
 {
   int retval;
 
   preloadInitialize();
 
-if (MILKDROP_PRESET_DEBUG)
-  std::cerr << "[Preset] loading file \"" << pathname << "\"..." << std::endl;
+  if (MILKDROP_PRESET_DEBUG)
+    std::cerr << "[Preset] loading file \"" << pathname << "\"..." << std::endl;
 
   if ((retval = loadPresetFile(pathname)) < 0)
   {
-if (MILKDROP_PRESET_DEBUG)
-     std::cerr << "[Preset] failed to load file \"" <<
-      pathname << "\"!" << std::endl;
+    if (MILKDROP_PRESET_DEBUG)
+      std::cerr << "[Preset] failed to load file \""
+                << pathname << "\"!"
+                << std::endl;
 
     /// @bug how should we handle this problem? a well define exception?
     throw retval;
@@ -304,7 +329,8 @@
   postloadInitialize();
 }
 
-void MilkdropPreset::initialize(std::istream & in)
+void
+MilkdropPreset::initialize(std::istream & in)
 {
   int retval;
 
@@ -313,8 +339,8 @@
   if ((retval = readIn(in)) < 0)
   {
 
-	if (MILKDROP_PRESET_DEBUG)
-     std::cerr << "[Preset] failed to load from stream " << std::endl;
+    if (MILKDROP_PRESET_DEBUG)
+      std::cerr << "[Preset] failed to load from stream " << std::endl;
 
     /// @bug how should we handle this problem? a well define exception?
     throw retval;
@@ -323,7 +349,9 @@
   postloadInitialize();
 }
 
-void MilkdropPreset::loadBuiltinParamsUnspecInitConds() {
+void
+MilkdropPreset::loadBuiltinParamsUnspecInitConds()
+{
 
   InitCondUtils::LoadUnspecInitCond loadUnspecInitCond(this->init_cond_tree, this->per_frame_init_eqn_tree);
 
@@ -332,22 +360,24 @@
 
 }
 
-void MilkdropPreset::loadCustomWaveUnspecInitConds()
+void
+MilkdropPreset::loadCustomWaveUnspecInitConds()
 {
-
-  for (PresetOutputs::cwave_container::iterator pos = customWaves.begin(); pos != customWaves.end(); ++pos)
+  for (PresetOutputs::cwave_container::iterator pos = customWaves.begin();
+       pos != customWaves.end();
+       ++pos)
   {
     assert(*pos);
     (*pos)->loadUnspecInitConds();
   }
-
 }
 
-void MilkdropPreset::loadCustomShapeUnspecInitConds()
+void
+MilkdropPreset::loadCustomShapeUnspecInitConds()
 {
-
   for (PresetOutputs::cshape_container::iterator pos = customShapes.begin();
-	pos != customShapes.end(); ++pos)
+       pos != customShapes.end();
+       ++pos)
   {
     assert(*pos);
     (*pos)->loadUnspecInitConds();
@@ -355,9 +385,9 @@
 }
 
 
-void MilkdropPreset::evaluateFrame()
+void
+MilkdropPreset::evaluateFrame()
 {
-
   // Evaluate all equation objects according to milkdrop flow diagram
 
   evalPerFrameInitEquations();
@@ -382,110 +412,102 @@
   /// @slow an extra O(N) per frame, could do this during eval
   _presetOutputs.customWaves = PresetOutputs::cwave_container(customWaves);
   _presetOutputs.customShapes = PresetOutputs::cshape_container(customShapes);
-
 }
 
-void MilkdropPreset::initialize_PerPixelMeshes()
+void
+MilkdropPreset::initialize_PerPixelMeshes()
 {
-
   int x,y;
-      for (x=0;x<presetInputs().gx;x++){
-	for(y=0;y<presetInputs().gy;y++){
-	  _presetOutputs.cx_mesh[x][y]=presetOutputs().cx;
-	}}
 
+  for (x=0;x<presetInputs().gx;x++){
+    for(y=0;y<presetInputs().gy;y++){
+      _presetOutputs.cx_mesh[x][y]=presetOutputs().cx;
+    }
+  }
 
+  for (x=0;x<presetInputs().gx;x++){
+    for(y=0;y<presetInputs().gy;y++){
+      _presetOutputs.cy_mesh[x][y]=presetOutputs().cy;
+    }
+  }
 
+  for (x=0;x<presetInputs().gx;x++){
+    for(y=0;y<presetInputs().gy;y++){
+      _presetOutputs.sx_mesh[x][y]=presetOutputs().sx;
+    }
+  }
 
-      for (x=0;x<presetInputs().gx;x++){
-	for(y=0;y<presetInputs().gy;y++){
-	  _presetOutputs.cy_mesh[x][y]=presetOutputs().cy;
-	}}
+  for (x=0;x<presetInputs().gx;x++){
+    for(y=0;y<presetInputs().gy;y++){
+      _presetOutputs.sy_mesh[x][y]=presetOutputs().sy;
+    }
+  }
 
+  for (x=0;x<presetInputs().gx;x++){
+    for(y=0;y<presetInputs().gy;y++){
+      _presetOutputs.dx_mesh[x][y]=presetOutputs().dx;
+    }
+  }
 
+  //std::cout<<presetOutputs().cx<<","<<presetOutputs().cy<<" "<<presetOutputs().dx<<","<<presetOutputs().dy<<std::endl;
 
-      for (x=0;x<presetInputs().gx;x++){
-	for(y=0;y<presetInputs().gy;y++){
-	  _presetOutputs.sx_mesh[x][y]=presetOutputs().sx;
-	}}
+  for (x=0;x<presetInputs().gx;x++){
+    for(y=0;y<presetInputs().gy;y++){
+      _presetOutputs.dy_mesh[x][y]=presetOutputs().dy;
+    }
+  }
 
+  for (x=0;x<presetInputs().gx;x++){
+    for(y=0;y<presetInputs().gy;y++){
+      _presetOutputs.zoom_mesh[x][y]=presetOutputs().zoom;
+    }
+  }
 
+  for (x=0;x<presetInputs().gx;x++){
+    for(y=0;y<presetInputs().gy;y++){
+      _presetOutputs.zoomexp_mesh[x][y]=presetOutputs().zoomexp;
+    }
+  }
 
+  for (x=0;x<presetInputs().gx;x++){
+    for(y=0;y<presetInputs().gy;y++){
+      _presetOutputs.rot_mesh[x][y]=presetOutputs().rot;
+    }
+  }
 
-      for (x=0;x<presetInputs().gx;x++){
-	for(y=0;y<presetInputs().gy;y++){
-	  _presetOutputs.sy_mesh[x][y]=presetOutputs().sy;
-	}}
-
-
-
-      for (x=0;x<presetInputs().gx;x++){
-	for(y=0;y<presetInputs().gy;y++){
-	  _presetOutputs.dx_mesh[x][y]=presetOutputs().dx;
-	}}
-
-//std::cout<<presetOutputs().cx<<","<<presetOutputs().cy<<" "<<presetOutputs().dx<<","<<presetOutputs().dy<<std::endl;
-
-      for (x=0;x<presetInputs().gx;x++){
-	for(y=0;y<presetInputs().gy;y++){
-	  _presetOutputs.dy_mesh[x][y]=presetOutputs().dy;
-	}}
-
-
-
-      for (x=0;x<presetInputs().gx;x++){
-	for(y=0;y<presetInputs().gy;y++){
-	  _presetOutputs.zoom_mesh[x][y]=presetOutputs().zoom;
-	}}
-
-
-
-
-      for (x=0;x<presetInputs().gx;x++){
-	for(y=0;y<presetInputs().gy;y++){
-	  _presetOutputs.zoomexp_mesh[x][y]=presetOutputs().zoomexp;
-	}}
-
-
-
-      for (x=0;x<presetInputs().gx;x++){
-	for(y=0;y<presetInputs().gy;y++){
-	  _presetOutputs.rot_mesh[x][y]=presetOutputs().rot;
-	}}
-
-
-      for (x=0;x<presetInputs().gx;x++){
-	for(y=0;y<presetInputs().gy;y++){
-	  _presetOutputs.warp_mesh[x][y]=presetOutputs().warp;
-	}}
-
-
-
+  for (x=0;x<presetInputs().gx;x++){
+    for(y=0;y<presetInputs().gy;y++){
+      _presetOutputs.warp_mesh[x][y]=presetOutputs().warp;
+    }
+  }
 }
-// Evaluates all per-pixel equations
-void MilkdropPreset::evalPerPixelEqns()
-{
 
+// Evaluates all per-pixel equations
+void
+MilkdropPreset::evalPerPixelEqns()
+{
   /* Evaluate all per pixel equations in the tree datastructure */
   for (int mesh_x = 0; mesh_x < presetInputs().gx; mesh_x++)
-	  for (int mesh_y = 0; mesh_y < presetInputs().gy; mesh_y++)
-  for (std::map<int, PerPixelEqn*>::iterator pos = per_pixel_eqn_tree.begin();
-       pos != per_pixel_eqn_tree.end(); ++pos)
-    pos->second->evaluate(mesh_x, mesh_y);
-
+    for (int mesh_y = 0; mesh_y < presetInputs().gy; mesh_y++)
+      for (std::map<int, PerPixelEqn*>::iterator pos = per_pixel_eqn_tree.begin();
+           pos != per_pixel_eqn_tree.end();
+           ++pos)
+        pos->second->evaluate(mesh_x, mesh_y);
 }
 
-int MilkdropPreset::readIn(std::istream & fs) {
-
+int
+MilkdropPreset::readIn(std::istream & fs)
+{
   line_mode_t line_mode;
+
   presetOutputs().compositeShader.programSource.clear();
   presetOutputs().warpShader.programSource.clear();
 
   /* Parse any comments */
   if (Parser::parse_top_comment(fs) < 0)
   {
-	if (MILKDROP_PRESET_DEBUG)
-    		std::cerr << "[Preset::readIn] no left bracket found..." << std::endl;
+    if (MILKDROP_PRESET_DEBUG)
+      std::cerr << "[Preset::readIn] no left bracket found..." << std::endl;
     return PROJECTM_FAILURE;
   }
 
@@ -512,35 +534,34 @@
     }
   }
 
-//  std::cerr << "loadPresetFile: finished line parsing successfully" << std::endl;
+  //  std::cerr << "loadPresetFile: finished line parsing successfully" << std::endl;
 
   /* Now the preset has been loaded.
      Evaluation calls can be made at appropiate
      times in the frame loop */
 
-return PROJECTM_SUCCESS;
+  return PROJECTM_SUCCESS;
 }
 
 /* loadPresetFile: private function that loads a specific preset denoted
    by the given pathname */
-int MilkdropPreset::loadPresetFile(const std::string & pathname)
+int
+MilkdropPreset::loadPresetFile(const std::string & pathname)
 {
-
-
   /* Open the file corresponding to pathname */
   std::ifstream fs(pathname.c_str());
+
   if (!fs || fs.eof()) {
     if (MILKDROP_PRESET_DEBUG)
-    	std::cerr << "loadPresetFile: loading of file \"" << pathname << "\" failed!\n";
+      std::cerr << "loadPresetFile: loading of file \"" << pathname << "\" failed!\n";
     return PROJECTM_ERROR;
   }
 
- return readIn(fs);
-
+  return readIn(fs);
 }
 
-const std::string & MilkdropPreset::name() const {
-	
-	return name().empty() ? filename() : name();
+const std::string &
+MilkdropPreset::name() const
+{
+  return name().empty() ? filename() : name();
 }
-
diff --git a/src/libprojectM/MilkdropPresetFactory/MilkdropPreset.hpp b/src/libprojectM/MilkdropPresetFactory/MilkdropPreset.hpp
index 89fc7f8..ddfbd52 100644
--- a/src/libprojectM/MilkdropPresetFactory/MilkdropPreset.hpp
+++ b/src/libprojectM/MilkdropPresetFactory/MilkdropPreset.hpp
@@ -1,4 +1,3 @@
-
 /**
  * projectM -- Milkdrop-esque visualisation SDK
  * Copyright (C)2003-2007 projectM Team
@@ -26,7 +25,6 @@
  *
  * $Log$
  */
-
 #ifndef _MilkdropPreset_HPP
 #define _MilkdropPreset_HPP
 
@@ -47,6 +45,7 @@
 #include "InitCond.hpp"
 #include "Preset.hpp"
 
+
 class CustomWave;
 class CustomShape;
 class InitCond;
@@ -109,18 +108,16 @@
   /// \returns A MilkdropPreset output instance with values computed from most recent evaluateFrame()
   PresetOutputs & presetOutputs() const
   {
-
     return _presetOutputs;
   }
 
   const PresetInputs & presetInputs() const
   {
-
     return _presetInputs;
   }
 
 
-// @bug encapsulate
+  // @bug encapsulate
 
   PresetOutputs::cwave_container customWaves;
   PresetOutputs::cshape_container customShapes;
@@ -134,13 +131,13 @@
   std::map<std::string,Param*> user_param_tree; /* user parameter splay tree */
 
 
-  PresetOutputs & pipeline() { return _presetOutputs; } 
+  PresetOutputs & pipeline() { return _presetOutputs; }
 
   void Render(const BeatDetect &music, const PipelineContext &context);
   const std::string & name() const;
-  const std::string & filename() const { return _filename; } 
-private:
-  std::string _filename; 
+  const std::string & filename() const { return _filename; }
+  private:
+  std::string _filename;
   PresetInputs _presetInputs;
   /// Evaluates the MilkdropPreset for a frame given the current values of MilkdropPreset inputs / outputs
   /// All calculated values are stored in the associated MilkdropPreset outputs instance
@@ -173,53 +170,52 @@
 
   void preloadInitialize();
   void postloadInitialize();
-  
+
   PresetOutputs & _presetOutputs;
 
-template <class CustomObject>
-void transfer_q_variables(std::vector<CustomObject*> & customObjects);
+  template <class CustomObject>
+  void transfer_q_variables(std::vector<CustomObject*> & customObjects);
 };
 
 
-template <class CustomObject>
-void MilkdropPreset::transfer_q_variables(std::vector<CustomObject*> & customObjects)
+template <class CustomObject> void
+MilkdropPreset::transfer_q_variables(std::vector<CustomObject*> & customObjects)
 {
- 	CustomObject * custom_object;
+  CustomObject * custom_object;
 
-	for (typename std::vector<CustomObject*>::iterator pos = customObjects.begin(); pos != customObjects.end();++pos) {
-
-		custom_object = *pos;
-		for (unsigned int i = 0; i < NUM_Q_VARIABLES; i++)
-			custom_object->q[i] = _presetOutputs.q[i];
-	}
-
-
+  for (typename std::vector<CustomObject*>::iterator pos = customObjects.begin();
+       pos != customObjects.end();
+       ++pos)
+  {
+    custom_object = *pos;
+    for (unsigned int i = 0; i < NUM_Q_VARIABLES; i++)
+      custom_object->q[i] = _presetOutputs.q[i];
+  }
 }
 
-template <class CustomObject>
-CustomObject * MilkdropPreset::find_custom_object(int id, std::vector<CustomObject*> & customObjects)
+template <class CustomObject> CustomObject *
+MilkdropPreset::find_custom_object(int id, std::vector<CustomObject*> & customObjects)
 {
-
   CustomObject * custom_object = NULL;
 
-
-  for (typename std::vector<CustomObject*>::iterator pos = customObjects.begin(); pos != customObjects.end();++pos) {
-	if ((*pos)->id == id) {
-		custom_object = *pos;
-		break;
-	}
+  for (typename std::vector<CustomObject*>::iterator pos = customObjects.begin();
+       pos != customObjects.end();
+       ++pos)
+  {
+    if ((*pos)->id == id) {
+      custom_object = *pos;
+      break;
+    }
   }
 
   if (custom_object == NULL)
   {
-
     if ((custom_object = new CustomObject(id)) == NULL)
     {
       return NULL;
     }
 
-      customObjects.push_back(custom_object);
-
+    customObjects.push_back(custom_object);
   }
 
   assert(custom_object);
@@ -227,5 +223,4 @@
 }
 
 
-
 #endif /** !_MilkdropPreset_HPP */
diff --git a/src/libprojectM/MilkdropPresetFactory/MilkdropPresetFactory.cpp b/src/libprojectM/MilkdropPresetFactory/MilkdropPresetFactory.cpp
index 0418a7c..3bcd620 100644
--- a/src/libprojectM/MilkdropPresetFactory/MilkdropPresetFactory.cpp
+++ b/src/libprojectM/MilkdropPresetFactory/MilkdropPresetFactory.cpp
@@ -17,211 +17,217 @@
 #include "IdlePreset.hpp"
 #include "PresetFrameIO.hpp"
 
-MilkdropPresetFactory::MilkdropPresetFactory(int gx, int gy): _usePresetOutputs(false)
+
+MilkdropPresetFactory::MilkdropPresetFactory(int gx, int gy)
+  : _usePresetOutputs(false)
 {
-	/* Initializes the builtin function database */
-	BuiltinFuncs::init_builtin_func_db();
+  /* Initializes the builtin function database */
+  BuiltinFuncs::init_builtin_func_db();
 
-	/* Initializes all infix operators */
-	Eval::init_infix_ops();
+  /* Initializes all infix operators */
+  Eval::init_infix_ops();
 
-	_presetOutputs = createPresetOutputs(gx,gy);
-	_presetOutputs2 = createPresetOutputs(gx, gy);
+  _presetOutputs = createPresetOutputs(gx,gy);
+  _presetOutputs2 = createPresetOutputs(gx, gy);
 }
 
-MilkdropPresetFactory::~MilkdropPresetFactory() {
-
-	std::cerr << "[~MilkdropPresetFactory] destroy infix ops" << std::endl;
-	Eval::destroy_infix_ops();
-	std::cerr << "[~MilkdropPresetFactory] destroy builtin func" << std::endl;
-	BuiltinFuncs::destroy_builtin_func_db();
-	std::cerr << "[~MilkdropPresetFactory] delete preset out puts" << std::endl;
-	delete(_presetOutputs);
-        delete(_presetOutputs2);
-	std::cerr << "[~MilkdropPresetFactory] done" << std::endl;
-
+MilkdropPresetFactory::~MilkdropPresetFactory()
+{
+  std::cerr << "[~MilkdropPresetFactory] destroy infix ops" << std::endl;
+  Eval::destroy_infix_ops();
+  std::cerr << "[~MilkdropPresetFactory] destroy builtin func" << std::endl;
+  BuiltinFuncs::destroy_builtin_func_db();
+  std::cerr << "[~MilkdropPresetFactory] delete preset out puts" << std::endl;
+  delete(_presetOutputs);
+  delete(_presetOutputs2);
+  std::cerr << "[~MilkdropPresetFactory] done" << std::endl;
 }
 
 /* Reinitializes the engine variables to a default (conservative and sane) value */
-void resetPresetOutputs(PresetOutputs * presetOutputs)
+void
+resetPresetOutputs(PresetOutputs * presetOutputs)
 {
+  presetOutputs->zoom               = 1.0;
+  presetOutputs->zoomexp            = 1.0;
+  presetOutputs->rot                = 0.0;
+  presetOutputs->warp               = 0.0;
 
-    presetOutputs->zoom=1.0;
-    presetOutputs->zoomexp = 1.0;
-    presetOutputs->rot= 0.0;
-    presetOutputs->warp= 0.0;
+  presetOutputs->sx                 = 1.0;
+  presetOutputs->sy                 = 1.0;
+  presetOutputs->dx                 = 0.0;
+  presetOutputs->dy                 = 0.0;
+  presetOutputs->cx                 = 0.5;
+  presetOutputs->cy                 = 0.5;
 
-    presetOutputs->sx= 1.0;
-    presetOutputs->sy= 1.0;
-    presetOutputs->dx= 0.0;
-    presetOutputs->dy= 0.0;
-    presetOutputs->cx= 0.5;
-    presetOutputs->cy= 0.5;
+  presetOutputs->screenDecay        = .98;
 
-    presetOutputs->screenDecay=.98;
+  presetOutputs->wave.r             = 1.0;
+  presetOutputs->wave.g             = 0.2;
+  presetOutputs->wave.b             = 0.0;
+  presetOutputs->wave.x             = 0.5;
+  presetOutputs->wave.y             = 0.5;
+  presetOutputs->wave.mystery       = 0.0;
 
-    presetOutputs->wave.r= 1.0;
-    presetOutputs->wave.g= 0.2;
-    presetOutputs->wave.b= 0.0;
-    presetOutputs->wave.x= 0.5;
-    presetOutputs->wave.y= 0.5;
-    presetOutputs->wave.mystery= 0.0;
+  presetOutputs->border.outer_size  = 0.0;
+  presetOutputs->border.outer_r     = 0.0;
+  presetOutputs->border.outer_g     = 0.0;
+  presetOutputs->border.outer_b     = 0.0;
+  presetOutputs->border.outer_a     = 0.0;
 
-    presetOutputs->border.outer_size= 0.0;
-    presetOutputs->border.outer_r= 0.0;
-    presetOutputs->border.outer_g= 0.0;
-    presetOutputs->border.outer_b= 0.0;
-    presetOutputs->border.outer_a= 0.0;
+  presetOutputs->border.inner_size  = 0.0;
+  presetOutputs->border.inner_r     = 0.0;
+  presetOutputs->border.inner_g     = 0.0;
+  presetOutputs->border.inner_b     = 0.0;
+  presetOutputs->border.inner_a     = 0.0;
 
-    presetOutputs->border.inner_size = 0.0;
-    presetOutputs->border.inner_r = 0.0;
-    presetOutputs->border.inner_g = 0.0;
-    presetOutputs->border.inner_b = 0.0;
-    presetOutputs->border.inner_a = 0.0;
-
-    presetOutputs->mv.a = 0.0;
-    presetOutputs->mv.r = 0.0;
-    presetOutputs->mv.g = 0.0;
-    presetOutputs->mv.b = 0.0;
-    presetOutputs->mv.length = 1.0;
-    presetOutputs->mv.x_num = 16.0;
-    presetOutputs->mv.y_num = 12.0;
-    presetOutputs->mv.x_offset = 0.02;
-    presetOutputs->mv.y_offset = 0.02;
+  presetOutputs->mv.a               = 0.0;
+  presetOutputs->mv.r               = 0.0;
+  presetOutputs->mv.g               = 0.0;
+  presetOutputs->mv.b               = 0.0;
+  presetOutputs->mv.length          = 1.0;
+  presetOutputs->mv.x_num           = 16.0;
+  presetOutputs->mv.y_num           = 12.0;
+  presetOutputs->mv.x_offset        = 0.02;
+  presetOutputs->mv.y_offset        = 0.02;
 
 
-    /* PER_FRAME CONSTANTS END */
-    presetOutputs->fRating = 0;
-    presetOutputs->fGammaAdj = 1.0;
-    presetOutputs->videoEcho.zoom = 1.0;
-    presetOutputs->videoEcho.a = 0;
-    presetOutputs->videoEcho.orientation = Normal;
+  /* PER_FRAME CONSTANTS END */
+  presetOutputs->fRating            = 0;
+  presetOutputs->fGammaAdj          = 1.0;
+  presetOutputs->videoEcho.zoom         = 1.0;
+  presetOutputs->videoEcho.a            = 0;
+  presetOutputs->videoEcho.orientation  = Normal;
 
-    presetOutputs->wave.additive = false;
-    presetOutputs->wave.dots = false;
-    presetOutputs->wave.thick = false;
-    presetOutputs->wave.modulateAlphaByVolume = 0;
-    presetOutputs->wave.maximizeColors = 0;
-    presetOutputs->textureWrap = 0;
-    presetOutputs->bDarkenCenter = 0;
-    presetOutputs->bRedBlueStereo = 0;
-    presetOutputs->bBrighten = 0;
-    presetOutputs->bDarken = 0;
-    presetOutputs->bSolarize = 0;
-    presetOutputs->bInvert = 0;
-    presetOutputs->bMotionVectorsOn = 1;
+  presetOutputs->wave.additive              = false;
+  presetOutputs->wave.dots                  = false;
+  presetOutputs->wave.thick                 = false;
+  presetOutputs->wave.modulateAlphaByVolume = 0;
+  presetOutputs->wave.maximizeColors        = 0;
+  presetOutputs->textureWrap        = 0;
+  presetOutputs->bDarkenCenter      = 0;
+  presetOutputs->bRedBlueStereo     = 0;
+  presetOutputs->bBrighten          = 0;
+  presetOutputs->bDarken            = 0;
+  presetOutputs->bSolarize          = 0;
+  presetOutputs->bInvert            = 0;
+  presetOutputs->bMotionVectorsOn   = 1;
 
-    presetOutputs->wave.a =1.0;
-    presetOutputs->wave.scale = 1.0;
-    presetOutputs->wave.smoothing = 0;
-    presetOutputs->wave.mystery = 0;
-    presetOutputs->wave.modOpacityEnd = 0;
-    presetOutputs->wave.modOpacityStart = 0;
-    presetOutputs->fWarpAnimSpeed = 0;
-    presetOutputs->fWarpScale = 0;
-    presetOutputs->fShader = 0;
+  presetOutputs->wave.a               =1.0;
+  presetOutputs->wave.scale           = 1.0;
+  presetOutputs->wave.smoothing       = 0;
+  presetOutputs->wave.mystery         = 0;
+  presetOutputs->wave.modOpacityEnd   = 0;
+  presetOutputs->wave.modOpacityStart = 0;
+  presetOutputs->fWarpAnimSpeed     = 0;
+  presetOutputs->fWarpScale         = 0;
+  presetOutputs->fShader            = 0;
 
-    /* PER_PIXEL CONSTANT END */
-    /* Q VARIABLES START */
+  /* PER_PIXEL CONSTANT END */
+  /* Q VARIABLES START */
 
-    for (int i = 0;i< 32;i++)
-        presetOutputs->q[i] = 0;
+  for (int i = 0;i< 32;i++)
+    presetOutputs->q[i] = 0;
 
-//	for ( std::vector<CustomWave*>::iterator pos = presetOutputs->customWaves.begin();
-//	        pos != presetOutputs->customWaves.end(); ++pos )
-//		if ( *pos != 0 ) delete ( *pos );
-	
-//	for ( std::vector<CustomShape*>::iterator pos = presetOutputs->customShapes.begin();
-//	        pos != presetOutputs->customShapes.end(); ++pos )
-//		if ( *pos != 0 ) delete ( *pos );
-	
-	presetOutputs->customWaves.clear();
-	presetOutputs->customShapes.clear();
+  //  for ( std::vector<CustomWave*>::iterator pos = presetOutputs->customWaves.begin();
+  //          pos != presetOutputs->customWaves.end(); ++pos )
+  //    if ( *pos != 0 ) delete ( *pos );
 
-    /* Q VARIABLES END */
+  //  for ( std::vector<CustomShape*>::iterator pos = presetOutputs->customShapes.begin();
+  //          pos != presetOutputs->customShapes.end(); ++pos )
+  //    if ( *pos != 0 ) delete ( *pos );
 
+  presetOutputs->customWaves.clear();
+  presetOutputs->customShapes.clear();
+
+  /* Q VARIABLES END */
 }
 
 
 /* Reinitializes the engine variables to a default (conservative and sane) value */
-void MilkdropPresetFactory::reset()
+void
+MilkdropPresetFactory::reset()
 {
-
-    resetPresetOutputs(_presetOutputs);
-    resetPresetOutputs(_presetOutputs2);
+  resetPresetOutputs(_presetOutputs);
+  resetPresetOutputs(_presetOutputs2);
 }
 
-PresetOutputs* MilkdropPresetFactory::createPresetOutputs(int gx, int gy)
+PresetOutputs*
+MilkdropPresetFactory::createPresetOutputs(int gx, int gy)
 {
+  PresetOutputs *presetOutputs = new PresetOutputs();
 
-	PresetOutputs *presetOutputs = new PresetOutputs();
+  presetOutputs->Initialize(gx,gy);
 
-	presetOutputs->Initialize(gx,gy);
+  /* PER FRAME CONSTANTS BEGIN */
+  presetOutputs->zoom               = 1.0;
+  presetOutputs->zoomexp            = 1.0;
+  presetOutputs->rot                = 0.0;
+  presetOutputs->warp               = 0.0;
 
-	/* PER FRAME CONSTANTS BEGIN */
-	presetOutputs->zoom=1.0;
-	presetOutputs->zoomexp = 1.0;
-	presetOutputs->rot= 0.0;
-	presetOutputs->warp= 0.0;
+  presetOutputs->sx                 = 1.0;
+  presetOutputs->sy                 = 1.0;
+  presetOutputs->dx                 = 0.0;
+  presetOutputs->dy                 = 0.0;
+  presetOutputs->cx                 = 0.5;
+  presetOutputs->cy                 = 0.5;
 
-	presetOutputs->sx= 1.0;
-	presetOutputs->sy= 1.0;
-	presetOutputs->dx= 0.0;
-	presetOutputs->dy= 0.0;
-	presetOutputs->cx= 0.5;
-	presetOutputs->cy= 0.5;
-
-	presetOutputs->screenDecay=.98;
+  presetOutputs->screenDecay        =.98;
 
 
-//_presetInputs.meshx = 0;
-//_presetInputs.meshy = 0;
+  //_presetInputs.meshx = 0;
+  //_presetInputs.meshy = 0;
 
 
-	/* PER_FRAME CONSTANTS END */
-	presetOutputs->fRating = 0;
-	presetOutputs->fGammaAdj = 1.0;
-	presetOutputs->videoEcho.zoom = 1.0;
-	presetOutputs->videoEcho.a = 0;
-	presetOutputs->videoEcho.orientation = Normal;
+  /* PER_FRAME CONSTANTS END */
+  presetOutputs->fRating            = 0;
+  presetOutputs->fGammaAdj          = 1.0;
+  presetOutputs->videoEcho.zoom         = 1.0;
+  presetOutputs->videoEcho.a            = 0;
+  presetOutputs->videoEcho.orientation  = Normal;
 
-	presetOutputs->textureWrap = 0;
-	presetOutputs->bDarkenCenter = 0;
-	presetOutputs->bRedBlueStereo = 0;
-	presetOutputs->bBrighten = 0;
-	presetOutputs->bDarken = 0;
-	presetOutputs->bSolarize = 0;
-	presetOutputs->bInvert = 0;
-	presetOutputs->bMotionVectorsOn = 1;
+  presetOutputs->textureWrap        = 0;
+  presetOutputs->bDarkenCenter      = 0;
+  presetOutputs->bRedBlueStereo     = 0;
+  presetOutputs->bBrighten          = 0;
+  presetOutputs->bDarken            = 0;
+  presetOutputs->bSolarize          = 0;
+  presetOutputs->bInvert            = 0;
+  presetOutputs->bMotionVectorsOn   = 1;
 
-    	presetOutputs->fWarpAnimSpeed = 0;
-	presetOutputs->fWarpScale = 0;
-	presetOutputs->fShader = 0;
+  presetOutputs->fWarpAnimSpeed     = 0;
+  presetOutputs->fWarpScale         = 0;
+  presetOutputs->fShader            = 0;
 
-	/* PER_PIXEL CONSTANTS BEGIN */
+  /* PER_PIXEL CONSTANTS BEGIN */
 
-	/* PER_PIXEL CONSTANT END */
+  /* PER_PIXEL CONSTANT END */
 
-	/* Q AND T VARIABLES START */
+  /* Q AND T VARIABLES START */
 
-	for (int i = 0;i<NUM_Q_VARIABLES;i++)
-		presetOutputs->q[i] = 0;
-	
-	/* Q AND T VARIABLES END */
-    return presetOutputs;
+  for (int i = 0;  i < NUM_Q_VARIABLES;  i++)
+    presetOutputs->q[i] = 0;
+
+  /* Q AND T VARIABLES END */
+  return presetOutputs;
 }
 
 
-std::auto_ptr<Preset> MilkdropPresetFactory::allocate(const std::string & url, const std::string & name, const std::string & author) {
+std::auto_ptr<Preset>
+MilkdropPresetFactory::allocate(
+const std::string & url,
+const std::string & name,
+const std::string & author
+)
+{
+  PresetOutputs *presetOutputs = _usePresetOutputs ? _presetOutputs : _presetOutputs2;
 
-    PresetOutputs *presetOutputs = _usePresetOutputs ? _presetOutputs : _presetOutputs2;
+  _usePresetOutputs = !_usePresetOutputs;
+  resetPresetOutputs(presetOutputs);
 
-	_usePresetOutputs = !_usePresetOutputs;
-	resetPresetOutputs(presetOutputs);
+  std::string path;
 
-	std::string path;
-	if (PresetFactory::protocol(url, path) == PresetFactory::IDLE_PRESET_PROTOCOL) {
-		return IdlePresets::allocate(path, *presetOutputs);
-	} else
-		return std::auto_ptr<Preset>(new MilkdropPreset(url, name, *presetOutputs));
+  if (PresetFactory::protocol(url, path) == PresetFactory::IDLE_PRESET_PROTOCOL) {
+    return IdlePresets::allocate(path, *presetOutputs);
+  } else
+    return std::auto_ptr<Preset>(new MilkdropPreset(url, name, *presetOutputs));
 }
diff --git a/src/libprojectM/MilkdropPresetFactory/MilkdropPresetFactory.hpp b/src/libprojectM/MilkdropPresetFactory/MilkdropPresetFactory.hpp
index 2a5a46a..4dff790 100644
--- a/src/libprojectM/MilkdropPresetFactory/MilkdropPresetFactory.hpp
+++ b/src/libprojectM/MilkdropPresetFactory/MilkdropPresetFactory.hpp
@@ -9,35 +9,37 @@
 // Copyright: See COPYING file that comes with this distribution
 //
 //
-
 #ifndef __MILKDROP_PRESET_FACTORY_HPP
 #define __MILKDROP_PRESET_FACTORY_HPP
 
 #include <memory>
 #include "../PresetFactory.hpp"
+
+
 class DLLEXPORT PresetOutputs;
 class DLLEXPORT PresetInputs;
 
+
 class MilkdropPresetFactory : public PresetFactory {
 
 public:
 
- MilkdropPresetFactory(int gx, int gy);
+  MilkdropPresetFactory(int gx, int gy);
 
- virtual ~MilkdropPresetFactory();
+  virtual ~MilkdropPresetFactory();
 
- std::auto_ptr<Preset> allocate(const std::string & url, const std::string & name = std::string(),
-	const std::string & author = std::string());
+  std::auto_ptr<Preset> allocate(const std::string & url, const std::string & name = std::string(),
+                                 const std::string & author = std::string());
 
- std::string supportedExtensions() const { return "milk prjm"; }
+  std::string supportedExtensions() const { return "milk prjm"; }
 
 private:
-    static PresetOutputs* createPresetOutputs(int gx, int gy);
-	void reset();
-	PresetOutputs * _presetOutputs;
-    PresetOutputs * _presetOutputs2;
-    bool _usePresetOutputs;
-	//PresetInputs _presetInputs;
+  static PresetOutputs* createPresetOutputs(int gx, int gy);
+  void reset();
+  PresetOutputs * _presetOutputs;
+  PresetOutputs * _presetOutputs2;
+  bool _usePresetOutputs;
+  //PresetInputs _presetInputs;
 };
 
 #endif
diff --git a/src/libprojectM/MilkdropPresetFactory/Param.cpp b/src/libprojectM/MilkdropPresetFactory/Param.cpp
index ca21e8f..ebc854f 100644
--- a/src/libprojectM/MilkdropPresetFactory/Param.cpp
+++ b/src/libprojectM/MilkdropPresetFactory/Param.cpp
@@ -39,161 +39,181 @@
 #include <iostream>
 #include <cassert>
 
+
 /** Constructor */
 Param::Param( std::string _name, short int _type, short int _flags, void * _engine_val, void * _matrix,
-              CValue _default_init_val, CValue _upper_bound, CValue _lower_bound):
-	name(_name),
-        type(_type),
-        flags (_flags),
-        matrix_flag (0),
-        engine_val(_engine_val),
-        matrix (_matrix),
-        default_init_val (_default_init_val),
-        upper_bound (_upper_bound),
-        lower_bound (_lower_bound)
-    {
+              CValue _default_init_val, CValue _upper_bound, CValue _lower_bound)
+  : name(_name),
+    type(_type),
+    flags (_flags),
+    matrix_flag (0),
+    engine_val(_engine_val),
+    matrix (_matrix),
+    default_init_val (_default_init_val),
+    upper_bound (_upper_bound),
+    lower_bound (_lower_bound)
+{
 
 }
 
 
 /* Creates a user defined parameter */
-Param::Param(std::string _name) :
-	name(_name),
-        type(P_TYPE_DOUBLE),
-	flags(P_FLAG_USERDEF),
-        matrix_flag(0),
-        matrix(0)
-        {
+Param::Param(std::string _name)
+  : name(_name),
+    type(P_TYPE_DOUBLE),
+    flags(P_FLAG_USERDEF),
+    matrix_flag(0),
+    matrix(0)
+{
+  engine_val = new float();
 
-	engine_val = new float();
+  default_init_val.float_val = DEFAULT_DOUBLE_IV;
+  upper_bound.float_val = DEFAULT_DOUBLE_UB;
+  lower_bound.float_val = DEFAULT_DOUBLE_LB;
 
-	default_init_val.float_val = DEFAULT_DOUBLE_IV;
-        upper_bound.float_val = DEFAULT_DOUBLE_UB;
-        lower_bound.float_val = DEFAULT_DOUBLE_LB;
-
-    /// @note may have fixed a recent bug. testing
-    *((float*)engine_val) = default_init_val.float_val;
-
-   
+  /// @note may have fixed a recent bug. testing
+  *((float*)engine_val) = default_init_val.float_val;
 }
 
 /* Free's a parameter type */
-Param::~Param() {
+Param::~Param()
+{
+  // I hate this, but will let it be for now
+  if (flags & P_FLAG_USERDEF) {
+    delete((double*)engine_val);
+  }
 
-    // I hate this, but will let it be for now
-    if (flags & P_FLAG_USERDEF) {
-        delete((double*)engine_val);
-    }
-
-    if (PARAM_DEBUG) printf("~Param: freeing \"%s\".\n", name.c_str());
+  if (PARAM_DEBUG) printf("~Param: freeing \"%s\".\n", name.c_str());
 }
 
 
 /* Returns nonzero if the string is valid parameter name */
-bool Param::is_valid_param_string( const char * string ) {
+bool
+Param::is_valid_param_string( const char * string )
+{
 
-    if (string == NULL)
-        return false;
+  if (string == NULL)
+    return false;
 
-    /* This ensures the first character is non numeric */
-    if ( ((*string) >= 48) && ((*string) <= 57))
-        return false;
+  /* This ensures the first character is non numeric */
+  if ( ((*string) >= 48) && ((*string) <= 57))
+    return false;
 
-    /* These probably should never happen */
-    if (*string == '.')
-        return false;
+  /* These probably should never happen */
+  if (*string == '.')
+    return false;
 
-    if (*string == '+')
-        return false;
+  if (*string == '+')
+    return false;
 
-    if (*string == '-')
-        return false;
+  if (*string == '-')
+    return false;
 
-    /* Could also add checks for other symbols. May do later */
+  /* Could also add checks for other symbols. May do later */
 
-    return true;
-
+  return true;
 }
 
 
 
 /* Loads a float parameter into the builtin database */
-Param * Param::new_param_float(const char * name, short int flags, void * engine_val, void * matrix,
-                               float upper_bound, float lower_bound, float init_val) {
+Param *
+Param::new_param_float (
+const char  * name,
+short int   flags,
+void        * engine_val,
+void        * matrix,
+float       upper_bound,
+float       lower_bound,
+float       init_val
+)
+{
+  Param   * param;
+  CValue  iv, ub, lb;
+  assert(engine_val);
 
-    Param * param;
-    CValue iv, ub, lb;
-    assert(engine_val);
+  iv.float_val = init_val;
+  ub.float_val = upper_bound;
+  lb.float_val = lower_bound;
 
-    iv.float_val = init_val;
-    ub.float_val = upper_bound;
-    lb.float_val = lower_bound;
-
-    if ((param = new Param(name, P_TYPE_DOUBLE, flags, engine_val, matrix,iv, ub, lb)) == NULL)
-        return NULL;
+  if ((param = new Param(name, P_TYPE_DOUBLE, flags, engine_val, matrix,iv, ub, lb)) == NULL)
+    return NULL;
 
 
-    /* Finished, return success */
-    return param;
+  /* Finished, return success */
+  return param;
 }
 
 /* Creates a new parameter of type int */
-Param * Param::new_param_int(const char * name, short int flags, void * engine_val,	
-                             int upper_bound, int lower_bound, int init_val) {
+Param *
+Param::new_param_int (
+const char  * name,
+short int   flags,
+void        * engine_val,
+int         upper_bound,
+int         lower_bound,
+int         init_val
+)
+{
+  Param   * param;
+  CValue  iv, ub, lb;
+  assert(engine_val);
 
-    Param * param;
-    CValue iv, ub, lb;
-    assert(engine_val);
+  iv.int_val = init_val;
+  ub.int_val = upper_bound;
+  lb.int_val = lower_bound;
 
-    iv.int_val = init_val;
-    ub.int_val = upper_bound;
-    lb.int_val = lower_bound;
-
-    if ((param = new Param(name, P_TYPE_INT, flags, engine_val, NULL, iv, ub, lb)) == NULL)
-        return NULL;
+  if ((param = new Param(name, P_TYPE_INT, flags, engine_val, NULL, iv, ub, lb)) == NULL)
+    return NULL;
 
 
-    /* Finished, return success */
-    return param;
+  /* Finished, return success */
+  return param;
 }
 
 /* Creates a new parameter of type bool */
-Param * Param::new_param_bool(const char * name, short int flags, void * engine_val,
-                              bool upper_bound, bool lower_bound, bool init_val) {
+Param *
+Param::new_param_bool (
+const char  * name,
+short int   flags,
+void        * engine_val,
+bool        upper_bound,
+bool        lower_bound,
+bool        init_val
+)
+{
+  Param   * param;
+  CValue  iv, ub, lb;
+  assert(engine_val);
 
-    Param * param;
-    CValue iv, ub, lb;
-    assert(engine_val);
+  iv.bool_val = init_val;
+  ub.bool_val = upper_bound;
+  lb.bool_val = lower_bound;
 
-    iv.bool_val = init_val;
-    ub.bool_val = upper_bound;
-    lb.bool_val = lower_bound;
-
-    if ((param = new Param(name, P_TYPE_BOOL, flags, engine_val, NULL, iv, ub, lb)) == NULL)
-        return NULL;
+  if ((param = new Param(name, P_TYPE_BOOL, flags, engine_val, NULL, iv, ub, lb)) == NULL)
+    return NULL;
 
 
-    /* Finished, return success */
-    return param;
+  /* Finished, return success */
+  return param;
 }
 
 /* Creates a new parameter of type string */
-Param * Param::new_param_string(const char * name, short int flags, void * engine_val) {
+Param *
+Param::new_param_string (const char * name, short int flags, void * engine_val)
+{
+  Param   * param;
+  CValue  iv, ub, lb;
+  assert(engine_val);
 
-    Param * param;
-    CValue iv, ub, lb;
-    assert(engine_val);
+  iv.bool_val = 0;
+  ub.bool_val = 0;
+  lb.bool_val = 0;
 
-    iv.bool_val = 0;
-    ub.bool_val = 0;
-    lb.bool_val = 0;
-
-    if ((param = new Param(name, P_TYPE_STRING, flags, engine_val, NULL, iv, ub, lb)) == NULL)
-        return NULL;
+  if ((param = new Param(name, P_TYPE_STRING, flags, engine_val, NULL, iv, ub, lb)) == NULL)
+    return NULL;
 
 
-    /* Finished, return success */
-    return param;
+  /* Finished, return success */
+  return param;
 }
-
-
diff --git a/src/libprojectM/MilkdropPresetFactory/Param.hpp b/src/libprojectM/MilkdropPresetFactory/Param.hpp
index 1f6bcf2..c422819 100644
--- a/src/libprojectM/MilkdropPresetFactory/Param.hpp
+++ b/src/libprojectM/MilkdropPresetFactory/Param.hpp
@@ -25,7 +25,6 @@
  *
  * $Log$
  */
-
 #ifndef _PARAM_H
 #define _PARAM_H
 
@@ -54,6 +53,8 @@
 #include "Common.hpp"
 #include <cmath>
 #include <string>
+
+
 class InitCond;
 class Param;
 class Preset;
@@ -62,90 +63,88 @@
 /* Parameter Type */
 class Param {
 public:
-    std::string name; /* name of the parameter, not necessary but useful neverthless */
-    short int type; /* parameter number type (int, bool, or float) */
-    short int flags; /* read, write, user defined, etc */
-    short int matrix_flag; /* for optimization purposes */
-    void * engine_val; /* pointer to the engine variable */
-    void * matrix; /* per pixel / per point matrix for this variable */
-    CValue default_init_val; /* a default initial condition value */
-    CValue upper_bound; /* this parameter's upper bound */
-    CValue lower_bound; /* this parameter's lower bound */
+  std::string name; /* name of the parameter, not necessary but useful neverthless */
+  short int type; /* parameter number type (int, bool, or float) */
+  short int flags; /* read, write, user defined, etc */
+  short int matrix_flag; /* for optimization purposes */
+  void * engine_val; /* pointer to the engine variable */
+  void * matrix; /* per pixel / per point matrix for this variable */
+  CValue default_init_val; /* a default initial condition value */
+  CValue upper_bound; /* this parameter's upper bound */
+  CValue lower_bound; /* this parameter's lower bound */
 
-    /// Create a new parameter
-    Param(std::string name, short int type, short int flags,
-           void * eqn_val, void *matrix,
-           CValue default_init_val, CValue upper_bound,
-           CValue lower_bound);
+  /// Create a new parameter
+  Param (std::string name, short int type, short int flags,
+         void * eqn_val, void *matrix,
+         CValue default_init_val, CValue upper_bound,
+         CValue lower_bound);
 
-    ~Param();
+  ~Param();
 
-    /// Create a user defined floating point parameter
-    Param( std::string name );
+  /// Create a user defined floating point parameter
+  Param( std::string name );
 
-    static bool is_valid_param_string( const char *string );
-    void set_param( float val );
+  static bool is_valid_param_string( const char *string );
+  void set_param( float val );
 
-    static Param *new_param_float( const char *name, short int flags, void *engine_val,
-                             void *matrix, float upper_bound,
-                             float lower_bound,
-                             float init_val );
-    static Param *new_param_double(const char *name, short int flags, void *engine_val,
-                             void *matrix, double upper_bound,
-                             double lower_bound,
-                             double init_val );
-    static Param * new_param_int(const char * name, short int flags, void * engine_val,
-                           int upper_bound, int lower_bound, int init_val );
-    static Param * new_param_bool(const char * name, short int flags, void * engine_val,
-                            bool upper_bound, bool lower_bound, bool init_val );
-    static Param * new_param_string(const char * name, short int flags, void * engine_val);
-
+  static Param *new_param_float( const char *name, short int flags, void *engine_val,
+                                 void *matrix, float upper_bound,
+                                 float lower_bound,
+                                 float init_val );
+  static Param *new_param_double(const char *name, short int flags, void *engine_val,
+                                 void *matrix, double upper_bound,
+                                 double lower_bound,
+                                 double init_val );
+  static Param * new_param_int(const char * name, short int flags, void * engine_val,
+                               int upper_bound, int lower_bound, int init_val );
+  static Param * new_param_bool(const char * name, short int flags, void * engine_val,
+                                bool upper_bound, bool lower_bound, bool init_val );
+  static Param * new_param_string(const char * name, short int flags, void * engine_val);
 };
 
 
 /* Sets the parameter engine value to value val.
-	clipping occurs if necessary */
-inline void Param::set_param( float val) {
+  clipping occurs if necessary */
+inline void
+Param::set_param( float val)
+{
+  switch (type) {
+  case P_TYPE_BOOL:
+    if (val < 0)
+      *((bool*)engine_val) = false;
+    else if (val > 0)
+      *((bool*)engine_val) = true;
+    else
+      *((bool*)engine_val) = false;
+    break;
 
-    switch (type) {
+  case P_TYPE_INT:
+    /* Make sure value is an integer */
+    val = floor(val);
+    if (val < lower_bound.int_val)
+      *((int*)engine_val) = lower_bound.int_val;
+    else if (val > upper_bound.int_val)
+      *((int*)engine_val) = upper_bound.int_val;
+    else
+      *((int*)engine_val) = (int)val;
+    break;
 
-    case P_TYPE_BOOL:
-        if (val < 0)
-            *((bool*)engine_val) = false;
-        else if (val > 0)
-            *((bool*)engine_val) = true;
-        else
-            *((bool*)engine_val) = false;
-        break;
-    case P_TYPE_INT:
-        /* Make sure value is an integer */
-        val = floor(val);
-        if (val < lower_bound.int_val)
-            *((int*)engine_val) = lower_bound.int_val;
-        else if (val > upper_bound.int_val)
-            *((int*)engine_val) = upper_bound.int_val;
-        else
-            *((int*)engine_val) = (int)val;
-        break;
-    case P_TYPE_DOUBLE:
-        /* Make sure value is an integer */
+  case P_TYPE_DOUBLE:
+    /* Make sure value is an integer */
+    if (val < lower_bound.float_val)
+      *((float*)engine_val) = lower_bound.float_val;
+    else if (val > upper_bound.float_val)
+      *((float*)engine_val) = upper_bound.float_val;
+    else
+      *((float*)engine_val) = val;
+    break;
 
+  default:
+    //abort();
+    break;
+  }
 
-        if (val < lower_bound.float_val)
-            *((float*)engine_val) = lower_bound.float_val;
-        else if (val > upper_bound.float_val)
-            *((float*)engine_val) = upper_bound.float_val;
-        else
-            *((float*)engine_val) = val;
-        break;
-    default:
-	//abort();
-        break;
-
-    }
-
-    return;
+  return;
 }
 
 #endif /** !_PARAM_TYPES_H */
-
diff --git a/src/libprojectM/MilkdropPresetFactory/ParamUtils.hpp b/src/libprojectM/MilkdropPresetFactory/ParamUtils.hpp
index dd94ff7..2a574e4 100644
--- a/src/libprojectM/MilkdropPresetFactory/ParamUtils.hpp
+++ b/src/libprojectM/MilkdropPresetFactory/ParamUtils.hpp
@@ -10,34 +10,33 @@
 #include <cassert>
 #include "BuiltinParams.hpp"
 
+
 class ParamUtils
 {
 public:
-  static bool insert(Param * param, std::map<std::string,Param*> * paramTree)
+  static bool
+  insert(Param * param, std::map<std::string,Param*> * paramTree)
   {
-
     assert(param);
     assert(paramTree);
 
-    
-    return ((paramTree->insert(std::make_pair(param->name,param))).second);
 
+    return ((paramTree->insert(std::make_pair(param->name,param))).second);
   }
 
   static const int AUTO_CREATE = 1;
   static const int NO_CREATE = 0;
 
-  template <int FLAGS>
-  static Param * find(std::string name, std::map<std::string,Param*> * paramTree)
+  template <int FLAGS> static Param *
+  find(std::string name, std::map<std::string,Param*> * paramTree)
   {
-
     assert(paramTree);
 
     Param * param;
 
     /* First look in the suggested database */
     std::map<std::string,Param*>::iterator pos = paramTree->find(name);
-		
+
 
     if ((FLAGS == AUTO_CREATE) && ((pos == paramTree->end())))
     {
@@ -50,26 +49,24 @@
         return NULL;
 
       /* Finally, insert the new parameter into this preset's parameter tree */
-      std::pair<std::map<std::string,Param*>::iterator, bool>  insertRetPair = 
-		paramTree->insert(std::make_pair(param->name, param));
+      std::pair<std::map<std::string,Param*>::iterator, bool>  insertRetPair =
+          paramTree->insert(std::make_pair(param->name, param));
 
       assert(insertRetPair.second);
-	
+
     } else if (pos != paramTree->end())
-	param = pos->second;
+      param = pos->second;
     else
-	param = NULL;	
+      param = NULL;
 
     /* Return the found (or created) parameter. Note that this could be null */
     return param;
-
-
   }
 
 
-  static Param * find(const std::string & name, BuiltinParams * builtinParams, std::map<std::string,Param*> * insertionTree)
+  static Param *
+  find(const std::string & name, BuiltinParams * builtinParams, std::map<std::string,Param*> * insertionTree)
   {
-
     Param * param;
 
     // Check first db
@@ -78,7 +75,6 @@
 
     // Check second db, create if necessary
     return find<AUTO_CREATE>(name, insertionTree);
-
   }
 
 };
diff --git a/src/libprojectM/MilkdropPresetFactory/Parser.cpp b/src/libprojectM/MilkdropPresetFactory/Parser.cpp
index 16c3c82..8a71f6d 100644
--- a/src/libprojectM/MilkdropPresetFactory/Parser.cpp
+++ b/src/libprojectM/MilkdropPresetFactory/Parser.cpp
@@ -19,7 +19,6 @@
  *
  */
 /* parser.c */
-
 #include <stdio.h>
 #include <string>
 #include <cstring>
@@ -47,29 +46,31 @@
 #include <sstream>
 #include "BuiltinFuncs.hpp"
 
+
 /* Grabs the next token from the file. The second argument points
    to the raw string */
 
-line_mode_t Parser::line_mode;
-CustomWave *Parser::current_wave;
-CustomShape *Parser::current_shape;
-int Parser::string_line_buffer_index;
-char Parser::string_line_buffer[STRING_LINE_SIZE];
-unsigned int Parser::line_count;
-int Parser::per_frame_eqn_count;
-int Parser::per_frame_init_eqn_count;
-int Parser::last_custom_wave_id;
-int Parser::last_custom_shape_id;
-char Parser::last_eqn_type[MAX_TOKEN_SIZE];
-int Parser::last_token_size;
+line_mode_t   Parser::line_mode;
+CustomWave    *Parser::current_wave;
+CustomShape   *Parser::current_shape;
+int           Parser::string_line_buffer_index;
+char          Parser::string_line_buffer[STRING_LINE_SIZE];
+unsigned int  Parser::line_count;
+int           Parser::per_frame_eqn_count;
+int           Parser::per_frame_init_eqn_count;
+int           Parser::last_custom_wave_id;
+int           Parser::last_custom_shape_id;
+char          Parser::last_eqn_type[MAX_TOKEN_SIZE];
+int           Parser::last_token_size;
 
 std::string Parser::lastLinePrefix("");
 
 bool Parser::tokenWrapAroundEnabled(false);
 
-token_t Parser::parseToken(std::istream &  fs, char * string)
-{
 
+token_t
+Parser::parseToken(std::istream &  fs, char * string)
+{
   int c;
   int i;
 
@@ -128,7 +129,6 @@
             return tEOL;
           }
         }
-
       }
 
       /* Otherwise, just a regular division operator */
@@ -166,43 +166,44 @@
 
       if (tokenWrapAroundEnabled)
       {
-	std::ostringstream buffer;
+        std::ostringstream buffer;
 
         if (PARSE_DEBUG) std::cerr << "token wrap! line " << line_count << std::endl;
         while (c != '=')
         {
-
           if (!fs || fs.eof())
           {
             line_count = 1;
             line_mode = UNSET_LINE_MODE;
-        if (PARSE_DEBUG)     std::cerr << "token wrap: end of file" << std::endl;
+            if (PARSE_DEBUG)     std::cerr << "token wrap: end of file" << std::endl;
             return tEOF;
           }
-
           else {
-	    c = fs.get();
-	    if ( c != '=')
-            	buffer << (char)c;
-	}
-
+            c = fs.get();
+            if ( c != '=')
+            buffer << (char)c;
+          }
         }
-        if (PARSE_DEBUG) std::cerr << "parseToken: parsed away equal sign, line prefix is \""  << buffer.str()
-		<< "\"" << std::endl;
+
+        if (PARSE_DEBUG)
+          std::cerr << "parseToken: parsed away equal sign, line prefix is \""
+                    << buffer.str()
+                    << "\""
+                    << std::endl;
         --i;
 
-	if (!wrapsToNextLine(buffer.str())) {
-		tokenWrapAroundEnabled = false;
-		int buf_size = (int)buffer.str().length();
-		// <= to also remove equal sign parsing from stream
-		for (int k = 0; k <= buf_size; k++) {
-			if (fs)
-				fs.unget();
-			else
-				abort();
-		}
-		return tEOL;
-	}
+        if (!wrapsToNextLine(buffer.str())) {
+          tokenWrapAroundEnabled = false;
+          int buf_size = (int)buffer.str().length();
+          // <= to also remove equal sign parsing from stream
+          for (int k = 0; k <= buf_size; k++) {
+            if (fs)
+              fs.unget();
+            else
+              abort();
+          }
+          return tEOL;
+        }
 
 
         break;
@@ -228,29 +229,28 @@
     case '\r':
       i--;
       break;
-    default:
-    	if (c == EOF)
-    		std::cerr << "shouldn't happen: " << c << "(LINE " << line_count << ")" << std::endl;
-        string[i] = tolower(c);
-        //string[i+1] = 0;
-        //std::cerr << "string is \n\"" << string << "\"" << std::endl;
-      }
+      default:
+      if (c == EOF)
+        std::cerr << "shouldn't happen: " << c << "(LINE " << line_count << ")" << std::endl;
+      string[i] = tolower(c);
+      //string[i+1] = 0;
+      //std::cerr << "string is \n\"" << string << "\"" << std::endl;
+    }
 
 
   }
 
   /* String reached maximum length, return special token error */
   return tStringTooLong;
-
 }
 
 /* Parse input in the form of "exp, exp, exp, ...)"
    Returns a general expression list */
 
-GenExpr **Parser::parse_prefix_args(std::istream &  fs, int num_args, MilkdropPreset * preset)
+GenExpr **
+Parser::parse_prefix_args(std::istream &  fs, int num_args, MilkdropPreset * preset)
 {
-
-  int i, j;
+  int     i, j;
   GenExpr ** expr_list; /* List of arguments to function */
   GenExpr * gen_expr;
 
@@ -287,7 +287,8 @@
 }
 
 /* Parses a comment at the top of the file. Stops when left bracket is found */
-int Parser::parse_top_comment(std::istream &  fs)
+int
+Parser::parse_top_comment(std::istream &  fs)
 {
 
   char string[MAX_TOKEN_SIZE];
@@ -306,9 +307,9 @@
 
 /* Right Bracket is parsed by this function.
    puts a new string into name */
-int Parser::parse_preset_name(std::istream &  fs, char * name)
+int
+Parser::parse_preset_name(std::istream &  fs, char * name)
 {
-
   token_t token;
 
   if (name == NULL)
@@ -322,21 +323,18 @@
 
 
 /* Parses per pixel equations */
-int Parser::parse_per_pixel_eqn(std::istream &  fs, MilkdropPreset * preset, char * init_string)
+int
+Parser::parse_per_pixel_eqn(std::istream &  fs, MilkdropPreset * preset, char * init_string)
 {
-
-
   char string[MAX_TOKEN_SIZE];
   GenExpr * gen_expr;
 
-
   if (init_string != 0)
   {
     strncpy(string, init_string, strlen(init_string));
   }
   else
   {
-
     if (parseToken(fs, string) != tEq)
     { /* parse per pixel operator name */
       return PROJECTM_PARSE_ERROR;
@@ -364,12 +362,13 @@
 }
 
 /* Parses an equation line, this function is way too big, should add some helper functions */
-int Parser::parse_line(std::istream &  fs, MilkdropPreset * preset)
+int
+Parser::parse_line(std::istream &  fs, MilkdropPreset * preset)
 {
 
-  char eqn_string[MAX_TOKEN_SIZE];
-  token_t token;
-  InitCond * init_cond;
+  char        eqn_string[MAX_TOKEN_SIZE];
+  token_t     token;
+  InitCond    * init_cond;
   PerFrameEqn * per_frame_eqn;
 
   /* Clear the string line buffer */
@@ -379,7 +378,7 @@
   tokenWrapAroundEnabled = false;
 
   token = parseToken( fs, eqn_string );
-  switch (token )
+  switch (token)
   {
 
     /* Invalid Cases */
@@ -397,7 +396,7 @@
   case tDiv:
 
     if (PARSE_DEBUG) std::cerr << "parse_line: invalid token found at start of line (LINE "
-      << line_count << ")" << std::endl;
+    << line_count << ")" << std::endl;
 
     /* Invalid token found, return a parse error */
     return PROJECTM_PARSE_ERROR;
@@ -425,35 +424,36 @@
     if (!fs)
       return PROJECTM_PARSE_ERROR;
 
-//	char z = fs.get();
-	char tmpChar;
-	if ((tmpChar = fs.get()) == '\n') {
-		tokenWrapAroundEnabled = false;
-		return PROJECTM_PARSE_ERROR;
-	} else if (tmpChar == '\r') {
-		tokenWrapAroundEnabled = false;
-		return PROJECTM_PARSE_ERROR;
-	} else
-		fs.unget();
+    //  char z = fs.get();
+    char tmpChar;
+
+    if ((tmpChar = fs.get()) == '\n') {
+      tokenWrapAroundEnabled = false;
+      return PROJECTM_PARSE_ERROR;
+    } else if (tmpChar == '\r') {
+      tokenWrapAroundEnabled = false;
+      return PROJECTM_PARSE_ERROR;
+    } else
+      fs.unget();
 
 
 
-	/* CASE: WARP CODE */
-	if (!strncmp(eqn_string, WARP_STRING, WARP_STRING_LENGTH))
-	{
-		//std::cout << "parsing warp string block\n" << std::endl;
-		parse_string_block(fs, &preset->presetOutputs().warpShader.programSource);
-		return PROJECTM_SUCCESS;
-	}
+    /* CASE: WARP CODE */
+    if (!strncmp(eqn_string, WARP_STRING, WARP_STRING_LENGTH))
+    {
+      //std::cout << "parsing warp string block\n" << std::endl;
+      parse_string_block(fs, &preset->presetOutputs().warpShader.programSource);
+      return PROJECTM_SUCCESS;
+    }
 
 
-	/* CASE: COMPOSITE CODE */
-	if (!strncmp(eqn_string, COMPOSITE_STRING, COMPOSITE_STRING_LENGTH))
-	{
-		//std::cout << "parsing composite string block\n" << std::endl;
-		parse_string_block(fs, &preset->presetOutputs().compositeShader.programSource);
-		return PROJECTM_SUCCESS;
-	}
+    /* CASE: COMPOSITE CODE */
+    if (!strncmp(eqn_string, COMPOSITE_STRING, COMPOSITE_STRING_LENGTH))
+    {
+      //std::cout << "parsing composite string block\n" << std::endl;
+      parse_string_block(fs, &preset->presetOutputs().compositeShader.programSource);
+      return PROJECTM_SUCCESS;
+    }
 
     /* CASE: PER FRAME INIT EQUATION */
     if (!strncmp(eqn_string, PER_FRAME_INIT_STRING, PER_FRAME_INIT_STRING_LENGTH))
@@ -479,7 +479,7 @@
     /* Per frame equation case */
     if (!strncmp(eqn_string, PER_FRAME_STRING, PER_FRAME_STRING_LENGTH))
     {
-	tokenWrapAroundEnabled = true;
+      tokenWrapAroundEnabled = true;
       /* Sometimes per frame equations are implicitly defined without the
       per_frame_ prefix. This informs the parser that one could follow */
       line_mode = PER_FRAME_LINE_MODE;
@@ -504,28 +504,25 @@
     /* Wavecode initial condition case */
     if (!strncmp(eqn_string, WAVECODE_STRING, WAVECODE_STRING_LENGTH))
     {
-
       line_mode = CUSTOM_WAVE_WAVECODE_LINE_MODE;
 
       return parse_wavecode(eqn_string, fs, preset);
     }
 
     /* Custom Wave Prefix */
-    if ((!strncmp(eqn_string, WAVE_STRING, WAVE_STRING_LENGTH)) &&
-        ((eqn_string[5] >= 48) && (eqn_string[5] <= 57)))
+    if (    (!strncmp(eqn_string, WAVE_STRING, WAVE_STRING_LENGTH))
+        &&  ((eqn_string[5] >= 48)  &&  (eqn_string[5] <= 57)))
     {
-	tokenWrapAroundEnabled = true;
+      tokenWrapAroundEnabled = true;
       //    if (PARSE_DEBUG) printf("parse_line wave prefix found: \"%s\"\n", eqn_string);
 
       return parse_wave(eqn_string, fs, preset);
-
     }
 
 
     /* Shapecode initial condition case */
     if (!strncmp(eqn_string, SHAPECODE_STRING, SHAPECODE_STRING_LENGTH))
     {
-
       line_mode = CUSTOM_SHAPE_SHAPECODE_LINE_MODE;
 
       if (PARSE_DEBUG) printf("parse_line: shapecode prefix found: \"%s\"\n", eqn_string);
@@ -534,13 +531,12 @@
     }
 
     /* Custom Shape Prefix */
-    if ((!strncmp(eqn_string, SHAPE_STRING, SHAPE_STRING_LENGTH)) &&
-        ((eqn_string[6] >= 48) && (eqn_string[6] <= 57)))
+    if (    (!strncmp(eqn_string, SHAPE_STRING, SHAPE_STRING_LENGTH))
+        &&  ((eqn_string[6] >= 48)  &&  (eqn_string[6] <= 57)))
     {
       tokenWrapAroundEnabled = true;
       if (PARSE_DEBUG) printf("parse_line shape prefix found: \"%s\"\n", eqn_string);
       return parse_shape(eqn_string, fs, preset);
-
     }
 
     /* Per pixel equation case */
@@ -563,20 +559,20 @@
 
     /* Sometimes equations are written implicitly in milkdrop files, in the form
 
-    per_frame_1 = p1 = eqn1; p2 = eqn2; p3 = eqn3;..;
+       per_frame_1 = p1 = eqn1; p2 = eqn2; p3 = eqn3;..;
 
-    which is analagous to:
+       which is analagous to:
 
-    per_frame_1 = p1 = eqn1; per_frame_2 = p2 = eqn2; per_frame_3 = p3 = eqn3; ...;
+       per_frame_1 = p1 = eqn1; per_frame_2 = p2 = eqn2; per_frame_3 = p3 = eqn3; ...;
 
-    The following line mode hack allows such implicit declaration of the
-    prefix that specifies the equation type. An alternative method
-    may be to associate each equation line as list of equations separated
-    by semicolons (and a new line ends the list). Instead, however, a global
-    variable called "line_mode" specifies the last type of equation found,
-    and bases any implicitly typed input on this fact
+       The following line mode hack allows such implicit declaration of the
+       prefix that specifies the equation type. An alternative method
+       may be to associate each equation line as list of equations separated
+       by semicolons (and a new line ends the list). Instead, however, a global
+       variable called "line_mode" specifies the last type of equation found,
+       and bases any implicitly typed input on this fact
 
-    Note added by Carmelo Piccione (carmelo.piccione@gmail.com) 10/19/03
+       Note added by Carmelo Piccione (carmelo.piccione@gmail.com) 10/19/03
     */
 
     /* Per frame line mode previously, try to parse the equation implicitly */
@@ -594,7 +590,6 @@
 
 
       return PROJECTM_SUCCESS;
-
     }
     else if (line_mode == PER_FRAME_INIT_LINE_MODE)
     {
@@ -618,8 +613,6 @@
       tokenWrapAroundEnabled = true;
       if (PARSE_DEBUG) printf("parse_line: implicit per pixel eqn (LINE %d)\n", line_count);
       return parse_per_pixel_eqn(fs, preset, eqn_string);
-
-
     }
     else if (line_mode == CUSTOM_WAVE_PER_POINT_LINE_MODE)
     {
@@ -644,7 +637,6 @@
       if ((custom_wave = MilkdropPreset::find_custom_object(last_custom_wave_id, preset->customWaves)) == NULL)
         return PROJECTM_FAILURE;
       return parse_wave_per_frame_eqn(fs, custom_wave, preset);
-
     }
     else if (line_mode == CUSTOM_WAVE_WAVECODE_LINE_MODE)
     {
@@ -667,7 +659,6 @@
         return PROJECTM_FAILURE;
 
       return parse_shape_per_frame_eqn(fs, custom_shape, preset);
-
     }
     else if (line_mode == CUSTOM_SHAPE_PER_FRAME_INIT_LINE_MODE)
     {
@@ -679,7 +670,6 @@
         return PROJECTM_FAILURE;
 
       return parse_shape_per_frame_init_eqn(fs, custom_shape, preset);
-
     }
 
     if (PARSE_DEBUG) printf("parse_line: found initial condition: name = \"%s\" (LINE %d)\n", eqn_string, line_count);
@@ -713,16 +703,16 @@
 
 
 /* Parses a general expression, this function is the meat of the parser */
-GenExpr * Parser::parse_gen_expr ( std::istream &  fs, TreeExpr * tree_expr, MilkdropPreset * preset)
+GenExpr *
+Parser::parse_gen_expr ( std::istream &  fs, TreeExpr * tree_expr, MilkdropPreset * preset)
 {
-
-  int i;
-  char string[MAX_TOKEN_SIZE];
+  int     i;
+  char    string[MAX_TOKEN_SIZE];
   token_t token;
   GenExpr * gen_expr;
-  float val;
-  Param * param = NULL;
-  Func * func;
+  float   val;
+  Param   * param = NULL;
+  Func    * func;
   GenExpr ** expr_list;
 
   switch (token = parseToken(fs,string))
@@ -736,7 +726,9 @@
       if (PARSE_DEBUG)
       {
         std::cerr << "parse_gen_expr: found prefix function (name = \""
-        << func->getName() << "\") (LINE " << line_count << ")" << std::endl;
+                  << func->getName()
+                  << "\") (LINE " << line_count << ")"
+                  << std::endl;
       }
 
       /* Parse the functions arguments */
@@ -745,7 +737,8 @@
         if (PARSE_DEBUG)
         {
           std::cerr << "parse_prefix_args: failed to generate an expresion list! (LINE "
-          << line_count << ")" << std::endl;
+                    << line_count << ")"
+                    << std::endl;
         }
         if ( tree_expr != NULL )
         {
@@ -757,8 +750,8 @@
       /* Convert function to expression */
       if ((gen_expr = GenExpr::prefun_to_expr((float (*)(void *))func->func_ptr, expr_list, func->getNumArgs())) == NULL)
       {
-        if (PARSE_DEBUG) printf("parse_prefix_args: failed to convert prefix function to general expression (LINE %d) \n",
-                                  line_count);
+        if (PARSE_DEBUG)
+          printf("parse_prefix_args: failed to convert prefix function to general expression (LINE %d) \n", line_count);
         if (tree_expr)
           delete tree_expr;
         for (i = 0; i < func->getNumArgs();i++)
@@ -781,7 +774,7 @@
 
 
     /* Case 2: (Left Parentice), a string coupled with a left parentice. Either an error or implicit
-       multiplication operator. For now treat it as an error */
+    multiplication operator. For now treat it as an error */
     if (*string != 0)
     {
       std::cerr << "token prefix is " << *string << std::endl;
@@ -792,13 +785,13 @@
     }
 
     /* CASE 3 (Left Parentice): the following is enclosed parentices to change order
-       of operations. So we create a new expression tree */
+    of operations. So we create a new expression tree */
 
     if ((gen_expr = parse_gen_expr(fs, NULL, preset)) == NULL)
     {
       if (PARSE_DEBUG) printf("parse_gen_expr:  found left parentice, but failed to create new expression tree \n");
       if (tree_expr)
-      delete tree_expr;
+        delete tree_expr;
       return NULL;
     }
 
@@ -810,7 +803,6 @@
   case tPlus:
     if (*string == 0)
     {
-
       if (PARSE_DEBUG) printf("parse_gen_expr: plus used as prefix (LINE %d)\n", line_count);
 
       /* Treat prefix plus as implict 0 preceding operator */
@@ -823,7 +815,6 @@
   case tMinus:
     if (*string == 0)
     {
-
       /* Use the negative infix operator, but first add an implicit zero to the operator tree */
       gen_expr = GenExpr::const_to_expr(0);
       //return parse_gen_expr(fs, insert_gen_expr(gen_expr, &tree_expr), preset);
@@ -838,7 +829,7 @@
   case tComma:
 
     /* CASE 1 (terminal): string is empty, but not null. Not sure if this will actually happen
-       any more. */
+    any more. */
     if (*string == 0)
     {
       if (PARSE_DEBUG) printf("parse_gen_expr: empty string coupled with terminal (LINE %d) \n", line_count);
@@ -861,14 +852,13 @@
     {
       if ((gen_expr = GenExpr::const_to_expr(val)) == NULL)
       {
-        if (tree_expr)
-          delete tree_expr;
-        return NULL;
+      if (tree_expr)
+        delete tree_expr;
+      return NULL;
       }
 
       /* Parse the rest of the line */
       return parse_infix_op(fs, token, insert_gen_expr(gen_expr, &tree_expr), preset);
-
     }
 
 
@@ -881,7 +871,7 @@
           if ((param = ParamUtils::find<ParamUtils::AUTO_CREATE>(std::string(string), &current_shape->param_tree)) == NULL)
           {
             if (tree_expr)
-              delete tree_expr;
+            delete tree_expr;
             return NULL;
           }
       }
@@ -889,7 +879,8 @@
       if (PARSE_DEBUG)
       {
         std::cerr << "parse_gen_expr: custom shape parameter (name = "
-        << param->name << ")" << std::endl;
+                  << param->name << ")"
+                  << std::endl;
       }
 
 
@@ -915,7 +906,7 @@
           if ((param = ParamUtils::find<ParamUtils::AUTO_CREATE>(std::string(string), &current_wave->param_tree)) == NULL)
           {
             if (tree_expr)
-              delete tree_expr;
+            delete tree_expr;
             return NULL;
           }
       }
@@ -924,7 +915,6 @@
       if (PARSE_DEBUG)
       {
         std::cerr << "parse_gen_expr: custom wave parameter (name = " <<  param->name << ")" << std::endl;
-
       }
 
       /* Convert parameter to an expression */
@@ -938,13 +928,11 @@
 
       /* Parse the rest of the line */
       return parse_infix_op(fs, token, insert_gen_expr(gen_expr, &tree_expr), preset);
-
     }
 
     /* CASE 6: regular parameter. Will be created if necessary and the string has no invalid characters */
     if ((param = ParamUtils::find(string, &preset->builtinParams, &preset->user_param_tree)) != NULL)
     {
-
       if (PARSE_DEBUG)
       {
         std::cerr << "parse_gen_expr: parameter (name = \"" << param->name << "\")..." << std::endl;
@@ -961,14 +949,12 @@
 
       /* Parse the rest of the line */
       return parse_infix_op(fs, token, insert_gen_expr(gen_expr, &tree_expr), preset);
-
     }
 
     /* CASE 7: Bad string, give up */
     if (PARSE_DEBUG)
     {
       printf( "parse_gen_expr: syntax error [string = \"%s\"] (LINE %d)\n", string, line_count);
-
     }
     if (tree_expr)
       delete tree_expr;
@@ -981,9 +967,9 @@
 /* Inserts expressions into tree according to operator precedence.
    If root is null, a new tree is created, with infix_op as only element */
 
-TreeExpr * Parser::insert_infix_op(InfixOp * infix_op, TreeExpr **root)
+TreeExpr *
+Parser::insert_infix_op(InfixOp * infix_op, TreeExpr **root)
 {
-
   TreeExpr * new_root;
 
   /* Sanity check */
@@ -1027,13 +1013,12 @@
 
   insert_infix_rec(infix_op, *root);
   return *root;
-
 }
 
 
-TreeExpr * Parser::insert_gen_expr(GenExpr * gen_expr, TreeExpr ** root)
+TreeExpr *
+Parser::insert_gen_expr(GenExpr * gen_expr, TreeExpr ** root)
 {
-
   TreeExpr * new_root;
 
   /* If someone foolishly passes a null
@@ -1063,9 +1048,9 @@
 }
 
 /* A recursive helper function to insert general expression elements into the operator tree */
-int Parser::insert_gen_rec(GenExpr * gen_expr, TreeExpr * root)
+int
+Parser::insert_gen_rec(GenExpr * gen_expr, TreeExpr * root)
 {
-
   /* Trivial Case: root is null */
 
   if (root == NULL)
@@ -1110,9 +1095,9 @@
 
 
 /* A recursive helper function to insert infix arguments by operator precedence */
-int Parser::insert_infix_rec(InfixOp * infix_op, TreeExpr * root)
+int
+Parser::insert_infix_rec(InfixOp * infix_op, TreeExpr * root)
 {
-
   /* Shouldn't happen, implies a parse error */
 
   if (root == NULL)
@@ -1160,13 +1145,12 @@
 
   root->right = new TreeExpr(infix_op, NULL, root->right, NULL);
   return PROJECTM_SUCCESS;
-
 }
 
 /* Parses an infix operator */
-GenExpr * Parser::parse_infix_op(std::istream &  fs, token_t token, TreeExpr * tree_expr, MilkdropPreset * preset)
+GenExpr *
+Parser::parse_infix_op(std::istream &  fs, token_t token, TreeExpr * tree_expr, MilkdropPreset * preset)
 {
-
   GenExpr * gen_expr;
 
   switch (token)
@@ -1219,17 +1203,16 @@
 
   /* Will never happen */
   return NULL;
-
 }
 
 /* Parses an integer, checks for +/- prefix */
-int Parser::parse_int(std::istream &  fs, int * int_ptr)
+int
+Parser::parse_int(std::istream &  fs, int * int_ptr)
 {
-
-  char string[MAX_TOKEN_SIZE];
+  char    string[MAX_TOKEN_SIZE];
   token_t token;
-  int sign;
-  char * end_ptr = (char*)" ";
+  int     sign;
+  char    * end_ptr = (char*)" ";
 
   token = parseToken(fs, string);
 
@@ -1265,12 +1248,12 @@
     return PROJECTM_SUCCESS;
 
   return PROJECTM_PARSE_ERROR;
-
 }
-/* Parses a floating point number */
-int Parser::string_to_float(char * string, float * float_ptr)
-{
 
+/* Parses a floating point number */
+int
+Parser::string_to_float(char * string, float * float_ptr)
+{
   char ** error_ptr;
 
   if (*string == 0)
@@ -1295,13 +1278,13 @@
 }
 
 /* Parses a floating point number */
-int Parser::parse_float(std::istream &  fs, float * float_ptr)
+int
+Parser::parse_float(std::istream &  fs, float * float_ptr)
 {
-
-  char string[MAX_TOKEN_SIZE];
-  char ** error_ptr;
+  char    string[MAX_TOKEN_SIZE];
+  char    ** error_ptr;
   token_t token;
-  int sign;
+  int     sign;
 
   error_ptr =(char**) wipemalloc(sizeof(char**));
 
@@ -1344,17 +1327,16 @@
   free(error_ptr);
   error_ptr = NULL;
   return PROJECTM_PARSE_ERROR;
-
 }
 
 /* Parses a per frame equation. That is, interprets a stream of data as a per frame equation */
-PerFrameEqn * Parser::parse_per_frame_eqn(std::istream &  fs, int index, MilkdropPreset * preset)
+PerFrameEqn *
+Parser::parse_per_frame_eqn(std::istream &  fs, int index, MilkdropPreset * preset)
 {
-
-  char string[MAX_TOKEN_SIZE];
-  Param * param;
+  char        string[MAX_TOKEN_SIZE];
+  Param       * param;
   PerFrameEqn * per_frame_eqn;
-  GenExpr * gen_expr;
+  GenExpr     * gen_expr;
 
 
   if (parseToken(fs, string) != tEq)
@@ -1399,12 +1381,12 @@
 }
 
 /* Parses an 'implicit' per frame equation. That is, interprets a stream of data as a per frame equation without a prefix */
-PerFrameEqn * Parser::parse_implicit_per_frame_eqn(std::istream &  fs, char * param_string, int index, MilkdropPreset * preset)
+PerFrameEqn *
+Parser::parse_implicit_per_frame_eqn(std::istream &  fs, char * param_string, int index, MilkdropPreset * preset)
 {
-
-  Param * param;
+  Param       * param;
   PerFrameEqn * per_frame_eqn;
-  GenExpr * gen_expr;
+  GenExpr     * gen_expr;
 
   if (fs == NULL)
     return NULL;
@@ -1452,12 +1434,12 @@
 }
 
 /* Parses an initial condition */
-InitCond * Parser::parse_init_cond(std::istream &  fs, char * name, MilkdropPreset * preset)
+InitCond *
+Parser::parse_init_cond(std::istream &  fs, char * name, MilkdropPreset * preset)
 {
-
-  Param * param;
-  CValue init_val;
-  InitCond * init_cond;
+  Param     * param;
+  CValue    init_val;
+  InitCond  * init_cond;
 
   if (name == NULL)
     return NULL;
@@ -1479,7 +1461,7 @@
   }
 
   /* At this point, a parameter has been created or was found
-     in the database. */
+  in the database. */
 
   if (PARSE_DEBUG) printf("parsed_init_cond: parsing initial condition value... (LINE %d)\n", line_count);
 
@@ -1494,7 +1476,6 @@
     }
     init_val.bool_val = bool_test;
   }
-
   else if ((param->type == P_TYPE_INT))
   {
     if ((parse_int(fs, (int*)&init_val.int_val)) == PROJECTM_PARSE_ERROR)
@@ -1503,7 +1484,6 @@
       return NULL;
     }
   }
-
   /* float value */
   else if (param->type == P_TYPE_DOUBLE)
   {
@@ -1513,7 +1493,6 @@
       return NULL;
     }
   }
-
   /* Unknown value */
   else
   {
@@ -1533,30 +1512,29 @@
 }
 
 
-void Parser::parse_string_block(std::istream &  fs, std::string * out_string) {
+void
+Parser::parse_string_block(std::istream &  fs, std::string * out_string)
+{
+  char    name[MAX_TOKEN_SIZE];
+  token_t token;
 
+  std::set<char> skipList;
+  skipList.insert('`');
+  readStringUntil(fs, out_string, false, skipList);
 
-	char name[MAX_TOKEN_SIZE];
-	token_t token;
-
-	std::set<char> skipList;
-	skipList.insert('`');
-	readStringUntil(fs, out_string, false, skipList);
-
-	//std::cout << "out_string:\n " << *out_string << "\n" << std::endl;
-
+  //std::cout << "out_string:\n " << *out_string << "\n" << std::endl;
 }
 
-InitCond * Parser::parse_per_frame_init_eqn(std::istream &  fs, MilkdropPreset * preset, std::map<std::string,Param*> * database)
+InitCond *
+Parser::parse_per_frame_init_eqn(std::istream &  fs, MilkdropPreset * preset, std::map<std::string,Param*> * database)
 {
-
-  char name[MAX_TOKEN_SIZE];
-  Param * param = NULL;
-  CValue init_val;
-  InitCond * init_cond;
-  GenExpr * gen_expr;
-  float val;
-  token_t token;
+  char      name[MAX_TOKEN_SIZE];
+  Param     * param = NULL;
+  CValue    init_val;
+  InitCond  * init_cond;
+  GenExpr   * gen_expr;
+  float     val;
+  token_t   token;
 
 
   if (preset == NULL)
@@ -1589,7 +1567,7 @@
   }
 
   /* At this point, a parameter has been created or was found
-     in the database. */
+  in the database. */
 
   if (PARSE_DEBUG) printf("parse_per_frame_init_eqn: parsing right hand side of per frame init equation.. (LINE %d)\n", line_count);
 
@@ -1610,18 +1588,15 @@
   {
     init_val.bool_val = (bool)val;
   }
-
   else if ((param->type == P_TYPE_INT))
   {
     init_val.int_val = (int)val;
   }
-
   /* float value */
   else if (param->type == P_TYPE_DOUBLE)
   {
     init_val.float_val = val;
   }
-
   /* Unknown value */
   else
   {
@@ -1643,133 +1618,130 @@
   return init_cond;
 }
 
-bool Parser::scanForComment(std::istream & fs) {
-
+bool
+Parser::scanForComment(std::istream & fs)
+{
   int c;
+
   c = fs.get();
 
   if (c == '/') {
-	while (true)
-	{
-		if (!fs || fs.eof())
-			return true;
-		else
-			c = fs.get();
-		if (c == EOF)
-			return true;
+    while (true)
+    {
+      if (!fs || fs.eof())
+        return true;
+      else
+        c = fs.get();
+      if (c == EOF)
+        return true;
 
-		if (c == '\n')
-		{
-			return true;
-		}
-	}
+      if (c == '\n')
+      {
+        return true;
+      }
+    }
   } else {
-	fs.unget();
-	return false;
+    fs.unget();
+    return false;
   }
 }
 
-void Parser::readStringUntil(std::istream & fs, std::string * out_buffer, bool wrapAround, const std::set<char> & skipList) {
-
-	int string_line_buffer_index = 0;
-	int c;
-
-	/* Loop until a delimiter is found, or the maximum string size is found */
-	while (true)
-	{
-
-		if (!fs || fs.eof())
-			c = EOF;
-		else
-			c = fs.get();
-
-		/* Now interpret the character */
-		switch (c)
-		{
-			case '/':
-			{
-				bool commentExisted = scanForComment(fs);
-				if (!commentExisted) {
-					out_buffer->push_back(c);
-					break;
-				} else {
-					line_count++;
-					return;
-				}
-			}
-			case '\n':
-				if (!out_buffer->empty() && ((*out_buffer)[out_buffer->length() -1] == '\n'))
-					return;
-
-				line_count++;
-				if (wrapAround)
-				{
-					std::ostringstream buffer;
-
-		//			if (PARSE_DEBUG) std::cerr << "token wrap! line " << line_count << std::endl;
-					while (c != '=')
-					{
-
-						if (!fs || fs.eof())
-						{
-							line_count = 1;
-							line_mode = UNSET_LINE_MODE;
-		//					if (PARSE_DEBUG)     std::cerr << "token wrap: end of file" << std::endl;
-							return;
-						}
-
-						else {
-							c = fs.get();
-							if ( c != '=')
-								buffer << c;
-						}
-
-					}
-
-
-					if (!wrapsToNextLine(buffer.str())) {
-						wrapAround = false;
-						int buf_size = (int)buffer.str().length();
-						// <= to also remove equal sign parsing from stream
-						for (int k = 0; k <= buf_size; k++) {
-							if (fs)
-								fs.unget();
-							else
-								abort();
-						}
-						return;
-					}
-
-					break;
-				} else
-					out_buffer->push_back(c);
-				return;
-			case EOF:
-				line_count = 1;
-				return;
-			default:
-
-				if (out_buffer != NULL)
-				{
-					if (skipList.find(c) == skipList.end())
-						out_buffer->push_back(c);
-
-				}
-		}
-
-	}
-
-
-}
-int Parser::parse_wavecode(char * token, std::istream &  fs, MilkdropPreset * preset)
+void
+Parser::readStringUntil(std::istream & fs, std::string * out_buffer, bool wrapAround, const std::set<char> & skipList)
 {
+  int string_line_buffer_index = 0;
+  int c;
 
-  char * var_string;
-  InitCond * init_cond;
-  CustomWave * custom_wave;
-  int id;
-  CValue init_val;
-  Param * param;
+  /* Loop until a delimiter is found, or the maximum string size is found */
+  while (true)
+  {
+    if (!fs || fs.eof())
+      c = EOF;
+    else
+      c = fs.get();
+
+    /* Now interpret the character */
+    switch (c)
+    {
+    case '/':
+      {
+        bool commentExisted = scanForComment(fs);
+
+        if (!commentExisted) {
+          out_buffer->push_back(c);
+          break;
+        } else {
+          line_count++;
+          return;
+        }
+      }
+    case '\n':
+      if (!out_buffer->empty() && ((*out_buffer)[out_buffer->length() -1] == '\n'))
+        return;
+
+      line_count++;
+      if (wrapAround)
+      {
+        std::ostringstream buffer;
+
+        //      if (PARSE_DEBUG) std::cerr << "token wrap! line " << line_count << std::endl;
+        while (c != '=')
+        {
+          if (!fs || fs.eof())
+          {
+            line_count = 1;
+            line_mode = UNSET_LINE_MODE;
+            //          if (PARSE_DEBUG)     std::cerr << "token wrap: end of file" << std::endl;
+            return;
+          }
+          else {
+            c = fs.get();
+            if ( c != '=')
+              buffer << c;
+          }
+        }
+
+
+        if (!wrapsToNextLine(buffer.str())) {
+          wrapAround = false;
+          int buf_size = (int)buffer.str().length();
+          // <= to also remove equal sign parsing from stream
+          for (int k = 0; k <= buf_size; k++) {
+            if (fs)
+              fs.unget();
+            else
+              abort();
+          }
+          return;
+        }
+
+        break;
+      } else
+        out_buffer->push_back(c);
+      return;
+    case EOF:
+      line_count = 1;
+      return;
+    default:
+
+      if (out_buffer != NULL)
+      {
+        if (skipList.find(c) == skipList.end())
+          out_buffer->push_back(c);
+      }
+    }
+  }
+}
+
+int
+Parser::parse_wavecode(char * token, std::istream &  fs, MilkdropPreset * preset)
+{
+  char        * var_string;
+  InitCond    * init_cond;
+  CustomWave  * custom_wave;
+  int         id;
+  CValue      init_val;
+  Param       * param;
 
   assert(preset);
   assert(fs);
@@ -1789,7 +1761,8 @@
   if ((custom_wave = MilkdropPreset::find_custom_object(id, preset->customWaves)) == NULL)
   {
     std::cerr << "parse_wavecode: failed to load (or create) custom wave (id = "
-    << id << ")!\n" << std::endl;
+              << id << ")!\n"
+              << std::endl;
 
     return PROJECTM_FAILURE;
   }
@@ -1807,9 +1780,9 @@
   if ((param->type == P_TYPE_BOOL))
   {
     int bool_test;
+
     if ((parse_int(fs, &bool_test)) == PROJECTM_PARSE_ERROR)
     {
-
       if (PARSE_DEBUG) printf("parse_wavecode: error parsing integer!\n");
       return PROJECTM_PARSE_ERROR;
     }
@@ -1819,12 +1792,10 @@
   {
     if ((parse_int(fs, (int*)&init_val.int_val)) == PROJECTM_PARSE_ERROR)
     {
-
       if (PARSE_DEBUG) printf("parse_wavecode: error parsing integer!\n");
       return PROJECTM_PARSE_ERROR;
     }
   }
-
   /* float value */
   else if (param->type == P_TYPE_DOUBLE)
   {
@@ -1834,7 +1805,6 @@
       return PROJECTM_PARSE_ERROR;
     }
   }
-
   /* Unknown value */
   else
   {
@@ -1852,9 +1822,9 @@
   }
 
   std::pair<std::map<std::string, InitCond*>::iterator, bool> inserteePair =
-    custom_wave->init_cond_tree.insert(std::make_pair(init_cond->param->name, init_cond));
+      custom_wave->init_cond_tree.insert(std::make_pair(init_cond->param->name, init_cond));
 
- // assert(inserteePair.second);
+  // assert(inserteePair.second);
 
   line_mode = CUSTOM_WAVE_WAVECODE_LINE_MODE;
 
@@ -1862,15 +1832,16 @@
   return PROJECTM_SUCCESS;
 }
 
-int Parser::parse_shapecode(char * token, std::istream &  fs, MilkdropPreset * preset)
+int
+Parser::parse_shapecode(char * token, std::istream &  fs, MilkdropPreset * preset)
 {
 
-  char * var_string;
-  InitCond * init_cond;
+  char        * var_string;
+  InitCond    * init_cond;
   CustomShape * custom_shape;
-  int id;
-  CValue init_val;
-  Param * param;
+  int         id;
+  CValue      init_val;
+  Param       * param;
 
   /* Null argument checks */
   if (preset == NULL)
@@ -1892,7 +1863,7 @@
 
 
   /* Retrieve custom shape information from preset. The 3rd argument
-     if true creates a custom shape if one does not exist */
+  if true creates a custom shape if one does not exist */
 
   if ((custom_shape = MilkdropPreset::find_custom_object(id,  preset->customShapes)) == NULL)
   {
@@ -1903,7 +1874,6 @@
 
   if ((param = ParamUtils::find<ParamUtils::NO_CREATE>(var_string, &custom_shape->text_properties_tree)) != NULL)
   {
-
     std::string text;//[MAX_TOKEN_SIZE];
     //token_t token = parseToken(fs, text);
 
@@ -1912,7 +1882,8 @@
     *((std::string*)param->engine_val) = text;
     if (PARSE_DEBUG)
       std::cerr << "parse_shapecode: found image url, text is \""
-      << text << "\"" << std::endl;
+                << text << "\""
+                << std::endl;
 
     return PROJECTM_SUCCESS;
   }
@@ -1933,6 +1904,7 @@
   if ((param->type == P_TYPE_BOOL))
   {
     int bool_test;
+
     if ((parse_int(fs, &bool_test)) == PROJECTM_PARSE_ERROR)
     {
       if (PARSE_DEBUG) printf("parse_shapecode: error parsing integer!\n");
@@ -1948,7 +1920,6 @@
       return PROJECTM_PARSE_ERROR;
     }
   }
-
   /* float value */
   else if (param->type == P_TYPE_DOUBLE)
   {
@@ -1958,7 +1929,6 @@
       return PROJECTM_PARSE_ERROR;
     }
   }
-
   /* Unknown value */
   else
   {
@@ -1981,9 +1951,9 @@
 }
 
 
-int Parser::parse_wavecode_prefix(char * token, int * id, char ** var_string)
+int
+Parser::parse_wavecode_prefix(char * token, int * id, char ** var_string)
 {
-
   int len, i, j;
 
   if (token == NULL)
@@ -2022,13 +1992,12 @@
   *var_string = token + i + 1;
 
   return PROJECTM_SUCCESS;
-
 }
 
 
-int Parser::parse_shapecode_prefix(char * token, int * id, char ** var_string)
+int
+Parser::parse_shapecode_prefix(char * token, int * id, char ** var_string)
 {
-
   int len, i, j;
 
   if (token == NULL)
@@ -2067,12 +2036,11 @@
   *var_string = token + i + 1;
 
   return PROJECTM_SUCCESS;
-
 }
 
-int Parser::parse_wave_prefix(char * token, int * id, char ** eqn_string)
+int
+Parser::parse_wave_prefix(char * token, int * id, char ** eqn_string)
 {
-
   int len, i, j;
 
   if (token == NULL)
@@ -2110,12 +2078,11 @@
 
   if (PARSE_DEBUG) printf("parse_wave_prefix: prefix = %s\n (LINE %d)", *eqn_string, line_count);
   return PROJECTM_SUCCESS;
-
 }
 
-int Parser::parse_shape_prefix(char * token, int * id, char ** eqn_string)
+int
+Parser::parse_shape_prefix(char * token, int * id, char ** eqn_string)
 {
-
   int len, i, j;
 
   if (token == NULL)
@@ -2152,15 +2119,14 @@
   *eqn_string = token + i + 1;
 
   return PROJECTM_SUCCESS;
-
 }
 
 /* Parses custom wave equations */
-int Parser::parse_wave(char * token, std::istream &  fs, MilkdropPreset * preset)
+int
+Parser::parse_wave(char * token, std::istream &  fs, MilkdropPreset * preset)
 {
-
-  int id;
-  char * eqn_type;
+  int   id;
+  char  * eqn_type;
 
   if (PARSE_DEBUG) printf("parse_wave:begin\n");
 
@@ -2181,18 +2147,17 @@
   strncpy(last_eqn_type, eqn_type, MAX_TOKEN_SIZE);
 
   return parse_wave_helper(fs, preset, id, eqn_type, 0);
-
 }
 
-int Parser::parse_wave_helper(std::istream &  fs, MilkdropPreset  * preset, int id, char * eqn_type, char * init_string)
+int
+Parser::parse_wave_helper(std::istream &  fs, MilkdropPreset  * preset, int id, char * eqn_type, char * init_string)
 {
-
-  Param * param;
-  GenExpr * gen_expr;
-  char string[MAX_TOKEN_SIZE];
+  Param       * param;
+  GenExpr     * gen_expr;
+  char        string[MAX_TOKEN_SIZE];
   PerFrameEqn * per_frame_eqn;
-  CustomWave * custom_wave;
-  InitCond * init_cond;
+  CustomWave  * custom_wave;
+  InitCond    * init_cond;
 
   /* Retrieve custom wave associated with this id */
   if ((custom_wave = MilkdropPreset::find_custom_object(id,  preset->customWaves)) == NULL)
@@ -2204,7 +2169,6 @@
   /* per frame init equation case */
   if (!strncmp(eqn_type, WAVE_INIT_STRING, WAVE_INIT_STRING_LENGTH))
   {
-
     if (PARSE_DEBUG) printf("parse_wave_helper (per frame init): [begin] (LINE %d)\n", line_count);
 
     /* Parse the per frame init equation */
@@ -2220,13 +2184,11 @@
     line_mode = CUSTOM_WAVE_PER_FRAME_INIT_LINE_MODE;
     init_cond->evaluate(true);
     return PROJECTM_SUCCESS;
-
   }
 
   /* per frame equation case */
   if (!strncmp(eqn_type, PER_FRAME_STRING_NO_UNDERSCORE, PER_FRAME_STRING_NO_UNDERSCORE_LENGTH))
   {
-
     if (PARSE_DEBUG) printf("parse_wave_helper (per_frame): [start] (custom wave id = %d)\n", custom_wave->id);
 
     if (parseToken(fs, string) != tEq)
@@ -2275,11 +2237,11 @@
 
     custom_wave->per_frame_eqn_tree.push_back(per_frame_eqn);
     if (PARSE_DEBUG) printf("parse_wave (per_frame): equation %d associated with custom wave %d [success]\n",
-                              per_frame_eqn->index, custom_wave->id);
+                            per_frame_eqn->index, custom_wave->id);
 
 
     /* Need to add stuff to string buffer so the editor can read the equations.
-       Why not make a nice little helper function for this? - here it is: */
+    Why not make a nice little helper function for this? - here it is: */
 
     line_mode = CUSTOM_WAVE_PER_FRAME_LINE_MODE;
     return PROJECTM_SUCCESS;
@@ -2289,7 +2251,6 @@
   /* per point equation case */
   if (!strncmp(eqn_type, PER_POINT_STRING, PER_POINT_STRING_LENGTH))
   {
-
     if (PARSE_DEBUG) printf("parse_wave_helper (per_point): per_pixel equation parsing start...(LINE %d)\n", line_count);
 
     /// HACK the parse_line code already parsed the per_pixel variable name. This handles that case
@@ -2337,16 +2298,15 @@
 }
 
 /* Parses custom shape equations */
-int Parser::parse_shape(char * token, std::istream &  fs, MilkdropPreset * preset)
+int
+Parser::parse_shape(char * token, std::istream &  fs, MilkdropPreset * preset)
 {
-
-  int id;
-  char * eqn_type;
+  int         id;
+  char        * eqn_type;
   CustomShape * custom_shape;
 
 
   if (token == NULL)
-
     return PROJECTM_FAILURE;
   if (fs == NULL)
     return PROJECTM_FAILURE;
@@ -2392,9 +2352,9 @@
    Returns -1 if syntax error
 */
 
-int Parser::get_string_prefix_len(char * string)
+int
+Parser::get_string_prefix_len(char * string)
 {
-
   int i = 0;
 
   /* Null argument check */
@@ -2430,7 +2390,8 @@
   return i;
 }
 
-int Parser::parse_shape_per_frame_init_eqn(std::istream &  fs, CustomShape * custom_shape, MilkdropPreset * preset)
+int
+Parser::parse_shape_per_frame_init_eqn(std::istream &  fs, CustomShape * custom_shape, MilkdropPreset * preset)
 {
   InitCond * init_cond;
 
@@ -2450,11 +2411,11 @@
   return PROJECTM_SUCCESS;
 }
 
-int Parser::parse_shape_per_frame_eqn(std::istream & fs, CustomShape * custom_shape, MilkdropPreset * preset)
+int
+Parser::parse_shape_per_frame_eqn(std::istream & fs, CustomShape * custom_shape, MilkdropPreset * preset)
 {
-
-  Param * param;
-  GenExpr * gen_expr;
+  Param       * param;
+  GenExpr     * gen_expr;
   PerFrameEqn * per_frame_eqn;
 
   char string[MAX_TOKEN_SIZE];
@@ -2512,11 +2473,11 @@
   return PROJECTM_SUCCESS;
 }
 
-int Parser::parse_wave_per_frame_eqn(std::istream &  fs, CustomWave * custom_wave, MilkdropPreset * preset)
+int
+Parser::parse_wave_per_frame_eqn(std::istream &  fs, CustomWave * custom_wave, MilkdropPreset * preset)
 {
-
-  Param * param;
-  GenExpr * gen_expr;
+  Param       * param;
+  GenExpr     * gen_expr;
   PerFrameEqn * per_frame_eqn;
 
   char string[MAX_TOKEN_SIZE];
@@ -2568,29 +2529,26 @@
 
   custom_wave->per_frame_eqn_tree.push_back(per_frame_eqn);
   if (PARSE_DEBUG) printf("parse_wave (per_frame): equation %d associated with custom wave %d [success]\n",
-                            per_frame_eqn->index, custom_wave->id);
+                          per_frame_eqn->index, custom_wave->id);
 
 
   /* Need to add stuff to string buffer so the editor can read the equations.
-     Why not make a nice little helper function for this? - here it is: */
+  Why not make a nice little helper function for this? - here it is: */
 
   line_mode = CUSTOM_WAVE_PER_FRAME_LINE_MODE;
   return PROJECTM_SUCCESS;
 }
 
 
-bool Parser::wrapsToNextLine(const std::string & str) {
+bool
+Parser::wrapsToNextLine(const std::string & str)
+{
+  std::size_t lastLineEndIndex = lastLinePrefix.find_last_not_of("0123456789");
+  std::size_t thisLineEndIndex = str.find_last_not_of("0123456789");
+  std::size_t startIndex = 0;
 
-std::size_t lastLineEndIndex =
-	lastLinePrefix.find_last_not_of("0123456789");
-
-std::size_t thisLineEndIndex =
-	str.find_last_not_of("0123456789");
-
-std::size_t startIndex = 0;
-if ((str.compare(startIndex, lastLineEndIndex, lastLinePrefix.c_str(), thisLineEndIndex)) == 0)
-	return true;
-else
-	return false;
-
+  if ((str.compare(startIndex, lastLineEndIndex, lastLinePrefix.c_str(), thisLineEndIndex)) == 0)
+    return true;
+  else
+    return false;
 }
diff --git a/src/libprojectM/MilkdropPresetFactory/Parser.hpp b/src/libprojectM/MilkdropPresetFactory/Parser.hpp
index 8c0e19d..f9ff507 100644
--- a/src/libprojectM/MilkdropPresetFactory/Parser.hpp
+++ b/src/libprojectM/MilkdropPresetFactory/Parser.hpp
@@ -25,9 +25,9 @@
  *
  * $Log$
  */
-
 #ifndef _PARSER_H
 #define _PARSER_H
+
 //#define PARSE_DEBUG 2
 #define PARSE_DEBUG 0
 
@@ -38,46 +38,47 @@
 #include "InitCond.hpp"
 #include "MilkdropPreset.hpp"
 
+
 /* Strings that prefix (and denote the type of) equations */
-#define PER_FRAME_STRING "per_frame_"
-#define PER_FRAME_STRING_LENGTH 10
+#define PER_FRAME_STRING                      "per_frame_"
+#define PER_FRAME_STRING_LENGTH               10
 
-#define PER_PIXEL_STRING "per_pixel_"
-#define PER_PIXEL_STRING_LENGTH 10
+#define PER_PIXEL_STRING                      "per_pixel_"
+#define PER_PIXEL_STRING_LENGTH               10
 
-#define PER_FRAME_INIT_STRING "per_frame_init_"
-#define PER_FRAME_INIT_STRING_LENGTH 15
+#define PER_FRAME_INIT_STRING                 "per_frame_init_"
+#define PER_FRAME_INIT_STRING_LENGTH          15
 
-#define WAVECODE_STRING "wavecode_"
-#define WAVECODE_STRING_LENGTH 9
+#define WAVECODE_STRING                       "wavecode_"
+#define WAVECODE_STRING_LENGTH                9
 
-#define WAVE_STRING "wave_"
-#define WAVE_STRING_LENGTH 5
+#define WAVE_STRING                           "wave_"
+#define WAVE_STRING_LENGTH                    5
 
-#define PER_POINT_STRING "per_point"
-#define PER_POINT_STRING_LENGTH 9
+#define PER_POINT_STRING                      "per_point"
+#define PER_POINT_STRING_LENGTH               9
 
-#define PER_FRAME_STRING_NO_UNDERSCORE "per_frame"
+#define PER_FRAME_STRING_NO_UNDERSCORE        "per_frame"
 #define PER_FRAME_STRING_NO_UNDERSCORE_LENGTH 9
 
-#define SHAPECODE_STRING "shapecode_"
-#define SHAPECODE_STRING_LENGTH 10
+#define SHAPECODE_STRING                      "shapecode_"
+#define SHAPECODE_STRING_LENGTH               10
 
 
-#define WARP_STRING "warp_"
-#define WARP_STRING_LENGTH 5
+#define WARP_STRING                           "warp_"
+#define WARP_STRING_LENGTH                    5
 
-#define COMPOSITE_STRING "comp_"
-#define COMPOSITE_STRING_LENGTH 5
+#define COMPOSITE_STRING                      "comp_"
+#define COMPOSITE_STRING_LENGTH               5
 
-#define SHAPE_STRING "shape_"
-#define SHAPE_STRING_LENGTH 6
+#define SHAPE_STRING                          "shape_"
+#define SHAPE_STRING_LENGTH                   6
 
-#define SHAPE_INIT_STRING "init"
-#define SHAPE_INIT_STRING_LENGTH 4
+#define SHAPE_INIT_STRING                     "init"
+#define SHAPE_INIT_STRING_LENGTH              4
 
-#define WAVE_INIT_STRING "init"
-#define WAVE_INIT_STRING_LENGTH 4
+#define WAVE_INIT_STRING                      "init"
+#define WAVE_INIT_STRING_LENGTH               4
 
 #include <set>
 
@@ -98,27 +99,27 @@
 
 /** Token enumeration type */
 typedef enum {
-    tEOL,   /* end of a line, usually a '/n' or '/r' */
-    tEOF,   /* end of file */
-    tLPr,   /* ( */
-    tRPr,   /* ) */
-    tLBr,   /* [ */
-    tRBr,   /* ] */
-    tEq,    /* = */
-    tPlus,  /* + */
-    tMinus, /* - */
-    tMult,  /* * */
-    tMod,   /* % */
-    tDiv,   /* / */
-    tOr,    /* | */
-    tAnd,   /* & */
-    tComma, /* , */
-    tPositive, /* + as a prefix operator */
-    tNegative, /* - as a prefix operator */
-    tSemiColon, /* ; */
-    tStringTooLong, /* special token to indicate an invalid string length */
-    tStringBufferFilled /* the string buffer for this line is maxed out */
-  } token_t;
+  tEOL,   /* end of a line, usually a '/n' or '/r' */
+  tEOF,   /* end of file */
+  tLPr,   /* ( */
+  tRPr,   /* ) */
+  tLBr,   /* [ */
+  tRBr,   /* ] */
+  tEq,    /* = */
+  tPlus,  /* + */
+  tMinus, /* - */
+  tMult,  /* * */
+  tMod,   /* % */
+  tDiv,   /* / */
+  tOr,    /* | */
+  tAnd,   /* & */
+  tComma, /* , */
+  tPositive, /* + as a prefix operator */
+  tNegative, /* - as a prefix operator */
+  tSemiColon, /* ; */
+  tStringTooLong, /* special token to indicate an invalid string length */
+  tStringBufferFilled /* the string buffer for this line is maxed out */
+} token_t;
 
 class CustomShape;
 class CustomWave;
@@ -130,63 +131,62 @@
 
 class Parser {
 public:
-    static std::string lastLinePrefix;
-    static line_mode_t line_mode;
-    static CustomWave *current_wave;
-    static CustomShape *current_shape;
-    static int string_line_buffer_index;
-    static char string_line_buffer[STRING_LINE_SIZE];
-    static unsigned int line_count;
-    static int per_frame_eqn_count;
-    static int per_frame_init_eqn_count;
-    static int last_custom_wave_id;
-    static int last_custom_shape_id;
-    static char last_eqn_type[MAX_TOKEN_SIZE];
-    static int last_token_size;
-    static bool tokenWrapAroundEnabled;
+  static std::string lastLinePrefix;
+  static line_mode_t line_mode;
+  static CustomWave *current_wave;
+  static CustomShape *current_shape;
+  static int string_line_buffer_index;
+  static char string_line_buffer[STRING_LINE_SIZE];
+  static unsigned int line_count;
+  static int per_frame_eqn_count;
+  static int per_frame_init_eqn_count;
+  static int last_custom_wave_id;
+  static int last_custom_shape_id;
+  static char last_eqn_type[MAX_TOKEN_SIZE];
+  static int last_token_size;
+  static bool tokenWrapAroundEnabled;
 
-    static PerFrameEqn *parse_per_frame_eqn( std::istream & fs, int index,
-                                             MilkdropPreset * preset);
-    static int parse_per_pixel_eqn( std::istream & fs, MilkdropPreset * preset,
-                                    char * init_string);
-    static InitCond *parse_init_cond( std::istream & fs, char * name, MilkdropPreset * preset );
-    static int parse_preset_name( std::istream & fs, char * name );
-    static int parse_top_comment( std::istream & fs );
-    static int parse_line( std::istream & fs, MilkdropPreset * preset );
+  static PerFrameEqn *parse_per_frame_eqn( std::istream & fs, int index,
+                                           MilkdropPreset * preset);
+  static int parse_per_pixel_eqn( std::istream & fs, MilkdropPreset * preset,
+                                  char * init_string);
+  static InitCond *parse_init_cond( std::istream & fs, char * name, MilkdropPreset * preset );
+  static int parse_preset_name( std::istream & fs, char * name );
+  static int parse_top_comment( std::istream & fs );
+  static int parse_line( std::istream & fs, MilkdropPreset * preset );
 
-    static int get_string_prefix_len(char * string);
-    static TreeExpr * insert_gen_expr(GenExpr * gen_expr, TreeExpr ** root);
-    static TreeExpr * insert_infix_op(InfixOp * infix_op, TreeExpr ** root);
-    static token_t parseToken(std::istream & fs, char * string);
-    static GenExpr ** parse_prefix_args(std::istream & fs, int num_args, MilkdropPreset * preset);
-    static GenExpr * parse_infix_op(std::istream & fs, token_t token, TreeExpr * tree_expr, MilkdropPreset * preset);
-    static GenExpr * parse_sign_arg(std::istream & fs);
-    static int parse_float(std::istream & fs, float * float_ptr);
-    static int parse_int(std::istream & fs, int * int_ptr);
-    static int insert_gen_rec(GenExpr * gen_expr, TreeExpr * root);
-    static int insert_infix_rec(InfixOp * infix_op, TreeExpr * root);
-    static GenExpr * parse_gen_expr(std::istream & fs, TreeExpr * tree_expr, MilkdropPreset * preset);
-    static PerFrameEqn * parse_implicit_per_frame_eqn(std::istream & fs, char * param_string, int index, MilkdropPreset * preset);
-    static InitCond * parse_per_frame_init_eqn(std::istream & fs, MilkdropPreset * preset, std::map<std::string,Param*> * database);
-    static int parse_wavecode_prefix(char * token, int * id, char ** var_string);
-    static int parse_wavecode(char * token, std::istream & fs, MilkdropPreset * preset);
-    static int parse_wave_prefix(char * token, int * id, char ** eqn_string);
-    static int parse_wave_helper(std::istream & fs, MilkdropPreset * preset, int id, char * eqn_type, char * init_string);
-    static int parse_shapecode(char * eqn_string, std::istream & fs, MilkdropPreset * preset);
-    static int parse_shapecode_prefix(char * token, int * id, char ** var_string);
-    static void parse_string_block(std::istream &  fs, std::string * out_string);
-    static bool scanForComment(std::istream & fs);
-    static int parse_wave(char * eqn_string, std::istream & fs, MilkdropPreset * preset);
-    static int parse_shape(char * eqn_string, std::istream & fs, MilkdropPreset * preset);
-    static int parse_shape_prefix(char * token, int * id, char ** eqn_string);
-    static void readStringUntil(std::istream & fs, std::string * out_buffer, bool wrapAround = true, const std::set<char> & skipList = std::set<char>()) ;
+  static int get_string_prefix_len(char * string);
+  static TreeExpr * insert_gen_expr(GenExpr * gen_expr, TreeExpr ** root);
+  static TreeExpr * insert_infix_op(InfixOp * infix_op, TreeExpr ** root);
+  static token_t parseToken(std::istream & fs, char * string);
+  static GenExpr ** parse_prefix_args(std::istream & fs, int num_args, MilkdropPreset * preset);
+  static GenExpr * parse_infix_op(std::istream & fs, token_t token, TreeExpr * tree_expr, MilkdropPreset * preset);
+  static GenExpr * parse_sign_arg(std::istream & fs);
+  static int parse_float(std::istream & fs, float * float_ptr);
+  static int parse_int(std::istream & fs, int * int_ptr);
+  static int insert_gen_rec(GenExpr * gen_expr, TreeExpr * root);
+  static int insert_infix_rec(InfixOp * infix_op, TreeExpr * root);
+  static GenExpr * parse_gen_expr(std::istream & fs, TreeExpr * tree_expr, MilkdropPreset * preset);
+  static PerFrameEqn * parse_implicit_per_frame_eqn(std::istream & fs, char * param_string, int index, MilkdropPreset * preset);
+  static InitCond * parse_per_frame_init_eqn(std::istream & fs, MilkdropPreset * preset, std::map<std::string,Param*> * database);
+  static int parse_wavecode_prefix(char * token, int * id, char ** var_string);
+  static int parse_wavecode(char * token, std::istream & fs, MilkdropPreset * preset);
+  static int parse_wave_prefix(char * token, int * id, char ** eqn_string);
+  static int parse_wave_helper(std::istream & fs, MilkdropPreset * preset, int id, char * eqn_type, char * init_string);
+  static int parse_shapecode(char * eqn_string, std::istream & fs, MilkdropPreset * preset);
+  static int parse_shapecode_prefix(char * token, int * id, char ** var_string);
+  static void parse_string_block(std::istream &  fs, std::string * out_string);
+  static bool scanForComment(std::istream & fs);
+  static int parse_wave(char * eqn_string, std::istream & fs, MilkdropPreset * preset);
+  static int parse_shape(char * eqn_string, std::istream & fs, MilkdropPreset * preset);
+  static int parse_shape_prefix(char * token, int * id, char ** eqn_string);
+  static void readStringUntil(std::istream & fs, std::string * out_buffer, bool wrapAround = true, const std::set<char> & skipList = std::set<char>()) ;
 
-    static int string_to_float(char * string, float * float_ptr);
-    static int parse_shape_per_frame_init_eqn(std::istream & fs, CustomShape * custom_shape, MilkdropPreset * preset);
-    static int parse_shape_per_frame_eqn(std::istream & fs, CustomShape * custom_shape, MilkdropPreset * preset);
-    static int parse_wave_per_frame_eqn(std::istream & fs, CustomWave * custom_wave, MilkdropPreset * preset);
-    static bool wrapsToNextLine(const std::string & str);
-  };
+  static int string_to_float(char * string, float * float_ptr);
+  static int parse_shape_per_frame_init_eqn(std::istream & fs, CustomShape * custom_shape, MilkdropPreset * preset);
+  static int parse_shape_per_frame_eqn(std::istream & fs, CustomShape * custom_shape, MilkdropPreset * preset);
+  static int parse_wave_per_frame_eqn(std::istream & fs, CustomWave * custom_wave, MilkdropPreset * preset);
+  static bool wrapsToNextLine(const std::string & str);
+};
 
 #endif /** !_PARSER_H */
-
diff --git a/src/libprojectM/MilkdropPresetFactory/PerFrameEqn.cpp b/src/libprojectM/MilkdropPresetFactory/PerFrameEqn.cpp
index 30e2342..96bd10f 100644
--- a/src/libprojectM/MilkdropPresetFactory/PerFrameEqn.cpp
+++ b/src/libprojectM/MilkdropPresetFactory/PerFrameEqn.cpp
@@ -18,7 +18,6 @@
  * See 'LICENSE.txt' included within this release
  *
  */
-
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -35,33 +34,33 @@
 #include "wipemalloc.h"
 #include <cassert>
 
+
 /* Evaluate an equation */
-void PerFrameEqn::evaluate() {
+void
+PerFrameEqn::evaluate()
+{
+  if (PER_FRAME_EQN_DEBUG) {
+    printf("per_frame_%d=%s= ", index, param->name.c_str());
+    fflush(stdout);
+  }
 
-     if (PER_FRAME_EQN_DEBUG) { 
-		 printf("per_frame_%d=%s= ", index, param->name.c_str());
-		 fflush(stdout); 
-     }
-	 
-    //*((float*)per_frame_eqn->param->engine_val) = eval_gen_expr(per_frame_eqn->gen_expr);
-	assert(gen_expr);
-	assert(param);
-	param->set_param(gen_expr->eval_gen_expr(-1,-1));
+  //*((float*)per_frame_eqn->param->engine_val) = eval_gen_expr(per_frame_eqn->gen_expr);
+  assert(gen_expr);
+  assert(param);
+  param->set_param(gen_expr->eval_gen_expr(-1,-1));
 
-     if (PER_FRAME_EQN_DEBUG) printf(" = %.4f\n", *((float*)param->engine_val)); 
-		 
+  if (PER_FRAME_EQN_DEBUG) printf(" = %.4f\n", *((float*)param->engine_val));
 }
 
 
 /* Frees perframe equation structure. Warning: assumes gen_expr pointer is not freed by anyone else! */
-PerFrameEqn::~PerFrameEqn() {
-
+PerFrameEqn::~PerFrameEqn()
+{
   delete gen_expr;
 
   // param is freed in param_tree container of some other class
-
 }
 
 /* Create a new per frame equation */
-PerFrameEqn::PerFrameEqn(int _index, Param * _param, GenExpr * _gen_expr) :
-	index(_index), param(_param), gen_expr(_gen_expr) {}
+PerFrameEqn::PerFrameEqn(int _index, Param * _param, GenExpr * _gen_expr)
+  : index(_index), param(_param), gen_expr(_gen_expr) {}
diff --git a/src/libprojectM/MilkdropPresetFactory/PerFrameEqn.hpp b/src/libprojectM/MilkdropPresetFactory/PerFrameEqn.hpp
index 3964080..155560f 100644
--- a/src/libprojectM/MilkdropPresetFactory/PerFrameEqn.hpp
+++ b/src/libprojectM/MilkdropPresetFactory/PerFrameEqn.hpp
@@ -29,25 +29,27 @@
 #ifndef _PER_FRAME_EQN_H
 #define _PER_FRAME_EQN_H
 
+
 #define PER_FRAME_EQN_DEBUG 0
 
+
 class GenExpr;
 class Param;
 class PerFrameEqn;
 
 class PerFrameEqn {
 public:
-    int index; /* a unique id for each per frame eqn (generated by order in preset files) */
-    Param *param; /* parameter to be assigned a value */
-    GenExpr *gen_expr;   /* expression that paremeter is equal to */
-     
-    PerFrameEqn(int index, Param * param, GenExpr * gen_expr);
-    ~PerFrameEqn();
+  int index; /* a unique id for each per frame eqn (generated by order in preset files) */
+  Param *param; /* parameter to be assigned a value */
+  GenExpr *gen_expr;   /* expression that paremeter is equal to */
 
-    /// Evaluate the per frame equation
-    void evaluate();
+  PerFrameEqn(int index, Param * param, GenExpr * gen_expr);
+  ~PerFrameEqn();
 
-  };
+  /// Evaluate the per frame equation
+  void evaluate();
+
+};
 
 
 #endif /** !_PER_FRAME_EQN_H */
diff --git a/src/libprojectM/MilkdropPresetFactory/PerPixelEqn.cpp b/src/libprojectM/MilkdropPresetFactory/PerPixelEqn.cpp
index 3f7c7bd..8a0d760 100644
--- a/src/libprojectM/MilkdropPresetFactory/PerPixelEqn.cpp
+++ b/src/libprojectM/MilkdropPresetFactory/PerPixelEqn.cpp
@@ -18,7 +18,6 @@
  * See 'LICENSE.txt' included within this release
  *
  */
-
 #include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
@@ -35,47 +34,48 @@
 
 #include "wipemalloc.h"
 #include <cassert>
-/* Evaluates a per pixel equation */
-void PerPixelEqn::evaluate(int mesh_i, int mesh_j) {
 
+
+/* Evaluates a per pixel equation */
+void
+PerPixelEqn::evaluate(int mesh_i, int mesh_j)
+{
   GenExpr * eqn_ptr = 0;
 
 
- eqn_ptr = this->gen_expr;
+  eqn_ptr = this->gen_expr;
 
- float ** param_matrix = (float**)this->param->matrix;
+  float ** param_matrix = (float**)this->param->matrix;
 
- if (param_matrix == 0) {
-	 assert(param->engine_val);
-	 (*(float*)param->engine_val) = eqn_ptr->eval_gen_expr(mesh_i, mesh_j);
+  if (param_matrix == 0) {
+    assert(param->engine_val);
+    (*(float*)param->engine_val) = eqn_ptr->eval_gen_expr(mesh_i, mesh_j);
 
   } else {
 
-  assert(!(eqn_ptr == NULL || param_matrix == NULL));
+    assert(!(eqn_ptr == NULL || param_matrix == NULL));
 
-  param_matrix[mesh_i][mesh_j] = eqn_ptr->eval_gen_expr(mesh_i, mesh_j);
+    param_matrix[mesh_i][mesh_j] = eqn_ptr->eval_gen_expr(mesh_i, mesh_j);
 
-  /* Now that this parameter has been referenced with a per
-     pixel equation, we let the evaluator know by setting
-     this flag */
-  /// @bug review and verify this behavior
-  param->matrix_flag = true;
-  param->flags |= P_FLAG_PER_PIXEL;
+    /* Now that this parameter has been referenced with a per
+    pixel equation, we let the evaluator know by setting
+    this flag */
+    /// @bug review and verify this behavior
+    param->matrix_flag = true;
+    param->flags |= P_FLAG_PER_PIXEL;
   }
 }
 
-PerPixelEqn::PerPixelEqn(int _index, Param * _param, GenExpr * _gen_expr):index(_index), param(_param), gen_expr(_gen_expr) {
-
-	assert(index >= 0);
-	assert(param != 0);
-	assert(gen_expr != 0);
-
+PerPixelEqn::PerPixelEqn(int _index, Param * _param, GenExpr * _gen_expr):index(_index), param(_param), gen_expr(_gen_expr)
+{
+  assert(index >= 0);
+  assert(param != 0);
+  assert(gen_expr != 0);
 }
 
 
 PerPixelEqn::~PerPixelEqn()
 {
-	if (gen_expr)
-		delete (gen_expr);
-
+  if (gen_expr)
+  delete (gen_expr);
 }
diff --git a/src/libprojectM/MilkdropPresetFactory/PerPixelEqn.hpp b/src/libprojectM/MilkdropPresetFactory/PerPixelEqn.hpp
index 9410d76..95ad52e 100644
--- a/src/libprojectM/MilkdropPresetFactory/PerPixelEqn.hpp
+++ b/src/libprojectM/MilkdropPresetFactory/PerPixelEqn.hpp
@@ -25,7 +25,6 @@
  *
  * $Log$
  */
-
 #ifndef _PER_PIXEL_EQN_H
 #define _PER_PIXEL_EQN_H
 
@@ -43,6 +42,7 @@
 #define WARP_OP 9
 #define NUM_OPS 10 /* obviously, this number is dependent on the number of existing per pixel operations */
 
+
 class GenExpr;
 class Param;
 class PerPixelEqn;
@@ -50,18 +50,18 @@
 
 class PerPixelEqn {
 public:
-    int index; /* used for splay tree ordering. */
-    int flags; /* primarily to specify if this variable is user-defined */
-    Param *param;
-    GenExpr *gen_expr;
+  int index; /* used for splay tree ordering. */
+  int flags; /* primarily to specify if this variable is user-defined */
+  Param *param;
+  GenExpr *gen_expr;
 
-    void evalPerPixelEqns( Preset *preset );
-    void evaluate(int mesh_i, int mesh_j);
-    virtual ~PerPixelEqn();
+  void evalPerPixelEqns( Preset *preset );
+  void evaluate(int mesh_i, int mesh_j);
+  virtual ~PerPixelEqn();
 
-    PerPixelEqn(int index, Param * param, GenExpr * gen_expr);
+  PerPixelEqn(int index, Param * param, GenExpr * gen_expr);
 
-  };
+};
 
 
 #endif /** !_PER_PIXEL_EQN_H */
diff --git a/src/libprojectM/MilkdropPresetFactory/PerPointEqn.cpp b/src/libprojectM/MilkdropPresetFactory/PerPointEqn.cpp
index e921916..eef886c 100644
--- a/src/libprojectM/MilkdropPresetFactory/PerPointEqn.cpp
+++ b/src/libprojectM/MilkdropPresetFactory/PerPointEqn.cpp
@@ -18,7 +18,6 @@
  * See 'LICENSE.txt' included within this release
  *
  */
-
 #include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
@@ -37,11 +36,12 @@
 #include <iostream>
 #include "wipemalloc.h"
 
-/* Evaluates a per point equation for the current custom wave given by interface_wave ptr */
-void PerPointEqn::evaluate(int i)
-{
 
-  float * param_matrix;
+/* Evaluates a per point equation for the current custom wave given by interface_wave ptr */
+void
+PerPointEqn::evaluate(int i)
+{
+  float   * param_matrix;
   GenExpr * eqn_ptr;
 
   //  samples = CustomWave::interface_wave->samples;
@@ -53,35 +53,30 @@
     assert(param->matrix_flag == false);
     (*(float*)param->engine_val) = eqn_ptr->eval_gen_expr(i,-1);
 
-  
     return;
   }
-
   else
   {
     param_matrix = (float*)param->matrix;
-  
-      // -1 is because per points only use one dimension
-      param_matrix[i] = eqn_ptr->eval_gen_expr(i, -1);
-    
+
+    // -1 is because per points only use one dimension
+    param_matrix[i] = eqn_ptr->eval_gen_expr(i, -1);
+
 
     /* Now that this parameter has been referenced with a per
-       point equation, we let the evaluator know by setting
-       this flag */
+    point equation, we let the evaluator know by setting
+    this flag */
 
     if (!param->matrix_flag)
       param->matrix_flag = true;
-
   }
-
 }
 
-PerPointEqn::PerPointEqn(int _index, Param * _param, GenExpr * _gen_expr, int _samples):
-    index(_index),
+PerPointEqn::PerPointEqn(int _index, Param * _param, GenExpr * _gen_expr, int _samples)
+  : index(_index),
     samples(_samples),
     param(_param),
     gen_expr(_gen_expr)
-
 {}
 
 
diff --git a/src/libprojectM/MilkdropPresetFactory/PerPointEqn.hpp b/src/libprojectM/MilkdropPresetFactory/PerPointEqn.hpp
index 90ba5ca..60b1a43 100644
--- a/src/libprojectM/MilkdropPresetFactory/PerPointEqn.hpp
+++ b/src/libprojectM/MilkdropPresetFactory/PerPointEqn.hpp
@@ -25,10 +25,10 @@
  *
  * $Log$
  */
-
 #ifndef _PER_POINT_EQN_H
 #define _PER_POINT_EQN_H
 
+
 class CustomWave;
 class GenExpr;
 class Param;
@@ -36,14 +36,14 @@
 
 class PerPointEqn {
 public:
-    int index;
-    int samples; // the number of samples to iterate over
-    Param *param;
-    GenExpr * gen_expr;
-    ~PerPointEqn();
-    void evaluate(int i);
-    PerPointEqn( int index, Param *param, GenExpr *gen_expr, int samples);
- };
+  int index;
+  int samples; // the number of samples to iterate over
+  Param *param;
+  GenExpr * gen_expr;
+  ~PerPointEqn();
+  void evaluate(int i);
+  PerPointEqn( int index, Param *param, GenExpr *gen_expr, int samples);
+};
 
 
 //inline void eval_per_point_eqn_helper( void *per_point_eqn ) {
diff --git a/src/libprojectM/MilkdropPresetFactory/PresetFrameIO.cpp b/src/libprojectM/MilkdropPresetFactory/PresetFrameIO.cpp
index 5a4c882..fa0986e 100644
--- a/src/libprojectM/MilkdropPresetFactory/PresetFrameIO.cpp
+++ b/src/libprojectM/MilkdropPresetFactory/PresetFrameIO.cpp
@@ -6,102 +6,103 @@
 #include <cmath>
 #include "Renderer/BeatDetect.hpp"
 
+
 PresetInputs::PresetInputs() : PipelineContext()
 {
 }
 
-void PresetInputs::update(const BeatDetect & music, const PipelineContext & context) {
+void
+PresetInputs::update(const BeatDetect & music, const PipelineContext & context)
+{
 
-    // Reflect new values form the beat detection unit
-    this->bass = music.bass;
-    this->mid = music.mid;
-    this->treb = music.treb;
-    this->bass_att = music.bass_att;
-    this->mid_att = music.mid_att;
-    this->treb_att = music.treb_att;
+  // Reflect new values form the beat detection unit
+  this->bass      = music.bass;
+  this->mid       = music.mid;
+  this->treb      = music.treb;
+  this->bass_att  = music.bass_att;
+  this->mid_att   = music.mid_att;
+  this->treb_att  = music.treb_att;
 
-    // Reflect new values from the pipeline context
-    this->fps = context.fps;
-    this->time = context.time;
+  // Reflect new values from the pipeline context
+  this->fps       = context.fps;
+  this->time      = context.time;
 
-    this->frame = context.frame;
-    this->progress = context.progress;
+  this->frame     = context.frame;
+  this->progress  = context.progress;
 }
 
-void PresetInputs::Initialize ( int gx, int gy )
+void
+PresetInputs::Initialize ( int gx, int gy )
 {
-	int x, y;
+  int x, y;
 
-	this->gx =gx;
-	this->gy= gy;
+  this->gx =gx;
+  this->gy= gy;
 
 
-	/// @bug no clue if this block belongs here
-	// ***
-	progress = 0;
-	frame = 1;
+  /// @bug no clue if this block belongs here
+  // ***
+  progress = 0;
+  frame = 1;
 
-	x_per_pixel = 0;
-	y_per_pixel = 0;
-	rad_per_pixel = 0;
-	ang_per_pixel = 0;
-	// ***
+  x_per_pixel = 0;
+  y_per_pixel = 0;
+  rad_per_pixel = 0;
+  ang_per_pixel = 0;
+  // ***
 
-	this->x_mesh= ( float ** ) wipemalloc ( gx * sizeof ( float * ) );
-	for ( x = 0; x < gx; x++ )
-	{
-		this->x_mesh[x] = ( float * ) wipemalloc ( gy * sizeof ( float ) );
-	}
-	this->y_mesh= ( float ** ) wipemalloc ( gx * sizeof ( float * ) );
-	for ( x = 0; x <gx; x++ )
-	{
-		this->y_mesh[x] = ( float * ) wipemalloc ( gy * sizeof ( float ) );
-	}
-	this->rad_mesh= ( float ** ) wipemalloc ( gx * sizeof ( float * ) );
-	for ( x = 0; x < gx; x++ )
-	{
-		this->rad_mesh[x] = ( float * ) wipemalloc ( gy * sizeof ( float ) );
-	}
-	this->theta_mesh= ( float ** ) wipemalloc ( gx * sizeof ( float * ) );
-	for ( x = 0; x <gx; x++ )
-	{
-		this->theta_mesh[x] = ( float * ) wipemalloc ( gy * sizeof ( float ) );
-	}
+  this->x_mesh= ( float ** ) wipemalloc ( gx * sizeof ( float * ) );
+  for ( x = 0; x < gx; x++ )
+  {
+    this->x_mesh[x] = ( float * ) wipemalloc ( gy * sizeof ( float ) );
+  }
+  this->y_mesh= ( float ** ) wipemalloc ( gx * sizeof ( float * ) );
+  for ( x = 0; x <gx; x++ )
+  {
+    this->y_mesh[x] = ( float * ) wipemalloc ( gy * sizeof ( float ) );
+  }
+  this->rad_mesh= ( float ** ) wipemalloc ( gx * sizeof ( float * ) );
+  for ( x = 0; x < gx; x++ )
+  {
+    this->rad_mesh[x] = ( float * ) wipemalloc ( gy * sizeof ( float ) );
+  }
+  this->theta_mesh= ( float ** ) wipemalloc ( gx * sizeof ( float * ) );
+  for ( x = 0; x <gx; x++ )
+  {
+    this->theta_mesh[x] = ( float * ) wipemalloc ( gy * sizeof ( float ) );
+  }
 
-	this->origtheta= ( float ** ) wipemalloc ( gx * sizeof ( float * ) );
-	for ( x = 0; x < gx; x++ )
-	{
-		this->origtheta[x] = ( float * ) wipemalloc ( gy * sizeof ( float ) );
-	}
-	this->origrad= ( float ** ) wipemalloc ( gx * sizeof ( float * ) );
-	for ( x = 0; x < gx; x++ )
-	{
-		this->origrad[x] = ( float * ) wipemalloc ( gy * sizeof ( float ) );
-	}
-	this->origx= ( float ** ) wipemalloc ( gx * sizeof ( float * ) );
-	for ( x = 0; x < gx; x++ )
-	{
-		this->origx[x] = ( float * ) wipemalloc ( gy * sizeof ( float ) );
-	}
-	this->origy= ( float ** ) wipemalloc ( gx * sizeof ( float * ) );
-	for ( x = 0; x < gx; x++ )
-	{
-		this->origy[x] = ( float * ) wipemalloc ( gy * sizeof ( float ) );
-	}
+  this->origtheta= ( float ** ) wipemalloc ( gx * sizeof ( float * ) );
+  for ( x = 0; x < gx; x++ )
+  {
+    this->origtheta[x] = ( float * ) wipemalloc ( gy * sizeof ( float ) );
+  }
+  this->origrad= ( float ** ) wipemalloc ( gx * sizeof ( float * ) );
+  for ( x = 0; x < gx; x++ )
+  {
+    this->origrad[x] = ( float * ) wipemalloc ( gy * sizeof ( float ) );
+  }
+  this->origx= ( float ** ) wipemalloc ( gx * sizeof ( float * ) );
+  for ( x = 0; x < gx; x++ )
+  {
+    this->origx[x] = ( float * ) wipemalloc ( gy * sizeof ( float ) );
+  }
+  this->origy= ( float ** ) wipemalloc ( gx * sizeof ( float * ) );
+  for ( x = 0; x < gx; x++ )
+  {
+    this->origy[x] = ( float * ) wipemalloc ( gy * sizeof ( float ) );
+  }
 
-	for ( x=0;x<gx;x++ )
-	{
-		for ( y=0;y<gy;y++ )
-		{
-			this->origx[x][y]=x/ ( float ) ( gx-1 );
-			this->origy[x][y]=- ( ( y/ ( float ) ( gy-1 ) )-1 );
-			this->origrad[x][y]=hypot ( ( this->origx[x][y]-.5 ) *2, ( this->origy[x][y]-.5 ) *2 ) * .7071067;
-			this->origtheta[x][y]=atan2 ( ( ( this->origy[x][y]-.5 ) *2 ), ( ( this->origx[x][y]-.5 ) *2 ) );
-		}
-	}
-
-
-
+  for ( x=0;x<gx;x++ )
+  {
+    for ( y=0;y<gy;y++ )
+    {
+      this->origx[x][y]=x/ ( float ) ( gx-1 );
+      this->origy[x][y]=- ( ( y/ ( float ) ( gy-1 ) )-1 );
+      this->origrad[x][y]=hypot ( ( this->origx[x][y]-.5 ) *2, ( this->origy[x][y]-.5 ) *2 ) * .7071067;
+      this->origtheta[x][y]=atan2 ( ( ( this->origy[x][y]-.5 ) *2 ), ( ( this->origx[x][y]-.5 ) *2 ) );
+    }
+  }
 }
 
 PresetOutputs::PresetOutputs() : Pipeline()
@@ -109,341 +110,339 @@
 
 PresetOutputs::~PresetOutputs()
 {
-	assert(this->gx > 0);
+  assert(this->gx > 0);
 
-	for ( int x = 0; x < this->gx; x++ )
-	{
-		free(this->sx_mesh[x]);
-		free(this->sy_mesh[x]);
-		free(this->dy_mesh[x]);
-		free(this->dx_mesh[x]);
-		free(this->cy_mesh[x]);
-		free(this->cx_mesh[x]);
+  for ( int x = 0; x < this->gx; x++ )
+  {
+    free (this->sx_mesh[x]);
+    free (this->sy_mesh[x]);
+    free (this->dy_mesh[x]);
+    free (this->dx_mesh[x]);
+    free (this->cy_mesh[x]);
+    free (this->cx_mesh[x]);
 
-		free(this->warp_mesh[x]);
-		free(this->zoom_mesh[x]);
-		free(this->zoomexp_mesh[x]);
-		free(this->rot_mesh[x]);
-		free(this->orig_x[x]);
-		free(this->orig_y[x]);
-		free(this->rad_mesh[x]);
-	}
+    free (this->warp_mesh[x]);
+    free (this->zoom_mesh[x]);
+    free (this->zoomexp_mesh[x]);
+    free (this->rot_mesh[x]);
+    free (this->orig_x[x]);
+    free (this->orig_y[x]);
+    free (this->rad_mesh[x]);
+  }
 
-		free(this->rad_mesh);
-		free(this->sx_mesh);
-		free(this->sy_mesh);
-		free(this->dy_mesh);
-		free(this->dx_mesh);
-		free(this->cy_mesh);
-		free(this->cx_mesh);
-		free(this->warp_mesh);
-		free(this->zoom_mesh);
-		free(this->zoomexp_mesh);
-		free(this->rot_mesh);
-		free(this->orig_x);
-		free(this->orig_y);
+  free (this->rad_mesh);
+  free (this->sx_mesh);
+  free (this->sy_mesh);
+  free (this->dy_mesh);
+  free (this->dx_mesh);
+  free (this->cy_mesh);
+  free (this->cx_mesh);
+  free (this->warp_mesh);
+  free (this->zoom_mesh);
+  free (this->zoomexp_mesh);
+  free (this->rot_mesh);
+  free (this->orig_x);
+  free (this->orig_y);
 
 }
 
-void PresetOutputs::Render(const BeatDetect &music, const PipelineContext &context)
+void
+PresetOutputs::Render(const BeatDetect &music, const PipelineContext &context)
 {
-	PerPixelMath(context);
+  PerPixelMath(context);
 
-	drawables.clear();
+  drawables.clear();
 
-	drawables.push_back(&mv);
+  drawables.push_back(&mv);
 
-	for (PresetOutputs::cshape_container::iterator pos = customShapes.begin();
-			pos != customShapes.end(); ++pos)
-			{
-				if( (*pos)->enabled==1)	drawables.push_back((*pos));
-			}
+  for (PresetOutputs::cshape_container::iterator pos = customShapes.begin();
+       pos != customShapes.end();
+       ++pos)
+  {
+    if( (*pos)->enabled==1) drawables.push_back((*pos));
+  }
 
-	for (PresetOutputs::cwave_container::iterator pos = customWaves.begin();
-			pos != customWaves.end(); ++pos)
-			{
-				if( (*pos)->enabled==1)	drawables.push_back((*pos));
-			}
+  for (PresetOutputs::cwave_container::iterator pos = customWaves.begin();
+       pos != customWaves.end();
+       ++pos)
+  {
+    if( (*pos)->enabled==1) drawables.push_back((*pos));
+  }
 
-    	drawables.push_back(&wave);
-	if(bDarkenCenter==1) drawables.push_back(&darkenCenter);
-	drawables.push_back(&border);
+  drawables.push_back(&wave);
+  if(bDarkenCenter==1) drawables.push_back(&darkenCenter);
+  drawables.push_back(&border);
 
-	compositeDrawables.clear();
-	compositeDrawables.push_back(&videoEcho);
+  compositeDrawables.clear();
+  compositeDrawables.push_back(&videoEcho);
 
-	if (bBrighten==1)
-		compositeDrawables.push_back(&brighten);
+  if (bBrighten==1)
+    compositeDrawables.push_back(&brighten);
 
-	if (bDarken==1)
-		compositeDrawables.push_back(&darken);
+  if (bDarken==1)
+    compositeDrawables.push_back(&darken);
 
-	if (bSolarize==1)
-		compositeDrawables.push_back(&solarize);
+  if (bSolarize==1)
+    compositeDrawables.push_back(&solarize);
 
-	if (bInvert==1)
-		compositeDrawables.push_back(&invert);
+  if (bInvert==1)
+    compositeDrawables.push_back(&invert);
 }
 
 
-void PresetOutputs::PerPixelMath(const PipelineContext &context)
+void
+PresetOutputs::PerPixelMath(const PipelineContext &context)
 {
+  int   x, y;
+  float fZoom2, fZoom2Inv;
 
-	int x, y;
-	float fZoom2, fZoom2Inv;
+  for (x = 0; x < gx; x++)
+  {
+    for (y = 0; y < gy; y++)
+    {
+      fZoom2 = std::pow(this->zoom_mesh[x][y], std::pow(this->zoomexp_mesh[x][y],
+                                                        rad_mesh[x][y] * 2.0f - 1.0f));
+      fZoom2Inv = 1.0f / fZoom2;
+      this->x_mesh[x][y] = this->orig_x[x][y] * 0.5f * fZoom2Inv + 0.5f;
+      this->y_mesh[x][y] = this->orig_y[x][y] * 0.5f * fZoom2Inv + 0.5f;
+    }
+  }
 
-	for (x = 0; x < gx; x++)
-	{
-		for (y = 0; y < gy; y++)
-		{
-			fZoom2 = std::pow(this->zoom_mesh[x][y], std::pow(this->zoomexp_mesh[x][y],
-					rad_mesh[x][y] * 2.0f - 1.0f));
-			fZoom2Inv = 1.0f / fZoom2;
-			this->x_mesh[x][y] = this->orig_x[x][y] * 0.5f * fZoom2Inv + 0.5f;
-			this->y_mesh[x][y] = this->orig_y[x][y] * 0.5f * fZoom2Inv + 0.5f;
-		}
-	}
+  for (x = 0; x < gx; x++)
+  {
+    for (y = 0; y < gy; y++)
+    {
+      this->x_mesh[x][y] = (this->x_mesh[x][y] - this->cx_mesh[x][y])
+                         / this->sx_mesh[x][y] + this->cx_mesh[x][y];
+    }
+  }
 
-	for (x = 0; x < gx; x++)
-	{
-		for (y = 0; y < gy; y++)
-		{
-			this->x_mesh[x][y] = (this->x_mesh[x][y] - this->cx_mesh[x][y])
-					/ this->sx_mesh[x][y] + this->cx_mesh[x][y];
-		}
-	}
+  for (x = 0; x < gx; x++)
+  {
+    for (y = 0; y < gy; y++)
+    {
+      this->y_mesh[x][y] = (this->y_mesh[x][y] - this->cy_mesh[x][y])
+                         / this->sy_mesh[x][y] + this->cy_mesh[x][y];
+    }
+  }
 
-	for (x = 0; x < gx; x++)
-	{
-		for (y = 0; y < gy; y++)
-		{
-			this->y_mesh[x][y] = (this->y_mesh[x][y] - this->cy_mesh[x][y])
-					/ this->sy_mesh[x][y] + this->cy_mesh[x][y];
-		}
-	}
+  float fWarpTime = context.time * this->fWarpAnimSpeed;
+  float fWarpScaleInv = 1.0f / this->fWarpScale;
+  float f[4];
+  f[0] = 11.68f + 4.0f * cosf(fWarpTime * 1.413f + 10);
+  f[1] = 8.77f + 3.0f * cosf(fWarpTime * 1.113f + 7);
+  f[2] = 10.54f + 3.0f * cosf(fWarpTime * 1.233f + 3);
+  f[3] = 11.49f + 4.0f * cosf(fWarpTime * 0.933f + 5);
 
-	float fWarpTime = context.time * this->fWarpAnimSpeed;
-	float fWarpScaleInv = 1.0f / this->fWarpScale;
-	float f[4];
-	f[0] = 11.68f + 4.0f * cosf(fWarpTime * 1.413f + 10);
-	f[1] = 8.77f + 3.0f * cosf(fWarpTime * 1.113f + 7);
-	f[2] = 10.54f + 3.0f * cosf(fWarpTime * 1.233f + 3);
-	f[3] = 11.49f + 4.0f * cosf(fWarpTime * 0.933f + 5);
+  for (x = 0; x < gx; x++)
+  {
+    for (y = 0; y < gy; y++)
+    {
+      this->x_mesh[x][y] += this->warp_mesh[x][y] * 0.0035f * sinf(fWarpTime * 0.333f
+                          + fWarpScaleInv * (this->orig_x[x][y] * f[0] - this->orig_y[x][y] * f[3]));
+      this->y_mesh[x][y] += this->warp_mesh[x][y] * 0.0035f * cosf(fWarpTime * 0.375f
+                          - fWarpScaleInv * (this->orig_x[x][y] * f[2] + this->orig_y[x][y] * f[1]));
+      this->x_mesh[x][y] += this->warp_mesh[x][y] * 0.0035f * cosf(fWarpTime * 0.753f
+                          - fWarpScaleInv * (this->orig_x[x][y] * f[1] - this->orig_y[x][y] * f[2]));
+      this->y_mesh[x][y] += this->warp_mesh[x][y] * 0.0035f * sinf(fWarpTime * 0.825f
+                          + fWarpScaleInv * (this->orig_x[x][y] * f[0] + this->orig_y[x][y] * f[3]));
+    }
+  }
+  for (x = 0; x < gx; x++)
+  {
+    for (y = 0; y < gy; y++)
+    {
+      float u2 = this->x_mesh[x][y] - this->cx_mesh[x][y];
+      float v2 = this->y_mesh[x][y] - this->cy_mesh[x][y];
 
-	for (x = 0; x < gx; x++)
-	{
-		for (y = 0; y < gy; y++)
-		{
-			this->x_mesh[x][y] += this->warp_mesh[x][y] * 0.0035f * sinf(fWarpTime * 0.333f
-					+ fWarpScaleInv * (this->orig_x[x][y] * f[0] - this->orig_y[x][y] * f[3]));
-			this->y_mesh[x][y] += this->warp_mesh[x][y] * 0.0035f * cosf(fWarpTime * 0.375f
-					- fWarpScaleInv * (this->orig_x[x][y] * f[2] + this->orig_y[x][y] * f[1]));
-			this->x_mesh[x][y] += this->warp_mesh[x][y] * 0.0035f * cosf(fWarpTime * 0.753f
-					- fWarpScaleInv * (this->orig_x[x][y] * f[1] - this->orig_y[x][y] * f[2]));
-			this->y_mesh[x][y] += this->warp_mesh[x][y] * 0.0035f * sinf(fWarpTime * 0.825f
-					+ fWarpScaleInv * (this->orig_x[x][y] * f[0] + this->orig_y[x][y] * f[3]));
-		}
-	}
-	for (x = 0; x < gx; x++)
-	{
-		for (y = 0; y < gy; y++)
-		{
-			float u2 = this->x_mesh[x][y] - this->cx_mesh[x][y];
-			float v2 = this->y_mesh[x][y] - this->cy_mesh[x][y];
+      float cos_rot = cosf(this->rot_mesh[x][y]);
+      float sin_rot = sinf(this->rot_mesh[x][y]);
 
-			float cos_rot = cosf(this->rot_mesh[x][y]);
-			float sin_rot = sinf(this->rot_mesh[x][y]);
+      this->x_mesh[x][y] = u2 * cos_rot - v2 * sin_rot + this->cx_mesh[x][y];
+      this->y_mesh[x][y] = u2 * sin_rot + v2 * cos_rot + this->cy_mesh[x][y];
+    }
+  }
 
-			this->x_mesh[x][y] = u2 * cos_rot - v2 * sin_rot + this->cx_mesh[x][y];
-			this->y_mesh[x][y] = u2 * sin_rot + v2 * cos_rot + this->cy_mesh[x][y];
+  for (x = 0; x < gx; x++)
+    for (y = 0; y < gy; y++)
+      this->x_mesh[x][y] -= this->dx_mesh[x][y];
 
-		}
-	}
-
-	for (x = 0; x < gx; x++)
-		for (y = 0; y < gy; y++)
-			this->x_mesh[x][y] -= this->dx_mesh[x][y];
-
-	for (x = 0; x < gx; x++)
-		for (y = 0; y < gy; y++)
-			this->y_mesh[x][y] -= this->dy_mesh[x][y];
-
+  for (x = 0; x < gx; x++)
+    for (y = 0; y < gy; y++)
+      this->y_mesh[x][y] -= this->dy_mesh[x][y];
 }
 
 
-void PresetOutputs::Initialize ( int gx, int gy )
+void
+PresetOutputs::Initialize ( int gx, int gy )
 {
+  assert(gx > 0);
+  this->gx = gx;
+  this->gy= gy;
 
-	assert(gx > 0);
-	this->gx = gx;
-	this->gy= gy;
+  staticPerPixel = true;
+  setStaticPerPixel(gx,gy);
 
-	staticPerPixel = true;
-	setStaticPerPixel(gx,gy);
+  assert(this->gx > 0);
+  int x;
+  this->x_mesh= ( float ** ) wipemalloc ( gx * sizeof ( float * ) );
+  for ( x = 0; x < gx; x++ )
+  {
+    this->x_mesh[x] = ( float * ) wipemalloc ( gy * sizeof ( float ) );
+  }
+  this->y_mesh= ( float ** ) wipemalloc ( gx * sizeof ( float * ) );
+  for ( x = 0; x < gx; x++ )
+  {
+    this->y_mesh[x] = ( float * ) wipemalloc ( gy * sizeof ( float ) );
+  }
+  this->sx_mesh= ( float ** ) wipemalloc ( gx * sizeof ( float * ) );
+  for ( x = 0; x < gx; x++ )
+  {
+    this->sx_mesh[x] = ( float * ) wipemalloc ( gy * sizeof ( float ) );
+  }
+  this->sy_mesh= ( float ** ) wipemalloc ( gx * sizeof ( float * ) );
+  for ( x = 0; x < gx; x++ )
+  {
+    this->sy_mesh[x] = ( float * ) wipemalloc ( gy * sizeof ( float ) );
+  }
+  this->dx_mesh= ( float ** ) wipemalloc ( gx * sizeof ( float * ) );
+  for ( x = 0; x < gx; x++ )
+  {
+    this->dx_mesh[x] = ( float * ) wipemalloc ( gy * sizeof ( float ) );
+  }
+  this->dy_mesh= ( float ** ) wipemalloc ( gx * sizeof ( float * ) );
+  for ( x = 0; x < gx; x++ )
+  {
+    this->dy_mesh[x] = ( float * ) wipemalloc ( gy * sizeof ( float ) );
+  }
+  this->cx_mesh= ( float ** ) wipemalloc ( gx * sizeof ( float * ) );
+  for ( x = 0; x < gx; x++ )
+  {
+    this->cx_mesh[x] = ( float * ) wipemalloc ( gy * sizeof ( float ) );
+  }
+  this->cy_mesh= ( float ** ) wipemalloc ( gx * sizeof ( float * ) );
+  for ( x = 0; x < gx; x++ )
+  {
+    this->cy_mesh[x] = ( float * ) wipemalloc ( gy * sizeof ( float ) );
+  }
+  this->zoom_mesh= ( float ** ) wipemalloc ( gx * sizeof ( float * ) );
+  for ( x = 0; x < gx; x++ )
+  {
+    this->zoom_mesh[x] = ( float * ) wipemalloc ( gy * sizeof ( float ) );
+  }
+  this->zoomexp_mesh= ( float ** ) wipemalloc ( gx * sizeof ( float * ) );
+  for ( x = 0; x < gx; x++ )
+  {
+    this->zoomexp_mesh[x] = ( float * ) wipemalloc ( gy * sizeof ( float ) );
+  }
+  this->rot_mesh= ( float ** ) wipemalloc ( gx * sizeof ( float * ) );
+  for ( x = 0; x < gx; x++ )
+  {
+    this->rot_mesh[x] = ( float * ) wipemalloc ( gy * sizeof ( float ) );
+  }
 
-	assert(this->gx > 0);
-	int x;
-	this->x_mesh= ( float ** ) wipemalloc ( gx * sizeof ( float * ) );
-	for ( x = 0; x < gx; x++ )
-	{
-		this->x_mesh[x] = ( float * ) wipemalloc ( gy * sizeof ( float ) );
-	}
-	this->y_mesh= ( float ** ) wipemalloc ( gx * sizeof ( float * ) );
-	for ( x = 0; x < gx; x++ )
-	{
-		this->y_mesh[x] = ( float * ) wipemalloc ( gy * sizeof ( float ) );
-	}
-	this->sx_mesh= ( float ** ) wipemalloc ( gx * sizeof ( float * ) );
-	for ( x = 0; x < gx; x++ )
-	{
-		this->sx_mesh[x] = ( float * ) wipemalloc ( gy * sizeof ( float ) );
-	}
-	this->sy_mesh= ( float ** ) wipemalloc ( gx * sizeof ( float * ) );
-	for ( x = 0; x < gx; x++ )
-	{
-		this->sy_mesh[x] = ( float * ) wipemalloc ( gy * sizeof ( float ) );
-	}
-	this->dx_mesh= ( float ** ) wipemalloc ( gx * sizeof ( float * ) );
-	for ( x = 0; x < gx; x++ )
-	{
-		this->dx_mesh[x] = ( float * ) wipemalloc ( gy * sizeof ( float ) );
-	}
-	this->dy_mesh= ( float ** ) wipemalloc ( gx * sizeof ( float * ) );
-	for ( x = 0; x < gx; x++ )
-	{
-		this->dy_mesh[x] = ( float * ) wipemalloc ( gy * sizeof ( float ) );
-	}
-	this->cx_mesh= ( float ** ) wipemalloc ( gx * sizeof ( float * ) );
-	for ( x = 0; x < gx; x++ )
-	{
-		this->cx_mesh[x] = ( float * ) wipemalloc ( gy * sizeof ( float ) );
-	}
-	this->cy_mesh= ( float ** ) wipemalloc ( gx * sizeof ( float * ) );
-	for ( x = 0; x < gx; x++ )
-	{
-		this->cy_mesh[x] = ( float * ) wipemalloc ( gy * sizeof ( float ) );
-	}
-	this->zoom_mesh= ( float ** ) wipemalloc ( gx * sizeof ( float * ) );
-	for ( x = 0; x < gx; x++ )
-	{
-		this->zoom_mesh[x] = ( float * ) wipemalloc ( gy * sizeof ( float ) );
-	}
-	this->zoomexp_mesh= ( float ** ) wipemalloc ( gx * sizeof ( float * ) );
-	for ( x = 0; x < gx; x++ )
-	{
-		this->zoomexp_mesh[x] = ( float * ) wipemalloc ( gy * sizeof ( float ) );
-	}
-	this->rot_mesh= ( float ** ) wipemalloc ( gx * sizeof ( float * ) );
-	for ( x = 0; x < gx; x++ )
-	{
-		this->rot_mesh[x] = ( float * ) wipemalloc ( gy * sizeof ( float ) );
-	}
+  this->warp_mesh= ( float ** ) wipemalloc ( gx * sizeof ( float * ) );
+  for ( x = 0; x < gx; x++ )
+  {
+    this->warp_mesh[x] = ( float * ) wipemalloc ( gy * sizeof ( float ) );
+  }
+  this->rad_mesh= ( float ** ) wipemalloc ( gx * sizeof ( float * ) );
+  for ( x = 0; x < gx; x++ )
+  {
+    this->rad_mesh[x] = ( float * ) wipemalloc ( gy * sizeof ( float ) );
+  }
+  this->orig_x = (float **) wipemalloc(gx * sizeof(float *));
+  for (x = 0; x < gx; x++)
+  {
+    this->orig_x[x] = (float *) wipemalloc(gy * sizeof(float));
+  }
+  this->orig_y = (float **) wipemalloc(gx * sizeof(float *));
+  for (x = 0; x < gx; x++)
+  {
+    this->orig_y[x] = (float *) wipemalloc(gy * sizeof(float));
+  }
 
-	this->warp_mesh= ( float ** ) wipemalloc ( gx * sizeof ( float * ) );
-	for ( x = 0; x < gx; x++ )
-	{
-		this->warp_mesh[x] = ( float * ) wipemalloc ( gy * sizeof ( float ) );
-	}
-	this->rad_mesh= ( float ** ) wipemalloc ( gx * sizeof ( float * ) );
-	for ( x = 0; x < gx; x++ )
-	{
-		this->rad_mesh[x] = ( float * ) wipemalloc ( gy * sizeof ( float ) );
-	}
-	this->orig_x = (float **) wipemalloc(gx * sizeof(float *));
-	for (x = 0; x < gx; x++)
-	{
-		this->orig_x[x] = (float *) wipemalloc(gy * sizeof(float));
-	}
-	this->orig_y = (float **) wipemalloc(gx * sizeof(float *));
-	for (x = 0; x < gx; x++)
-	{
-		this->orig_y[x] = (float *) wipemalloc(gy * sizeof(float));
-	}
+  //initialize reference grid values
+  for (x = 0; x < gx; x++)
+  {
+    for (int y = 0; y < gy; y++)
+    {
+      float origx = x / (float) (gx - 1);
+      float origy = -((y / (float) (gy - 1)) - 1);
 
-		//initialize reference grid values
-		for (x = 0; x < gx; x++)
-		{
-			for (int y = 0; y < gy; y++)
-			{
-				float origx = x / (float) (gx - 1);
-				float origy = -((y / (float) (gy - 1)) - 1);
-
-				rad_mesh[x][y]=hypot ( ( origx-.5 ) *2, ( origy-.5 ) *2 ) * .7071067;
-				orig_x[x][y] = (origx - .5) * 2;
-				orig_y[x][y] = (origy - .5) * 2;
-			}
-		}
+      rad_mesh[x][y]=hypot ( ( origx-.5 ) *2, ( origy-.5 ) *2 ) * .7071067;
+      orig_x[x][y] = (origx - .5) * 2;
+      orig_y[x][y] = (origy - .5) * 2;
+    }
+  }
 }
 
 PresetInputs::~PresetInputs()
 {
-	for ( int x = 0; x < this->gx; x++ )
-	{
+  for ( int x = 0; x < this->gx; x++ )
+  {
+    free ( this->origtheta[x] );
+    free ( this->origrad[x] );
+    free ( this->origx[x] );
+    free ( this->origy[x] );
+
+    free ( this->x_mesh[x] );
+    free ( this->y_mesh[x] );
+    free ( this->rad_mesh[x] );
+    free ( this->theta_mesh[x] );
+  }
 
 
-		free ( this->origtheta[x] );
-		free ( this->origrad[x] );
-		free ( this->origx[x] );
-		free ( this->origy[x] );
+  free ( this->origx );
+  free ( this->origy );
+  free ( this->origrad );
+  free ( this->origtheta );
 
-		free ( this->x_mesh[x] );
-		free ( this->y_mesh[x] );
-		free ( this->rad_mesh[x] );
-		free ( this->theta_mesh[x] );
+  free ( this->x_mesh );
+  free ( this->y_mesh );
+  free ( this->rad_mesh );
+  free ( this->theta_mesh );
 
-	}
+  this->origx = NULL;
+  this->origy = NULL;
+  this->origtheta = NULL;
+  this->origrad = NULL;
 
-
-	free ( this->origx );
-	free ( this->origy );
-	free ( this->origrad );
-	free ( this->origtheta );
-
-	free ( this->x_mesh );
-	free ( this->y_mesh );
-	free ( this->rad_mesh );
-	free ( this->theta_mesh );
-
-	this->origx = NULL;
-	this->origy = NULL;
-	this->origtheta = NULL;
-	this->origrad = NULL;
-
-	this->x_mesh = NULL;
-	this->y_mesh = NULL;
-	this->rad_mesh = NULL;
-	this->theta_mesh = NULL;
+  this->x_mesh = NULL;
+  this->y_mesh = NULL;
+  this->rad_mesh = NULL;
+  this->theta_mesh = NULL;
 }
 
 
 void PresetInputs::resetMesh()
 {
-	int x,y;
+  int x,y;
 
-	assert ( x_mesh );
-	assert ( y_mesh );
-	assert ( rad_mesh );
-	assert ( theta_mesh );
+  assert ( x_mesh );
+  assert ( y_mesh );
+  assert ( rad_mesh );
+  assert ( theta_mesh );
 
-	for ( x=0;x<this->gx;x++ )
-	{
-		for ( y=0;y<this->gy;y++ )
-		{
-			x_mesh[x][y]=this->origx[x][y];
-			y_mesh[x][y]=this->origy[x][y];
-			rad_mesh[x][y]=this->origrad[x][y];
-			theta_mesh[x][y]=this->origtheta[x][y];
-		}
-	}
-
+  for ( x=0;x<this->gx;x++ )
+  {
+    for ( y=0;y<this->gy;y++ )
+    {
+      x_mesh[x][y]=this->origx[x][y];
+      y_mesh[x][y]=this->origy[x][y];
+      rad_mesh[x][y]=this->origrad[x][y];
+      theta_mesh[x][y]=this->origtheta[x][y];
+    }
+  }
 }
 
 
 #ifdef USE_MERGE_PRESET_CODE
-void PresetMerger::MergePresets(PresetOutputs & A, PresetOutputs & B, double ratio, int gx, int gy)
+void
+PresetMerger::MergePresets(PresetOutputs & A, PresetOutputs & B, double ratio, int gx, int gy)
 {
 
-double invratio = 1.0 - ratio;
+  double invratio = 1.0 - ratio;
   //Merge Simple Waveforms
   //
   // All the mess is because of Waveform 7, which is two lines.
@@ -453,65 +452,69 @@
   //Merge Custom Shapes and Custom Waves
 
   for (PresetOutputs::cshape_container::iterator pos = A.customShapes.begin();
-	pos != A.customShapes.end(); ++pos)
-    {
-       (*pos)->a *= invratio;
-       (*pos)->a2 *= invratio;
-       (*pos)->border_a *= invratio;
-    }
+       pos != A.customShapes.end();
+       ++pos)
+  {
+    (*pos)->a *= invratio;
+    (*pos)->a2 *= invratio;
+    (*pos)->border_a *= invratio;
+  }
 
   for (PresetOutputs::cshape_container::iterator pos = B.customShapes.begin();
-	pos != B.customShapes.end(); ++pos)
-    {
-       (*pos)->a *= ratio;
-       (*pos)->a2 *= ratio;
-       (*pos)->border_a *= ratio;
+       pos != B.customShapes.end();
+       ++pos)
+  {
+    (*pos)->a *= ratio;
+    (*pos)->a2 *= ratio;
+    (*pos)->border_a *= ratio;
 
-        A.customShapes.push_back(*pos);
+    A.customShapes.push_back(*pos);
+  }
 
-    }
- for (PresetOutputs::cwave_container::iterator pos = A.customWaves.begin();
-	pos != A.customWaves.end(); ++pos)
+  for (PresetOutputs::cwave_container::iterator pos = A.customWaves.begin();
+       pos != A.customWaves.end();
+       ++pos)
+  {
+    (*pos)->a *= invratio;
+    for (int x=0; x <   (*pos)->samples; x++)
     {
-       (*pos)->a *= invratio;
-      for (int x=0; x <   (*pos)->samples; x++)
-	{
-	   (*pos)->a_mesh[x]= (*pos)->a_mesh[x]*invratio;
-	}
+      (*pos)->a_mesh[x]= (*pos)->a_mesh[x]*invratio;
     }
+  }
 
   for (PresetOutputs::cwave_container::iterator pos = B.customWaves.begin();
-	pos != B.customWaves.end(); ++pos)
+       pos != B.customWaves.end();
+       ++pos)
+  {
+    (*pos)->a *= ratio;
+    for (int x=0; x < (*pos)->samples; x++)
     {
-       (*pos)->a *= ratio;
-      for (int x=0; x < (*pos)->samples; x++)
-	{
-	   (*pos)->a_mesh[x]= (*pos)->a_mesh[x]*ratio;
-	}
-       A.customWaves.push_back(*pos);
+      (*pos)->a_mesh[x]= (*pos)->a_mesh[x]*ratio;
     }
+    A.customWaves.push_back(*pos);
+  }
 
 
   //Interpolate Per-Pixel mesh
 
   for (int x=0;x<gx;x++)
+  {
+    for(int y=0;y<gy;y++)
     {
-      for(int y=0;y<gy;y++)
-	{
-	  A.x_mesh[x][y]  = A.x_mesh[x][y]* invratio + B.x_mesh[x][y]*ratio;
-	}
+      A.x_mesh[x][y]  = A.x_mesh[x][y]* invratio + B.x_mesh[x][y]*ratio;
     }
- for (int x=0;x<gx;x++)
+  }
+  for (int x=0;x<gx;x++)
+  {
+    for(int y=0;y<gy;y++)
     {
-      for(int y=0;y<gy;y++)
-	{
-	  A.y_mesh[x][y]  = A.y_mesh[x][y]* invratio + B.y_mesh[x][y]*ratio;
-	}
+      A.y_mesh[x][y]  = A.y_mesh[x][y]* invratio + B.y_mesh[x][y]*ratio;
     }
+  }
 
 
 
- //Interpolate PerFrame floats
+  //Interpolate PerFrame floats
 
   A.screenDecay = A.screenDecay * invratio + B.screenDecay * ratio;
 
@@ -559,17 +562,17 @@
   //Switch bools and discrete values halfway.  Maybe we should do some interesting stuff here.
 
   if (ratio > 0.5)
-    {
-      A.videoEcho.orientation = B.videoEcho.orientation;
-      A.textureWrap = B.textureWrap;
-      A.bDarkenCenter = B.bDarkenCenter;
-      A.bRedBlueStereo = B.bRedBlueStereo;
-      A.bBrighten = B.bBrighten;
-      A.bDarken = B.bDarken;
-      A.bSolarize = B.bSolarize;
-      A.bInvert = B.bInvert;
-      A.bMotionVectorsOn = B.bMotionVectorsOn;
-    }
+  {
+    A.videoEcho.orientation = B.videoEcho.orientation;
+    A.textureWrap = B.textureWrap;
+    A.bDarkenCenter = B.bDarkenCenter;
+    A.bRedBlueStereo = B.bRedBlueStereo;
+    A.bBrighten = B.bBrighten;
+    A.bDarken = B.bDarken;
+    A.bSolarize = B.bSolarize;
+    A.bInvert = B.bInvert;
+    A.bMotionVectorsOn = B.bMotionVectorsOn;
+  }
 
   return;
 }
diff --git a/src/libprojectM/MilkdropPresetFactory/PresetFrameIO.hpp b/src/libprojectM/MilkdropPresetFactory/PresetFrameIO.hpp
index 229879c..9b7a5a4 100644
--- a/src/libprojectM/MilkdropPresetFactory/PresetFrameIO.hpp
+++ b/src/libprojectM/MilkdropPresetFactory/PresetFrameIO.hpp
@@ -1,5 +1,6 @@
 #ifndef PRESET_FRAME_IO_HPP
 #define PRESET_FRAME_IO_HPP
+
 #include <vector>
 #include "Renderer/MilkdropWaveform.hpp"
 #include "Renderer/Pipeline.hpp"
@@ -14,51 +15,51 @@
 class PresetInputs : public PipelineContext {
 
 public:
-    /* PER_PIXEL VARIBLES BEGIN */
+  /* PER_PIXEL VARIBLES BEGIN */
 
-    float x_per_pixel;
-    float y_per_pixel;
-    float rad_per_pixel;
-    float ang_per_pixel;
+  float x_per_pixel;
+  float y_per_pixel;
+  float rad_per_pixel;
+  float ang_per_pixel;
 
-    /* PER_PIXEL VARIBLES END */
+  /* PER_PIXEL VARIBLES END */
 
-    float bass;
-    float mid;
-    float treb;
-    float bass_att;
-    float mid_att;
-    float treb_att;
+  float bass;
+  float mid;
+  float treb;
+  float bass_att;
+  float mid_att;
+  float treb_att;
 
-    /* variables were added in milkdrop 1.04 */
-    int gx, gy;
+  /* variables were added in milkdrop 1.04 */
+  int gx, gy;
 
-    float **x_mesh;
-    float **y_mesh;
-    float **rad_mesh;
-    float **theta_mesh;
+  float **x_mesh;
+  float **y_mesh;
+  float **rad_mesh;
+  float **theta_mesh;
 
-    float **origtheta;  //grid containing interpolated mesh reference values
-    float **origrad;
-    float **origx;  //original mesh
-    float **origy;
+  float **origtheta;  //grid containing interpolated mesh reference values
+  float **origrad;
+  float **origx;  //original mesh
+  float **origy;
 
-    void resetMesh();
+  void resetMesh();
 
-    ~PresetInputs();
-    PresetInputs();
+  ~PresetInputs();
+  PresetInputs();
 
-    /// Initializes this preset inputs given a mesh size.
-    /// \param gx the width of the mesh 
-    /// \param gy the height of the mesh
-    /// \note This must be called before reading values from this class
-    void Initialize(int gx, int gy);
+  /// Initializes this preset inputs given a mesh size.
+  /// \param gx the width of the mesh
+  /// \param gy the height of the mesh
+  /// \note This must be called before reading values from this class
+  void Initialize(int gx, int gy);
 
-    /// Updates this preset inputs with the latest values from the
-    /// the pipeline context and beat detection unit
-    void update (const BeatDetect & music, const PipelineContext & context);
+  /// Updates this preset inputs with the latest values from the
+  /// the pipeline context and beat detection unit
+  void update (const BeatDetect & music, const PipelineContext & context);
 
-    private:
+private:
 };
 
 
@@ -67,77 +68,77 @@
 /// Every preset object needs a reference to one of these.
 class PresetOutputs : public Pipeline {
 public:
-    typedef std::vector<CustomWave*> cwave_container;
-    typedef std::vector<CustomShape*> cshape_container;
+  typedef std::vector<CustomWave*> cwave_container;
+  typedef std::vector<CustomShape*> cshape_container;
 
-    cwave_container customWaves;
-    cshape_container customShapes;
+  cwave_container customWaves;
+  cshape_container customShapes;
 
-    void Initialize(int gx, int gy);
-    PresetOutputs();
-    ~PresetOutputs();
-    virtual void Render(const BeatDetect &music, const PipelineContext &context);
-    void PerPixelMath( const PipelineContext &context);
-    /* PER FRAME VARIABLES BEGIN */
+  void Initialize(int gx, int gy);
+  PresetOutputs();
+  ~PresetOutputs();
+  virtual void Render(const BeatDetect &music, const PipelineContext &context);
+  void PerPixelMath( const PipelineContext &context);
+  /* PER FRAME VARIABLES BEGIN */
 
-    float zoom;
-    float zoomexp;
-    float rot;
-    float warp;
+  float zoom;
+  float zoomexp;
+  float rot;
+  float warp;
 
-    float sx;
-    float sy;
-    float dx;
-    float dy;
-    float cx;
-    float cy;
+  float sx;
+  float sy;
+  float dx;
+  float dy;
+  float cx;
+  float cy;
 
-    VideoEcho videoEcho;
+  VideoEcho videoEcho;
 
-    MilkdropWaveform wave;
-    Border border;
-    MotionVectors mv;
-    DarkenCenter darkenCenter;
+  MilkdropWaveform wave;
+  Border border;
+  MotionVectors mv;
+  DarkenCenter darkenCenter;
 
-    Brighten brighten;
-    Darken darken;
-    Invert invert;
-    Solarize solarize;
+  Brighten brighten;
+  Darken darken;
+  Invert invert;
+  Solarize solarize;
 
 
-    int gy,gx;
-    /* PER_FRAME VARIABLES END */
+  int gy,gx;
+  /* PER_FRAME VARIABLES END */
 
-    float fRating;
-    float fGammaAdj;
+  float fRating;
+  float fGammaAdj;
 
-    bool bDarkenCenter;
-    bool bRedBlueStereo;
-    bool bBrighten;
-    bool bDarken;
-    bool bSolarize;
-    bool bInvert;
-    bool bMotionVectorsOn;
+  bool bDarkenCenter;
+  bool bRedBlueStereo;
+  bool bBrighten;
+  bool bDarken;
+  bool bSolarize;
+  bool bInvert;
+  bool bMotionVectorsOn;
 
-    float fWarpAnimSpeed;
-    float fWarpScale;
-    float fShader;
+  float fWarpAnimSpeed;
+  float fWarpScale;
+  float fShader;
 
-    float **zoom_mesh;
-    float **zoomexp_mesh;
-    float **rot_mesh;
+  float **zoom_mesh;
+  float **zoomexp_mesh;
+  float **rot_mesh;
 
-    float **sx_mesh;
-    float **sy_mesh;
-    float **dx_mesh;
-    float **dy_mesh;
-    float **cx_mesh;
-    float **cy_mesh;
-    float **warp_mesh;
+  float **sx_mesh;
+  float **sy_mesh;
+  float **dx_mesh;
+  float **dy_mesh;
+  float **cx_mesh;
+  float **cy_mesh;
+  float **warp_mesh;
 
-    float **orig_x;  //original mesh
-    float **orig_y;
-    float **rad_mesh;
+  float **orig_x;  //original mesh
+  float **orig_y;
+  float **rad_mesh;
 };
 
 
diff --git a/src/libprojectM/PCM.cpp b/src/libprojectM/PCM.cpp
index 5ce9d9a..1caebd4 100644
--- a/src/libprojectM/PCM.cpp
+++ b/src/libprojectM/PCM.cpp
@@ -1,6 +1,6 @@
 /**
  * projectM -- Milkdrop-esque visualisation SDK
- * Copyright (C)2003-2004 projectM Team
+ * Copyright (C) 2003-2004 projectM Team
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -24,7 +24,6 @@
  * Takes sound data from wherever and hands it back out.
  * Returns PCM Data or spectrum data, or the derivative of the PCM data
  */
-
 #include <stdlib.h>
 #include <stdio.h>
 
@@ -33,225 +32,234 @@
 #include "fftsg.h"
 #include "PCM.hpp"
 #include <cassert>
+#include <iostream>
+
 
 int PCM::maxsamples = 2048;
 
-//initPCM(int samples)
+
+//initPCM (int samples)
 //
 //Initializes the PCM buffer to
 // number of samples specified.
-#include <iostream>
-PCM::PCM() {
-    initPCM( 2048 );
 
-    #ifdef DEBUG
-    std::cerr << "[PCM] MAX SAMPLES:" << maxsamples << std::endl;
-    #endif
-  }
+PCM::PCM ()
+{
+  initPCM (2048);
 
-void PCM::initPCM(int samples) {
+#ifdef DEBUG
+  std::cerr << "[PCM] MAX SAMPLES:" << maxsamples << std::endl;
+#endif
+}
+
+void
+PCM::initPCM (int samples)
+{
   int i;
 
-    waveSmoothing = 0;
+  waveSmoothing = 0;
 
   //Allocate memory for PCM data buffer
-    assert(samples == 2048);
-  PCMd = (float **)wipemalloc(2 * sizeof(float *));
-  PCMd[0] = (float *)wipemalloc(samples * sizeof(float));
-  PCMd[1] = (float *)wipemalloc(samples * sizeof(float));
+  assert (samples == 2048);
+  PCMd    = (float **) wipemalloc (2 * sizeof (float *));
+  PCMd[0] = (float *) wipemalloc (samples * sizeof (float));
+  PCMd[1] = (float *) wipemalloc (samples * sizeof (float));
 
   //maxsamples=samples;
-  newsamples=0;
-    numsamples = maxsamples;
+  newsamples = 0;
+  numsamples = maxsamples;
 
   //Initialize buffers to 0
-  for (i=0;i<samples;i++)
-    {
-      PCMd[0][i]=0;
-      PCMd[1][i]=0;
-    }
+  for (i = 0;  i < samples;  i++) {
+    PCMd[0][i] =
+    PCMd[1][i] = 0;
+  }
 
-  start=0;
+  start = 0;
 
   //Allocate FFT workspace
-  w=  (double *)wipemalloc(maxsamples*sizeof(double));
-  ip= (int *)wipemalloc(maxsamples*sizeof(int));
-  ip[0]=0;
+  w = (double *) wipemalloc (maxsamples * sizeof (double));
+  ip = (int *) wipemalloc (maxsamples * sizeof (int));
+  ip[0] = 0;
 
 
-    /** PCM data */
-//    this->maxsamples = 2048;
-//    this->numsamples = 0;
-//    this->pcmdataL = NULL;
-//    this->pcmdataR = NULL;
+  /** PCM data */
+  //    this->maxsamples = 2048;
+  //    this->numsamples = 0;
+  //    this->pcmdataL = NULL;
+  //    this->pcmdataR = NULL;
 
-    /** Allocate PCM data structures */
-    pcmdataL=(float *)wipemalloc(this->maxsamples*sizeof(float));
-    pcmdataR=(float *)wipemalloc(this->maxsamples*sizeof(float));
+  /** Allocate PCM data structures */
+  pcmdataL = (float *) wipemalloc (this->maxsamples * sizeof (float));
+  pcmdataR = (float *) wipemalloc (this->maxsamples * sizeof (float));
 
 }
 
-PCM::~PCM() {
-
-	free(pcmdataL);
-	free(pcmdataR);
-	free(w);
-	free(ip);
-
-	free(PCMd[0]);
-	free(PCMd[1]);
-	free(PCMd);
-
-}
-
-#include <iostream>
-
-void PCM::addPCMfloat(const float *PCMdata, int samples)
+PCM::~PCM ()
 {
-  int i,j;
+  free (pcmdataL);
+  free (pcmdataR);
+  free (w);
+  free (ip);
 
-  for(i=0;i<samples;i++)
-    {
-      j=i+start;
+  free (PCMd[0]);
+  free (PCMd[1]);
+  free (PCMd);
+}
 
-      if (PCMdata[i] != 0 ) {
 
-	PCMd[0][j%maxsamples] = PCMdata[i];
-	PCMd[1][j%maxsamples] = PCMdata[i];
+void
+PCM::addPCMfloat (const float *PCMdata, int samples)
+{
+  int i, j;
 
-      }
-      else
-	{
-	  PCMd[0][j % maxsamples] = 0;
-	  PCMd[1][j % maxsamples] = 0;
-	}
+  for (i = 0;  i < samples;  i++)
+  {
+    j = i + start;
+
+    if (PCMdata[i] != 0 ) {
+      PCMd[0][j % maxsamples] = PCMdata[i];
+      PCMd[1][j % maxsamples] = PCMdata[i];
+    } else {
+      PCMd[0][j % maxsamples] = 0;
+      PCMd[1][j % maxsamples] = 0;
     }
+  }
 
-  start+=samples;
-  start=start%maxsamples;
+  start += samples;
+  start = start % maxsamples;
 
- newsamples+=samples;
- if (newsamples>maxsamples) newsamples=maxsamples;
-  numsamples = getPCMnew(pcmdataR,1,0,waveSmoothing,0,0);
-    getPCMnew(pcmdataL,0,0,waveSmoothing,0,1);
-    getPCM(vdataL,512,0,1,0,0);
-    getPCM(vdataR,512,1,1,0,0);
+  newsamples += samples;
+  if (newsamples > maxsamples)
+    newsamples = maxsamples;
+
+  numsamples = getPCMnew (pcmdataR, 1, 0, waveSmoothing, 0, 0);
+  getPCMnew (pcmdataL, 0, 0, waveSmoothing, 0, 1);
+  getPCM (vdataL, 512, 0, 1, 0, 0);
+  getPCM (vdataR, 512, 1, 1, 0, 0);
 }
 
-void PCM::addPCM16Data(const short* pcm_data, short samples)  {
-   int i, j;
-
-   for (i = 0; i < samples; ++i) {
-      j=i+start;
-      PCMd[0][j % maxsamples]=(pcm_data[i * 2 + 0]/16384.0);
-      PCMd[1][j % maxsamples]=(pcm_data[i * 2 + 1]/16384.0);
-   }
-
-   start = (start + samples) % maxsamples;
-
-   newsamples+=samples;
-   if (newsamples>maxsamples) newsamples=maxsamples;
-     numsamples = getPCMnew(pcmdataR,1,0,waveSmoothing,0,0);
-    getPCMnew(pcmdataL,0,0,waveSmoothing,0,1);
-    getPCM(vdataL,512,0,1,0,0);
-    getPCM(vdataR,512,1,1,0,0);
-}
-
-
-void PCM::addPCM16(short PCMdata[2][512])
+void
+PCM::addPCM16Data (const short* pcm_data, short samples)
 {
-  int i,j;
+  int i, j;
+
+  for (i = 0;  i < samples;  ++i) {
+    j = i + start;
+    PCMd[0][j % maxsamples] = (pcm_data[i * 2 + 0] / 16384.0);
+    PCMd[1][j % maxsamples] = (pcm_data[i * 2 + 1] / 16384.0);
+  }
+
+  start = (start + samples) % maxsamples;
+
+  newsamples += samples;
+  if (newsamples > maxsamples)
+    newsamples = maxsamples;
+
+  numsamples = getPCMnew (pcmdataR, 1, 0, waveSmoothing, 0, 0);
+  getPCMnew (pcmdataL, 0, 0, waveSmoothing, 0, 1);
+  getPCM (vdataL, 512, 0, 1, 0, 0);
+  getPCM (vdataR, 512, 1, 1, 0, 0);
+}
+
+
+void
+PCM::addPCM16 (short PCMdata[2][512])
+{
+  int i, j;
   int samples=512;
 
-	 for(i=0;i<samples;i++)
-	   {
-	     j=i+start;
-         if ( PCMdata[0][i] != 0 && PCMdata[1][i] != 0 ) {
-	         PCMd[0][j%maxsamples]=(PCMdata[0][i]/16384.0);
-	         PCMd[1][j%maxsamples]=(PCMdata[1][i]/16384.0);
-          } else {
-             PCMd[0][j % maxsamples] = (float)0;
-             PCMd[1][j % maxsamples] = (float)0;
-          }
-	   }
+  for (i = 0;  i < samples; i++) {
+    j = i + start;
+    if (PCMdata[0][i] != 0  &&  PCMdata[1][i] != 0) {
+      PCMd[0][j % maxsamples] = (PCMdata[0][i] / 16384.0);
+      PCMd[1][j % maxsamples] = (PCMdata[1][i] / 16384.0);
+    } else {
+      PCMd[0][j % maxsamples] = (float) 0;
+      PCMd[1][j % maxsamples] = (float) 0;
+    }
+  }
 
-	 // printf("Added %d samples %d %d %f\n",samples,start,(start+samples)%maxsamples,PCM[0][start+10]);
+  // printf ("Added %d samples %d %d %f\n", samples, start,(start+samples)%maxsamples, PCM[0][start+10]);
 
- start+=samples;
- start=start%maxsamples;
+  start += samples;
+  start = start % maxsamples;
 
- newsamples+=samples;
- if (newsamples>maxsamples) newsamples=maxsamples;
+  newsamples += samples;
+  if (newsamples > maxsamples)
+    newsamples = maxsamples;
 
-    numsamples = getPCMnew(pcmdataR,1,0,waveSmoothing,0,0);
-    getPCMnew(pcmdataL,0,0,waveSmoothing,0,1);
-    getPCM(vdataL,512,0,1,0,0);
-    getPCM(vdataR,512,1,1,0,0);
+  numsamples = getPCMnew (pcmdataR, 1, 0, waveSmoothing, 0, 0);
+  getPCMnew (pcmdataL, 0, 0, waveSmoothing, 0, 1);
+  getPCM (vdataL, 512, 0, 1, 0, 0);
+  getPCM (vdataR, 512, 1, 1, 0, 0);
 }
 
 
-void PCM::addPCM8( unsigned char PCMdata[2][1024])
+void
+PCM::addPCM8 (unsigned char PCMdata[2][1024])
 {
-  int i,j;
-  int samples=1024;
+  int i, j;
+  int samples = 1024;
+
+  for (i = 0;  i < samples;  i++) {
+    j = i + start;
+    if (PCMdata[0][i] != 0  &&  PCMdata[1][i] != 0) {
+      PCMd[0][j % maxsamples] = ((float) (PCMdata[0][i] - 128.0) / 64);
+      PCMd[1][j % maxsamples] = ((float) (PCMdata[1][i] - 128.0) / 64);
+    } else {
+      PCMd[0][j % maxsamples] = 0;
+      PCMd[1][j % maxsamples] = 0;
+    }
+  }
 
 
-	 for(i=0;i<samples;i++)
-	   {
-	     j=i+start;
-         if ( PCMdata[0][i] != 0 && PCMdata[1][i] != 0 ) {
-	         PCMd[0][j%maxsamples]=( (float)( PCMdata[0][i] - 128.0 ) / 64 );
-	         PCMd[1][j%maxsamples]=( (float)( PCMdata[1][i] - 128.0 ) / 64 );
-          } else {
-             PCMd[0][j % maxsamples] = 0;
-             PCMd[1][j % maxsamples] = 0;
-          }
-	   }
+  // printf ("Added %d samples %d %d %f\n", samples, start,(start+samples)%maxsamples, PCM[0][start+10]);
 
+  start += samples;
+  start = start % maxsamples;
 
-	 // printf("Added %d samples %d %d %f\n",samples,start,(start+samples)%maxsamples,PCM[0][start+10]);
+  newsamples += samples;
+  if (newsamples > maxsamples)
+    newsamples = maxsamples;
 
- start+=samples;
- start=start%maxsamples;
-
- newsamples+=samples;
- if (newsamples>maxsamples) newsamples=maxsamples;
-    numsamples = getPCMnew(pcmdataR,1,0,waveSmoothing,0,0);
-    getPCMnew(pcmdataL,0,0,waveSmoothing,0,1);
-    getPCM(vdataL,512,0,1,0,0);
-    getPCM(vdataR,512,1,1,0,0);
+  numsamples = getPCMnew (pcmdataR, 1, 0, waveSmoothing, 0, 0);
+  getPCMnew (pcmdataL, 0, 0, waveSmoothing, 0, 1);
+  getPCM (vdataL, 512, 0, 1, 0, 0);
+  getPCM (vdataR, 512, 1, 1, 0, 0);
 }
 
-void PCM::addPCM8_512( const unsigned char PCMdata[2][512])
+void
+PCM::addPCM8_512 (const unsigned char PCMdata[2][512])
 {
-  int i,j;
-  int samples=512;
+  int i, j;
+  int samples = 512;
+
+  for (i = 0;  i < samples;  i++) {
+    j = i + start;
+    if (PCMdata[0][i] != 0  &&  PCMdata[1][i] != 0) {
+      PCMd[0][j % maxsamples] = ((float) (PCMdata[0][i] - 128.0) / 64);
+      PCMd[1][j % maxsamples] = ((float) (PCMdata[1][i] - 128.0) / 64);
+    } else {
+      PCMd[0][j % maxsamples] = 0;
+      PCMd[1][j % maxsamples] = 0;
+    }
+  }
 
 
-	 for(i=0;i<samples;i++)
-	   {
-	     j=i+start;
-         if ( PCMdata[0][i] != 0 && PCMdata[1][i] != 0 ) {
-	         PCMd[0][j%maxsamples]=( (float)( PCMdata[0][i] - 128.0 ) / 64 );
-	         PCMd[1][j%maxsamples]=( (float)( PCMdata[1][i] - 128.0 ) / 64 );
-          } else {
-             PCMd[0][j % maxsamples] = 0;
-             PCMd[1][j % maxsamples] = 0;
-          }
-	   }
+  // printf ("Added %d samples %d %d %f\n", samples, start,(start+samples)%maxsamples, PCM[0][start+10]);
 
+  start += samples;
+  start = start % maxsamples;
 
-	 // printf("Added %d samples %d %d %f\n",samples,start,(start+samples)%maxsamples,PCM[0][start+10]);
+  newsamples += samples;
+  if (newsamples > maxsamples)
+    newsamples = maxsamples;
 
- start+=samples;
- start=start%maxsamples;
-
- newsamples+=samples;
- if (newsamples>maxsamples) newsamples=maxsamples;
-    numsamples = getPCMnew(pcmdataR,1,0,waveSmoothing,0,0);
-    getPCMnew(pcmdataL,0,0,waveSmoothing,0,1);
-    getPCM(vdataL,512,0,1,0,0);
-    getPCM(vdataR,512,1,1,0,0);
+  numsamples = getPCMnew (pcmdataR, 1, 0, waveSmoothing, 0, 0);
+  getPCMnew (pcmdataL, 0, 0, waveSmoothing, 0, 1);
+  getPCM (vdataL, 512, 0, 1, 0, 0);
+  getPCM (vdataR, 512, 1, 1, 0, 0);
 }
 
 
@@ -264,46 +272,54 @@
 
 //returned values are normalized from -1 to 1
 
-void PCM::getPCM(float *PCMdata, int samples, int channel, int freq, float smoothing, int derive)
+void
+PCM::getPCM (
+float *PCMdata,
+int   samples,
+int   channel,
+int   freq,
+float smoothing,
+int   derive
+)
 {
-   int i,index;
+  int i, index;
 
-   index=start-1;
+  index = start - 1;
 
-   if (index<0) index=maxsamples+index;
+  if (index < 0)
+    index = maxsamples + index;
 
-   PCMdata[0]=PCMd[channel][index];
+  PCMdata[0] = PCMd[channel][index];
 
-   for(i=1;i<samples;i++)
-     {
-       index=start-1-i;
-       if (index<0) index=maxsamples+index;
+  for (i = 1;  i < samples;  i++) {
+    index = start - 1 - i;
+    if (index < 0)
+      index = maxsamples + index;
 
-       PCMdata[i]=(1-smoothing)*PCMd[channel][index]+smoothing*PCMdata[i-1];
-     }
+    PCMdata[i] = (1 - smoothing) * PCMd[channel][index]
+               + smoothing * PCMdata[i - 1];
+  }
 
-   //return derivative of PCM data
-   if(derive)
-     {
-       for(i=0;i<samples-1;i++)
-	 {
-	   PCMdata[i]=PCMdata[i]-PCMdata[i+1];
-	 }
-       PCMdata[samples-1]=0;
-     }
+  //return derivative of PCM data
+  if (derive) {
+    for (i = 0;  i < samples - 1;  i++) {
+      PCMdata[i] = PCMdata[i] - PCMdata[i + 1];
+    }
+    PCMdata[samples-1] = 0;
+  }
 
-   //return frequency data instead of PCM (perform FFT)
+  //return frequency data instead of PCM (perform FFT)
 
-   if (freq)
+  if (freq) {
+    double temppcm[1024];
 
-     {
-       double temppcm[1024];
-       for (int i=0;i<samples;i++)
-	 {temppcm[i]=(double)PCMdata[i];}
-       rdft(samples, 1, temppcm, ip, w);
-       for (int j=0;j<samples;j++)
-	 {PCMdata[j]=(float)temppcm[j];}
-     }
+    for (int i = 0;  i < samples;  i++)
+      {temppcm[i] = (double) PCMdata[i];}
+
+    rdft (samples, 1, temppcm, ip, w);
+    for (int j = 0;  j < samples;  j++)
+      {PCMdata[j] = (float) temppcm[j];}
+  }
 }
 
 //getPCMnew
@@ -311,49 +327,59 @@
 //Like getPCM except it returns all new samples in the buffer
 //the actual return value is the number of samples, up to maxsamples.
 //the passed pointer, PCMData, must bee able to hold up to maxsamples
-
-int PCM::getPCMnew(float *PCMdata, int channel, int freq, float smoothing, int derive, int reset)
+//
+int
+PCM::getPCMnew (
+float *PCMdata,
+int   channel,
+int   freq,
+float smoothing,
+int   derive,
+int   reset
+)
 {
-   int i,index;
+  int i, index;
 
-   index=start-1;
+  index = start - 1;
 
-   if (index<0) index=maxsamples+index;
+  if (index < 0)
+    index = maxsamples + index;
 
-   PCMdata[0]=PCMd[channel][index];
-   for(i=1;i<newsamples;i++)
-     {
-       index=start-1-i;
-       if (index<0) index=maxsamples+index;
+  PCMdata[0] = PCMd[channel][index];
+  for (i = 1;  i < newsamples;  i++) {
+    index = start - 1 - i;
+    if (index < 0)
+      index = maxsamples + index;
 
-       PCMdata[i]=(1-smoothing)*PCMd[channel][index]+smoothing*PCMdata[i-1];
-     }
+    PCMdata[i] = (1 - smoothing) * PCMd[channel][index]
+              + smoothing * PCMdata[i-1];
+  }
 
-   //return derivative of PCM data
-   if(derive)
-     {
-       for(i=0;i<newsamples-1;i++)
-	 {
-	   PCMdata[i]=PCMdata[i]-PCMdata[i+1];
-	 }
-       PCMdata[newsamples-1]=0;
-     }
+  //return derivative of PCM data
+  if (derive) {
+    for (i = 0;  i < newsamples - 1;  i++) {
+      PCMdata[i] = PCMdata[i] - PCMdata[i + 1];
+    }
+    PCMdata[newsamples-1] = 0;
+  }
 
-   //return frequency data instead of PCM (perform FFT)
-   //   if (freq) rdft(samples, 1, PCMdata, ip, w);
-   i=newsamples;
-   if (reset)  newsamples=0;
+  //return frequency data instead of PCM (perform FFT)
+  //   if (freq) rdft (samples, 1, PCMdata, ip, w);
+  i = newsamples;
+  if (reset)  newsamples = 0;
 
-   return i;
+  return i;
 }
 
 //Free stuff
-void PCM::freePCM() {
-  free(PCMd[0]);
-  free(PCMd[1]);
-  free(PCMd);
-  free(ip);
-  free(w);
+void
+PCM::freePCM ()
+{
+  free (PCMd[0]);
+  free (PCMd[1]);
+  free (PCMd);
+  free (ip);
+  free (w);
 
   PCMd = NULL;
   ip = NULL;
diff --git a/src/libprojectM/PCM.hpp b/src/libprojectM/PCM.hpp
index 5888e84..92330a6 100644
--- a/src/libprojectM/PCM.hpp
+++ b/src/libprojectM/PCM.hpp
@@ -29,46 +29,47 @@
 #ifndef _PCM_H
 #define _PCM_H
 
+
 #include "dlldefs.h"
 
+
 class 
 #ifdef WIN32 
 DLLEXPORT 
 #endif 
 PCM {
 public:
-    float **PCMd;
-    int start;
+  float   **PCMd;
+  int     start;
 
-    /** Use wave smoothing */
-    float waveSmoothing;
+  /** Use wave smoothing */
+  float   waveSmoothing;
 
-    int *ip;
-    double *w;
-    int newsamples;
+  int     *ip;
+  double  *w;
+  int     newsamples;
 
-    int numsamples; //size of new PCM info
-    float *pcmdataL;     //holder for most recent pcm data
-    float *pcmdataR;     //holder for most recent pcm data
+  int     numsamples; //size of new PCM info
+  float   *pcmdataL;     //holder for most recent pcm data
+  float   *pcmdataR;     //holder for most recent pcm data
 
-    /** PCM data */
-    float vdataL[512];  //holders for FFT data (spectrum)
-    float vdataR[512];
+  /** PCM data */
+  float   vdataL[512];  //holders for FFT data (spectrum)
+  float   vdataR[512];
 
-    static int maxsamples;
-    PCM();
-    ~PCM();
-    void initPCM(int maxsamples);
-    void addPCMfloat(const float *PCMdata, int samples);
-    void addPCM16(short [2][512]);
-    void addPCM16Data(const short* pcm_data, short samples);
-    void addPCM8( unsigned char [2][1024]);
-	void addPCM8_512( const unsigned char [2][512]);
-    void getPCM(float *data, int samples, int channel, int freq, float smoothing, int derive);
-    void freePCM();
-    int getPCMnew(float *PCMdata, int channel, int freq, float smoothing, int derive,int reset);
+  static int  maxsamples;
 
-
-  };
+        PCM();
+        ~PCM();
+  void  initPCM (int maxsamples);
+  void  addPCMfloat (const float *PCMdata, int samples);
+  void  addPCM16 (short [2][512]);
+  void  addPCM16Data (const short* pcm_data, short samples);
+  void  addPCM8 (unsigned char [2][1024]);
+  void  addPCM8_512 (const unsigned char [2][512]);
+  void  getPCM (float *data, int samples, int channel, int freq, float smoothing, int derive);
+  void  freePCM ();
+  int   getPCMnew (float *PCMdata, int channel, int freq, float smoothing, int derive,int reset);
+};
 
 #endif /** !_PCM_H */
diff --git a/src/libprojectM/PipelineMerger.cpp b/src/libprojectM/PipelineMerger.cpp
index 56640c9..ffb7be2 100644
--- a/src/libprojectM/PipelineMerger.cpp
+++ b/src/libprojectM/PipelineMerger.cpp
@@ -2,122 +2,134 @@
 #include "RenderItemMatcher.hpp"
 #include "RenderItemMergeFunction.hpp"
 
+
+/*  FIXME: Use math.h constants.  */
 const double PipelineMerger::e(2.71828182845904523536);
 const double PipelineMerger::s(0.5);
 
-void PipelineMerger::mergePipelines(const Pipeline & a, const Pipeline & b, Pipeline & out, RenderItemMatcher::MatchResults & results, RenderItemMergeFunction & mergeFunction, float ratio)
 
+void
+PipelineMerger::mergePipelines (
+const Pipeline                  &a,
+const Pipeline                  &b,
+Pipeline                        &out,
+RenderItemMatcher::MatchResults &results,
+RenderItemMergeFunction         &mergeFunction,
+float                           ratio
+)
 {
+  const double x = (ratio - 0.5) * 20;
+  const double sigmoid = 1.0 / (1.0 + e - s * x);
+  const double invratio = 1.0 - ratio;
 
-	const double x = ( ratio - 0.5 ) * 20;
-	const double sigmoid = 1.0 / ( 1.0 + e - s * x );
-	const double invratio = 1.0 - ratio;
+  out.textureWrap = (ratio < 0.5) ? a.textureWrap : b.textureWrap;
 
-	out.textureWrap = ( ratio < 0.5 ) ? a.textureWrap : b.textureWrap;
+  out.screenDecay = lerp (b.screenDecay, a.screenDecay, ratio);
 
-	out.screenDecay = lerp ( b.screenDecay, a.screenDecay, ratio );
+  out.drawables.clear();
+  out.compositeDrawables.clear();
 
-	out.drawables.clear();
-	out.compositeDrawables.clear();
+  for (std::vector<RenderItem*>::const_iterator pos = a.drawables.begin();
+       pos != a.drawables.end();
+       ++pos)
+  {
+    (*pos)->masterAlpha = invratio;
+    out.drawables.push_back (*pos);
+  }
 
-	for ( std::vector<RenderItem*>::const_iterator pos = a.drawables.begin();
-	        pos != a.drawables.end(); ++pos )
-	{
-		( *pos )->masterAlpha = invratio;
-		out.drawables.push_back ( *pos );
-	}
+  for (std::vector<RenderItem*>::const_iterator pos = b.drawables.begin();
+       pos != b.drawables.end();
+       ++pos)
+  {
+    (*pos)->masterAlpha = ratio;
+    out.drawables.push_back (*pos);
+  }
 
-	for ( std::vector<RenderItem*>::const_iterator pos = b.drawables.begin();
-	        pos != b.drawables.end();++pos )
-	{
-		( *pos )->masterAlpha = ratio;
-		out.drawables.push_back ( *pos );
-	}
+  if (ratio < 0.5) {
+    const double local_ratio = (invratio - 0.5) * 2;
 
-    if(ratio < 0.5)
+    for (std::vector<RenderItem*>::const_iterator pos = a.compositeDrawables.begin();
+         pos != a.compositeDrawables.end();
+         ++pos)
     {
-        const double local_ratio = (invratio - 0.5) * 2;
-
-        for (std::vector<RenderItem*>::const_iterator pos = a.compositeDrawables.begin();
-        pos != a.compositeDrawables.end(); ++pos)
-        {
-            (*pos)->masterAlpha = local_ratio;
-            out.compositeDrawables.push_back(*pos);
-        }
+      (*pos)->masterAlpha = local_ratio;
+      out.compositeDrawables.push_back (*pos);
     }
-    else
+  } else {
+    const double local_ratio = (ratio - 0.5) * 2;
+
+    for (std::vector<RenderItem*>::const_iterator pos = b.compositeDrawables.begin();
+         pos != b.compositeDrawables.end();
+         ++pos)
     {
-        const double local_ratio = (ratio - 0.5) * 2;
-
-        for (std::vector<RenderItem*>::const_iterator pos = b.compositeDrawables.begin();
-        pos != b.compositeDrawables.end();++pos)
-        {
-            (*pos)->masterAlpha = local_ratio;
-            out.compositeDrawables.push_back(*pos);
-        }
+      (*pos)->masterAlpha = local_ratio;
+      out.compositeDrawables.push_back (*pos);
     }
+  }
 
-	/*
-	for (RenderItemMatchList::iterator pos = results.matches.begin(); pos != results.matches.end(); ++pos) {
+  /*
+  for (RenderItemMatchList::iterator pos = results.matches.begin();
+       pos != results.matches.end();
+       ++pos)
+  {
+    RenderItem * itemA = pos->first;
+    RenderItem * itemB = pos->second;
 
-		RenderItem * itemA = pos->first;
-		RenderItem * itemB = pos->second;
+    RenderItem * itemC = mergeFunction(itemA, itemB, ratio);
 
-		RenderItem * itemC = mergeFunction(itemA, itemB, ratio);
-
-		if (itemC == 0) {
-			itemA->masterAlpha = ratio;
-	        	out.drawables.push_back(itemA);
-			itemB->masterAlpha = invratio;
-	        	out.drawables.push_back(itemB);
-		} else
-			out.drawables.push_back(itemC);
-
-	}
+    if (itemC == 0) {
+      itemA->masterAlpha = ratio;
+      out.drawables.push_back (itemA);
+      itemB->masterAlpha = invratio;
+      out.drawables.push_back (itemB);
+    } else
+      out.drawables.push_back (itemC);
+  }
 
 
-	for (std::vector<RenderItem*>::const_iterator pos = results.unmatchedLeft.begin();
-		pos != results.unmatchedLeft.end(); ++pos)
-	    {
-	       (*pos)->masterAlpha = invratio;
-	       out.drawables.push_back(*pos);
-	    }
+  for (std::vector<RenderItem*>::const_iterator pos = results.unmatchedLeft.begin();
+       pos != results.unmatchedLeft.end();
+       ++pos)
+  {
+    (*pos)->masterAlpha = invratio;
+    out.drawables.push_back (*pos);
+  }
 
-	for (std::vector<RenderItem*>::const_iterator pos = results.unmatchedRight.begin();
-		pos != results.unmatchedRight.end(); ++pos)
-		{
-		  (*pos)->masterAlpha = ratio;
-		   out.drawables.push_back(*pos);
-		}
-	*/
+  for (std::vector<RenderItem*>::const_iterator pos = results.unmatchedRight.begin();
+       pos != results.unmatchedRight.end();
+       ++pos)
+  {
+    (*pos)->masterAlpha = ratio;
+    out.drawables.push_back (*pos);
+  }
+  */
 
-	if (a.staticPerPixel && b.staticPerPixel)
-	{
-		out.staticPerPixel = true;
-		 for (int x=0;x<a.gx;x++)
-		    {
-		      for(int y=0;y<a.gy;y++)
-			{
-			  out.x_mesh[x][y]  = a.x_mesh[x][y]* invratio + b.x_mesh[x][y]*ratio;
-			}
-		    }
-		 for (int x=0;x<a.gx;x++)
-		    {
-		      for(int y=0;y<a.gy;y++)
-			{
-			  out.y_mesh[x][y]  = a.y_mesh[x][y]* invratio + b.y_mesh[x][y]*ratio;
-			}
-		    }
-	}
-
-    if(ratio < 0.5)
+  if (a.staticPerPixel  &&  b.staticPerPixel) {
+    out.staticPerPixel = true;
+    for (int x = 0;  x < a.gx;  x++)
     {
-	out.compositeShader = a.compositeShader;
-	out.warpShader = a.warpShader;
+      for (int y = 0;  y < a.gy;  y++)
+      {
+        out.x_mesh[x][y]  = a.x_mesh[x][y] * invratio + b.x_mesh[x][y] * ratio;
+      }
     }
-    else
+    for (int x = 0;  x < a.gx;  x++)
     {
-      out.compositeShader = b.compositeShader;
-      out.warpShader = b.warpShader;
+      for (int y = 0;  y < a.gy;  y++)
+      {
+        out.y_mesh[x][y]  = a.y_mesh[x][y] * invratio + b.y_mesh[x][y] * ratio;
+      }
     }
+  }
+
+  if (ratio < 0.5)
+  {
+    out.compositeShader = a.compositeShader;
+    out.warpShader = a.warpShader;
+  }
+  else
+  {
+    out.compositeShader = b.compositeShader;
+    out.warpShader = b.warpShader;
+  }
 }
diff --git a/src/libprojectM/PipelineMerger.hpp b/src/libprojectM/PipelineMerger.hpp
index a0bba91..5d37bae 100644
--- a/src/libprojectM/PipelineMerger.hpp
+++ b/src/libprojectM/PipelineMerger.hpp
@@ -1,28 +1,31 @@
 #ifndef PRESET_MERGE_HPP
 #define PRESET_MERGE_HPP
+
 #include "Preset.hpp"
 #include "Pipeline.hpp"
 #include "RenderItemMatcher.hpp"
 #include "RenderItemMergeFunction.hpp"
 
+
 class PipelineMerger
 {
- template <class T> inline static T lerp(T a, T b, float ratio)
-{
-  return a * ratio + b * (1 - ratio);
-}
+  template <class T> inline static T lerp(T a, T b, float ratio)
+  {
+    return a * ratio + b * (1 - ratio);
+  }
 
 public:
-    
-  static void mergePipelines(const Pipeline &a,  const Pipeline &b, Pipeline &out, 
-	RenderItemMatcher::MatchResults & matching, RenderItemMergeFunction & merger, float ratio);
 
-private :
+  static void mergePipelines(const Pipeline &a,  const Pipeline &b, Pipeline &out,
+                             RenderItemMatcher::MatchResults & matching,
+                             RenderItemMergeFunction & merger, float ratio);
 
-static const double s;
-static const double e;
+private:
+
+  static const double s;
+  static const double e;
 
 };
 
 
-#endif
+#endif  /*  PRESET_MERGE_HPP  */
diff --git a/src/libprojectM/Preset.cpp b/src/libprojectM/Preset.cpp
index 84e823a..91175d8 100644
--- a/src/libprojectM/Preset.cpp
+++ b/src/libprojectM/Preset.cpp
@@ -7,6 +7,7 @@
 
 #include "Preset.hpp"
 
+
 Preset::~Preset() {}
 
 Preset::Preset(const std::string & presetName, const std::string & presetAuthor):
@@ -19,5 +20,3 @@
 void Preset::setAuthor(const std::string & value) { _author = value; }
 
 const std::string & Preset::author() const { return _author; }
-
-
diff --git a/src/libprojectM/Preset.hpp b/src/libprojectM/Preset.hpp
index 4171e97..53ede8e 100644
--- a/src/libprojectM/Preset.hpp
+++ b/src/libprojectM/Preset.hpp
@@ -8,31 +8,32 @@
 #ifndef PRESET_HPP_
 #define PRESET_HPP_
 
+
 #include <string>
 
 #include "Renderer/BeatDetect.hpp"
 #include "Renderer/Pipeline.hpp"
 #include "Renderer/PipelineContext.hpp"
 
+
 class Preset {
 public:
+                      Preset(const std::string & name = std::string(),
+                             const std::string & author = std::string());
+  virtual             ~Preset();
 
-	
-	Preset(const std::string & name=std::string(), const std::string & author = std::string());
-	virtual ~Preset();
+  void                setName(const std::string & value);
+  const std::string & name() const;
 
-	void setName(const std::string & value);
-	const std::string & name() const;
+  void                setAuthor(const std::string & value);
+  const std::string & author() const;
 
-	void setAuthor(const std::string & value);
-	const std::string & author() const;
-
-	virtual Pipeline & pipeline() = 0;
-	virtual void Render(const BeatDetect &music, const PipelineContext &context) = 0;
+  virtual Pipeline &  pipeline() = 0;
+  virtual void        Render(const BeatDetect &music, const PipelineContext &context) = 0;
 
 private:
-	std::string _name;
-	std::string _author;
+  std::string _name;
+  std::string _author;
 };
 
 #endif /* PRESET_HPP_ */
diff --git a/src/libprojectM/PresetChooser.cpp b/src/libprojectM/PresetChooser.cpp
index b239759..253b2d9 100644
--- a/src/libprojectM/PresetChooser.cpp
+++ b/src/libprojectM/PresetChooser.cpp
@@ -11,4 +11,3 @@
 //
 
 #include "PresetChooser.hpp"
-
diff --git a/src/libprojectM/PresetChooser.hpp b/src/libprojectM/PresetChooser.hpp
index ab88b2a..8b645fb 100644
--- a/src/libprojectM/PresetChooser.hpp
+++ b/src/libprojectM/PresetChooser.hpp
@@ -8,46 +8,48 @@
 #include <cassert>
 #include <memory>
 #include <iostream>
+
+
 class PresetChooser;
 
 ///  A simple iterator class to traverse back and forth a preset directory
 class PresetIterator {
 
 public:
-    PresetIterator()  {}
+  PresetIterator()  {}
 
-    /// Instantiate a preset iterator at the given starting position
-    PresetIterator(std::size_t start);
+  /// Instantiate a preset iterator at the given starting position
+  PresetIterator(std::size_t start);
 
-    /// Move iterator forward
-    void operator++();
+  /// Move iterator forward
+  void        operator++();
 
-    /// Move iterator backword
-    void operator--() ;
+  /// Move iterator backword
+  void        operator--() ;
 
-    /// Not equal comparator
-    bool operator !=(const PresetIterator & presetPos) const ;
+  /// Not equal comparator
+  bool        operator !=(const PresetIterator & presetPos) const ;
 
-    /// Equality comparator
-    bool operator ==(const PresetIterator & presetPos) const ;
+  /// Equality comparator
+  bool        operator ==(const PresetIterator & presetPos) const ;
 
-    /// Returns an integer value representing the iterator position
-    /// @bug might become internal
-    /// \brief Returns the indexing value used by the current iterator.
-    std::size_t operator*() const;
+  /// Returns an integer value representing the iterator position
+  /// @bug might become internal
+  /// \brief Returns the indexing value used by the current iterator.
+  std::size_t operator*() const;
 
-    ///  Allocate a new preset given this iterator's associated preset name
-    /// \param presetInputs the preset inputs to associate with the preset upon construction
-    /// \param presetOutputs the preset outputs to associate with the preset upon construction
-    /// \returns an autopointer of the newly allocated preset
-    std::auto_ptr<Preset> allocate();
+  ///  Allocate a new preset given this iterator's associated preset name
+  /// \param presetInputs the preset inputs to associate with the preset upon construction
+  /// \param presetOutputs the preset outputs to associate with the preset upon construction
+  /// \returns an autopointer of the newly allocated preset
+  std::auto_ptr<Preset> allocate();
 
-    ///  Set the chooser asocciated with this iterator
-    void setChooser(const PresetChooser & chooser);
+  ///  Set the chooser asocciated with this iterator
+  void setChooser(const PresetChooser & chooser);
 
 private:
-    std::size_t _currentIndex;
-    const PresetChooser * _presetChooser;
+  std::size_t _currentIndex;
+  const PresetChooser * _presetChooser;
 
 };
 
@@ -55,187 +57,217 @@
 class PresetChooser {
 
 public:
-    typedef PresetIterator iterator;
+  typedef PresetIterator iterator;
 
-    /// Initializes a chooser with an established preset loader.
-    /// \param presetLoader an initialized preset loader to choose presets from
-    /// \note The preset loader is refreshed via events or otherwise outside this class's scope
-    PresetChooser(const PresetLoader & presetLoader, bool 	softCutRatingsEnabled);
+  /// Initializes a chooser with an established preset loader.
+  /// \param presetLoader an initialized preset loader to choose presets from
+  /// \note The preset loader is refreshed via events or otherwise outside this class's scope
+  PresetChooser(const PresetLoader & presetLoader, bool   softCutRatingsEnabled);
 
-    inline void setSoftCutRatingsEnabled(bool enabled) {
-	_softCutRatingsEnabled = enabled;
-    }
+  inline void setSoftCutRatingsEnabled(bool enabled) {
+    _softCutRatingsEnabled = enabled;
+  }
 
-    /// Choose a preset via the passed in index. Must be between 0 and num valid presets in directory
-    /// \param index An index lying in the interval [0, this->getNumPresets())
-    /// \param presetInputs the preset inputs to associate with the preset upon construction
-    /// \param presetOutputs the preset outputs to associate with the preset upon construction
-    /// \returns an auto pointer of the newly allocated preset
-    std::auto_ptr<Preset> directoryIndex(std::size_t index) const;
+  /// Choose a preset via the passed in index. Must be between 0 and num valid presets in directory
+  /// \param index An index lying in the interval [0, this->getNumPresets())
+  /// \param presetInputs the preset inputs to associate with the preset upon construction
+  /// \param presetOutputs the preset outputs to associate with the preset upon construction
+  /// \returns an auto pointer of the newly allocated preset
+  std::auto_ptr<Preset> directoryIndex(std::size_t index) const;
 
-    /// Gets the number of presets last believed to exist in the preset loader's filename collection
-    /// \returns the number of presets in the collection
-    std::size_t size() const;
+  /// Gets the number of presets last believed to exist in the preset loader's filename collection
+  /// \returns the number of presets in the collection
+  std::size_t size() const;
 
-    /// An STL-esque iterator to begin traversing presets from a directory
-    /// \param index the index to begin iterating at. Assumed valid between [0, num presets)
-    /// \returns the position of the first preset in the collection
-    PresetIterator begin(unsigned int index) const;
+  /// An STL-esque iterator to begin traversing presets from a directory
+  /// \param index the index to begin iterating at. Assumed valid between [0, num presets)
+  /// \returns the position of the first preset in the collection
+  PresetIterator begin(unsigned int index) const;
 
-    /// An STL-esque iterator to begin traversing presets from a directory
-    /// \returns the position of the first preset in the collection
-    PresetIterator begin();
+  /// An STL-esque iterator to begin traversing presets from a directory
+  /// \returns the position of the first preset in the collection
+  PresetIterator begin();
 
-    /// An STL-esque iterator to retrieve an end position from a directory
-    /// \returns the end position of the collection
-    PresetIterator end() const;
+  /// An STL-esque iterator to retrieve an end position from a directory
+  /// \returns the end position of the collection
+  PresetIterator end() const;
 
-    /// Perform a weighted sample to select a preset (uses preset rating values)
-    /// \returns an iterator to the randomly selected preset
-    iterator weightedRandom(bool hardCut) const;
+  /// Perform a weighted sample to select a preset (uses preset rating values)
+  /// \returns an iterator to the randomly selected preset
+  iterator weightedRandom(bool hardCut) const;
 
-    /// True if no presets in directory
-    bool empty() const;
+  /// True if no presets in directory
+  bool empty() const;
 
 
-    inline void nextPreset(PresetIterator & presetPos);
-    inline void previousPreset(PresetIterator & presetPos);
+  inline void nextPreset(PresetIterator & presetPos);
+  inline void previousPreset(PresetIterator & presetPos);
 
 private:
-    std::vector<float> sampleWeights;
-    const PresetLoader * _presetLoader;
-    bool _softCutRatingsEnabled;
+  std::vector<float> sampleWeights;
+  const PresetLoader * _presetLoader;
+  bool _softCutRatingsEnabled;
 };
 
 
-inline PresetChooser::PresetChooser(const PresetLoader & presetLoader, bool softCutRatingsEnabled):_presetLoader(&presetLoader), _softCutRatingsEnabled(softCutRatingsEnabled) {
+inline
+PresetChooser::PresetChooser (
+const PresetLoader  &presetLoader,
+bool                softCutRatingsEnabled
+)
+  : _presetLoader(&presetLoader),
+    _softCutRatingsEnabled(softCutRatingsEnabled)
+{
 
 }
 
-inline std::size_t PresetChooser::size() const {
-    return _presetLoader->size();
+inline std::size_t
+PresetChooser::size() const
+{
+  return _presetLoader->size();
 }
 
-inline void PresetIterator::setChooser(const PresetChooser & chooser) {
-    _presetChooser = &chooser;
+inline void
+PresetIterator::setChooser(const PresetChooser & chooser)
+{
+  _presetChooser = &chooser;
 }
 
-inline std::size_t PresetIterator::operator*() const {
-    return _currentIndex;
+inline std::size_t
+PresetIterator::operator*() const
+{
+  return _currentIndex;
 }
 
 inline PresetIterator::PresetIterator(std::size_t start):_currentIndex(start) {}
 
-inline void PresetIterator::operator++() {
-    assert(_currentIndex < _presetChooser->size());
-    _currentIndex++;
+inline void
+PresetIterator::operator++()
+{
+  assert(_currentIndex < _presetChooser->size());
+  _currentIndex++;
 }
 
-inline void PresetIterator::operator--() {
-    assert(_currentIndex > 0);
-    _currentIndex--;
+inline void
+PresetIterator::operator--()
+{
+  assert(_currentIndex > 0);
+  _currentIndex--;
 }
 
-inline bool PresetIterator::operator !=(const PresetIterator & presetPos) const {
-    return (*presetPos != **this);
+inline bool
+PresetIterator::operator !=(const PresetIterator & presetPos) const
+{
+  return (*presetPos != **this);
 }
 
 
-inline bool PresetIterator::operator ==(const PresetIterator & presetPos) const {
-    return (*presetPos == **this);
+inline bool
+PresetIterator::operator ==(const PresetIterator & presetPos) const
+{
+  return (*presetPos == **this);
 }
 
-inline std::auto_ptr<Preset> PresetIterator::allocate() {
-    return _presetChooser->directoryIndex(_currentIndex);
+inline std::auto_ptr<Preset>
+PresetIterator::allocate()
+{
+  return _presetChooser->directoryIndex(_currentIndex);
 }
 
-inline void PresetChooser::nextPreset(PresetIterator & presetPos) {
+inline void
+PresetChooser::nextPreset(PresetIterator & presetPos)
+{
+  if (this->empty()) {
+    return;
+  }
+  // Case: idle preset currently running, selected first preset of chooser
+  else if (presetPos == this->end())
+    presetPos = this->begin();
+  else
+    ++(presetPos);
 
-		if (this->empty()) {
-			return;
-		}
-
-		// Case: idle preset currently running, selected first preset of chooser
-		else if (presetPos == this->end())
-			presetPos = this->begin();
-		else
-			++(presetPos);
-
-		// Case: already at last preset, loop to beginning
-		if (((presetPos) == this->end())) {
-			presetPos = this->begin();
-		}
-
+  // Case: already at last preset, loop to beginning
+  if (((presetPos) == this->end())) {
+    presetPos = this->begin();
+  }
 }
 
 
-inline void PresetChooser::previousPreset(PresetIterator & presetPos) {
-		if (this->empty())
-			return;
+inline void
+PresetChooser::previousPreset(PresetIterator & presetPos)
+{
+  if (this->empty())
+    return;
 
-		// Case: idle preset currently running, selected last preset of chooser
-		else if (presetPos == this->end()) {
-			--(presetPos);
-		}
-
-		else if (presetPos != this->begin()) {
-			--(presetPos);
-		}
-
-		else {
-		   presetPos = this->end();
-		   --(presetPos);
-		}
+  // Case: idle preset currently running, selected last preset of chooser
+  else if (presetPos == this->end()) {
+    --(presetPos);
+  }
+  else if (presetPos != this->begin()) {
+    --(presetPos);
+  }
+  else {
+    presetPos = this->end();
+    --(presetPos);
+  }
 }
 
-inline PresetIterator PresetChooser::begin() {
-    PresetIterator pos(0);
-    pos.setChooser(*this);
-    return pos;
+inline PresetIterator
+PresetChooser::begin()
+{
+  PresetIterator pos(0);
+  pos.setChooser(*this);
+  return pos;
 }
 
-inline PresetIterator PresetChooser::begin(unsigned int index) const{
-    PresetIterator pos(index);
-    pos.setChooser(*this);
-    return pos;
+inline PresetIterator
+PresetChooser::begin(unsigned int index) const
+{
+  PresetIterator pos(index);
+  pos.setChooser(*this);
+  return pos;
 }
 
-inline PresetIterator PresetChooser::end() const {
-    PresetIterator pos(_presetLoader->size());
-    pos.setChooser(*this);
-    return pos;
+inline PresetIterator
+PresetChooser::end() const
+{
+  PresetIterator pos(_presetLoader->size());
+  pos.setChooser(*this);
+  return pos;
 }
 
 
-inline bool PresetChooser::empty() const {
-	return _presetLoader->size() == 0;
+inline bool
+PresetChooser::empty() const
+{
+  return _presetLoader->size() == 0;
 }
 
-inline std::auto_ptr<Preset> PresetChooser::directoryIndex(std::size_t index) const {
-
-	return _presetLoader->loadPreset(index);
+inline std::auto_ptr<Preset>
+PresetChooser::directoryIndex(std::size_t index) const
+{
+  return _presetLoader->loadPreset(index);
 }
 
 
-inline PresetChooser::iterator PresetChooser::weightedRandom(bool hardCut) const {
+inline PresetChooser::iterator
+PresetChooser::weightedRandom(bool hardCut) const
+{
+  // TODO make a sophisticated function object interface to determine why a certain rating
+  // category is chosen, or weighted distribution thereover.
+  const PresetRatingType ratingType = hardCut || (!_softCutRatingsEnabled) ?
+                                                 HARD_CUT_RATING_TYPE :
+                                                 SOFT_CUT_RATING_TYPE;    
 
-	
-	
+  const std::size_t ratingsTypeIndex = static_cast<std::size_t>(ratingType);
 
-	// TODO make a sophisticated function object interface to determine why a certain rating
-	// category is chosen, or weighted distribution thereover.
-	const PresetRatingType ratingType = hardCut || (!_softCutRatingsEnabled) ? 
-		HARD_CUT_RATING_TYPE : SOFT_CUT_RATING_TYPE;		
+  const std::vector<int> & weights = _presetLoader->getPresetRatings()[ratingsTypeIndex];
 
-	const std::size_t ratingsTypeIndex = static_cast<std::size_t>(ratingType);
-	
-	const std::vector<int> & weights = _presetLoader->getPresetRatings()[ratingsTypeIndex];
+  const std::size_t index = RandomNumberGenerators::weightedRandom
+                             (weights,
+                              _presetLoader->getPresetRatingsSums()[ratingsTypeIndex]);
 
-	const std::size_t index = RandomNumberGenerators::weightedRandom
-		(weights,
-		 _presetLoader->getPresetRatingsSums()[ratingsTypeIndex]);
-	
-	return begin(index);
+  return begin(index);
 }
 
 #endif
diff --git a/src/libprojectM/PresetFactory.cpp b/src/libprojectM/PresetFactory.cpp
index bd7ac16..78e5031 100644
--- a/src/libprojectM/PresetFactory.cpp
+++ b/src/libprojectM/PresetFactory.cpp
@@ -1,24 +1,25 @@
 #include "PresetFactory.hpp"
 
+
 const std::string PresetFactory::IDLE_PRESET_PROTOCOL("idle");
 
-std::string PresetFactory::protocol(const std::string & url, std::string & path) {
 
+std::string
+PresetFactory::protocol (const std::string & url, std::string & path)
+{
 #ifdef __APPLE__
-	// NOTE: Brian changed this from url.find_first_of to url.find, since presumably we want to find the first occurence of
-	// :// and not the first occurence of any colon or forward slash.  At least that fixed a bug in the Mac OS X build.
-	std::size_t pos = url.find("://");
+  // NOTE: Brian changed this from url.find_first_of to url.find, since presumably we want to find the first occurence of
+  // :// and not the first occurence of any colon or forward slash.  At least that fixed a bug in the Mac OS X build.
+  std::size_t pos = url.find("://");
 #else
-	std::size_t pos = url.find_first_of("://");
+  std::size_t pos = url.find_first_of("://");
 #endif
-	if (pos == std::string::npos)
-		return std::string();
-	else {
-		path = url.substr(pos + 3, url.length());
-		std::cout << "[PresetFactory] path is " << path << std::endl;
-		std::cout << "[PresetFactory] url is " << url << std::endl;
-		return url.substr(0, pos);
-	}
-
+  if (pos == std::string::npos)
+    return std::string();
+  else {
+    path = url.substr (pos + 3, url.length());
+    std::cout << "[PresetFactory] path is " << path << std::endl;
+    std::cout << "[PresetFactory] url is " << url << std::endl;
+    return url.substr (0, pos);
+  }
 }
-
diff --git a/src/libprojectM/PresetFactory.hpp b/src/libprojectM/PresetFactory.hpp
index e9c8a4c..4e883e2 100644
--- a/src/libprojectM/PresetFactory.hpp
+++ b/src/libprojectM/PresetFactory.hpp
@@ -9,33 +9,34 @@
 // Copyright: See COPYING file that comes with this distribution
 //
 //
-
 #include "Preset.hpp"
 #include <memory>
 
 #ifndef __PRESET_FACTORY_HPP
 #define __PRESET_FACTORY_HPP
 
+
 class PresetFactory {
 
 public:
- static const std::string IDLE_PRESET_PROTOCOL;
- static std::string protocol(const std::string & url, std::string & path);
+  static const std::string IDLE_PRESET_PROTOCOL;
+  static std::string protocol(const std::string & url, std::string & path);
 
- inline PresetFactory() {}
+  inline PresetFactory() {}
 
- inline virtual ~PresetFactory() {}
+  inline virtual ~PresetFactory() {}
 
- /// Constructs a new preset given an url and optional meta data
- /// \param url a locational identifier referencing the preset
- /// \param name the preset name
- /// \param author the preset author
- /// \returns a valid preset object
- virtual std::auto_ptr<Preset> allocate(const std::string & url, const std::string & name=std::string(),
-	 const std::string & author=std::string()) = 0;
+  /// Constructs a new preset given an url and optional meta data
+  /// \param url a locational identifier referencing the preset
+  /// \param name the preset name
+  /// \param author the preset author
+  /// \returns a valid preset object
+  virtual std::auto_ptr<Preset> allocate (const std::string & url,
+                                          const std::string & name=std::string(),
+                                          const std::string & author=std::string()) = 0;
 
- /// Returns a space separated list of supported extensions
- virtual std::string supportedExtensions() const = 0;
+  /// Returns a space separated list of supported extensions
+  virtual std::string supportedExtensions() const = 0;
 
 };
 
diff --git a/src/libprojectM/PresetFactoryManager.cpp b/src/libprojectM/PresetFactoryManager.cpp
index 7dea038..b383107 100644
--- a/src/libprojectM/PresetFactoryManager.cpp
+++ b/src/libprojectM/PresetFactoryManager.cpp
@@ -1,7 +1,7 @@
 //
 // C++ Implementation: PresetFactoryManager
 //
-// Description: 
+// Description:
 //
 //
 // Author: Carmelo Piccione <carmelo.piccione@gmail.com>, (C) 2008
@@ -20,71 +20,92 @@
 #endif
 
 #include <sstream>
-PresetFactoryManager::PresetFactoryManager() : _gx(0), _gy(0), initialized(false) {}
 
-PresetFactoryManager::~PresetFactoryManager() {
-	for (std::vector<PresetFactory *>::iterator pos = _factoryList.begin(); 
-		pos != _factoryList.end(); ++pos) {
-		assert(*pos);
-		delete(*pos);
-	}
+
+PresetFactoryManager::PresetFactoryManager()
+  : _gx (0), _gy (0), initialized (false)
+{}
+
+PresetFactoryManager::~PresetFactoryManager()
+{
+  for (std::vector<PresetFactory *>::iterator pos = _factoryList.begin();
+       pos != _factoryList.end();
+       ++pos)
+  {
+    assert (*pos);
+    delete (*pos);
+  }
 
   initialized = false;
 }
 
-void PresetFactoryManager::initialize(int gx, int gy) {
-	_gx = gx;
-	_gy = gy;
-	
-	if (!initialized) {
-	  initialized = true;
-	} else {
-	  std::cout << "already initialized " << std::endl;
-	  return;
-	}
-	  
-	PresetFactory * factory;
-	
-	#ifndef DISABLE_MILKDROP_PRESETS
-	factory = new MilkdropPresetFactory(_gx, _gy);
-	registerFactory(factory->supportedExtensions(), factory);		
-	#endif
-	
-	#ifndef DISABLE_NATIVE_PRESETS
-	factory = new NativePresetFactory();
-	registerFactory(factory->supportedExtensions(), factory);
-	#endif
+void
+PresetFactoryManager::initialize (int gx, int gy)
+{
+  _gx = gx;
+  _gy = gy;
+
+  if (!initialized) {
+    initialized = true;
+  } else {
+    std::cout << "already initialized " << std::endl;
+    return;
+  }
+
+  PresetFactory * factory;
+
+  #ifndef DISABLE_MILKDROP_PRESETS
+  factory = new MilkdropPresetFactory (_gx, _gy);
+  registerFactory (factory->supportedExtensions(), factory);
+  #endif
+
+  #ifndef DISABLE_NATIVE_PRESETS
+  factory = new NativePresetFactory();
+  registerFactory (factory->supportedExtensions(), factory);
+  #endif
 }
 
 // Current behavior if a conflict is occurs is to override the previous request
 
-void PresetFactoryManager::registerFactory(const std::string & extensions, PresetFactory * factory) {
-	
-	std::stringstream ss(extensions);	
-	std::string extension;
+void
+PresetFactoryManager::registerFactory
+(
+const std::string &extensions,
+PresetFactory     *factory
+)
+{
+  std::stringstream ss (extensions);
+  std::string       extension;
 
-	_factoryList.push_back(factory);
+  _factoryList.push_back (factory);
 
-	while (ss >> extension) {
-		if (_factoryMap.count(extension)) {
-			std::cerr << "[PresetFactoryManager] Warning: extension \"" << extension << 
-				"\" already has a factory. New factory handler ignored." << std::endl;			
-		} else {
-			_factoryMap.insert(std::make_pair(extension, factory));			
-		}
-	}
+  while (ss >> extension) {
+    if (_factoryMap.count (extension)) {
+      std::cerr << "[PresetFactoryManager] Warning: extension \""
+                << extension
+                << "\" already has a factory. New factory handler ignored."
+                << std::endl;
+    } else {
+      _factoryMap.insert (std::make_pair (extension, factory));
+    }
+  }
 }
 
-PresetFactory & PresetFactoryManager::factory(const std::string & extension) {
+PresetFactory &
+PresetFactoryManager::factory (const std::string & extension)
+{
 
-	if (!_factoryMap.count(extension)) {		
-		std::ostringstream os;
-		os << "No factory associated with \"" << extension << "\"." << std::endl;
-		throw PresetFactoryException(os.str());
-	}
-	return *_factoryMap[extension];
+  if (!_factoryMap.count (extension)) {
+    std::ostringstream os;
+
+    os << "No factory associated with \"" << extension << "\"." << std::endl;
+    throw PresetFactoryException (os.str());
+  }
+  return *_factoryMap[extension];
 }
 
-bool PresetFactoryManager::extensionHandled(const std::string & extension) const {		
-	return _factoryMap.count(extension);
+bool
+PresetFactoryManager::extensionHandled (const std::string & extension) const
+{
+  return _factoryMap.count (extension);
 }
diff --git a/src/libprojectM/PresetFactoryManager.hpp b/src/libprojectM/PresetFactoryManager.hpp
index 2dfa0a0..899b229 100644
--- a/src/libprojectM/PresetFactoryManager.hpp
+++ b/src/libprojectM/PresetFactoryManager.hpp
@@ -11,49 +11,53 @@
 //
 #ifndef __PRESET_FACTORY_MANAGER_HPP
 #define __PRESET_FACTORY_MANAGER_HPP
+
 #include "PresetFactory.hpp"
 
+
 /// A simple exception class to strongly type all preset factory related issues
 class PresetFactoryException : public std::exception
 {
-	public:
-		inline PresetFactoryException(const std::string & message) : _message(message) {}
-		virtual ~PresetFactoryException() throw() {}
-		const std::string & message() const { return _message; } 
+public:
+  inline            PresetFactoryException (const std::string & message) : _message(message) {}
+  virtual           ~PresetFactoryException() throw() {}
+  const std::string &message() const { return _message; } 
 
-	private:
-		std::string _message;
+private:
+  std::string _message;
 };
 
 /// A manager of preset factories
 class PresetFactoryManager {
 
-	public:
-		PresetFactoryManager();
-		~PresetFactoryManager();
+public:
+  PresetFactoryManager();
+  ~PresetFactoryManager();
 
-		/// Initializes the manager with mesh sizes specified
-		/// \param gx the width of the mesh
-		/// \param gy the height of the mesh
-		/// \note This must be called once before any other methods
-		void initialize(int gx, int gy);
-		
-		/// Requests a factory given a preset extension type
-		/// \param extension a string denoting the preset suffix type
-		/// \throws PresetFactoryException if the extension is unhandled
-		/// \returns a valid preset factory associated with the extension
-		PresetFactory & factory(const std::string & extension);
+  /// Initializes the manager with mesh sizes specified
+  /// \param gx the width of the mesh
+  /// \param gy the height of the mesh
+  /// \note This must be called once before any other methods
+  void initialize (int gx, int gy);
 
-		/// Tests if an extension has been registered with a factory
-		/// \param extension the file name extension to verify
-		/// \returns true if a factory exists, false otherwise
-		bool extensionHandled(const std::string & extension) const;
+  /// Requests a factory given a preset extension type
+  /// \param extension a string denoting the preset suffix type
+  /// \throws PresetFactoryException if the extension is unhandled
+  /// \returns a valid preset factory associated with the extension
+  PresetFactory & factory (const std::string & extension);
 
-	private:
-		int _gx, _gy;				
-		mutable std::map<std::string, PresetFactory *> _factoryMap;
-		mutable std::vector<PresetFactory *> _factoryList;
-		void registerFactory(const std::string & extension, PresetFactory * factory);
-		volatile bool initialized;
+  /// Tests if an extension has been registered with a factory
+  /// \param extension the file name extension to verify
+  /// \returns true if a factory exists, false otherwise
+  bool extensionHandled (const std::string & extension) const;
+
+private:
+  mutable std::map<std::string, PresetFactory *>  _factoryMap;
+  mutable std::vector<PresetFactory *>            _factoryList;
+  int             _gx, _gy;       
+  volatile bool   initialized;
+
+  void registerFactory (const std::string & extension, PresetFactory * factory);
 };
+
 #endif
diff --git a/src/libprojectM/PresetLoader.cpp b/src/libprojectM/PresetLoader.cpp
index e0afec5..1542db3 100644
--- a/src/libprojectM/PresetLoader.cpp
+++ b/src/libprojectM/PresetLoader.cpp
@@ -35,249 +35,281 @@
 
 #include "Common.hpp"
 
-PresetLoader::PresetLoader (int gx, int gy, std::string dirname = std::string()) :_dirname ( dirname ), _dir ( 0 )
+
+PresetLoader::PresetLoader (int gx, int gy, std::string dirname = std::string())
+ : _dirname (dirname),
+   _dir (0)
 {
-	_presetFactoryManager.initialize(gx,gy);
-	// Do one scan
-	if ( _dirname != std::string() )
-		rescan();
-	else
-		clear();
+  _presetFactoryManager.initialize (gx, gy);
+  // Do one scan
+  if (_dirname != std::string())
+    rescan();
+  else
+    clear();
 }
 
 PresetLoader::~PresetLoader()
 {
-	if ( _dir )
-		closedir ( _dir );
+  if (_dir)
+    closedir (_dir);
 }
 
-void PresetLoader::setScanDirectory ( std::string dirname )
+void
+PresetLoader::setScanDirectory (std::string dirname)
 {
-	_dirname = dirname;
+  _dirname = dirname;
 }
 
 
-void PresetLoader::rescan()
+void
+PresetLoader::rescan()
 {
-	// std::cerr << "Rescanning..." << std::endl;
+  // std::cerr << "Rescanning..." << std::endl;
 
-	// Clear the directory entry collection
-	clear();
-	
-	// If directory already opened, close it first
-	if ( _dir )
-	{
-		closedir ( _dir );
-		_dir = 0;
-	}
+  // Clear the directory entry collection
+  clear();
 
-	// Allocate a new a stream given the current directory name
-	if ( ( _dir = opendir ( _dirname.c_str() ) ) == NULL )
-	{
-		handleDirectoryError();
-		return; // no files loaded. _entries is empty
-	}
+  // If directory already opened, close it first
+  if (_dir)
+  {
+    closedir (_dir);
+    _dir = 0;
+  }
 
-	struct dirent * dir_entry;
-	std::set<std::string> alphaSortedFileSet;
-	std::set<std::string> alphaSortedPresetNameSet;
+  // Allocate a new a stream given the current directory name
+  if ((_dir = opendir (_dirname.c_str())) == NULL)
+  {
+    handleDirectoryError();
+    return; // no files loaded. _entries is empty
+  }
 
-	while ( ( dir_entry = readdir ( _dir ) ) != NULL )
-	{
+  struct dirent         *dir_entry;
+  std::set<std::string> alphaSortedFileSet;
+  std::set<std::string> alphaSortedPresetNameSet;
+
+  while ((dir_entry = readdir (_dir)) != NULL)
+  {
     if (dir_entry->d_name == 0)
       continue;
 
-		std::ostringstream out;
-		// Convert char * to friendly string
-		std::string filename ( dir_entry->d_name );
+    std::ostringstream  out;
+    // Convert char * to friendly string
+    std::string         filename (dir_entry->d_name);
 
-		// Verify extension is projectm or milkdrop
-		if (!_presetFactoryManager.extensionHandled(parseExtension(filename)))
-			continue;
+    // Verify extension is projectm or milkdrop
+    if (!_presetFactoryManager.extensionHandled (parseExtension (filename)))
+      continue;
 
-		if ( filename.length() > 0 && filename[0] == '.' )
-			continue;
+    if (filename.length() > 0  &&  filename[0] == '.')
+      continue;
 
-		// Create full path name
-		out << _dirname << PATH_SEPARATOR << filename;
+    // Create full path name
+    out << _dirname << PATH_SEPARATOR << filename;
 
-		// Add to our directory entry collection
-		alphaSortedFileSet.insert ( out.str() );
-		alphaSortedPresetNameSet.insert ( filename );
+    // Add to our directory entry collection
+    alphaSortedFileSet.insert (out.str());
+    alphaSortedPresetNameSet.insert (filename);
 
-		// the directory entry struct is freed elsewhere
-	}
+    // the directory entry struct is freed elsewhere
+  }
 
-	// Push all entries in order from the file set to the file entries member (which is an indexed vector)
-	for ( std::set<std::string>::iterator pos = alphaSortedFileSet.begin();
-	        pos != alphaSortedFileSet.end();++pos )
-		_entries.push_back ( *pos );
+  // Push all entries in order from the file set to the file entries member (which is an indexed vector)
+  for (std::set<std::string>::iterator pos = alphaSortedFileSet.begin();
+       pos != alphaSortedFileSet.end();
+       ++pos)
+  {
+    _entries.push_back (*pos);
+  }
 
-	// Push all preset names in similar fashion
-	for ( std::set<std::string>::iterator pos = alphaSortedPresetNameSet.begin();
-	        pos != alphaSortedPresetNameSet.end();++pos )
-		_presetNames.push_back ( *pos );
+  // Push all preset names in similar fashion
+  for (std::set<std::string>::iterator pos = alphaSortedPresetNameSet.begin();
+       pos != alphaSortedPresetNameSet.end();
+       ++pos)
+  {
+    _presetNames.push_back (*pos);
+  }
 
-	// Give all presets equal rating of 3 - why 3? I don't know
-	_ratings = std::vector<RatingList>(TOTAL_RATING_TYPES, RatingList( _presetNames.size(), 3 ));
-	_ratingsSums = std::vector<int>(TOTAL_RATING_TYPES, 3 * _presetNames.size());
-	
-
-	assert ( _entries.size() == _presetNames.size() );
+  // Give all presets equal rating of 3 - why 3? I don't know
+  _ratings = std::vector<RatingList>(TOTAL_RATING_TYPES, RatingList (_presetNames.size(), 3));
+  _ratingsSums = std::vector<int>(TOTAL_RATING_TYPES, 3 * _presetNames.size());
 
 
-
+  assert (_entries.size() == _presetNames.size());
 }
 
 
-std::auto_ptr<Preset> PresetLoader::loadPreset ( unsigned int index )  const
+std::auto_ptr<Preset>
+PresetLoader::loadPreset (unsigned int index)  const
 {
+  // Check that index isn't insane
+  assert (index >= 0);
+  assert (index < _entries.size());
 
-	// Check that index isn't insane
-	assert ( index >= 0 );
-	assert ( index < _entries.size() );
+  // Return a new autopointer to a preset
+  const std::string extension = parseExtension (_entries[index]);
 
-	// Return a new autopointer to a preset
-	const std::string extension = parseExtension ( _entries[index] );
-
-	return _presetFactoryManager.factory(extension).allocate
-		( _entries[index], _presetNames[index] );
-
+  return _presetFactoryManager
+         .factory (extension)
+         .allocate (_entries[index], _presetNames[index]);
 }
 
 
-std::auto_ptr<Preset> PresetLoader::loadPreset ( const std::string & url )  const
+std::auto_ptr<Preset>
+PresetLoader::loadPreset (const std::string & url)  const
 {
+  // Return a new autopointer to a preset
+  const std::string extension = parseExtension (url);
 
-	// Return a new autopointer to a preset
-	const std::string extension = parseExtension ( url );
-
-	/// @bug probably should not use url for preset name
-	return _presetFactoryManager.factory(extension).allocate
-		(url, url);
-
+  /// @bug probably should not use url for preset name
+  return _presetFactoryManager
+         .factory (extension)
+         .allocate (url, url);
 }
 
-void PresetLoader::handleDirectoryError()
+void
+PresetLoader::handleDirectoryError()
 {
 
 #ifdef WIN32
-	std::cerr << "[PresetLoader] warning: errno unsupported on win32 platforms. fix me" << std::endl;
+  std::cerr << "[PresetLoader] warning: errno unsupported on win32 platforms. fix me" << std::endl;
 #else
 
-	switch ( errno )
-	{
-		case ENOENT:
-			std::cerr << "[PresetLoader] ENOENT error. The path \"" << this->_dirname << "\" probably does not exist. \"man open\" for more info." << std::endl;
-			break;
-		case ENOMEM:
-			std::cerr << "[PresetLoader] out of memory! Are you running Windows?" << std::endl;
-			abort();
-		case ENOTDIR:
-			std::cerr << "[PresetLoader] directory specified is not a preset directory! Trying to continue..." << std::endl;
-			break;
-		case ENFILE:
-			std::cerr << "[PresetLoader] Your system has reached its open file limit. Trying to continue..." << std::endl;
-			break;
-		case EMFILE:
-			std::cerr << "[PresetLoader] too many files in use by projectM! Bailing!" << std::endl;
-			break;
-		case EACCES:
-			std::cerr << "[PresetLoader] permissions issue reading the specified preset directory." << std::endl;
-			break;
-		default:
-			break;
-	}
+  switch (errno) {
+  case ENOENT:
+    std::cerr << "[PresetLoader] ENOENT error. The path \""
+              << this->_dirname
+              << "\" probably does not exist. \"man open\" for more info."
+              << std::endl;
+    break;
+  case ENOMEM:
+    std::cerr << "[PresetLoader] out of memory! Are you running Windows?"
+              << std::endl;
+    abort();
+  case ENOTDIR:
+    std::cerr << "[PresetLoader] directory specified is not a preset directory! Trying to continue..."
+              << std::endl;
+    break;
+  case ENFILE:
+    std::cerr << "[PresetLoader] Your system has reached its open file limit. Trying to continue..."
+              << std::endl;
+    break;
+  case EMFILE:
+    std::cerr << "[PresetLoader] too many files in use by projectM! Bailing!"
+              << std::endl;
+    break;
+  case EACCES:
+    std::cerr << "[PresetLoader] permissions issue reading the specified preset directory."
+              << std::endl;
+    break;
+  default:
+    break;
+  }
 #endif
 }
 
-void PresetLoader::setRating(unsigned int index, int rating, const PresetRatingType ratingType)
+void
+PresetLoader::setRating (unsigned int index, int rating, const PresetRatingType ratingType)
 {
-	assert ( index >=0 );
-	
-	const unsigned int ratingTypeIndex = static_cast<unsigned int>(ratingType);
-	assert (index < _ratings[ratingTypeIndex].size());
- 
-	_ratingsSums[ratingTypeIndex] -= _ratings[ratingTypeIndex][index];
+  assert (index >=0);
 
-	_ratings[ratingTypeIndex][index] = rating;
-	_ratingsSums[ratingType] += rating;
+  const unsigned int ratingTypeIndex = static_cast<unsigned int>(ratingType);
+  assert (index < _ratings[ratingTypeIndex].size());
 
+  _ratingsSums[ratingTypeIndex] -= _ratings[ratingTypeIndex][index];
+
+  _ratings[ratingTypeIndex][index] = rating;
+  _ratingsSums[ratingType] += rating;
 }
 
 
-unsigned int PresetLoader::addPresetURL ( const std::string & url, const std::string & presetName, const std::vector<int> & ratings)
+unsigned int
+PresetLoader::addPresetURL (
+const std::string       & url,
+const std::string       & presetName,
+const std::vector<int>  & ratings
+)
 {
-	_entries.push_back(url);
-	_presetNames.push_back ( presetName );
+  _entries.push_back (url);
+  _presetNames.push_back (presetName);
 
-	assert(ratings.size() == TOTAL_RATING_TYPES);
-	assert(ratings.size() == _ratings.size());
+  assert (ratings.size() == TOTAL_RATING_TYPES);
+  assert (ratings.size() == _ratings.size());
 
-	for (int i = 0; i < _ratings.size(); i++)
-		_ratings[i].push_back(ratings[i]);
+  for (int i = 0;  i < _ratings.size();  i++)
+    _ratings[i].push_back (ratings[i]);
 
-	for (int i = 0; i < ratings.size(); i++)
-		_ratingsSums[i] += ratings[i];
-	
-	return _entries.size()-1;
+  for (int i = 0;  i < ratings.size();  i++)
+    _ratingsSums[i] += ratings[i];
+
+  return _entries.size() - 1;
 }
 
-void PresetLoader::removePreset ( unsigned int index )
+void
+PresetLoader::removePreset (unsigned int index)
 {
+  _entries.erase (_entries.begin() + index);
+  _presetNames.erase (_presetNames.begin() + index);
 
-	_entries.erase ( _entries.begin() + index );
-	_presetNames.erase ( _presetNames.begin() + index );
-	
-	for (int i = 0; i < _ratingsSums.size(); i++) {
-		_ratingsSums[i] -= _ratings[i][index];
-		_ratings[i].erase ( _ratings[i].begin() + index );
-	}
-	
-
+  for (int i = 0;  i < _ratingsSums.size();  i++) {
+    _ratingsSums[i] -= _ratings[i][index];
+    _ratings[i].erase (_ratings[i].begin() + index);
+  }
 }
 
-const std::string & PresetLoader::getPresetURL ( unsigned int index ) const
+const std::string &
+PresetLoader::getPresetURL (unsigned int index) const
 {
-	return _entries[index];
+  return _entries[index];
 }
 
-const std::string & PresetLoader::getPresetName ( unsigned int index ) const
+const std::string &
+PresetLoader::getPresetName (unsigned int index) const
 {
-	return _presetNames[index];
+  return _presetNames[index];
 }
 
-int PresetLoader::getPresetRating ( unsigned int index, const PresetRatingType ratingType ) const
+int
+PresetLoader::getPresetRating (
+unsigned int            index,
+const PresetRatingType  ratingType
+) const
 {
-	return _ratings[ratingType][index];
+  return _ratings[ratingType][index];
 }
 
-const std::vector<RatingList> & PresetLoader::getPresetRatings () const
+const std::vector<RatingList> &
+PresetLoader::getPresetRatings() const
 {
-	return _ratings;
+  return _ratings;
 }
 
-const std::vector<int> & PresetLoader::getPresetRatingsSums() const {
-	return _ratingsSums;
-}
-
-void PresetLoader::setPresetName(unsigned int index, std::string name) {
-	_presetNames[index] = name;
-}
-
-void PresetLoader::insertPresetURL ( unsigned int index, const std::string & url, const std::string & presetName, const RatingList & ratings)
+const std::vector<int> &
+PresetLoader::getPresetRatingsSums() const
 {
-	_entries.insert ( _entries.begin() + index, url );
-	_presetNames.insert ( _presetNames.begin() + index, presetName );
-	
-	
+  return _ratingsSums;
+}
 
-	for (int i = 0; i < _ratingsSums.size();i++) {
-		_ratingsSums[i] += _ratings[i][index];
-		_ratings[i].insert ( _ratings[i].begin() + index, ratings[i] );
-	}
+void
+PresetLoader::setPresetName (unsigned int index, std::string name)
+{
+  _presetNames[index] = name;
+}
 
-	assert ( _entries.size() == _presetNames.size() );
-	
-	
+void
+PresetLoader::insertPresetURL (
+unsigned int      index,
+const std::string & url,
+const std::string & presetName,
+const RatingList  & ratings
+)
+{
+  _entries.insert (_entries.begin() + index, url);
+  _presetNames.insert (_presetNames.begin() + index, presetName);
+
+  for (int i = 0;  i < _ratingsSums.size();  i++) {
+    _ratingsSums[i] += _ratings[i][index];
+    _ratings[i].insert (_ratings[i].begin() + index, ratings[i]);
+  }
+
+  assert (_entries.size() == _presetNames.size());
 }
diff --git a/src/libprojectM/PresetLoader.hpp b/src/libprojectM/PresetLoader.hpp
index 02d43c1..d83e548 100644
--- a/src/libprojectM/PresetLoader.hpp
+++ b/src/libprojectM/PresetLoader.hpp
@@ -21,98 +21,98 @@
 #include <map>
 #include "PresetFactoryManager.hpp"
 
+
 class Preset;
 class PresetFactory;
 
 
 class PresetLoader {
-	public:
-		
-		
-		/// Initializes the preset loader with the target directory specified 
-		PresetLoader(int gx, int gy, std::string dirname);
-				
-		~PresetLoader();
-	
-		/// Load a preset by specifying it's unique identifier given when the preset url
-		/// was added to this loader	
-		std::auto_ptr<Preset> loadPreset(unsigned int index) const;
-		std::auto_ptr<Preset> loadPreset ( const std::string & url )  const;
-		/// Add a preset to the loader's collection.
-		/// \param url an url referencing the preset
-		/// \param presetName a name for the preset
-		/// \param rating an integer representing the goodness of the preset
-		/// \returns The unique index assigned to the preset in the collection. Used with loadPreset
-		unsigned int addPresetURL ( const std::string & url, const std::string & presetName, const RatingList & ratings);
-			
-		/// Add a preset to the loader's collection.
-		/// \param index insertion index
-		/// \param url an url referencing the preset
-		/// \param presetName a name for the preset
-		/// \param rating an integer representing the goodness of the preset
-		void insertPresetURL (unsigned int index, const std::string & url, const std::string & presetName, const RatingList & ratings);
-	
-		/// Clears all presets from the collection
-		inline void clear() { 
-			_entries.clear(); _presetNames.clear(); 
-			_ratings = std::vector<RatingList>(TOTAL_RATING_TYPES, RatingList());
-			clearRatingsSum();
- 		}
+public:
 
-		inline void clearRatingsSum() {
-			_ratingsSums = std::vector<int>(TOTAL_RATING_TYPES, 0);
-		}
-		
-		const std::vector<RatingList> & getPresetRatings() const;		
-		const std::vector<int> & getPresetRatingsSums() const;
+  /// Initializes the preset loader with the target directory specified 
+  PresetLoader(int gx, int gy, std::string dirname);
 
-		/// Removes a preset from the loader
-		/// \param index the unique identifier of the preset url to be removed
-		void removePreset(unsigned int index);
+  ~PresetLoader();
 
-		/// Sets the rating of a preset to a new value
-		void setRating(unsigned int index, int rating, const PresetRatingType ratingType);
-		
-		/// Get a preset rating given an index
-		int getPresetRating ( unsigned int index, const PresetRatingType ratingType) const;
-		
-		/// Get a preset url given an index
-		const std::string & getPresetURL ( unsigned int index) const;
-		
-		/// Get a preset name given an index
-		const std::string & getPresetName ( unsigned int index) const;
-		
-		/// Returns the number of presets in the active directory 
-		inline std::size_t size() const {
-			return _entries.size();
-		}
-					
-		/// Sets the directory where the loader will search for files 
-		void setScanDirectory(std::string pathname);
+  /// Load a preset by specifying it's unique identifier given when the preset url
+  /// was added to this loader  
+  std::auto_ptr<Preset> loadPreset(unsigned int index) const;
+  std::auto_ptr<Preset> loadPreset ( const std::string & url )  const;
+  /// Add a preset to the loader's collection.
+  /// \param url an url referencing the preset
+  /// \param presetName a name for the preset
+  /// \param rating an integer representing the goodness of the preset
+  /// \returns The unique index assigned to the preset in the collection. Used with loadPreset
+  unsigned int addPresetURL ( const std::string & url, const std::string & presetName, const RatingList & ratings);
 
-		/// Returns the directory path associated with this preset chooser
-		inline const std::string & directoryName() const {
-			return _dirname;
-		}
-		
-		/// Rescans the active preset directory
-		void rescan();
-		void setPresetName(unsigned int index, std::string name);
-	private:
-		void handleDirectoryError();
-		std::string _dirname;
-		DIR * _dir;
-		std::vector<int> _ratingsSums;
-		mutable PresetFactoryManager _presetFactoryManager;
+  /// Add a preset to the loader's collection.
+  /// \param index insertion index
+  /// \param url an url referencing the preset
+  /// \param presetName a name for the preset
+  /// \param rating an integer representing the goodness of the preset
+  void insertPresetURL (unsigned int index, const std::string & url, const std::string & presetName, const RatingList & ratings);
 
-		// vector chosen for speed, but not great for reverse index lookups
-		std::vector<std::string> _entries;
-		std::vector<std::string> _presetNames;
+  /// Clears all presets from the collection
+  inline void clear() { 
+    _entries.clear(); _presetNames.clear(); 
+    _ratings = std::vector<RatingList>(TOTAL_RATING_TYPES, RatingList());
+    clearRatingsSum();
+  }
 
-		// Indexed by ratingType, preset position.
-		std::vector<RatingList> _ratings;
-		
+  inline void clearRatingsSum() {
+    _ratingsSums = std::vector<int>(TOTAL_RATING_TYPES, 0);
+  }
 
+  const std::vector<RatingList> & getPresetRatings() const;   
+  const std::vector<int> & getPresetRatingsSums() const;
+
+  /// Removes a preset from the loader
+  /// \param index the unique identifier of the preset url to be removed
+  void removePreset(unsigned int index);
+
+  /// Sets the rating of a preset to a new value
+  void setRating(unsigned int index, int rating, const PresetRatingType ratingType);
+
+  /// Get a preset rating given an index
+  int getPresetRating ( unsigned int index, const PresetRatingType ratingType) const;
+
+  /// Get a preset url given an index
+  const std::string & getPresetURL ( unsigned int index) const;
+
+  /// Get a preset name given an index
+  const std::string & getPresetName ( unsigned int index) const;
+
+  /// Returns the number of presets in the active directory 
+  inline std::size_t size() const {
+    return _entries.size();
+  }
+
+  /// Sets the directory where the loader will search for files 
+  void setScanDirectory(std::string pathname);
+
+  /// Returns the directory path associated with this preset chooser
+  inline const std::string & directoryName() const {
+    return _dirname;
+  }
+
+  /// Rescans the active preset directory
+  void rescan();
+  void setPresetName(unsigned int index, std::string name);
+
+private:
+  void handleDirectoryError();
+
+  std::string                   _dirname;
+  DIR                           *_dir;
+  std::vector<int>              _ratingsSums;
+  mutable PresetFactoryManager  _presetFactoryManager;
+
+  // vector chosen for speed, but not great for reverse index lookups
+  std::vector<std::string>      _entries;
+  std::vector<std::string>      _presetNames;
+
+  // Indexed by ratingType, preset position.
+  std::vector<RatingList>       _ratings;
 };
 
 #endif
diff --git a/src/libprojectM/RandomNumberGenerators.hpp b/src/libprojectM/RandomNumberGenerators.hpp
index 862e43b..008585a 100644
--- a/src/libprojectM/RandomNumberGenerators.hpp
+++ b/src/libprojectM/RandomNumberGenerators.hpp
@@ -7,116 +7,136 @@
 
 #define WEIGHTED_RANDOM_DEBUG 0
 
+
 namespace RandomNumberGenerators {
 
-inline float uniform()
-/* Uniform random number generator x(n+1)= a*x(n) mod c
-				with a = pow(7,5) and c = pow(2,31)-1.
-				Copyright (c) Tao Pang 1997. */
-	{
-		const int ia=16807,ic=2147483647,iq=127773,ir=2836;
-		int il,ih,it;
-		float rc;
-		static int iseed = rand();
-		ih = iseed/iq;
-		il = iseed%iq;
-		it = ia*il-ir*ih;
-		if (it > 0)
-		{
-			iseed = it;
-		}
-		else
-		{
-			iseed = ic+it;
-		}
-		rc = ic;
-		return iseed/rc;
-	}
 
-inline float gaussian(float mean, float sigma)
+inline float
+uniform()
+/* Uniform random number generator x(n+1)= a*x(n) mod c
+        with a = pow(7,5) and c = pow(2,31)-1.
+        Copyright (c) Tao Pang 1997. */
+{
+  const int   ia=16807,
+              ic=2147483647,
+              iq=127773,
+              ir=2836;
+  int         il,ih,it;
+  float       rc;
+  static int  iseed = rand();
+
+  ih = iseed / iq;
+  il = iseed % iq;
+  it = ia * il - ir * ih;
+  if (it > 0)
+  {
+    iseed = it;
+  }
+  else
+  {
+    iseed = ic+it;
+  }
+  rc = ic;
+  return iseed / rc;
+}
+
+inline float
+gaussian (float mean, float sigma)
 {
 
-	float x1, x2, w, y1, y2;
- 
-	do {
-		x1 = 2.0 * uniform() - 1.0;
-		x2 = 2.0 * uniform() - 1.0;
-		w = x1 * x1 + x2 * x2;
-	} while ( w >= 1.0 );
+  float x1, x2, w, y1, y2;
 
-	w = sqrt( (-2.0 * log( w ) ) / w );
-	y1 = x1 * w;
-	y2 = x2 * w;
-	
-	float ret = y1*sigma + mean;
+  do {
+    x1 = 2.0 * uniform() - 1.0;
+    x2 = 2.0 * uniform() - 1.0;
+    w = x1 * x1 + x2 * x2;
+  } while ( w >= 1.0 );
 
-	return ret;
+  w = sqrt( (-2.0 * log( w ) ) / w );
+  y1 = x1 * w;
+  y2 = x2 * w;
+
+  float ret = y1*sigma + mean;
+
+  return ret;
 }
 
-inline std::size_t uniformInteger(std::size_t upperBound=1) {
-
-	
-	/// @bug there was a man entry about how this leads to a lousy uniform
-	/// @bug distribution in practice. should probably review
-	assert(upperBound > 0);
-	return ((rand()) % ((int)upperBound));
+inline std::size_t
+uniformInteger (std::size_t upperBound = 1)
+{
+  /// @bug there was a man entry about how this leads to a lousy uniform
+  /// @bug distribution in practice. should probably review
+  assert(upperBound > 0);
+  return ((rand()) % ((int)upperBound));
 }
 
-	
-	
+
+
 
 /// Randomizes from probabilistically weighted distribution. Thus,
 /// sum of passed in weights should be 1.0
-inline std::size_t weightedRandomNormalized(std::vector<float> weights) {
+inline std::size_t
+weightedRandomNormalized(std::vector<float> weights)
+{
+  // Choose a random bounded mass between 0 and 1
+  float cutoff = ((float) (rand())) / (float) RAND_MAX;
 
-        // Choose a random bounded mass between 0 and 1
-	float cutoff = ((float)(rand())) / (float)RAND_MAX;
+  //std::cout << "cutoff : " << cutoff << std::endl;
 
-	//std::cout << "cutoff : " << cutoff << std::endl;
+  // Sum up mass, stopping when cutoff is reached. This is the typical
+  // weighted sampling algorithm.
+  float mass = 0;
+  for (std::size_t i = 0;  i < weights.size();   i++) {
+    mass += weights[i];
+    //std::cout << "mass: " << mass << std::endl;
+    if (mass >= cutoff)
+      return i;
+  }
 
-    // Sum up mass, stopping when cutoff is reached. This is the typical
-    // weighted sampling algorithm.
-	float mass = 0;
-	for (std::size_t i = 0; i< weights.size() ; i++) {
-		mass += weights[i];
-		//std::cout << "mass: " << mass << std::endl;
-		if (mass >= cutoff)
-			return i;
-	}
-
-    // Just in case something slips through the cracks
-	return weights.size()-1;
+  // Just in case something slips through the cracks
+  return weights.size()-1;
 }
 
-inline std::size_t weightedRandom(const std::vector<int> & weights, unsigned int weightTotalHint = 0) {
-	
+inline std::size_t
+weightedRandom (const std::vector<int> & weights, unsigned int weightTotalHint = 0)
+{
+  if (weightTotalHint == 0) {
+    for (std::size_t i = 0;  i < weights.size();  i++)
+      weightTotalHint += weights[i];
+  }
 
-	if (weightTotalHint == 0)	{		
-		for (std::size_t i = 0; i < weights.size();i++) 
-			weightTotalHint += weights[i];
-	}
-	
-	const int sampledSum = uniformInteger(weightTotalHint);
-	int sum = 0;
-	if (WEIGHTED_RANDOM_DEBUG) std::cout << "[RNG::weightedRandom()] weightTotal = " << weightTotalHint <<
-			 std::endl; 
+  const int sampledSum = uniformInteger(weightTotalHint);
+  int sum = 0;
 
-	for (std::size_t i = 0; i < weights.size();i++) {
-		if (WEIGHTED_RANDOM_DEBUG) 
-		std::cout << "[RNG::weightedRandom()] weight[" << i << "] = " << weights[i] <<
-			 std::endl; 
+  if (WEIGHTED_RANDOM_DEBUG)
+    std::cout << "[RNG::weightedRandom()] weightTotal = "
+              << weightTotalHint
+              << std::endl;
 
-		sum += weights[i];
-		if (sampledSum <= sum) {
-			if (WEIGHTED_RANDOM_DEBUG) 
-			std::cout << "[RNG::weightedRandom()] sampled index " << i << "(" <<
-			 "running sum = " << sum << ", sampled sum = " << sampledSum << std::endl;
-			return i;
-		}
-	}
+  for (std::size_t i = 0;  i < weights.size();  i++) {
+    if (WEIGHTED_RANDOM_DEBUG)
+      std::cout << "[RNG::weightedRandom()] weight[" << i << "] = "
+                << weights[i]
+                << std::endl;
 
-	return weights.size()-1;
+    sum += weights[i];
+    if (sampledSum <= sum) {
+      if (WEIGHTED_RANDOM_DEBUG)
+        std::cout << "[RNG::weightedRandom()] sampled index "
+                  << i
+                  << "("
+                  << "running sum = "
+                  << sum
+                  << ", sampled sum = "
+                  << sampledSum
+                  << std::endl;
+      return i;
+    }
+  }
+
+  return weights.size() - 1;
 }
 
-}
+}   /*  namespace RandomNumberGenerators  */
+
 #endif
diff --git a/src/libprojectM/Renderer/BeatDetect.cpp b/src/libprojectM/Renderer/BeatDetect.cpp
index 106b544..e7f79ea 100644
--- a/src/libprojectM/Renderer/BeatDetect.cpp
+++ b/src/libprojectM/Renderer/BeatDetect.cpp
@@ -21,11 +21,10 @@
 /**
  * Takes sound data from wherever and returns beat detection values
  * Uses statistical Energy-Based methods. Very simple
- * 
+ *
  * Some stuff was taken from Frederic Patin's beat-detection article,
  * you'll find it online
  */
-
 #include <stdlib.h>
 #include <stdio.h>
 
@@ -36,151 +35,153 @@
 #include <cmath>
 #include "BeatDetect.hpp"
 
-BeatDetect::BeatDetect(PCM *pcm) {
-  int x,y; 
+
+BeatDetect::BeatDetect (PCM *pcm)
+{
+  int x,y;
 
   this->pcm=pcm;
 
-  this->vol_instant=0;
-  this->vol_history=0;
+  this->vol_instant = 0;
+  this->vol_history = 0;
 
-  for (y=0;y<80;y++)
-    {
-      this->vol_buffer[y]=0;
-    }
-
-  this->beat_buffer_pos=0;
-
-  for (x=0;x<32;x++) {
-      this->beat_instant[x]=0;
-      this->beat_history[x]=0;
-      this->beat_val[x]=1.0;
-      this->beat_att[x]=1.0;
-      this->beat_variance[x]=0;
-      for (y=0;y<80;y++) {
-	    this->beat_buffer[x][y]=0;
-	    }
-    }
-
-    this->treb = 0;
-    this->mid = 0;
-    this->bass = 0;
-    this->vol_old = 0;
-    this->beat_sensitivity = 10.00;
-    this->treb_att = 0;
-    this->mid_att = 0;
-    this->bass_att = 0;
-    this->vol = 0;
-
-  
+  for (y = 0;  y < 80;  y++)
+  {
+    this->vol_buffer[y] = 0;
   }
 
-BeatDetect::~BeatDetect() 
+  this->beat_buffer_pos = 0;
+
+  for (x = 0;  x < 32;  x++) {
+    this->beat_instant[x] = 0;
+    this->beat_history[x] = 0;
+    this->beat_val[x] = 1.0;
+    this->beat_att[x] = 1.0;
+    this->beat_variance[x] = 0;
+    for (y = 0;  y < 80;  y++) {
+      this->beat_buffer[x][y] = 0;
+    }
+  }
+
+  this->treb = 0;
+  this->mid = 0;
+  this->bass = 0;
+  this->vol_old = 0;
+  this->beat_sensitivity = 10.00;
+  this->treb_att = 0;
+  this->mid_att = 0;
+  this->bass_att = 0;
+  this->vol = 0;
+}
+
+BeatDetect::~BeatDetect()
 {
 
 }
 
-void BeatDetect::reset() {
-  this->treb = 0;
-  this->mid = 0;
-  this->bass = 0;
-  this->treb_att = 0;
-  this->mid_att = 0;
-  this->bass_att = 0;
-  }
-
-void BeatDetect::detectFromSamples() {
-    vol_old = vol;
-    bass=0;mid=0;treb=0;
-
-    getBeatVals(pcm->pcmdataL,pcm->pcmdataR);
-  }
-
-void BeatDetect::getBeatVals( float *vdataL,float *vdataR ) {
-
-  int linear=0;
-  int x,y;
-  float temp2=0;
-
-  vol_instant=0;
-      for ( x=0;x<16;x++)
-	{
-	  
-	  beat_instant[x]=0;
-	  for ( y=linear*2;y<(linear+8+x)*2;y++)
-	    {
-	      beat_instant[x]+=((vdataL[y]*vdataL[y])+(vdataR[y]*vdataR[y]))*(1.0/(8+x)); 
-//	      printf( "beat_instant[%d]: %f %f %f\n", x, beat_instant[x], vdataL[y], vdataR[y] );
-	      vol_instant+=((vdataL[y]*vdataL[y])+(vdataR[y]*vdataR[y]))*(1.0/512.0);
-
-	    }
-//printf("1");	  
-	  linear=y/2;
-	  beat_history[x]-=(beat_buffer[x][beat_buffer_pos])*.0125;
-	  beat_buffer[x][beat_buffer_pos]=beat_instant[x];
-	  beat_history[x]+=(beat_instant[x])*.0125;
-	  
-	  beat_val[x]=(beat_instant[x])/(beat_history[x]);
-	  
-	  beat_att[x]+=(beat_instant[x])/(beat_history[x]);
-
-//printf("2\n");
- 	  
-	}
-//printf("b\n");      
-      vol_history-=(vol_buffer[beat_buffer_pos])*.0125;
-      vol_buffer[beat_buffer_pos]=vol_instant;
-      vol_history+=(vol_instant)*.0125;
-
-      mid=0;
-      for(x=1;x<10;x++)
-	{
-	 mid+=(beat_instant[x]);
-	  temp2+=(beat_history[x]);
-	 
-	}
-
-	 mid=mid/(1.5*temp2);
-	 temp2=0;
-	 treb=0;
- 	  for(x=10;x<16;x++)
-	    { 
-	      treb+=(beat_instant[x]);
-	      temp2+=(beat_history[x]);
-	    }
-//printf("c\n");
-	  treb=treb/(1.5*temp2);
-//	  *vol=vol_instant/(1.5*vol_history);
-	  vol=vol_instant/(1.5*vol_history);
-
-	  bass=(beat_instant[0])/(1.5*beat_history[0]);
-
-	  
-	  if ( projectM_isnan( treb ) ) {
-	    treb = 0.0;
-	  }
-	  if ( projectM_isnan( mid ) ) {
-	    mid = 0.0;
-	  }
-	  if ( projectM_isnan( bass ) ) {
-	    bass = 0.0;
-	  }
-	  treb_att=.6 * treb_att + .4 * treb;
-	  mid_att=.6 * mid_att + .4 * mid;
-	  bass_att=.6 * bass_att + .4 * bass;
-
-	  if(bass_att>100)bass_att=100;
-	  if(bass >100)bass=100;
-	  if(mid_att>100)mid_att=100;
-	  if(mid >100)mid=100;
-	  if(treb_att>100)treb_att=100;
-	  if(treb >100)treb=100;
-	  if(vol>100)vol=100;
-	  
-	   // *vol=(beat_instant[3])/(beat_history[3]);
-	  beat_buffer_pos++;
-	  if( beat_buffer_pos>79)beat_buffer_pos=0;
-	
+void
+BeatDetect::reset()
+{
+  this->treb      = 0;
+  this->mid       = 0;
+  this->bass      = 0;
+  this->treb_att  = 0;
+  this->mid_att   = 0;
+  this->bass_att  = 0;
 }
 
+void
+BeatDetect::detectFromSamples()
+{
+  vol_old = vol;
+  bass = 0;  mid = 0;  treb = 0;
 
+  getBeatVals (pcm->pcmdataL, pcm->pcmdataR);
+}
+
+void
+BeatDetect::getBeatVals (float *vdataL, float *vdataR)
+{
+  int   linear=0;
+  int   x,y;
+  float temp2=0;
+
+  vol_instant = 0;
+  for (x = 0;  x < 16;  x++)
+  {
+    beat_instant[x]=0;
+    for (y = linear * 2;  y < (linear + 8 + x) * 2;  y++)
+    {
+      beat_instant[x] += ((vdataL[y] * vdataL[y])
+                       + (vdataR[y] * vdataR[y])) * (1.0 / (8 + x));
+      //        printf ("beat_instant[%d]: %f %f %f\n", x, beat_instant[x], vdataL[y], vdataR[y]);
+      vol_instant += ((vdataL[y] * vdataL[y])
+                   + (vdataR[y] * vdataR[y])) * (1.0 / 512.0);
+
+    }
+    //printf ("1");
+    linear = y / 2;
+    beat_history[x] -= (beat_buffer[x][beat_buffer_pos])*.0125;
+    beat_buffer[x][beat_buffer_pos] = beat_instant[x];
+    beat_history[x] += (beat_instant[x]) * .0125;
+
+    beat_val[x] = (beat_instant[x]) / (beat_history[x]);
+
+    beat_att[x] += (beat_instant[x]) / (beat_history[x]);
+
+    //printf ("2\n");
+
+  }
+  //printf ("b\n");
+  vol_history -= (vol_buffer[beat_buffer_pos]) * .0125;
+  vol_buffer[beat_buffer_pos] = vol_instant;
+  vol_history += (vol_instant) * .0125;
+
+  mid = 0;
+  for (x = 1;  x < 10;  x++)
+  {
+    mid += (beat_instant[x]);
+    temp2 += (beat_history[x]);
+  }
+
+  mid = mid / (1.5 * temp2);
+  temp2 = 0;
+  treb = 0;
+  for (x = 10;  x < 16;  x++)
+  {
+    treb += (beat_instant[x]);
+    temp2 += (beat_history[x]);
+  }
+  //printf ("c\n");
+  treb = treb / (1.5 * temp2);
+  //    *vol=vol_instant/(1.5*vol_history);
+  vol = vol_instant / (1.5 * vol_history);
+
+  bass = (beat_instant[0]) / (1.5 * beat_history[0]);
+
+
+  if (projectM_isnan (treb)) {
+    treb = 0.0;
+  }
+  if (projectM_isnan (mid)) {
+    mid = 0.0;
+  }
+  if (projectM_isnan (bass)) {
+    bass = 0.0;
+  }
+  treb_att = .6 * treb_att + .4 * treb;
+  mid_att = .6 * mid_att + .4 * mid;
+  bass_att = .6 * bass_att + .4 * bass;
+
+  if (bass_att > 100) bass_att =100;
+  if (bass > 100)     bass = 100;
+  if (mid_att > 100)  mid_att = 100;
+  if (mid > 100)      mid = 100;
+  if (treb_att > 100) treb_att = 100;
+  if (treb > 100)     treb = 100;
+  if (vol > 100)      vol = 100;
+
+  // *vol=(beat_instant[3])/(beat_history[3]);
+  beat_buffer_pos++;
+  if (beat_buffer_pos > 79) beat_buffer_pos = 0;
+}
diff --git a/src/libprojectM/Renderer/BeatDetect.hpp b/src/libprojectM/Renderer/BeatDetect.hpp
index 4dc3881..5da9831 100644
--- a/src/libprojectM/Renderer/BeatDetect.hpp
+++ b/src/libprojectM/Renderer/BeatDetect.hpp
@@ -27,7 +27,6 @@
  * $Log$
  *
  */
-
 #ifndef _BEAT_DETECT_H
 #define _BEAT_DETECT_H
 
@@ -37,38 +36,39 @@
 
 class DLLEXPORT BeatDetect
 {
-	public:
-		float treb ;
-		float mid ;
-		float bass ;
-		float vol_old ;
-		float beat_sensitivity;
-		float treb_att ;
-		float mid_att ;
-		float bass_att ;
-		float vol;
+public:
+  float treb;
+  float mid;
+  float bass;
+  float vol_old;
+  float beat_sensitivity;
+  float treb_att;
+  float mid_att;
+  float bass_att;
+  float vol;
 
-		PCM *pcm;
+  PCM *pcm;
 
-		/** Methods */
-		BeatDetect(PCM *pcm);
-		~BeatDetect();
-		void initBeatDetect();
-		void reset();
-		void detectFromSamples();
-		void getBeatVals ( float *vdataL, float *vdataR );
-	private:
-		/** Vars */
-		float beat_buffer[32][80],
-		beat_instant[32],
-		beat_history[32];
-		float beat_val[32],
-		beat_att[32],
-		beat_variance[32];
-		int beat_buffer_pos;
-		float vol_buffer[80],
-		vol_instant,
-		vol_history;
+  /** Methods */
+  BeatDetect(PCM *pcm);
+  ~BeatDetect();
+  void initBeatDetect();
+  void reset();
+  void detectFromSamples();
+  void getBeatVals ( float *vdataL, float *vdataR );
+
+private:
+  /** Vars */
+  float beat_buffer[32][80],
+        beat_instant[32],
+        beat_history[32];
+  float beat_val[32],
+        beat_att[32],
+        beat_variance[32];
+  int   beat_buffer_pos;
+  float vol_buffer[80],
+        vol_instant,
+        vol_history;
 };
 
 #endif /** !_BEAT_DETECT_H */
diff --git a/src/libprojectM/Renderer/FBO.cpp b/src/libprojectM/Renderer/FBO.cpp
index 2bc1dd3..fe86e8f 100644
--- a/src/libprojectM/Renderer/FBO.cpp
+++ b/src/libprojectM/Renderer/FBO.cpp
@@ -23,7 +23,6 @@
  *
  * Render this methods
  */
-
 #include <stdio.h>
 //#include <GL/gl.h>
 #include <iostream>
@@ -32,274 +31,270 @@
 
 
 
-RenderTarget::~RenderTarget() {
-
-
-	glDeleteTextures( 1, &this->textureID[0]);
+RenderTarget::~RenderTarget()
+{
+  glDeleteTextures (1, &this->textureID[0]);
 
 #ifdef USE_FBO
-	if (useFBO) 
-         {
-		glDeleteTextures( 1, &this->textureID[1] );
-		glDeleteRenderbuffersEXT(1,  &this->depthb[0]);
-		glDeleteFramebuffersEXT(1, &this->fbuffer[0]);
-		if(renderToTexture)
-		  {
-		    glDeleteTextures( 1, &this->textureID[2] );
-		    glDeleteRenderbuffersEXT(1,  &this->depthb[1]);
-		    glDeleteFramebuffersEXT(1, &this->fbuffer[1]);
-		  }
-         }
+  if (useFBO)
+  {
+    glDeleteTextures (1, &this->textureID[1]);
+    glDeleteRenderbuffersEXT (1,  &this->depthb[0]);
+    glDeleteFramebuffersEXT (1, &this->fbuffer[0]);
+    if (renderToTexture)
+    {
+      glDeleteTextures (1, &this->textureID[2]);
+      glDeleteRenderbuffersEXT (1,  &this->depthb[1]);
+      glDeleteFramebuffersEXT (1, &this->fbuffer[1]);
+    }
+  }
 #endif
-
 }
 
 GLuint RenderTarget::initRenderToTexture()
 {
 #ifdef USE_FBO
-
   if (this->useFBO==1)
-    {
-      this->renderToTexture=1;
-      
-      GLuint   fb2, depth_rb2;
-      glGenFramebuffersEXT(1, &fb2);
-      glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, fb2 );
-      glGenRenderbuffersEXT(1, &depth_rb2);
-      glBindRenderbufferEXT( GL_RENDERBUFFER_EXT, depth_rb2 );
-      
-      glRenderbufferStorageEXT( GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT, this->texsize,this->texsize  );
-      glFramebufferRenderbufferEXT( GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, depth_rb2 );         
-      this->fbuffer[1] = fb2;
-      this->depthb[1]=  depth_rb2;
-      glGenTextures(1, &this->textureID[2]);
-      glBindTexture(GL_TEXTURE_2D, this->textureID[2]); 
-      glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-      glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, texsize, texsize, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL );
-      glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-      glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
-      glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
-      glFramebufferTexture2DEXT( GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, this->textureID[2], 0 );
-      return this->textureID[2];
-    }
-#endif 
-return -1;
-      
+  {
+    this->renderToTexture=1;
+
+    GLuint   fb2, depth_rb2;
+
+    glGenFramebuffersEXT (1, &fb2);
+    glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, fb2);
+    glGenRenderbuffersEXT (1, &depth_rb2);
+    glBindRenderbufferEXT (GL_RENDERBUFFER_EXT, depth_rb2);
+
+    glRenderbufferStorageEXT (GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT, this->texsize,this->texsize );
+    glFramebufferRenderbufferEXT (GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, depth_rb2);
+    this->fbuffer[1] = fb2;
+    this->depthb[1]=  depth_rb2;
+    glGenTextures (1, &this->textureID[2]);
+    glBindTexture (GL_TEXTURE_2D, this->textureID[2]);
+    glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+    glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, texsize, texsize, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
+    glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+    glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
+    glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
+    glFramebufferTexture2DEXT (GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, this->textureID[2], 0);
+    return this->textureID[2];
+  }
+#endif
+  return -1;
 }
 
 /** Creates new pbuffers */
-RenderTarget::RenderTarget(int texsize, int width, int height) : useFBO(false) {
+RenderTarget::RenderTarget (int texsize, int width, int height)
+  : useFBO (false)
+{
+  int mindim = 0;
+  int origtexsize = 0;
 
-   int mindim = 0;
-   int origtexsize = 0;
-
-   this->renderToTexture = 0;
-   this->texsize = texsize;
+  this->renderToTexture = 0;
+  this->texsize = texsize;
 
 #ifdef USE_FBO
-      // Forceably disable FBO if user requested it but the video card / driver lacks
-      // the appropraite frame buffer extension.
-      useFBO = !!strstr ((char const *) glGetString (GL_EXTENSIONS),
+  // Forceably disable FBO if user requested it but the video card / driver lacks
+  // the appropraite frame buffer extension.
+  useFBO = !!strstr ((char const *) glGetString (GL_EXTENSIONS),
 #ifdef USE_GLES1
-                         "GL_OES_framebuffer_object"
+                     "GL_OES_framebuffer_object"
 #else
-                         "GL_EXT_framebuffer_object"
+                     "GL_EXT_framebuffer_object"
 #endif
-                        );
-      if (useFBO)
-	{	 
-
-	  GLuint   fb,  depth_rb, rgba_tex,  other_tex;
-	  glGenFramebuffersEXT(1, &fb);
-	  glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, fb );
-	  
-	  glGenRenderbuffersEXT(1, &depth_rb);
-	  glBindRenderbufferEXT( GL_RENDERBUFFER_EXT, depth_rb );
-	  glRenderbufferStorageEXT( GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT, this->texsize,this->texsize  );
-	  glFramebufferRenderbufferEXT( GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, depth_rb );
-	  this->fbuffer[0] = fb;
-	  this->depthb[0]=  depth_rb;
-	  
-	  glGenTextures(1, &other_tex);
-	  glBindTexture(GL_TEXTURE_2D,other_tex);
-	  glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, texsize, texsize, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL );
-	  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-	  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-	  //glGenerateMipmapEXT(GL_TEXTURE_2D);
-	  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
-	  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
-	  
-	  
-	  
-	  glGenTextures(1, &rgba_tex);
-	  glBindTexture(GL_TEXTURE_2D, rgba_tex); 
-	  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-	  glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, texsize, texsize, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL );
-	  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-	  //glGenerateMipmapEXT(GL_TEXTURE_2D);
-	  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
-	  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
-	  
-	  
-	  
-	  glFramebufferTexture2DEXT( GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, rgba_tex, 0 );         
-	  this->textureID[0] = rgba_tex;
-	  this->textureID[1] = other_tex; 
-	  
-	  GLenum status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
-
-	  glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, 0);
-
-	  if (status == GL_FRAMEBUFFER_COMPLETE_EXT) {
-	    return;
-	  }	
-	  std::cerr << "[projecM] warning: FBO support not detected. Using fallback." << std::endl;
-	}
-
-#endif 
-
-// Can reach here via two code paths: 
-// (1) useFBO was set to false externally by cmake / system setting / etc.
-// (2) useFBO was true but forced to false as it failed to pass all the GLU extension checks.
-
-    /** Fallback pbuffer creation via teximage hack */
-    /** Check the texture size against the viewport size */
-    /** If the viewport is smaller, then we'll need to scale the texture size down */
-    /** If the viewport is larger, scale it up */
-    mindim = width < height ? width : height;
-    origtexsize = this->texsize;
-    this->texsize = nearestPower2( mindim, SCALE_MINIFY );
-        glGenTextures(1, &this->textureID[0] );
-
-        glBindTexture(GL_TEXTURE_2D, this->textureID[0] );
-        //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
-        //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
-
-	glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-	glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-
-        glTexImage2D(GL_TEXTURE_2D,
-		    0,
-		    GL_RGBA,
-		    this->texsize, this->texsize,
-		    0,
-		    GL_RGBA,
-		    GL_UNSIGNED_BYTE,
-		    NULL);
-      
-
-   
-    return;
-  }
-
-  void RenderTarget::fallbackRescale(int width, int height)
+                   );
+  if (useFBO)
   {
-	int mindim = width < height ? width : height;
-    int origtexsize = this->texsize;
-    this->texsize = nearestPower2( mindim, SCALE_MINIFY );
+    GLuint   fb,  depth_rb, rgba_tex,  other_tex;
+    glGenFramebuffersEXT (1, &fb);
+    glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, fb);
 
-    if (origtexsize == texsize)
+    glGenRenderbuffersEXT (1, &depth_rb);
+    glBindRenderbufferEXT (GL_RENDERBUFFER_EXT, depth_rb);
+    glRenderbufferStorageEXT (GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT, this->texsize,this->texsize );
+    glFramebufferRenderbufferEXT (GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, depth_rb);
+    this->fbuffer[0] = fb;
+    this->depthb[0]=  depth_rb;
+
+    glGenTextures (1, &other_tex);
+    glBindTexture (GL_TEXTURE_2D,other_tex);
+    glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, texsize, texsize, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
+    glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+    glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+    //glGenerateMipmapEXT (GL_TEXTURE_2D);
+    glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
+    glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
+
+
+
+    glGenTextures (1, &rgba_tex);
+    glBindTexture (GL_TEXTURE_2D, rgba_tex);
+    glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+    glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, texsize, texsize, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
+    glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+    //glGenerateMipmapEXT (GL_TEXTURE_2D);
+    glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
+    glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
+
+
+
+    glFramebufferTexture2DEXT (GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, rgba_tex, 0);
+    this->textureID[0] = rgba_tex;
+    this->textureID[1] = other_tex;
+
+    GLenum status = glCheckFramebufferStatusEXT (GL_FRAMEBUFFER_EXT);
+
+    glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, 0);
+
+    if (status == GL_FRAMEBUFFER_COMPLETE_EXT) {
       return;
-
-    /* Create the texture that will be bound to the render this */
-    /*
-
-        if ( this->texsize != origtexsize ) {
-
-            glDeleteTextures( 1, &this->textureID[0] );
-          }
-    */
-
-        glGenTextures(1, &this->textureID[0] );
-
-        glBindTexture(GL_TEXTURE_2D, this->textureID[0] );
-        //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
-        //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
-
-	glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-	glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-
-        glTexImage2D(GL_TEXTURE_2D,
-		    0,
-		    GL_RGBA,
-		    this->texsize, this->texsize,
-		    0,
-		    GL_RGBA,
-		    GL_UNSIGNED_BYTE,
-		    NULL);
-      
-
+    }
+    std::cerr << "[projecM] warning: FBO support not detected. Using fallback." << std::endl;
   }
+#endif  /*  USE_FBO  */
+
+  // Can reach here via two code paths:
+  // (1) useFBO was set to false externally by cmake / system setting / etc.
+  // (2) useFBO was true but forced to false as it failed to pass all the GLU extension checks.
+
+  /** Fallback pbuffer creation via teximage hack */
+  /** Check the texture size against the viewport size */
+  /** If the viewport is smaller, then we'll need to scale the texture size down */
+  /** If the viewport is larger, scale it up */
+  mindim = width < height ? width : height;
+  origtexsize = this->texsize;
+  this->texsize = nearestPower2 (mindim, SCALE_MINIFY);
+  glGenTextures (1, &this->textureID[0]);
+
+  glBindTexture (GL_TEXTURE_2D, this->textureID[0]);
+  //glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+  //glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+
+  glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+  glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+
+  glTexImage2D (GL_TEXTURE_2D,
+                0,
+                GL_RGBA,
+                this->texsize, this->texsize,
+                0,
+                GL_RGBA,
+                GL_UNSIGNED_BYTE,
+                NULL);
+
+  return;
+}
+
+void
+RenderTarget::fallbackRescale (int width, int height)
+{
+  int mindim = width < height ? width : height;
+  int origtexsize = this->texsize;
+
+  this->texsize = nearestPower2 (mindim, SCALE_MINIFY);
+
+  if (origtexsize == texsize)
+    return;
+
+  /* Create the texture that will be bound to the render this */
+  /*
+
+  if (this->texsize != origtexsize) {
+    glDeleteTextures (1, &this->textureID[0]);
+  }
+  */
+
+  glGenTextures (1, &this->textureID[0]);
+
+  glBindTexture (GL_TEXTURE_2D, this->textureID[0]);
+  //glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+  //glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+
+  glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+  glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+
+  glTexImage2D (GL_TEXTURE_2D,
+                0,
+                GL_RGBA,
+                this->texsize, this->texsize,
+                0,
+                GL_RGBA,
+                GL_UNSIGNED_BYTE,
+                NULL);
+}
 
 /** Destroys the pbuffer */
 
 /** Locks the pbuffer */
-void RenderTarget::lock() {
-
+void
+RenderTarget::lock()
+{
 #ifdef USE_FBO
-  if(this->useFBO)
-    { 
-      glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, this->fbuffer[0]);     
-    }
+  if (this->useFBO)
+  {
+    glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, this->fbuffer[0]);
+  }
 #endif
-    }
+}
 
 /** Unlocks the pbuffer */
-void RenderTarget::unlock() {
-
+void
+RenderTarget::unlock()
+{
 #ifdef USE_FBO
-  if(this->useFBO)
-    {
-      glBindTexture( GL_TEXTURE_2D, this->textureID[1] );
-      glCopyTexSubImage2D( GL_TEXTURE_2D,
-                         0, 0, 0, 0, 0, 
-                         this->texsize, this->texsize );
-      glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
-      return;
-    }
-#endif
-    /** Fallback texture path */
-    
-    glBindTexture( GL_TEXTURE_2D, this->textureID[0] );
-    
-	glCopyTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, 0, 0, this->texsize, this->texsize );
+  if (this->useFBO)
+  {
+    glBindTexture (GL_TEXTURE_2D, this->textureID[1]);
+    glCopyTexSubImage2D (GL_TEXTURE_2D,
+                         0, 0, 0, 0, 0,
+                         this->texsize, this->texsize);
+    glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, 0);
+    return;
   }
+#endif
+  /** Fallback texture path */
 
-/** 
+  glBindTexture (GL_TEXTURE_2D, this->textureID[0]);
+
+  glCopyTexSubImage2D (GL_TEXTURE_2D, 0, 0, 0, 0, 0, this->texsize, this->texsize);
+}
+
+/**
  * Calculates the nearest power of two to the given number using the
  * appropriate rule
  */
-int RenderTarget::nearestPower2( int value, TextureScale scaleRule ) {
+int
+RenderTarget::nearestPower2 (int value, TextureScale scaleRule)
+{
+  int x = value;
+  int power = 0;
 
-    int x = value;
-    int power = 0;
-
-    while ( ( x & 0x01 ) != 1 ) {
-        x >>= 1;
-      }
-
-    if ( x == 1 ) {
-        return value;
-      } else {
-        x = value;
-        while ( x != 0 ) {
-            x >>= 1;
-            power++;
-          }
-        switch ( scaleRule ) {
-            case SCALE_NEAREST:
-                if ( ( ( 1 << power ) - value ) <= ( value - ( 1 << ( power - 1 ) ) ) ) {
-                    return 1 << power;
-                  } else {
-                    return 1 << ( power - 1 );
-                  }
-            case SCALE_MAGNIFY:
-                return 1 << power;
-            case SCALE_MINIFY:
-                return 1 << ( power - 1 );
-            default:
-                break;
-          }
-      }
-    return 0;
+  while ((x & 0x01) != 1) {
+    x >>= 1;
   }
+
+  if (x == 1) {
+    return value;
+  } else {
+    x = value;
+    while (x != 0) {
+      x >>= 1;
+      power++;
+    }
+    switch (scaleRule) {
+    case SCALE_NEAREST:
+      if (((1 << power) - value) <= (value - (1 << (power - 1)))) {
+        return 1 << power;
+      } else {
+        return 1 << (power - 1);
+      }
+    case SCALE_MAGNIFY:
+      return 1 << power;
+    case SCALE_MINIFY:
+      return 1 << (power - 1);
+    default:
+      break;
+    }
+  }
+  return 0;
+}
diff --git a/src/libprojectM/Renderer/FBO.hpp b/src/libprojectM/Renderer/FBO.hpp
index 77a1272..21f13ec 100644
--- a/src/libprojectM/Renderer/FBO.hpp
+++ b/src/libprojectM/Renderer/FBO.hpp
@@ -24,7 +24,6 @@
  * Opaque render target
  *
  */
-
 #ifndef _RENDERTARGET_H
 #define _RENDERTARGET_H
 
@@ -47,15 +46,19 @@
 #endif
 #endif
 
-typedef enum { SCALE_NEAREST, SCALE_MAGNIFY, SCALE_MINIFY } TextureScale;
+
+typedef enum {
+  SCALE_NEAREST,
+  SCALE_MAGNIFY,
+  SCALE_MINIFY
+} TextureScale;
+
 
 class RenderTarget {
-
-
 public:
-    /** Texture size */
-    int texsize;
-  
+  /** Texture size */
+  int texsize;
+
   int useFBO;
   int renderToTexture;
 
@@ -68,22 +71,21 @@
   int nearestPower2( int value, TextureScale scaleRule );
   void fallbackRescale(int width, int height);
 
-    /** Opaque pbuffer context and pbuffer */
-/*
+  /** Opaque pbuffer context and pbuffer */
+  /*
 #ifdef MACOS
-    void *origContext;
-    void *pbufferContext;
-    void *pbuffer;
+  void *origContext;
+  void *pbufferContext;
+  void *pbuffer;
 #endif
-*/
-    /** Render target texture ID for non-pbuffer systems */
-    GLuint textureID[3];
+  */
+  /** Render target texture ID for non-pbuffer systems */
+  GLuint textureID[3];
 #ifdef USE_FBO
-    GLuint fbuffer[2]; 
-    GLuint depthb[2];
+  GLuint fbuffer[2];
+  GLuint depthb[2];
 #endif
-  };
-
+};
 
 
 #endif /** !_RENDERTARGET_H */
diff --git a/src/libprojectM/Renderer/Filters.cpp b/src/libprojectM/Renderer/Filters.cpp
index 3e831f9..f064552 100644
--- a/src/libprojectM/Renderer/Filters.cpp
+++ b/src/libprojectM/Renderer/Filters.cpp
@@ -4,7 +4,6 @@
  *  Created on: Jun 18, 2008
  *      Author: pete
  */
-
 #include "Common.hpp"
 
 #ifdef USE_GLES1
@@ -21,78 +20,82 @@
 
 #include "Filters.hpp"
 
-void Brighten::Draw(RenderContext &context)
+
+void
+Brighten::Draw(RenderContext &context)
 {
-	float points[4][2] = {{-0.5, -0.5},
-				      {-0.5,  0.5},
-				      { 0.5,  0.5},
-				      { 0.5,  -0.5}};
+  float points[4][2] = {{-0.5, -0.5},
+                        {-0.5,  0.5},
+                        { 0.5,  0.5},
+                        { 0.5,  -0.5}};
 
-	glEnableClientState(GL_VERTEX_ARRAY);
-	glVertexPointer(2,GL_FLOAT,0,points);
+  glEnableClientState(GL_VERTEX_ARRAY);
+  glVertexPointer(2,GL_FLOAT,0,points);
 
-	glColor4f(1.0, 1.0, 1.0, 1.0);
-	glBlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ZERO);
-	glDrawArrays(GL_TRIANGLE_FAN,0,4);
-	glBlendFunc(GL_ZERO, GL_DST_COLOR);
-	glDrawArrays(GL_TRIANGLE_FAN,0,4);
-	glBlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ZERO);
-	glDrawArrays(GL_TRIANGLE_FAN,0,4);
-	glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+  glColor4f(1.0, 1.0, 1.0, 1.0);
+  glBlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ZERO);
+  glDrawArrays(GL_TRIANGLE_FAN,0,4);
+  glBlendFunc(GL_ZERO, GL_DST_COLOR);
+  glDrawArrays(GL_TRIANGLE_FAN,0,4);
+  glBlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ZERO);
+  glDrawArrays(GL_TRIANGLE_FAN,0,4);
+  glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
 
-	glDisableClientState(GL_VERTEX_ARRAY);
+  glDisableClientState(GL_VERTEX_ARRAY);
 }
 
-void Darken::Draw(RenderContext &context)
+void
+Darken::Draw(RenderContext &context)
 {
-	float points[4][2] = {{-0.5, -0.5},
-				      {-0.5,  0.5},
-				      { 0.5,  0.5},
-				      { 0.5,  -0.5}};
+  float points[4][2] = {{-0.5, -0.5},
+                        {-0.5,  0.5},
+                        { 0.5,  0.5},
+                        { 0.5,  -0.5}};
 
-		glEnableClientState(GL_VERTEX_ARRAY);
-		glVertexPointer(2,GL_FLOAT,0,points);
-		glColor4f(1.0, 1.0, 1.0, 1.0);
-		glBlendFunc(GL_ZERO, GL_DST_COLOR);
-		glDrawArrays(GL_TRIANGLE_FAN,0,4);
-		glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-		glDisableClientState(GL_VERTEX_ARRAY);
+  glEnableClientState(GL_VERTEX_ARRAY);
+  glVertexPointer(2,GL_FLOAT,0,points);
+  glColor4f(1.0, 1.0, 1.0, 1.0);
+  glBlendFunc(GL_ZERO, GL_DST_COLOR);
+  glDrawArrays(GL_TRIANGLE_FAN,0,4);
+  glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+  glDisableClientState(GL_VERTEX_ARRAY);
 }
 
-void Invert::Draw(RenderContext &context)
+void
+Invert::Draw(RenderContext &context)
 {
-	float points[4][2] = {{-0.5, -0.5},
-				      {-0.5,  0.5},
-				      { 0.5,  0.5},
-				      { 0.5,  -0.5}};
+  float points[4][2] = {{-0.5, -0.5},
+                        {-0.5,  0.5},
+                        { 0.5,  0.5},
+                        { 0.5,  -0.5}};
 
-		glEnableClientState(GL_VERTEX_ARRAY);
-		glVertexPointer(2,GL_FLOAT,0,points);
-		glColor4f(1.0, 1.0, 1.0, 1.0);
-		glBlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ZERO);
-		glDrawArrays(GL_TRIANGLE_FAN,0,4);
-		glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+  glEnableClientState(GL_VERTEX_ARRAY);
+  glVertexPointer(2,GL_FLOAT,0,points);
+  glColor4f(1.0, 1.0, 1.0, 1.0);
+  glBlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ZERO);
+  glDrawArrays(GL_TRIANGLE_FAN,0,4);
+  glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
 
-		glDisableClientState(GL_VERTEX_ARRAY);
+  glDisableClientState(GL_VERTEX_ARRAY);
 }
 
-void Solarize::Draw(RenderContext &context)
+void
+Solarize::Draw(RenderContext &context)
 {
-	float points[4][2] = {{-0.5, -0.5},
-					      {-0.5,  0.5},
-					      { 0.5,  0.5},
-					      { 0.5,  -0.5}};
+  float points[4][2] = {{-0.5, -0.5},
+                        {-0.5,  0.5},
+                        { 0.5,  0.5},
+                        { 0.5,  -0.5}};
 
-	glEnableClientState(GL_VERTEX_ARRAY);
-	glVertexPointer(2,GL_FLOAT,0,points);
+  glEnableClientState(GL_VERTEX_ARRAY);
+  glVertexPointer(2,GL_FLOAT,0,points);
 
-	glColor4f(1.0, 1.0, 1.0, 1.0);
-	glBlendFunc(GL_ZERO, GL_ONE_MINUS_DST_COLOR);
-	glDrawArrays(GL_TRIANGLE_FAN,0,4);
-	glBlendFunc(GL_DST_COLOR, GL_ONE);
-	glDrawArrays(GL_TRIANGLE_FAN,0,4);
-	glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+  glColor4f(1.0, 1.0, 1.0, 1.0);
+  glBlendFunc(GL_ZERO, GL_ONE_MINUS_DST_COLOR);
+  glDrawArrays(GL_TRIANGLE_FAN,0,4);
+  glBlendFunc(GL_DST_COLOR, GL_ONE);
+  glDrawArrays(GL_TRIANGLE_FAN,0,4);
+  glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
 
-	glDisableClientState(GL_VERTEX_ARRAY);
+  glDisableClientState(GL_VERTEX_ARRAY);
 }
-
diff --git a/src/libprojectM/Renderer/Filters.hpp b/src/libprojectM/Renderer/Filters.hpp
index 6ce64da..c27668a 100644
--- a/src/libprojectM/Renderer/Filters.hpp
+++ b/src/libprojectM/Renderer/Filters.hpp
@@ -4,38 +4,38 @@
  *  Created on: Jun 18, 2008
  *      Author: pete
  */
-
 #ifndef FILTERS_HPP_
 #define FILTERS_HPP_
 
 #include "Renderable.hpp"
 
+
 class Brighten : public RenderItem
 {
 public:
-	Brighten(){}
-	void Draw(RenderContext &context);
+  Brighten(){}
+  void Draw(RenderContext &context);
 };
 
 class Darken : public RenderItem
 {
 public:
-	Darken(){}
-	void Draw(RenderContext &context);
+  Darken(){}
+  void Draw(RenderContext &context);
 };
 
 class Invert : public RenderItem
 {
 public:
-	Invert(){}
-	void Draw(RenderContext &context);
+  Invert(){}
+  void Draw(RenderContext &context);
 };
 
 class Solarize : public RenderItem
 {
 public:
-	Solarize(){}
-	void Draw(RenderContext &context);
+  Solarize(){}
+  void Draw(RenderContext &context);
 };
 
 #endif /* FILTERS_HPP_ */
diff --git a/src/libprojectM/Renderer/MilkdropWaveform.cpp b/src/libprojectM/Renderer/MilkdropWaveform.cpp
index db1181f..d6859c9 100644
--- a/src/libprojectM/Renderer/MilkdropWaveform.cpp
+++ b/src/libprojectM/Renderer/MilkdropWaveform.cpp
@@ -23,351 +23,366 @@
 #include "math.h"
 #include "BeatDetect.hpp"
 
-MilkdropWaveform::MilkdropWaveform(): RenderItem(),
-	x(0.5), y(0.5), r(1), g(0), b(0), a(1), mystery(0), mode(Line), scale(10), smoothing(0), rot(0), samples(0),modOpacityStart(0),modOpacityEnd(1),
-	modulateAlphaByVolume(false), maximizeColors(false), additive(false), dots(false), thick(false), loop(false) {}
 
-void MilkdropWaveform::Draw(RenderContext &context)
+MilkdropWaveform::MilkdropWaveform()
+  : RenderItem(),
+    x(0.5), y(0.5),
+    r(1), g(0), b(0), a(1),
+    mystery(0),
+    mode(Line),
+    scale(10),
+    smoothing(0),
+    rot(0),
+    samples(0),
+    modOpacityStart(0),
+    modOpacityEnd(1),
+    modulateAlphaByVolume(false),
+    maximizeColors(false),
+    additive(false),
+    dots(false),
+    thick(false),
+    loop(false)
+{}
+
+void
+MilkdropWaveform::Draw(RenderContext &context)
 {
-	  WaveformMath(context);
+  WaveformMath(context);
 
-	glMatrixMode( GL_MODELVIEW );
-		glPushMatrix();
-		glLoadIdentity();
+  glMatrixMode( GL_MODELVIEW );
+  glPushMatrix();
+  glLoadIdentity();
 
-		if(modulateAlphaByVolume) ModulateOpacityByVolume(context);
-		else temp_a = a;
-		MaximizeColors(context);
+  if (modulateAlphaByVolume)  ModulateOpacityByVolume(context);
+  else                        temp_a = a;
+  MaximizeColors(context);
 
-	#ifndef USE_GLES1
-		if(dots==1) glEnable(GL_LINE_STIPPLE);
-	#endif
+#ifndef USE_GLES1
+  if(dots==1) glEnable(GL_LINE_STIPPLE);
+#endif
 
-		//Thick wave drawing
-		if (thick==1)  glLineWidth( (context.texsize < 512 ) ? 2 : 2*context.texsize/512);
-		else glLineWidth( (context.texsize < 512 ) ? 1 : context.texsize/512);
+  //Thick wave drawing
+  if (thick == 1) glLineWidth( (context.texsize < 512 ) ? 2 : 2*context.texsize/512);
+  else            glLineWidth( (context.texsize < 512 ) ? 1 : context.texsize/512);
 
-		//Additive wave drawing (vice overwrite)
-		if (additive==1)glBlendFunc(GL_SRC_ALPHA, GL_ONE);
-		else glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+  //Additive wave drawing (vice overwrite)
+  if (additive == 1)  glBlendFunc(GL_SRC_ALPHA, GL_ONE);
+  else                glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
 
 
-		glTranslatef(.5, .5, 0);
-		glRotatef(rot, 0, 0, 1);
-		glScalef(aspectScale, 1.0, 1.0);
-		glTranslatef(-.5, -.5, 0);
+  glTranslatef(.5, .5, 0);
+  glRotatef(rot, 0, 0, 1);
+  glScalef(aspectScale, 1.0, 1.0);
+  glTranslatef(-.5, -.5, 0);
 
 
-		glEnableClientState(GL_VERTEX_ARRAY);
-		glDisableClientState(GL_TEXTURE_COORD_ARRAY);
-		glDisableClientState(GL_COLOR_ARRAY);
-		glVertexPointer(2,GL_FLOAT,0,wavearray);
+  glEnableClientState(GL_VERTEX_ARRAY);
+  glDisableClientState(GL_TEXTURE_COORD_ARRAY);
+  glDisableClientState(GL_COLOR_ARRAY);
+  glVertexPointer(2,GL_FLOAT,0,wavearray);
 
-		if (loop)
-		  glDrawArrays(GL_LINE_LOOP,0,samples);
-		else
-		  glDrawArrays(GL_LINE_STRIP,0,samples);
+  if (loop)
+    glDrawArrays(GL_LINE_LOOP,0,samples);
+  else
+    glDrawArrays(GL_LINE_STRIP,0,samples);
 
 
-		if (two_waves)
-		  {
-		    glVertexPointer(2,GL_FLOAT,0,wavearray2);
-		    if (loop)
-		      glDrawArrays(GL_LINE_LOOP,0,samples);
-		    else
-		      glDrawArrays(GL_LINE_STRIP,0,samples);
-		  }
+  if (two_waves)
+  {
+    glVertexPointer(2,GL_FLOAT,0,wavearray2);
+    if (loop)
+      glDrawArrays(GL_LINE_LOOP,0,samples);
+    else
+      glDrawArrays(GL_LINE_STRIP,0,samples);
+  }
 
 
-	#ifndef USE_GLES1
-		if(dots==1) glDisable(GL_LINE_STIPPLE);
-	#endif
+#ifndef USE_GLES1
+  if(dots==1) glDisable(GL_LINE_STIPPLE);
+#endif
 
-		glPopMatrix();
+  glPopMatrix();
 }
 
-void MilkdropWaveform::ModulateOpacityByVolume(RenderContext &context)
+void
+MilkdropWaveform::ModulateOpacityByVolume(RenderContext &context)
 {
+  //modulate volume by opacity
+  //
+  //set an upper and lower bound and linearly
+  //calculate the opacity from 0=lower to 1=upper
+  //based on current volume
 
-	//modulate volume by opacity
-	//
-	//set an upper and lower bound and linearly
-	//calculate the opacity from 0=lower to 1=upper
-	//based on current volume
-
-	if (context.beatDetect->vol<= modOpacityStart)  temp_a=0.0;
-	 else if (context.beatDetect->vol>=modOpacityEnd) temp_a=a;
-	 else temp_a=a*((context.beatDetect->vol-modOpacityStart)/(modOpacityEnd-modOpacityStart));
-
+  if (context.beatDetect->vol<= modOpacityStart)
+    temp_a=0.0;
+  else if (context.beatDetect->vol>=modOpacityEnd)
+    temp_a=a;
+  else
+    temp_a=a*((context.beatDetect->vol-modOpacityStart)/(modOpacityEnd-modOpacityStart));
 }
 
-void MilkdropWaveform::MaximizeColors(RenderContext &context)
+void
+MilkdropWaveform::MaximizeColors(RenderContext &context)
 {
+  float wave_r_switch=0, wave_g_switch=0, wave_b_switch=0;
 
-	float wave_r_switch=0, wave_g_switch=0, wave_b_switch=0;
-	//wave color brightening
-	//
-	//forces max color value to 1.0 and scales
-	// the rest accordingly
-	if(mode==Blob2 || mode==Blob5)
-		switch(context.texsize)
-		{
-			case 256:  temp_a *= 0.07f; break;
-			case 512:  temp_a *= 0.09f; break;
-			case 1024: temp_a *= 0.11f; break;
-			case 2048: temp_a *= 0.13f; break;
-		}
-	else if(mode==Blob3)
-	{
-		switch(context.texsize)
-		{
-			case 256:  temp_a *= 0.075f; break;
-			case 512:  temp_a *= 0.15f; break;
-			case 1024: temp_a *= 0.22f; break;
-			case 2048: temp_a *= 0.33f; break;
-		}
-		temp_a*=1.3f;
-		temp_a*=std::pow(context.beatDetect->treb , 2.0f);
-	}
+  //wave color brightening
+  //
+  //forces max color value to 1.0 and scales
+  // the rest accordingly
+  if (mode==Blob2 || mode==Blob5)
+    switch(context.texsize)
+    {
+    case 256:  temp_a *= 0.07f; break;
+    case 512:  temp_a *= 0.09f; break;
+    case 1024: temp_a *= 0.11f; break;
+    case 2048: temp_a *= 0.13f; break;
+    }
+  else if(mode==Blob3)
+  {
+    switch(context.texsize)
+    {
+    case 256:  temp_a *= 0.075f; break;
+    case 512:  temp_a *= 0.15f; break;
+    case 1024: temp_a *= 0.22f; break;
+    case 2048: temp_a *= 0.33f; break;
+    }
+    temp_a*=1.3f;
+    temp_a*=std::pow(context.beatDetect->treb , 2.0f);
+  }
 
-	if (maximizeColors==true)
-	{
-		if(r>=g && r>=b)   //red brightest
-		{
-			wave_b_switch=b*(1/r);
-			wave_g_switch=g*(1/r);
-			wave_r_switch=1.0;
-		}
-		else if   (b>=g && b>=r)         //blue brightest
-		{
-			wave_r_switch=r*(1/b);
-			wave_g_switch=g*(1/b);
-			wave_b_switch=1.0;
-
-		}
-
-		else  if (g>=b && g>=r)         //green brightest
-		{
-			wave_b_switch=b*(1/g);
-			wave_r_switch=r*(1/g);
-			wave_g_switch=1.0;
-		}
+  if (maximizeColors==true)
+  {
+    if(r>=g && r>=b)   //red brightest
+    {
+      wave_b_switch=b*(1/r);
+      wave_g_switch=g*(1/r);
+      wave_r_switch=1.0;
+    }
+    else if   (b>=g && b>=r)         //blue brightest
+    {
+      wave_r_switch=r*(1/b);
+      wave_g_switch=g*(1/b);
+      wave_b_switch=1.0;
+    }
+    else  if (g>=b && g>=r)         //green brightest
+    {
+      wave_b_switch=b*(1/g);
+      wave_r_switch=r*(1/g);
+      wave_g_switch=1.0;
+    }
 
 
-		glColor4f(wave_r_switch, wave_g_switch, wave_b_switch, temp_a * masterAlpha);
-	}
-	else
-	{
-		glColor4f(r, g, b, temp_a * masterAlpha);
-	}
+    glColor4f(wave_r_switch, wave_g_switch, wave_b_switch, temp_a * masterAlpha);
+  }
+  else
+  {
+    glColor4f(r, g, b, temp_a * masterAlpha);
+  }
 }
 
 
-void MilkdropWaveform::WaveformMath(RenderContext &context)
+void
+MilkdropWaveform::WaveformMath(RenderContext &context)
 {
+  int   i;
+  float r, theta;
 
-	int i;
+  float offset;
 
-	float r, theta;
+  float wave_x_temp=0;
+  float wave_y_temp=0;
 
-	float offset;
-
-	float wave_x_temp=0;
-	float wave_y_temp=0;
-
-	float cos_rot;
-	float sin_rot;
-
-	offset=x-.5;
-    float temp_y;
-
-	two_waves = false;
-	loop = false;
-
-	switch(mode)
-	{
-
-		case Circle:
-		  {
- 		    loop = true;
-			rot =   0;
-			aspectScale=1.0;
-			temp_y=-1*(y-1.0);
+  float cos_rot;
+  float sin_rot;
 
 
-			samples = 0? 512-32 : context.beatDetect->pcm->numsamples;
+  offset=x-.5;
+  float temp_y;
 
-			float inv_nverts_minus_one = 1.0f/(float)(samples);
+  two_waves = false;
+  loop = false;
 
-	       float last_value = context.beatDetect->pcm->pcmdataR[samples-1]+context.beatDetect->pcm->pcmdataL[samples-1];
-			float first_value = context.beatDetect->pcm->pcmdataR[0]+context.beatDetect->pcm->pcmdataL[0];
-			float offset = first_value-last_value;
-
-			for ( int i=0;i<samples;i++)
-			{
-
-			  float value = context.beatDetect->pcm->pcmdataR[i]+context.beatDetect->pcm->pcmdataL[i];
-			  value += offset * (i/(float)samples);
-
-			  r=(0.5 + 0.4f*.12*value*scale + mystery)*.5;
-			  theta=i*inv_nverts_minus_one*6.28f + context.time*0.2f;
-
-			  wavearray[i][0]=(r*cos(theta)*(context.aspectCorrect? context.aspectRatio : 1.0)+x);
-			  wavearray[i][1]=(r*sin(theta)+temp_y);
-			}
-		  }
-
-			break;
-
-		case RadialBlob://circularly moving waveform
-
-			rot =   0;
-			aspectScale = context.aspectRatio;
-
-			temp_y=-1*(y-1.0);
-
-			samples = 512-32;
-			for ( int i=0;i<512-32;i++)
-			{
-				theta=context.beatDetect->pcm->pcmdataL[i+32]*0.06*scale * 1.57 + context.time*2.3;
-				r=(0.53 + 0.43*context.beatDetect->pcm->pcmdataR[i]*0.12*scale+ mystery)*.5;
-
-				wavearray[i][0]=(r*cos(theta)*(context.aspectCorrect ? context.aspectRatio : 1.0)+x);
-				wavearray[i][1]=(r*sin(theta)+temp_y);
-			}
-
-			break;
-
-		case Blob2://EXPERIMENTAL
-
-			temp_y=-1*(y-1.0);
-			rot =   0;
-			aspectScale =1.0;
-			samples = 512-32;
-
-			for ( int i=0;i<512-32;i++)
-			{
-				wavearray[i][0]=(context.beatDetect->pcm->pcmdataR[i]*scale*0.5*(context.aspectCorrect ? context.aspectRatio : 1.0) + x);
-				wavearray[i][1]=(context.beatDetect->pcm->pcmdataL[i+32]*scale*0.5 + temp_y);
-			}
-
-			break;
-
-		case Blob3://EXPERIMENTAL
-
-			temp_y=-1*(y-1.0);
-
-			rot =   0;
-			aspectScale =1.0;
-
-			samples = 512-32;
-
-			for ( int i=0;i<512-32;i++)
-			{
-				wavearray[i][0]=(context.beatDetect->pcm->pcmdataR[i] * scale*0.5 + x);
-				wavearray[i][1]=( (context.beatDetect->pcm->pcmdataL[i+32]*scale*0.5 + temp_y));
-			}
-
-			break;
-
-		case DerivativeLine://single x-axis derivative waveform
-		{
-			rot =-mystery*90;
-			aspectScale=1.0;
-
-			temp_y=-1*(y-1.0);
-
-			float w1 = 0.45f + 0.5f*(mystery*0.5f + 0.5f);
-			float w2 = 1.0f - w1;
-			float xx[512], yy[512];
-			samples = 512-32;
-
-			for (int i=0; i<512-32; i++)
-			{
-				xx[i] = -1.0f + 2.0f*(i/(512.0-32.0)) + x;
-				yy[i] =0.4* context.beatDetect->pcm->pcmdataL[i]*0.47f*scale + temp_y;
-				xx[i] += 0.4*context.beatDetect->pcm->pcmdataR[i]*0.44f*scale;
-
-				if (i>1)
-				{
-					xx[i] = xx[i]*w2 + w1*(xx[i-1]*2.0f - xx[i-2]);
-					yy[i] = yy[i]*w2 + w1*(yy[i-1]*2.0f - yy[i-2]);
-				}
-				wavearray[i][0]=xx[i];
-				wavearray[i][1]=yy[i];
-			}											   		}
-		break;
-
-		case Blob5://EXPERIMENTAL
-
-			rot = 0;
-			aspectScale =1.0;
-
-			temp_y=-1*(y-1.0);
-
-			cos_rot = cosf(context.time*0.3f);
-			sin_rot = sinf(context.time*0.3f);
-			samples = 512-32;
-
-			for ( int i=0;i<512-32;i++)
-			{
-				float x0 = (context.beatDetect->pcm->pcmdataR[i]*context.beatDetect->pcm->pcmdataL[i+32] + context.beatDetect->pcm->pcmdataL[i+32]*context.beatDetect->pcm->pcmdataR[i]);
-				float y0 = (context.beatDetect->pcm->pcmdataR[i]*context.beatDetect->pcm->pcmdataR[i] - context.beatDetect->pcm->pcmdataL[i+32]*context.beatDetect->pcm->pcmdataL[i+32]);
-				wavearray[i][0]=((x0*cos_rot - y0*sin_rot)*scale*0.5*(context.aspectCorrect ? context.aspectRatio : 1.0) + x);
-				wavearray[i][1]=( (x0*sin_rot + y0*cos_rot)*scale*0.5 + temp_y);
-			}
-			break;
-
-		case Line://single waveform
+  switch(mode)
+  {
+  case Circle:
+    {
+      loop = true;
+      rot =   0;
+      aspectScale=1.0;
+      temp_y=-1*(y-1.0);
 
 
-			wave_x_temp=-2*0.4142*(fabs(fabs(mystery)-.5)-.5);
+      samples = 0? 512-32 : context.beatDetect->pcm->numsamples;
 
-			rot = -mystery*90;
-			aspectScale =1.0+wave_x_temp;
-			wave_x_temp=-1*(x-1.0);
-			samples = 0 ? 512-32 : context.beatDetect->pcm->numsamples;
+      float inv_nverts_minus_one = 1.0f/(float)(samples);
 
-			for ( int i=0;i<  samples;i++)
-			{
+      float last_value = context.beatDetect->pcm->pcmdataR[samples-1]+context.beatDetect->pcm->pcmdataL[samples-1];
+      float first_value = context.beatDetect->pcm->pcmdataR[0]+context.beatDetect->pcm->pcmdataL[0];
+      float offset = first_value-last_value;
 
-				wavearray[i][0]=i/(float)  samples;
-				wavearray[i][1]=context.beatDetect->pcm->pcmdataR[i]*.04*scale+wave_x_temp;
+      for ( int i=0;i<samples;i++)
+      {
+        float value = context.beatDetect->pcm->pcmdataR[i]+context.beatDetect->pcm->pcmdataL[i];
+        value += offset * (i/(float)samples);
 
-			}
-			//	  printf("%f %f\n",renderTarget->texsize*wave_y_temp,wave_y_temp);
+        r=(0.5 + 0.4f*.12*value*scale + mystery)*.5;
+        theta=i*inv_nverts_minus_one*6.28f + context.time*0.2f;
 
-			break;
+        wavearray[i][0]=(r*cos(theta)*(context.aspectCorrect? context.aspectRatio : 1.0)+x);
+        wavearray[i][1]=(r*sin(theta)+temp_y);
+      }
+    }
 
-		case DoubleLine://dual waveforms
+    break;
+
+  case RadialBlob://circularly moving waveform
+
+    rot =   0;
+    aspectScale = context.aspectRatio;
+
+    temp_y=-1*(y-1.0);
+
+    samples = 512-32;
+    for ( int i=0;i<512-32;i++)
+    {
+      theta=context.beatDetect->pcm->pcmdataL[i+32]*0.06*scale * 1.57 + context.time*2.3;
+      r=(0.53 + 0.43*context.beatDetect->pcm->pcmdataR[i]*0.12*scale+ mystery)*.5;
+
+      wavearray[i][0]=(r*cos(theta)*(context.aspectCorrect ? context.aspectRatio : 1.0)+x);
+      wavearray[i][1]=(r*sin(theta)+temp_y);
+    }
+
+    break;
+
+  case Blob2://EXPERIMENTAL
+
+    temp_y=-1*(y-1.0);
+    rot =   0;
+    aspectScale =1.0;
+    samples = 512-32;
+
+    for ( int i=0;i<512-32;i++)
+    {
+      wavearray[i][0]=(context.beatDetect->pcm->pcmdataR[i]*scale*0.5*(context.aspectCorrect ? context.aspectRatio : 1.0) + x);
+      wavearray[i][1]=(context.beatDetect->pcm->pcmdataL[i+32]*scale*0.5 + temp_y);
+    }
+
+    break;
+
+  case Blob3://EXPERIMENTAL
+
+    temp_y=-1*(y-1.0);
+
+    rot =   0;
+    aspectScale =1.0;
+
+    samples = 512-32;
+
+    for ( int i=0;i<512-32;i++)
+    {
+      wavearray[i][0]=(context.beatDetect->pcm->pcmdataR[i] * scale*0.5 + x);
+      wavearray[i][1]=( (context.beatDetect->pcm->pcmdataL[i+32]*scale*0.5 + temp_y));
+    }
+
+    break;
+
+  case DerivativeLine://single x-axis derivative waveform
+    {
+      rot =-mystery*90;
+      aspectScale=1.0;
+
+      temp_y=-1*(y-1.0);
+
+      float w1 = 0.45f + 0.5f*(mystery*0.5f + 0.5f);
+      float w2 = 1.0f - w1;
+      float xx[512], yy[512];
+      samples = 512-32;
+
+      for (int i=0; i<512-32; i++)
+      {
+        xx[i] = -1.0f + 2.0f*(i/(512.0-32.0)) + x;
+        yy[i] =0.4* context.beatDetect->pcm->pcmdataL[i]*0.47f*scale + temp_y;
+        xx[i] += 0.4*context.beatDetect->pcm->pcmdataR[i]*0.44f*scale;
+
+        if (i>1)
+        {
+          xx[i] = xx[i]*w2 + w1*(xx[i-1]*2.0f - xx[i-2]);
+          yy[i] = yy[i]*w2 + w1*(yy[i-1]*2.0f - yy[i-2]);
+        }
+        wavearray[i][0]=xx[i];
+        wavearray[i][1]=yy[i];
+      }
+    }
+    break;
+
+  case Blob5://EXPERIMENTAL
+
+    rot = 0;
+    aspectScale =1.0;
+
+    temp_y=-1*(y-1.0);
+
+    cos_rot = cosf(context.time*0.3f);
+    sin_rot = sinf(context.time*0.3f);
+    samples = 512-32;
+
+    for ( int i=0;i<512-32;i++)
+    {
+      float x0 = (  context.beatDetect->pcm->pcmdataR[i] * context.beatDetect->pcm->pcmdataL[i + 32]
+                  + context.beatDetect->pcm->pcmdataL[i + 32] * context.beatDetect->pcm->pcmdataR[i]);
+      float y0 = (  context.beatDetect->pcm->pcmdataR[i] * context.beatDetect->pcm->pcmdataR[i]
+                  - context.beatDetect->pcm->pcmdataL[i + 32] * context.beatDetect->pcm->pcmdataL[i + 32]);
+      wavearray[i][0] = ((x0*cos_rot - y0*sin_rot)*scale*0.5*(context.aspectCorrect ? context.aspectRatio : 1.0) + x);
+      wavearray[i][1] = ( (x0*sin_rot + y0*cos_rot)*scale*0.5 + temp_y);
+    }
+    break;
+
+  case Line://single waveform
+
+    wave_x_temp=-2*0.4142*(fabs(fabs(mystery)-.5)-.5);
+
+    rot = -mystery*90;
+    aspectScale =1.0+wave_x_temp;
+    wave_x_temp=-1*(x-1.0);
+    samples = 0 ? 512-32 : context.beatDetect->pcm->numsamples;
+
+    for ( int i=0;i<  samples;i++)
+    {
+      wavearray[i][0]=i/(float)  samples;
+      wavearray[i][1]=context.beatDetect->pcm->pcmdataR[i]*.04*scale+wave_x_temp;
+    }
+    //    printf("%f %f\n",renderTarget->texsize*wave_y_temp,wave_y_temp);
+
+    break;
+
+  case DoubleLine://dual waveforms
+
+    wave_x_temp=-2*0.4142*(fabs(fabs(mystery)-.5)-.5);
+
+    rot = -mystery*90;
+    aspectScale =1.0+wave_x_temp;
 
 
-			wave_x_temp=-2*0.4142*(fabs(fabs(mystery)-.5)-.5);
+    samples = 0 ? 512-32 : context.beatDetect->pcm->numsamples;
+    two_waves = true;
 
-			rot = -mystery*90;
-			aspectScale =1.0+wave_x_temp;
+    double y_adj = y*y*.5;
 
+    wave_y_temp=-1*(x-1);
 
-			samples = 0 ? 512-32 : context.beatDetect->pcm->numsamples;
-			two_waves = true;
+    for ( int i=0;i<samples;i++)
+    {
+      wavearray[i][0]=i/((float)  samples);
+      wavearray[i][1]= context.beatDetect->pcm->pcmdataL[i]*.04*scale+(wave_y_temp+y_adj);
+    }
 
-			double y_adj = y*y*.5;
+    for ( int i=0;i<samples;i++)
+    {
+      wavearray2[i][0]=i/((float)  samples);
+      wavearray2[i][1]=context.beatDetect->pcm->pcmdataR[i]*.04*scale+(wave_y_temp-y_adj);
+    }
 
-			wave_y_temp=-1*(x-1);
-
-			for ( int i=0;i<samples;i++)
-			{
-				wavearray[i][0]=i/((float)  samples);
-				wavearray[i][1]= context.beatDetect->pcm->pcmdataL[i]*.04*scale+(wave_y_temp+y_adj);
-			}
-
-			for ( int i=0;i<samples;i++)
-			{
-				wavearray2[i][0]=i/((float)  samples);
-				wavearray2[i][1]=context.beatDetect->pcm->pcmdataR[i]*.04*scale+(wave_y_temp-y_adj);
-			}
-
-			break;
-
-	}
+    break;
+  }
 }
diff --git a/src/libprojectM/Renderer/MilkdropWaveform.hpp b/src/libprojectM/Renderer/MilkdropWaveform.hpp
index cdafd93..13a499b 100644
--- a/src/libprojectM/Renderer/MilkdropWaveform.hpp
+++ b/src/libprojectM/Renderer/MilkdropWaveform.hpp
@@ -4,62 +4,68 @@
  *  Created on: Jun 25, 2008
  *      Author: pete
  */
-
 #ifndef MILKDROPWAVEFORM_HPP_
 #define MILKDROPWAVEFORM_HPP_
 
 #include "Renderable.hpp"
 
+
 enum MilkdropWaveformMode
-	{
-	  Circle=0, RadialBlob, Blob2, Blob3, DerivativeLine, Blob5, Line, DoubleLine
-	};
+{
+  Circle=0,
+  RadialBlob,
+  Blob2,
+  Blob3,
+  DerivativeLine,
+  Blob5,
+  Line,
+  DoubleLine
+};
 
 
 class MilkdropWaveform : public RenderItem
 {
 public:
+  float x;
+  float y;
 
+  float r;
+  float g;
+  float b;
+  float a;
 
-	float x;
-	float y;
+  float mystery;
 
-	float r;
-	float g;
-	float b;
-	float a;
+  MilkdropWaveformMode mode;
 
-	float mystery;
+  bool  additive;
+  bool  dots;
+  bool  thick;
+  bool  modulateAlphaByVolume;
+  bool  maximizeColors;
+  float scale;
+  float smoothing;
 
-    MilkdropWaveformMode mode;
+  MilkdropWaveform();
+  void Draw(RenderContext &context);
 
-	bool additive;
-	bool dots;
-	bool thick;
-	bool modulateAlphaByVolume;
-	bool maximizeColors;
-	float scale;
-	float smoothing;
-
-	MilkdropWaveform();
-	void Draw(RenderContext &context);
-
-	float modOpacityStart;
-	float modOpacityEnd;
+  float modOpacityStart;
+  float modOpacityEnd;
 
 private:
-	float temp_a;
-	float rot;
-	float aspectScale;
-	int samples;
-	bool two_waves;
-	bool loop;
-	float wavearray[2048][2];
-	float wavearray2[2048][2];
+  float temp_a;
+  float rot;
+  float aspectScale;
+  int   samples;
+  bool  two_waves;
+  bool  loop;
+  float wavearray[2048][2];
+  float wavearray2[2048][2];
 
-	void MaximizeColors(RenderContext &context);
-	void ModulateOpacityByVolume(RenderContext &context);
-	void WaveformMath(RenderContext &context);
+  void MaximizeColors(RenderContext &context);
+  void ModulateOpacityByVolume(RenderContext &context);
+  void WaveformMath(RenderContext &context);
 
 };
+
 #endif /* MILKDROPWAVEFORM_HPP_ */
diff --git a/src/libprojectM/Renderer/PerPixelMesh.cpp b/src/libprojectM/Renderer/PerPixelMesh.cpp
index c378133..1b89f0c 100644
--- a/src/libprojectM/Renderer/PerPixelMesh.cpp
+++ b/src/libprojectM/Renderer/PerPixelMesh.cpp
@@ -4,45 +4,49 @@
 #include "omptl/omptl"
 #include "omptl/omptl_algorithm"
 
-PerPixelMesh::PerPixelMesh(int width, int height) : width(width), height(height), size (width * height),
-		p(width * height, PixelPoint(0,0)),
-		p_original(width * height, PixelPoint(0,0)),
-		identity(width * height, PerPixelContext(0,0,0,0,0,0))
-		{
-		for (int j=0;j<height;j++)
-			for(int i=0;i<width;i++)
-			{
-				int index = j * width + i;
 
-						float xval=i/(float)(width-1);
-						float yval=-((j/(float)(height-1))-1);
-
-						p[index].x = xval;
-						p[index].y = yval;
-
-						p_original[index].x = xval;
-						p_original[index].y = yval;
-
-						identity[index].x= xval;
-						identity[index].y= yval;
-
-						//identity[index].x= (xval-.5)*2;
-						//identity[index].y= (yval-.5)*2;
-
-						identity[index].i= i;
-						identity[index].j= j;
-
-						identity[index].rad=hypot ( ( xval-.5 ) *2, ( yval-.5 ) *2 ) * .7071067;
-						identity[index].theta=atan2 ( ( yval-.5 ) *2 ,  ( xval-.5 ) *2  );
-			}
-		}
-
-void PerPixelMesh::Reset()
+PerPixelMesh::PerPixelMesh (int width, int height)
+  : width(width), height(height),
+    size (width * height),
+    p(width * height, PixelPoint(0,0)),
+    p_original(width * height, PixelPoint(0,0)),
+    identity(width * height, PerPixelContext(0,0,0,0,0,0))
 {
-	omptl::copy(p_original.begin(), p_original.end(), p.begin());
+  for (int j = 0;  j < height;  j++)
+    for (int i = 0;  i < width;  i++)
+    {
+      int index = j * width + i;
+
+      float xval = i / (float) (width - 1);
+      float yval = -((j / (float) (height - 1)) - 1);
+
+      p[index].x = xval;
+      p[index].y = yval;
+
+      p_original[index].x = xval;
+      p_original[index].y = yval;
+
+      identity[index].x= xval;
+      identity[index].y= yval;
+
+      //identity[index].x= (xval-.5)*2;
+      //identity[index].y= (yval-.5)*2;
+
+      identity[index].i= i;
+      identity[index].j= j;
+
+      identity[index].rad=hypot ( ( xval-.5 ) *2, ( yval-.5 ) *2 ) * .7071067;
+      identity[index].theta=atan2 ( ( yval-.5 ) *2 ,  ( xval-.5 ) *2  );
+    }
+}
+
+void
+PerPixelMesh::Reset()
+{
+  omptl::copy(p_original.begin(), p_original.end(), p.begin());
 }
 
 PixelPoint::PixelPoint(float x, float y)
-	: x(x), y(y) {}
+  : x(x), y(y) {}
 PerPixelContext::PerPixelContext(float x, float y, float rad, float theta, int i, int j)
-	: x(x), y(y), rad(rad), theta(theta), i(i), j(j) {}
+  : x(x), y(y), rad(rad), theta(theta), i(i), j(j) {}
diff --git a/src/libprojectM/Renderer/PerPixelMesh.hpp b/src/libprojectM/Renderer/PerPixelMesh.hpp
index f37a2b1..3b47a09 100644
--- a/src/libprojectM/Renderer/PerPixelMesh.hpp
+++ b/src/libprojectM/Renderer/PerPixelMesh.hpp
@@ -3,43 +3,43 @@
 
 #include <vector>
 
+
 struct PixelPoint
 {
-	float x;
-	float y;
+  float x;
+  float y;
 
-	PixelPoint(float x, float y);
+  PixelPoint(float x, float y);
 };
 
 struct PerPixelContext
 {
-	float x;
-	float y;
-	float rad;
-	float theta;
+  float x;
+  float y;
+  float rad;
+  float theta;
 
-	int i;
-	int j;
+  int i;
+  int j;
 
-	PerPixelContext(float x, float y, float rad, float theta, int i, int j);
+  PerPixelContext(float x, float y, float rad, float theta, int i, int j);
 };
 
 class PerPixelMesh
 {
 public:
-	int width;
-	int height;
-	int size;
+  int width;
+  int height;
+  int size;
 
-	std::vector<PixelPoint> p;
-	std::vector<PixelPoint> p_original;
-	std::vector<PerPixelContext> identity;
+  std::vector<PixelPoint> p;
+  std::vector<PixelPoint> p_original;
+  std::vector<PerPixelContext> identity;
 
-	PerPixelMesh(int width, int height);
+  PerPixelMesh(int width, int height);
 
-	void Reset();
+  void Reset();
 };
 
 
-
 #endif
diff --git a/src/libprojectM/Renderer/PerlinNoise.cpp b/src/libprojectM/Renderer/PerlinNoise.cpp
index a6bda55..2fefa2b 100644
--- a/src/libprojectM/Renderer/PerlinNoise.cpp
+++ b/src/libprojectM/Renderer/PerlinNoise.cpp
@@ -4,50 +4,50 @@
  *  Created on: Jul 11, 2008
  *      Author: pete
  */
-
 #include "PerlinNoise.hpp"
 #include <iostream>
 #include <stdlib.h>
 
+
 PerlinNoise::PerlinNoise()
 {
-	for (int x = 0; x < 256;x++)
-		for (int y = 0; y < 256;y++)
-			noise_lq[x][y] = noise(x , y);
+  for (int x = 0; x < 256;x++)
+    for (int y = 0; y < 256;y++)
+      noise_lq[x][y] = noise(x , y);
 
-	for (int x = 0; x < 32;x++)
-		for (int y = 0; y < 32;y++)
-			noise_lq_lite[x][y] = noise(4*x,16*y);
+  for (int x = 0; x < 32;x++)
+    for (int y = 0; y < 32;y++)
+      noise_lq_lite[x][y] = noise(4*x,16*y);
 
-	for (int x = 0; x < 256;x++)
-		for (int y = 0; y < 256;y++)
-			noise_mq[x][y] = InterpolatedNoise((float)x/(float)2.0,(float)y/(float)2.0);
+  for (int x = 0; x < 256;x++)
+    for (int y = 0; y < 256;y++)
+      noise_mq[x][y] = InterpolatedNoise((float)x/(float)2.0,(float)y/(float)2.0);
 
-	for (int x = 0; x < 256;x++)
-		for (int y = 0; y < 256;y++)
-			noise_hq[x][y] = InterpolatedNoise((float)x/(float)3.0,(float)y/(float)3.0);
+  for (int x = 0; x < 256;x++)
+    for (int y = 0; y < 256;y++)
+      noise_hq[x][y] = InterpolatedNoise((float)x/(float)3.0,(float)y/(float)3.0);
 
-	for (int x = 0; x < 32;x++)
-		for (int y = 0; y < 32;y++)
-			for (int z = 0; z < 32;z++)
-				noise_lq_vol[x][y][z] = noise(x,y,z);
+  for (int x = 0; x < 32;x++)
+    for (int y = 0; y < 32;y++)
+      for (int z = 0; z < 32;z++)
+        noise_lq_vol[x][y][z] = noise(x,y,z);
 
-	for (int x = 0; x < 32;x++)
-		for (int y = 0; y < 32;y++)
-			for (int z = 0; z < 32;z++)
-				noise_hq_vol[x][y][z] = noise(x,y,z);//perlin_noise_3d(x,y,z,6121,7,seed3,0.5,64);
+  for (int x = 0; x < 32;x++)
+    for (int y = 0; y < 32;y++)
+      for (int z = 0; z < 32;z++)
+        noise_hq_vol[x][y][z] = noise(x,y,z);//perlin_noise_3d(x,y,z,6121,7,seed3,0.5,64);
 
-	int seed = rand()%1000;
+  int seed = rand()%1000;
 
-	int size = 512;
-	int octaves = sqrt((double)size);
+  int size = 512;
+  int octaves = sqrt((double)size);
 
-		for (int x = 0; x < size;x++)
-			for (int y = 0; y < size;y++)
-				noise_perlin[x][y] = perlin_noise_2d(x,y,6321,octaves,seed,0.5,size/4);
+    for (int x = 0; x < size;x++)
+      for (int y = 0; y < size;y++)
+        noise_perlin[x][y] = perlin_noise_2d(x,y,6321,octaves,seed,0.5,size/4);
 }
 
 PerlinNoise::~PerlinNoise()
 {
-	// TODO Auto-generated destructor stub
+  // TODO Auto-generated destructor stub
 }
diff --git a/src/libprojectM/Renderer/PerlinNoise.hpp b/src/libprojectM/Renderer/PerlinNoise.hpp
index e1193d7..fc77808 100644
--- a/src/libprojectM/Renderer/PerlinNoise.hpp
+++ b/src/libprojectM/Renderer/PerlinNoise.hpp
@@ -10,232 +10,227 @@
 
 #include <math.h>
 
+
 class PerlinNoise
 {
 public:
-
-	float noise_lq[256][256];
-	float noise_lq_lite[32][32];
-	float noise_mq[256][256];
-	float noise_hq[256][256];
-	float noise_perlin[512][512];
-	float noise_lq_vol[32][32][32];
-	float noise_hq_vol[32][32][32];
+  float noise_lq[256][256];
+  float noise_lq_lite[32][32];
+  float noise_mq[256][256];
+  float noise_hq[256][256];
+  float noise_perlin[512][512];
+  float noise_lq_vol[32][32][32];
+  float noise_hq_vol[32][32][32];
 
 
-	PerlinNoise();
-	virtual ~PerlinNoise();
+  PerlinNoise();
+  virtual ~PerlinNoise();
 
 private:
 
-	static inline float noise( int x)
-	{
-	    x = (x<<13)^x;
-	    return (((x * (x * x * 15731 + 789221) + 1376312589) & 0x7fffffff) / 2147483648.0);
-	   }
+  static inline float noise( int x)
+  {
+    x = (x<<13)^x;
+    return (((x * (x * x * 15731 + 789221) + 1376312589) & 0x7fffffff) / 2147483648.0);
+  }
 
-	static inline float noise(int x, int y)
-	{
-		 int n = x + y * 57;
-		 return noise(n);
-	}
+  static inline float noise(int x, int y)
+  {
+    int n = x + y * 57;
+    return noise(n);
+  }
 
-	static inline float noise(int x, int y, int z)
-	{
-		 int n = x + y * 57 + z * 141;
-		 return noise(n);
-	}
+  static inline float noise(int x, int y, int z)
+  {
+    int n = x + y * 57 + z * 141;
+    return noise(n);
+  }
 
-	static inline float cos_interp(float a, float b, float x)
-	{
-		float ft = x * 3.1415927;
-		float f = (1 - cos(ft)) * .5;
+  static inline float cos_interp(float a, float b, float x)
+  {
+    float ft = x * 3.1415927;
+    float f = (1 - cos(ft)) * .5;
 
-		return  a*(1-f) + b*f;
-	}
+    return  a*(1-f) + b*f;
+  }
 
-	static inline float cubic_interp(float v0, float v1, float v2, float v3, float x)
-	{
-		float P = (v3 - v2) - (v0 - v1);
-		float Q = (v0 - v1) - P;
-		float R = v2 - v0;
+  static inline float cubic_interp(float v0, float v1, float v2, float v3, float x)
+  {
+    float P = (v3 - v2) - (v0 - v1);
+    float Q = (v0 - v1) - P;
+    float R = v2 - v0;
 
-		return P*pow(x,3) + Q * pow(x,2) + R*x + v1;
-	}
+    return P*pow(x,3) + Q * pow(x,2) + R*x + v1;
+  }
 
-	static inline float InterpolatedNoise(float x, float y)
-	{
-		int integer_X = int(x);
-		float fractional_X = x - integer_X;
+  static inline float InterpolatedNoise(float x, float y)
+  {
+    int integer_X = int(x);
+    float fractional_X = x - integer_X;
 
-		int integer_Y = int(y);
-		float fractional_Y = y - integer_Y;
+    int integer_Y = int(y);
+    float fractional_Y = y - integer_Y;
 
-		float a0 = noise(integer_X - 1,      integer_Y - 1);
-		float a1 = noise(integer_X,          integer_Y - 1);
-		float a2 = noise(integer_X + 1,      integer_Y - 1);
-		float a3 = noise(integer_X + 2,      integer_Y - 1);
+    float a0 = noise(integer_X - 1,      integer_Y - 1);
+    float a1 = noise(integer_X,          integer_Y - 1);
+    float a2 = noise(integer_X + 1,      integer_Y - 1);
+    float a3 = noise(integer_X + 2,      integer_Y - 1);
 
-		float x0 = noise(integer_X - 1,      integer_Y);
-		float x1 = noise(integer_X,          integer_Y);
-		float x2 = noise(integer_X + 1,      integer_Y);
-		float x3 = noise(integer_X + 2,      integer_Y);
+    float x0 = noise(integer_X - 1,      integer_Y);
+    float x1 = noise(integer_X,          integer_Y);
+    float x2 = noise(integer_X + 1,      integer_Y);
+    float x3 = noise(integer_X + 2,      integer_Y);
 
-		float y0 = noise(integer_X + 0,   	 integer_Y + 1);
-		float y1 = noise(integer_X,     	 integer_Y + 1);
-		float y2 = noise(integer_X + 1, 	 integer_Y + 1);
-		float y3 = noise(integer_X + 2, 	 integer_Y + 1);
+    float y0 = noise(integer_X + 0,      integer_Y + 1);
+    float y1 = noise(integer_X,        integer_Y + 1);
+    float y2 = noise(integer_X + 1,    integer_Y + 1);
+    float y3 = noise(integer_X + 2,    integer_Y + 1);
 
-		float b0 = noise(integer_X - 1,      integer_Y + 2);
-		float b1 = noise(integer_X,          integer_Y + 2);
-		float b2 = noise(integer_X + 1,      integer_Y + 2);
-		float b3 = noise(integer_X + 2,      integer_Y + 2);
+    float b0 = noise(integer_X - 1,      integer_Y + 2);
+    float b1 = noise(integer_X,          integer_Y + 2);
+    float b2 = noise(integer_X + 1,      integer_Y + 2);
+    float b3 = noise(integer_X + 2,      integer_Y + 2);
 
-		float i0 = cubic_interp(a0 , a1, a2, a3, fractional_X);
-		float i1 = cubic_interp(x0 , x1, x2, x3, fractional_X);
-		float i2 = cubic_interp(y0 , y1, y2, y3, fractional_X);
-		float i3 = cubic_interp(b0 , b1, b2, b3, fractional_X);
+    float i0 = cubic_interp(a0 , a1, a2, a3, fractional_X);
+    float i1 = cubic_interp(x0 , x1, x2, x3, fractional_X);
+    float i2 = cubic_interp(y0 , y1, y2, y3, fractional_X);
+    float i3 = cubic_interp(b0 , b1, b2, b3, fractional_X);
 
-		return cubic_interp(i0, i1 , i2 , i3, fractional_Y);
+    return cubic_interp(i0, i1 , i2 , i3, fractional_Y);
 
-	}
+  }
 
-	static inline float perlin_octave_2d(float x,float y, int width, int seed, float period)
-	{
+  static inline float perlin_octave_2d(float x,float y, int width, int seed, float period)
+  {
+    float freq=1/(float)(period);
 
-	           float freq=1/(float)(period);
+    int num=(int)(width*freq);
+    int step_x=(int)(x*freq);
+    int step_y=(int)(y*freq);
+    float zone_x=x*freq-step_x;
+    float zone_y=y*freq-step_y;
+    int box=step_x+step_y*num;
+    int noisedata=(box+seed);
 
-	           int num=(int)(width*freq);
-	           int step_x=(int)(x*freq);
-	           int step_y=(int)(y*freq);
-	           float zone_x=x*freq-step_x;
-	           float zone_y=y*freq-step_y;
-	           int box=step_x+step_y*num;
-	           int noisedata=(box+seed);
+    float u=cubic_interp(noise(noisedata-num-1),noise(noisedata-num),noise(noisedata-num+1),noise(noisedata-num+2),zone_x);
+    float a=cubic_interp(noise(noisedata-1),noise(noisedata),noise(noisedata+1),noise(noisedata+2),zone_x);
+    float b=cubic_interp(noise(noisedata+num -1),noise(noisedata+num),noise(noisedata+1+num),noise(noisedata+2+num),zone_x);
+    float v=cubic_interp(noise(noisedata+2*num -1),noise(noisedata+2*num),noise(noisedata+1+2*num),noise(noisedata+2+2*num),zone_x);
 
-	           float u=cubic_interp(noise(noisedata-num-1),noise(noisedata-num),noise(noisedata-num+1),noise(noisedata-num+2),zone_x);
-	           float a=cubic_interp(noise(noisedata-1),noise(noisedata),noise(noisedata+1),noise(noisedata+2),zone_x);
-	           float b=cubic_interp(noise(noisedata+num -1),noise(noisedata+num),noise(noisedata+1+num),noise(noisedata+2+num),zone_x);
-	           float v=cubic_interp(noise(noisedata+2*num -1),noise(noisedata+2*num),noise(noisedata+1+2*num),noise(noisedata+2+2*num),zone_x);
+    float value=cubic_interp(u,a,b,v,zone_y);
 
-	           float value=cubic_interp(u,a,b,v,zone_y);
-
-	          return value;
-	}
+    return value;
+  }
 
 
-	static inline float perlin_octave_2d_cos(float x,float y, int width, int seed, float period)
-		{
+  static inline float perlin_octave_2d_cos(float x,float y, int width, int seed, float period)
+  {
+    float freq=1/(float)(period);
 
-		           float freq=1/(float)(period);
+    int num=(int)(width*freq);
+    int step_x=(int)(x*freq);
+    int step_y=(int)(y*freq);
+    float zone_x=x*freq-step_x;
+    float zone_y=y*freq-step_y;
+    int box=step_x+step_y*num;
+    int noisedata=(box+seed);
 
-		           int num=(int)(width*freq);
-		           int step_x=(int)(x*freq);
-		           int step_y=(int)(y*freq);
-		           float zone_x=x*freq-step_x;
-		           float zone_y=y*freq-step_y;
-		           int box=step_x+step_y*num;
-		           int noisedata=(box+seed);
+    float a=cos_interp(noise(noisedata),noise(noisedata+1),zone_x);
+    float b=cos_interp(noise(noisedata+num),noise(noisedata+1+num),zone_x);
 
-		           float a=cos_interp(noise(noisedata),noise(noisedata+1),zone_x);
-		           float b=cos_interp(noise(noisedata+num),noise(noisedata+1+num),zone_x);
+    float value=cos_interp(a,b,zone_y);
 
-		           float value=cos_interp(a,b,zone_y);
-
-		          return value;
-		}
+    return value;
+  }
 
 
 
-	static inline float perlin_octave_3d(float x,float y, float z,int width, int seed, float period)
-		{
-		           float freq=1/(float)(period);
+  static inline float perlin_octave_3d(float x,float y, float z,int width, int seed, float period)
+  {
+    float freq=1/(float)(period);
 
-		           int num=(int)(width*freq);
-		           int step_x=(int)(x*freq);
-		           int step_y=(int)(y*freq);
-		           int step_z=(int)(z*freq);
-		           float zone_x=x*freq-step_x;
-		           float zone_y=y*freq-step_y;
-		           float zone_z=z*freq-step_z;
+    int num=(int)(width*freq);
+    int step_x=(int)(x*freq);
+    int step_y=(int)(y*freq);
+    int step_z=(int)(z*freq);
+    float zone_x=x*freq-step_x;
+    float zone_y=y*freq-step_y;
+    float zone_z=z*freq-step_z;
 
-		           int boxB=step_x+step_y+step_z*num;
-		           int boxC=step_x+step_y+step_z*(num+1);
-		           int boxD=step_x+step_y+step_z*(num+2);
-		           int boxA=step_x+step_y+step_z*(num-1);
+    int boxB=step_x+step_y+step_z*num;
+    int boxC=step_x+step_y+step_z*(num+1);
+    int boxD=step_x+step_y+step_z*(num+2);
+    int boxA=step_x+step_y+step_z*(num-1);
 
-		           float u,a,b,v,noisedata,box;
+    float u,a,b,v,noisedata,box;
 
-		           box = boxA;
-		           noisedata=(box+seed);
-		           u=cubic_interp(noise(noisedata-num-1),noise(noisedata-num),noise(noisedata-num+1),noise(noisedata-num+2),zone_x);
-		           a=cubic_interp(noise(noisedata-1),noise(noisedata),noise(noisedata+1),noise(noisedata+2),zone_x);
-		           b=cubic_interp(noise(noisedata+num -1),noise(noisedata+num),noise(noisedata+1+num),noise(noisedata+2+num),zone_x);
-		           v=cubic_interp(noise(noisedata+2*num -1),noise(noisedata+2*num),noise(noisedata+1+2*num),noise(noisedata+2+2*num),zone_x);
-		           float A=cubic_interp(u,a,b,v,zone_y);
+    box = boxA;
+    noisedata=(box+seed);
+    u=cubic_interp(noise(noisedata-num-1),noise(noisedata-num),noise(noisedata-num+1),noise(noisedata-num+2),zone_x);
+    a=cubic_interp(noise(noisedata-1),noise(noisedata),noise(noisedata+1),noise(noisedata+2),zone_x);
+    b=cubic_interp(noise(noisedata+num -1),noise(noisedata+num),noise(noisedata+1+num),noise(noisedata+2+num),zone_x);
+    v=cubic_interp(noise(noisedata+2*num -1),noise(noisedata+2*num),noise(noisedata+1+2*num),noise(noisedata+2+2*num),zone_x);
+    float A=cubic_interp(u,a,b,v,zone_y);
 
-		           box = boxB;
-		           noisedata=(box+seed);
-		           u=cubic_interp(noise(noisedata-num-1),noise(noisedata-num),noise(noisedata-num+1),noise(noisedata-num+2),zone_x);
-		           a=cubic_interp(noise(noisedata-1),noise(noisedata),noise(noisedata+1),noise(noisedata+2),zone_x);
-		           b=cubic_interp(noise(noisedata+num -1),noise(noisedata+num),noise(noisedata+1+num),noise(noisedata+2+num),zone_x);
-		           v=cubic_interp(noise(noisedata+2*num -1),noise(noisedata+2*num),noise(noisedata+1+2*num),noise(noisedata+2+2*num),zone_x);
-		           float B=cubic_interp(u,a,b,v,zone_y);
+    box = boxB;
+    noisedata=(box+seed);
+    u=cubic_interp(noise(noisedata-num-1),noise(noisedata-num),noise(noisedata-num+1),noise(noisedata-num+2),zone_x);
+    a=cubic_interp(noise(noisedata-1),noise(noisedata),noise(noisedata+1),noise(noisedata+2),zone_x);
+    b=cubic_interp(noise(noisedata+num -1),noise(noisedata+num),noise(noisedata+1+num),noise(noisedata+2+num),zone_x);
+    v=cubic_interp(noise(noisedata+2*num -1),noise(noisedata+2*num),noise(noisedata+1+2*num),noise(noisedata+2+2*num),zone_x);
+    float B=cubic_interp(u,a,b,v,zone_y);
 
-		           box = boxC;
-		           noisedata=(box+seed);
-		           u=cubic_interp(noise(noisedata-num-1),noise(noisedata-num),noise(noisedata-num+1),noise(noisedata-num+2),zone_x);
-		           a=cubic_interp(noise(noisedata-1),noise(noisedata),noise(noisedata+1),noise(noisedata+2),zone_x);
-		           b=cubic_interp(noise(noisedata+num -1),noise(noisedata+num),noise(noisedata+1+num),noise(noisedata+2+num),zone_x);
-		           v=cubic_interp(noise(noisedata+2*num -1),noise(noisedata+2*num),noise(noisedata+1+2*num),noise(noisedata+2+2*num),zone_x);
-		           float C=cubic_interp(u,a,b,v,zone_y);
+    box = boxC;
+    noisedata=(box+seed);
+    u=cubic_interp(noise(noisedata-num-1),noise(noisedata-num),noise(noisedata-num+1),noise(noisedata-num+2),zone_x);
+    a=cubic_interp(noise(noisedata-1),noise(noisedata),noise(noisedata+1),noise(noisedata+2),zone_x);
+    b=cubic_interp(noise(noisedata+num -1),noise(noisedata+num),noise(noisedata+1+num),noise(noisedata+2+num),zone_x);
+    v=cubic_interp(noise(noisedata+2*num -1),noise(noisedata+2*num),noise(noisedata+1+2*num),noise(noisedata+2+2*num),zone_x);
+    float C=cubic_interp(u,a,b,v,zone_y);
 
-		           box = boxD;
-		           noisedata=(box+seed);
-		           u=cubic_interp(noise(noisedata-num-1),noise(noisedata-num),noise(noisedata-num+1),noise(noisedata-num+2),zone_x);
-		           a=cubic_interp(noise(noisedata-1),noise(noisedata),noise(noisedata+1),noise(noisedata+2),zone_x);
-		           b=cubic_interp(noise(noisedata+num -1),noise(noisedata+num),noise(noisedata+1+num),noise(noisedata+2+num),zone_x);
-		           v=cubic_interp(noise(noisedata+2*num -1),noise(noisedata+2*num),noise(noisedata+1+2*num),noise(noisedata+2+2*num),zone_x);
-		           float D=cubic_interp(u,a,b,v,zone_y);
+    box = boxD;
+    noisedata=(box+seed);
+    u=cubic_interp(noise(noisedata-num-1),noise(noisedata-num),noise(noisedata-num+1),noise(noisedata-num+2),zone_x);
+    a=cubic_interp(noise(noisedata-1),noise(noisedata),noise(noisedata+1),noise(noisedata+2),zone_x);
+    b=cubic_interp(noise(noisedata+num -1),noise(noisedata+num),noise(noisedata+1+num),noise(noisedata+2+num),zone_x);
+    v=cubic_interp(noise(noisedata+2*num -1),noise(noisedata+2*num),noise(noisedata+1+2*num),noise(noisedata+2+2*num),zone_x);
+    float D=cubic_interp(u,a,b,v,zone_y);
 
-		           float value =cubic_interp(A,B,C,D,zone_z);
+    float value =cubic_interp(A,B,C,D,zone_z);
 
-		           return value;
-		}
+    return value;
+  }
 
 
-	static inline float perlin_noise_2d(int x, int y,  int width, int octaves, int seed, float persistance, float basePeriod)
-		{
-			float p = persistance;
-			float val = 0.0;
+  static inline float perlin_noise_2d(int x, int y,  int width, int octaves, int seed, float persistance, float basePeriod)
+  {
+    float p = persistance;
+    float val = 0.0;
 
-			for (int i = 0; i<octaves;i++)
-			{
-				val += perlin_octave_2d_cos(x,y,width,seed,basePeriod) * p;
+    for (int i = 0; i<octaves;i++)
+    {
+      val += perlin_octave_2d_cos(x,y,width,seed,basePeriod) * p;
 
-				basePeriod *= 0.5;
-				p *= persistance;
-			}
-			return val;
-		}
+      basePeriod *= 0.5;
+      p *= persistance;
+    }
+    return val;
+  }
 
-	static inline float perlin_noise_3d(int x, int y, int z, int width, int octaves, int seed, float persistance, float basePeriod)
-		{
-			float p = persistance;
-			float val = 0.0;
+  static inline float perlin_noise_3d(int x, int y, int z, int width, int octaves, int seed, float persistance, float basePeriod)
+  {
+    float p = persistance;
+    float val = 0.0;
 
-			for (int i = 0; i<octaves;i++)
-			{
-				val += perlin_octave_3d(x,y,z,width,seed,basePeriod) * p;
+    for (int i = 0; i<octaves;i++)
+    {
+      val += perlin_octave_3d(x,y,z,width,seed,basePeriod) * p;
 
-				basePeriod *= 0.5;
-				p *= persistance;
-			}
-			return val;
-		}
-
-
-
+      basePeriod *= 0.5;
+      p *= persistance;
+    }
+    return val;
+  }
 };
 
 #endif /* PERLINNOISE_HPP_ */
diff --git a/src/libprojectM/Renderer/Pipeline.cpp b/src/libprojectM/Renderer/Pipeline.cpp
index 3daf7ae..fbb7cbc 100644
--- a/src/libprojectM/Renderer/Pipeline.cpp
+++ b/src/libprojectM/Renderer/Pipeline.cpp
@@ -7,43 +7,51 @@
 #include "Pipeline.hpp"
 #include "wipemalloc.h"
 
-Pipeline::Pipeline() : staticPerPixel(false),gx(0),gy(0),blur1n(1), blur2n(1), blur3n(1),
-blur1x(1), blur2x(1), blur3x(1),
-blur1ed(1){}
 
-void Pipeline::setStaticPerPixel(int gx, int gy)
+Pipeline::Pipeline()
+  : staticPerPixel(false),
+    gx(0), gy(0),
+    blur1n(1), blur2n(1), blur3n(1),
+    blur1x(1), blur2x(1), blur3x(1),
+    blur1ed(1)
+{}
+
+void
+Pipeline::setStaticPerPixel(int gx, int gy)
 {
-	 staticPerPixel = true;
-	 this->gx = gx;
-	 this->gy = gy;
+  staticPerPixel = true;
+  this->gx = gx;
+  this->gy = gy;
 
-		this->x_mesh= ( float ** ) wipemalloc ( gx * sizeof ( float * ) );
-		for ( int x = 0; x < gx; x++ )
-		{
-			this->x_mesh[x] = ( float * ) wipemalloc ( gy * sizeof ( float ) );
-		}
-		this->y_mesh= ( float ** ) wipemalloc ( gx * sizeof ( float * ) );
-		for ( int x = 0; x < gx; x++ )
-		{
-			this->y_mesh[x] = ( float * ) wipemalloc ( gy * sizeof ( float ) );
-		}
-
+  this->x_mesh= ( float ** ) wipemalloc ( gx * sizeof ( float * ) );
+  for ( int x = 0; x < gx; x++ )
+  {
+    this->x_mesh[x] = ( float * ) wipemalloc ( gy * sizeof ( float ) );
+  }
+  this->y_mesh= ( float ** ) wipemalloc ( gx * sizeof ( float * ) );
+  for ( int x = 0; x < gx; x++ )
+  {
+    this->y_mesh[x] = ( float * ) wipemalloc ( gy * sizeof ( float ) );
+  }
 }
 
 Pipeline::~Pipeline()
 {
-if (staticPerPixel)
-{
-	for ( int x = 0; x < this->gx; x++ )
-	{
-		free(this->x_mesh[x]);
-		free(this->y_mesh[x]);
-	}
-	free(x_mesh);
-	free(y_mesh);
-}
+  if (staticPerPixel)
+  {
+    for ( int x = 0; x < this->gx; x++ )
+    {
+      free(this->x_mesh[x]);
+      free(this->y_mesh[x]);
+    }
+    free(x_mesh);
+    free(y_mesh);
+  }
 }
 
 //void Pipeline::Render(const BeatDetect &music, const PipelineContext &context){}
-PixelPoint Pipeline::PerPixel(PixelPoint p, const PerPixelContext context)
-{return p;}
+PixelPoint
+Pipeline::PerPixel(PixelPoint p, const PerPixelContext context)
+{
+  return p;
+}
diff --git a/src/libprojectM/Renderer/Pipeline.hpp b/src/libprojectM/Renderer/Pipeline.hpp
index b782226..5697165 100644
--- a/src/libprojectM/Renderer/Pipeline.hpp
+++ b/src/libprojectM/Renderer/Pipeline.hpp
@@ -8,6 +8,8 @@
 #include "PipelineContext.hpp"
 #include "Shader.hpp"
 #include "../Common.hpp"
+
+
 //This class is the input to projectM's renderer
 //
 //Most implemenatations should implement PerPixel in order to get multi-threaded
@@ -16,41 +18,40 @@
 class Pipeline
 {
 public:
+  //static per pixel stuff
+  bool staticPerPixel;
+  int gx;
+  int gy;
 
-	 //static per pixel stuff
-	 bool staticPerPixel;
-	 int gx;
-	 int gy;
+  float** x_mesh;
+  float** y_mesh;
+  //end static per pixel
 
-	 float** x_mesh;
-	 float** y_mesh;
-	 //end static per pixel
+  bool  textureWrap;
+  float screenDecay;
 
-	 bool  textureWrap;
-	 float screenDecay;
+  //variables passed to pixel shaders
+  float q[NUM_Q_VARIABLES];
 
-	 //variables passed to pixel shaders
-	 float q[NUM_Q_VARIABLES];
+  //blur settings n=bias x=scale
+  float blur1n;
+  float blur2n;
+  float blur3n;
+  float blur1x;
+  float blur2x;
+  float blur3x;
+  float blur1ed;
 
-	 //blur settings n=bias x=scale
-	 float blur1n;
-	 float blur2n;
-	 float blur3n;
-	 float blur1x;
-	 float blur2x;
-	 float blur3x;
-	 float blur1ed;
+  Shader warpShader;
+  Shader compositeShader;
 
-	 Shader warpShader;
-	 Shader compositeShader;
+  std::vector<RenderItem*> drawables;
+  std::vector<RenderItem*> compositeDrawables;
 
-	 std::vector<RenderItem*> drawables;
-	 std::vector<RenderItem*> compositeDrawables;
-
-	 Pipeline();
-	 void setStaticPerPixel(int gx, int gy);
-	 virtual ~Pipeline();
-	 virtual PixelPoint PerPixel(PixelPoint p, const PerPixelContext context);
+  Pipeline();
+  void setStaticPerPixel(int gx, int gy);
+  virtual ~Pipeline();
+  virtual PixelPoint PerPixel(PixelPoint p, const PerPixelContext context);
 };
 
 #endif
diff --git a/src/libprojectM/Renderer/PipelineContext.cpp b/src/libprojectM/Renderer/PipelineContext.cpp
index 2233147..b9f07f0 100644
--- a/src/libprojectM/Renderer/PipelineContext.cpp
+++ b/src/libprojectM/Renderer/PipelineContext.cpp
@@ -4,8 +4,8 @@
  *  Created on: Jun 22, 2008
  *      Author: pete
  */
-
 #include "PipelineContext.hpp"
 
+
 PipelineContext::PipelineContext() {}
 PipelineContext::~PipelineContext() {}
diff --git a/src/libprojectM/Renderer/PipelineContext.hpp b/src/libprojectM/Renderer/PipelineContext.hpp
index 1b7f899..870e9e6 100644
--- a/src/libprojectM/Renderer/PipelineContext.hpp
+++ b/src/libprojectM/Renderer/PipelineContext.hpp
@@ -4,20 +4,20 @@
  *  Created on: Jun 22, 2008
  *      Author: pete
  */
-
 #ifndef PIPELINECONTEXT_HPP_
 #define PIPELINECONTEXT_HPP_
 
+
 class PipelineContext
 {
 public:
-	int fps;
-    	float time;
-	int   frame;
-	float progress;
+  int   fps;
+  float time;
+  int   frame;
+  float progress;
 
-	PipelineContext();
-	virtual ~PipelineContext();
+  PipelineContext();
+  virtual ~PipelineContext();
 };
 
 #endif /* PIPELINECONTEXT_HPP_ */
diff --git a/src/libprojectM/Renderer/RenderItemDistanceMetric.cpp b/src/libprojectM/Renderer/RenderItemDistanceMetric.cpp
index e032ba5..2eae44c 100644
--- a/src/libprojectM/Renderer/RenderItemDistanceMetric.cpp
+++ b/src/libprojectM/Renderer/RenderItemDistanceMetric.cpp
@@ -4,10 +4,10 @@
  *  Created on: Feb 18, 2009
  *      Author: struktured
  */
-
 #include "RenderItemDistanceMetric.hpp"
 
+
 // Assumes [0, 1] distance space because it's easy to manage with overflow
 // Underflow is obviously possible though.
 const double RenderItemDistanceMetric::NOT_COMPARABLE_VALUE
-	(1.0);
+  (1.0);
diff --git a/src/libprojectM/Renderer/RenderItemDistanceMetric.hpp b/src/libprojectM/Renderer/RenderItemDistanceMetric.hpp
index 1f9e0bb..b7e7c75 100644
--- a/src/libprojectM/Renderer/RenderItemDistanceMetric.hpp
+++ b/src/libprojectM/Renderer/RenderItemDistanceMetric.hpp
@@ -4,7 +4,6 @@
  *  Created on: Feb 16, 2009
  *      Author: struktured
  */
-
 #ifndef RenderItemDISTANCEMETRIC_H_
 #define RenderItemDISTANCEMETRIC_H_
 
@@ -17,7 +16,8 @@
 
 /// Compares two render items and returns zero if they are virtually equivalent and large values
 /// when they are dissimilar. If two render items cannot be compared, NOT_COMPARABLE_VALUE is returned.
-class RenderItemDistanceMetric : public std::binary_function<const RenderItem*, const RenderItem*, double> {
+class RenderItemDistanceMetric : public std::binary_function<const RenderItem*, const RenderItem*, double>
+{
 public:
   const static double NOT_COMPARABLE_VALUE;
   virtual double operator()(const RenderItem * r1, const RenderItem * r2) const = 0;
@@ -27,119 +27,123 @@
 // A base class to construct render item distance metrics. Just specify your two concrete
 // render item types as template parameters and override the computeDistance() function.
 template <class R1, class R2>
-class RenderItemDistance : public RenderItemDistanceMetric {
-
+class RenderItemDistance : public RenderItemDistanceMetric
+{
 protected:
-// Override to create your own distance fmetric for your specified custom types.
-virtual double computeDistance(const R1 * r1, const R2 * r2) const = 0;
+  // Override to create your own distance fmetric for your specified custom types.
+  virtual double computeDistance(const R1 * r1, const R2 * r2) const = 0;
 
 public:
 
-inline virtual double operator()(const RenderItem * r1, const RenderItem * r2) const {
-	if (supported(r1, r2))
-		return computeDistance(dynamic_cast<const R1*>(r1), dynamic_cast<const R2*>(r2));
-	else if (supported(r2,r1))
-		return computeDistance(dynamic_cast<const R1*>(r2), dynamic_cast<const R2*>(r1));
-	else
-		return NOT_COMPARABLE_VALUE;
-}
+  inline virtual double operator()(const RenderItem * r1, const RenderItem * r2) const
+  {
+    if (supported(r1, r2))
+      return computeDistance(dynamic_cast<const R1*>(r1), dynamic_cast<const R2*>(r2));
+    else if (supported(r2,r1))
+      return computeDistance(dynamic_cast<const R1*>(r2), dynamic_cast<const R2*>(r1));
+    else
+      return NOT_COMPARABLE_VALUE;
+  }
 
-// Returns true if and only if r1 and r2 are the same type as or derived from R1, R2 respectively
-inline bool supported(const RenderItem * r1, const RenderItem * r2) const {
-	return dynamic_cast<const R1*>(r1) && dynamic_cast<const R2*>(r2);
-	//return typeid(r1) == typeid(const R1 *) && typeid(r2) == typeid(const R2 *);
-}
+  // Returns true if and only if r1 and r2 are the same type as or derived from R1, R2 respectively
+  inline bool supported(const RenderItem * r1, const RenderItem * r2) const
+  {
+    return dynamic_cast<const R1*>(r1) && dynamic_cast<const R2*>(r2);
+    //return typeid(r1) == typeid(const R1 *) && typeid(r2) == typeid(const R2 *);
+  }
 
-inline TypeIdPair typeIdPair() const {
-	return TypeIdPair(typeid(const R1*).name(), typeid(const R2*).name());
-}
-
+  inline TypeIdPair typeIdPair() const
+  {
+    return TypeIdPair(typeid(const R1*).name(), typeid(const R2*).name());
+  }
 };
 
 
-class RTIRenderItemDistance : public RenderItemDistance<RenderItem, RenderItem> {
+class RTIRenderItemDistance : public RenderItemDistance<RenderItem, RenderItem>
+{
 public:
 
-	RTIRenderItemDistance() {}
-	virtual ~RTIRenderItemDistance() {}
+  RTIRenderItemDistance() {}
+  virtual ~RTIRenderItemDistance() {}
 
 protected:
-	virtual inline double computeDistance(const RenderItem * lhs, const RenderItem * rhs) const {
-		if (typeid(*lhs) == typeid(*rhs)) {
-			//std::cerr << typeid(*lhs).name() << " and " << typeid(*rhs).name() <<  "are comparable" << std::endl;
+  virtual inline double computeDistance(const RenderItem * lhs, const RenderItem * rhs) const
+  {
+    if (typeid(*lhs) == typeid(*rhs)) {
+      //std::cerr << typeid(*lhs).name() << " and " << typeid(*rhs).name() <<  "are comparable" << std::endl;
 
-			return 0.0;
-		}
-		else {
-			//std::cerr << typeid(*lhs).name() << " and " << typeid(*rhs).name() <<  "not comparable" << std::endl;
-			return NOT_COMPARABLE_VALUE;
-		}
-	}
-
-
+      return 0.0;
+    }
+    else {
+      //std::cerr << typeid(*lhs).name() << " and " << typeid(*rhs).name() <<  "not comparable" << std::endl;
+      return NOT_COMPARABLE_VALUE;
+    }
+  }
 };
 
 
 
-class ShapeXYDistance : public RenderItemDistance<Shape, Shape> {
-
+class ShapeXYDistance : public RenderItemDistance<Shape, Shape>
+{
 public:
 
-	ShapeXYDistance() {}
-	virtual ~ShapeXYDistance() {}
+  ShapeXYDistance() {}
+  virtual ~ShapeXYDistance() {}
 
 protected:
 
-	virtual inline double computeDistance(const Shape * lhs, const Shape * rhs) const {
-			return (meanSquaredError(lhs->x, rhs->x) + meanSquaredError(lhs->y, rhs->y)) / 2;
-	}
+  virtual inline double computeDistance(const Shape * lhs, const Shape * rhs) const
+  {
+    return (meanSquaredError(lhs->x, rhs->x) + meanSquaredError(lhs->y, rhs->y)) / 2;
+  }
 
 };
 
 
-class MasterRenderItemDistance : public RenderItemDistance<RenderItem, RenderItem> {
-
-typedef std::map<TypeIdPair, RenderItemDistanceMetric*> DistanceMetricMap;
+class MasterRenderItemDistance : public RenderItemDistance<RenderItem, RenderItem>
+{
+  typedef std::map<TypeIdPair, RenderItemDistanceMetric*> DistanceMetricMap;
 public:
 
-	MasterRenderItemDistance() {}
-	virtual ~MasterRenderItemDistance() {}
+  MasterRenderItemDistance() {}
+  virtual ~MasterRenderItemDistance() {}
 
-	inline void addMetric(RenderItemDistanceMetric * fun) {
-		_distanceMetricMap[fun->typeIdPair()] = fun;
-	}
+  inline void addMetric(RenderItemDistanceMetric * fun)
+  {
+    _distanceMetricMap[fun->typeIdPair()] = fun;
+  }
 
 protected:
-	virtual inline double computeDistance(const RenderItem * lhs, const RenderItem * rhs) const {
+  virtual inline double computeDistance(const RenderItem * lhs, const RenderItem * rhs) const
+  {
+    RenderItemDistanceMetric * metric;
 
-		RenderItemDistanceMetric * metric;
-
-		TypeIdPair pair(typeid(lhs), typeid(rhs));
+    TypeIdPair pair(typeid(lhs), typeid(rhs));
 
 
-		// If specialized metric exists, use it to get higher granularity
-		// of correctness
-		if (_distanceMetricMap.count(pair)) {
-			metric = _distanceMetricMap[pair];
-		} else if (_distanceMetricMap.count(pair = TypeIdPair(typeid(rhs), typeid(lhs)))) {
-			metric = _distanceMetricMap[pair];
-		} else { // Failing that, use rtti && shape distance if its a shape type
+    // If specialized metric exists, use it to get higher granularity
+    // of correctness
+    if (_distanceMetricMap.count(pair)) {
+      metric = _distanceMetricMap[pair];
+    } else if (_distanceMetricMap.count(pair = TypeIdPair(typeid(rhs), typeid(lhs)))) {
+      metric = _distanceMetricMap[pair];
+    } else { // Failing that, use rtti && shape distance if its a shape type
+      const double rttiError = _rttiDistance(lhs,rhs);
 
-			const double rttiError = _rttiDistance(lhs,rhs);
+      /// @bug This is a non elegant approach to supporting shape distance
+      if (rttiError == 0 && _shapeXYDistance.supported(lhs,rhs))
+        return _shapeXYDistance(lhs, rhs);
+      else
+        return rttiError;
+    }
 
-			/// @bug This is a non elegant approach to supporting shape distance
-			if (rttiError == 0 && _shapeXYDistance.supported(lhs,rhs))
-			   return _shapeXYDistance(lhs, rhs);
-			else return rttiError;
-		}
-
-		return (*metric)(lhs, rhs);
-	}
+    return (*metric)(lhs, rhs);
+  }
 
 private:
-	mutable RTIRenderItemDistance _rttiDistance;
-	mutable ShapeXYDistance _shapeXYDistance;
-	mutable DistanceMetricMap _distanceMetricMap;
+  mutable RTIRenderItemDistance _rttiDistance;
+  mutable ShapeXYDistance _shapeXYDistance;
+  mutable DistanceMetricMap _distanceMetricMap;
 };
 
 #endif /* RenderItemDISTANCEMETRIC_H_ */
diff --git a/src/libprojectM/Renderer/RenderItemMatcher.cpp b/src/libprojectM/Renderer/RenderItemMatcher.cpp
index cf10750..515d136 100644
--- a/src/libprojectM/Renderer/RenderItemMatcher.cpp
+++ b/src/libprojectM/Renderer/RenderItemMatcher.cpp
@@ -1,34 +1,36 @@
 #include "RenderItemMatcher.hpp"
 
-double RenderItemMatcher::computeMatching(const RenderItemList & lhs, const RenderItemList & rhs) const {
-		for (int i = 0; i < lhs.size();i++) {
-			int j;
-			for (j = 0; j < rhs.size();j++)
-				_weights[i][j] = _distanceFunction(lhs[i], rhs[j]);
-			for (; j < lhs.size();j++)
-				_weights[i][j] = RenderItemDistanceMetric::NOT_COMPARABLE_VALUE;
-		}
 
-		
-		const double error = _hungarianMethod(_weights, lhs.size());
-		//std::cout << "[computeMatching] total error is " << error << std::endl;
-		return error;
+double
+RenderItemMatcher::computeMatching (const RenderItemList & lhs, const RenderItemList & rhs) const
+{
+  for (int i = 0; i < lhs.size();i++) {
+    int j;
+    for (j = 0; j < rhs.size();j++)
+      _weights[i][j] = _distanceFunction(lhs[i], rhs[j]);
+    for (; j < lhs.size();j++)
+      _weights[i][j] = RenderItemDistanceMetric::NOT_COMPARABLE_VALUE;
+  }
+
+
+  const double error = _hungarianMethod(_weights, lhs.size());
+  //std::cout << "[computeMatching] total error is " << error << std::endl;
+  return error;
 }
 
 
+void
+RenderItemMatcher::setMatches (const RenderItemList & lhs_src, const RenderItemList & rhs_src) const
+{
+  for (int i = 0; i < lhs_src.size();i++) {
+    const int j = _hungarianMethod.matching(i);
 
-void RenderItemMatcher::setMatches
-	(const RenderItemList & lhs_src, const RenderItemList & rhs_src) const {
-
-	  for (int i = 0; i < lhs_src.size();i++) {
-		const int j = _hungarianMethod.matching(i);
-
-		// hack
-		if (true || _weights[i][j] == RenderItemDistanceMetric::NOT_COMPARABLE_VALUE) {
- 			_results.unmatchedLeft.push_back(lhs_src[i]);
-			_results.unmatchedRight.push_back(rhs_src[i]);
-		} else {
-		    _results.matches.push_back(std::make_pair(lhs_src[i], rhs_src[j]));
-		}
-	  }
-}
\ No newline at end of file
+    // hack
+    if (true || _weights[i][j] == RenderItemDistanceMetric::NOT_COMPARABLE_VALUE) {
+      _results.unmatchedLeft.push_back(lhs_src[i]);
+      _results.unmatchedRight.push_back(rhs_src[i]);
+    } else {
+      _results.matches.push_back(std::make_pair(lhs_src[i], rhs_src[j]));
+    }
+  }
+}
diff --git a/src/libprojectM/Renderer/RenderItemMatcher.hpp b/src/libprojectM/Renderer/RenderItemMatcher.hpp
index 387d369..6b6ecca 100644
--- a/src/libprojectM/Renderer/RenderItemMatcher.hpp
+++ b/src/libprojectM/Renderer/RenderItemMatcher.hpp
@@ -4,7 +4,6 @@
  *  Created on: Feb 16, 2009
  *      Author: struktured
  */
-
 #ifndef RenderItemMatcher_HPP
 #define RenderItemMatcher_HPP
 
@@ -14,6 +13,7 @@
 #include <iostream>
 #include "HungarianMethod.hpp"
 
+
 typedef std::vector<std::pair<RenderItem*, RenderItem*> > RenderItemMatchList;
 
 class MatchResults;
@@ -22,56 +22,53 @@
 
 public:
 
-struct MatchResults {
-  RenderItemMatchList matches;
-  std::vector<RenderItem*> unmatchedLeft;
-  std::vector<RenderItem*> unmatchedRight;
+  struct MatchResults {
+    RenderItemMatchList matches;
+    std::vector<RenderItem*> unmatchedLeft;
+    std::vector<RenderItem*> unmatchedRight;
 
-  double error;
-};
+    double error;
+  };
 
-	static const std::size_t MAXIMUM_SET_SIZE = 1000;
+  static const std::size_t MAXIMUM_SET_SIZE = 1000;
 
-	/// Computes an optimal matching between two renderable item sets.
-	/// @param lhs the "left-hand side" list of render items.
-	/// @param rhs the "right-hand side" list of render items.
-	/// @returns a list of match pairs, possibly self referencing, and an error estimate of the matching.
-	inline virtual void operator()(const RenderItemList & lhs, const RenderItemList & rhs) const {
-		
-		// Ensure the first argument is greater than next to aid the helper function's logic.
-		if (lhs.size() >= rhs.size()) {
-		  _results.error = computeMatching(lhs, rhs);
-		  setMatches(lhs, rhs);
-		} else {
-		  _results.error = computeMatching(rhs, lhs);
-		  setMatches(rhs, lhs);
-		}
-		
-	
-	}
+  /// Computes an optimal matching between two renderable item sets.
+  /// @param lhs the "left-hand side" list of render items.
+  /// @param rhs the "right-hand side" list of render items.
+  /// @returns a list of match pairs, possibly self referencing, and an error estimate of the matching.
+  inline virtual void operator()(const RenderItemList & lhs, const RenderItemList & rhs) const
+  {
+    // Ensure the first argument is greater than next to aid the helper function's logic.
+    if (lhs.size() >= rhs.size()) {
+      _results.error = computeMatching(lhs, rhs);
+      setMatches(lhs, rhs);
+    } else {
+      _results.error = computeMatching(rhs, lhs);
+      setMatches(rhs, lhs);
+    }
+  }
 
-	RenderItemMatcher() {}
-	virtual ~RenderItemMatcher() {}
+  RenderItemMatcher() {}
+  virtual ~RenderItemMatcher() {}
 
-	inline MatchResults & matchResults() { return _results; }
+  inline MatchResults & matchResults() { return _results; }
 
-	inline double weight(int i, int j) const { return _weights[i][j]; }
+  inline double weight(int i, int j) const { return _weights[i][j]; }
 
-	MasterRenderItemDistance & distanceFunction() { return _distanceFunction; }
+  MasterRenderItemDistance & distanceFunction() { return _distanceFunction; }
 
 private:
-	mutable HungarianMethod<MAXIMUM_SET_SIZE> _hungarianMethod;
-	mutable double _weights[MAXIMUM_SET_SIZE][MAXIMUM_SET_SIZE];
+  mutable HungarianMethod<MAXIMUM_SET_SIZE> _hungarianMethod;
+  mutable double _weights[MAXIMUM_SET_SIZE][MAXIMUM_SET_SIZE];
 
-	mutable MatchResults _results;
+  mutable MatchResults _results;
 
-	/// @idea interface this entirely allow overriding of its type.
-	mutable MasterRenderItemDistance _distanceFunction;
-	
-	double computeMatching(const RenderItemList & lhs, const RenderItemList & rhs) const;
+  /// @idea interface this entirely allow overriding of its type.
+  mutable MasterRenderItemDistance _distanceFunction;
 
-	void setMatches(const RenderItemList & lhs_src, const RenderItemList & rhs_src) const;
+  double computeMatching(const RenderItemList & lhs, const RenderItemList & rhs) const;
 
+  void setMatches(const RenderItemList & lhs_src, const RenderItemList & rhs_src) const;
 };
 
 #endif
diff --git a/src/libprojectM/Renderer/RenderItemMergeFunction.hpp b/src/libprojectM/Renderer/RenderItemMergeFunction.hpp
index 6316641..79884cd 100644
--- a/src/libprojectM/Renderer/RenderItemMergeFunction.hpp
+++ b/src/libprojectM/Renderer/RenderItemMergeFunction.hpp
@@ -19,19 +19,19 @@
 template <class T>
 inline T interpolate(T a, T b, float ratio)
 {
-    return (ratio*a + (1-ratio)*b) * 0.5;
+  return (ratio*a + (1-ratio)*b) * 0.5;
 }
 
 template <>
 inline int interpolate(int a, int b, float ratio)
 {
-    return (int)(ratio*(float)a + (1-ratio)*(float)b) * 0.5;
+  return (int)(ratio*(float)a + (1-ratio)*(float)b) * 0.5;
 }
 
 template <>
 inline bool interpolate(bool a, bool b, float ratio)
 {
-    return (ratio >= 0.5) ? a : b;
+  return (ratio >= 0.5) ? a : b;
 }
 
 
@@ -46,149 +46,151 @@
 /// A base class to construct render item distance mergeFunctions. Just specify your two concrete
 /// render item types as template parameters and override the computeMerge() function.
 template <class R1, class R2=R1, class R3=R2>
-class RenderItemMerge : public RenderItemMergeFunction {
+ class RenderItemMerge : public RenderItemMergeFunction
+{
 
 protected:
-/// Override to create your own distance mergeFunction for your specified custom types.
-virtual R3 * computeMerge(const R1 * r1, const R2 * r2, double ratio) const = 0;
+  /// Override to create your own distance mergeFunction for your specified custom types.
+  virtual R3 * computeMerge(const R1 * r1, const R2 * r2, double ratio) const = 0;
 
 public:
 
-inline virtual R3 * operator()(const RenderItem * r1, const RenderItem * r2, double ratio) const {
-	if (supported(r1, r2))
-		return computeMerge(dynamic_cast<const R1*>(r1), dynamic_cast<const R2*>(r2), ratio);
-	else if (supported(r2,r1))
-		return computeMerge(dynamic_cast<const R1*>(r2), dynamic_cast<const R2*>(r1), ratio);
-	else
-		return 0;
-}
+  inline virtual R3 * operator()(const RenderItem * r1, const RenderItem * r2, double ratio) const
+  {
+    if (supported(r1, r2))
+      return computeMerge(dynamic_cast<const R1*>(r1), dynamic_cast<const R2*>(r2), ratio);
+    else if (supported(r2,r1))
+      return computeMerge(dynamic_cast<const R1*>(r2), dynamic_cast<const R2*>(r1), ratio);
+    else
+      return 0;
+  }
 
-/// Returns true if and only if r1 and r2 are of type R1 and R2 respectively.
-inline bool supported(const RenderItem * r1, const RenderItem * r2) const {
-	return typeid(r1) == typeid(const R1 *) && typeid(r2) == typeid(const R2 *);
-}
+  /// Returns true if and only if r1 and r2 are of type R1 and R2 respectively.
+  inline bool supported(const RenderItem * r1, const RenderItem * r2) const
+  {
+    return typeid(r1) == typeid(const R1 *) && typeid(r2) == typeid(const R2 *);
+  }
 
-inline TypeIdPair typeIdPair() const {
-	return TypeIdPair(typeid(const R1*).name(), typeid(const R2*).name());
-}
-
+  inline TypeIdPair typeIdPair() const
+  {
+    return TypeIdPair(typeid(const R1*).name(), typeid(const R2*).name());
+  }
 };
 
 
 class ShapeMerge : public RenderItemMerge<Shape> {
-
 public:
 
-	ShapeMerge() {}
-	virtual ~ShapeMerge() {}
+  ShapeMerge() {}
+  virtual ~ShapeMerge() {}
 
-protected:
+  protected:
 
-	virtual inline Shape * computeMerge(const Shape * lhs, const Shape * rhs, double ratio) const {
+  virtual inline Shape * computeMerge(const Shape * lhs, const Shape * rhs, double ratio) const
+  {
 
-    	Shape * ret = new Shape();
-	Shape & target = *ret;
+    Shape * ret = new Shape();
+    Shape & target = *ret;
 
-	target.x = interpolate(lhs->x, rhs->x, ratio);
-        target.y = interpolate(lhs->y, rhs->y, ratio);
-	target.a = interpolate(lhs->a, rhs->a, ratio);
-        target.a2 = interpolate(lhs->a2, rhs->a2, ratio);
-        target.r = interpolate(lhs->r, rhs->r, ratio);
-        target.r2 = interpolate(lhs->r2, rhs->r2, ratio);
-        target.g = interpolate(lhs->g, rhs->g, ratio);
-        target.g2 = interpolate(lhs->g2, rhs->g2, ratio);
-        target.b = interpolate(lhs->b, rhs->b, ratio);
-        target.b2 = interpolate(lhs->b2, rhs->b2, ratio);
+    target.x = interpolate(lhs->x, rhs->x, ratio);
+    target.y = interpolate(lhs->y, rhs->y, ratio);
+    target.a = interpolate(lhs->a, rhs->a, ratio);
+    target.a2 = interpolate(lhs->a2, rhs->a2, ratio);
+    target.r = interpolate(lhs->r, rhs->r, ratio);
+    target.r2 = interpolate(lhs->r2, rhs->r2, ratio);
+    target.g = interpolate(lhs->g, rhs->g, ratio);
+    target.g2 = interpolate(lhs->g2, rhs->g2, ratio);
+    target.b = interpolate(lhs->b, rhs->b, ratio);
+    target.b2 = interpolate(lhs->b2, rhs->b2, ratio);
 
-        target.ang = interpolate(lhs->ang, rhs->ang, ratio);
-        target.radius = interpolate(lhs->radius, rhs->radius, ratio);
+    target.ang = interpolate(lhs->ang, rhs->ang, ratio);
+    target.radius = interpolate(lhs->radius, rhs->radius, ratio);
 
-        target.tex_ang = interpolate(lhs->tex_ang, rhs->tex_ang, ratio);
-        target.tex_zoom = interpolate(lhs->tex_zoom, rhs->tex_zoom, ratio);
+    target.tex_ang = interpolate(lhs->tex_ang, rhs->tex_ang, ratio);
+    target.tex_zoom = interpolate(lhs->tex_zoom, rhs->tex_zoom, ratio);
 
-        target.border_a = interpolate(lhs->border_a, rhs->border_a, ratio);
-        target.border_r = interpolate(lhs->border_r, rhs->border_r, ratio);
-        target.border_g = interpolate(lhs->border_g, rhs->border_g, ratio);
-        target.border_b = interpolate(lhs->border_b, rhs->border_b, ratio);
+    target.border_a = interpolate(lhs->border_a, rhs->border_a, ratio);
+    target.border_r = interpolate(lhs->border_r, rhs->border_r, ratio);
+    target.border_g = interpolate(lhs->border_g, rhs->border_g, ratio);
+    target.border_b = interpolate(lhs->border_b, rhs->border_b, ratio);
 
-        target.sides = interpolate(lhs->sides, rhs->sides, ratio);
+    target.sides = interpolate(lhs->sides, rhs->sides, ratio);
 
-        target.additive = interpolate(lhs->additive, rhs->additive, ratio);
-        target.textured = interpolate(lhs->textured, rhs->textured, ratio);
-        target.thickOutline = interpolate(lhs->thickOutline, rhs->thickOutline, ratio);
-        target.enabled = interpolate(lhs->enabled, rhs->enabled, ratio);
+    target.additive = interpolate(lhs->additive, rhs->additive, ratio);
+    target.textured = interpolate(lhs->textured, rhs->textured, ratio);
+    target.thickOutline = interpolate(lhs->thickOutline, rhs->thickOutline, ratio);
+    target.enabled = interpolate(lhs->enabled, rhs->enabled, ratio);
 
-        target.masterAlpha = interpolate(lhs->masterAlpha, rhs->masterAlpha, ratio);
-        target.imageUrl = (ratio > 0.5) ? lhs->imageUrl : rhs->imageUrl, ratio;
+    target.masterAlpha = interpolate(lhs->masterAlpha, rhs->masterAlpha, ratio);
+    target.imageUrl = (ratio > 0.5) ? lhs->imageUrl : rhs->imageUrl, ratio;
 
-        return ret;
-	}
+    return ret;
+  }
 };
 
 class BorderMerge : public RenderItemMerge<Border> {
+public:
 
-    public:
+  BorderMerge() {}
+  virtual ~BorderMerge() {}
 
-        BorderMerge() {}
-        virtual ~BorderMerge() {}
+protected:
 
-    protected:
+  virtual inline Border * computeMerge(const Border * lhs, const Border * rhs, double ratio) const
+  {
+    Border * ret = new Border();
 
-        virtual inline Border * computeMerge(const Border * lhs, const Border * rhs, double ratio) const
-        {
-            Border * ret = new Border();
-		
-	    Border & target = *ret;
+    Border & target = *ret;
 
-            target.inner_a = interpolate(lhs->inner_a, rhs->inner_a, ratio);
-            target.inner_r = interpolate(lhs->inner_r, rhs->inner_r, ratio);
-            target.inner_g = interpolate(lhs->inner_g, rhs->inner_g, ratio);
-            target.inner_b = interpolate(lhs->inner_b, rhs->inner_b, ratio);
-            target.inner_size = interpolate(lhs->inner_size, rhs->inner_size, ratio);
+    target.inner_a = interpolate(lhs->inner_a, rhs->inner_a, ratio);
+    target.inner_r = interpolate(lhs->inner_r, rhs->inner_r, ratio);
+    target.inner_g = interpolate(lhs->inner_g, rhs->inner_g, ratio);
+    target.inner_b = interpolate(lhs->inner_b, rhs->inner_b, ratio);
+    target.inner_size = interpolate(lhs->inner_size, rhs->inner_size, ratio);
 
-            target.outer_a = interpolate(lhs->outer_a, rhs->outer_a, ratio);
-            target.outer_r = interpolate(lhs->outer_r, rhs->outer_r, ratio);
-            target.outer_g = interpolate(lhs->outer_g, rhs->outer_g, ratio);
-            target.outer_b = interpolate(lhs->outer_b, rhs->outer_b, ratio);
-            target.outer_size = interpolate(lhs->outer_size, rhs->outer_size, ratio);
+    target.outer_a = interpolate(lhs->outer_a, rhs->outer_a, ratio);
+    target.outer_r = interpolate(lhs->outer_r, rhs->outer_r, ratio);
+    target.outer_g = interpolate(lhs->outer_g, rhs->outer_g, ratio);
+    target.outer_b = interpolate(lhs->outer_b, rhs->outer_b, ratio);
+    target.outer_size = interpolate(lhs->outer_size, rhs->outer_size, ratio);
 
-            target.masterAlpha = interpolate(lhs->masterAlpha, rhs->masterAlpha, ratio);
+    target.masterAlpha = interpolate(lhs->masterAlpha, rhs->masterAlpha, ratio);
 
-            return ret;
-        }
+    return ret;
+  }
 };
 
 
-class WaveformMerge : public RenderItemMerge<Waveform> {
+class WaveformMerge : public RenderItemMerge<Waveform>
+{
+public:
 
-    public:
+  WaveformMerge() {}
+  virtual ~WaveformMerge() {}
 
-        WaveformMerge() {}
-        virtual ~WaveformMerge() {}
+protected:
 
-    protected:
+  /// @BUG unimplemented
+  virtual inline Waveform * computeMerge(const Waveform * lhs, const Waveform * rhs, double ratio) const
+  {
+    return 0;
+    /*
+    Waveform * ret = new Waveform();
+    Waveform & target = *ret;
 
-	/// @BUG unimplemented
-        virtual inline Waveform * computeMerge(const Waveform * lhs, const Waveform * rhs, double ratio) const
-        {
-		return 0;
-/*
-            Waveform * ret = new Waveform();
-	    Waveform & target = *ret;
+    target.additive = interpolate(lhs->additive, rhs->additive, ratio);
+    target.dots = interpolate(lhs->dots, rhs->dots, ratio);
+    target.samples = (rhs->samples > lhs-> samples) ? lhs->samples : rhs->samples;
+    target.scaling = interpolate(lhs->scaling, rhs->scaling, ratio);
+    target.sep = interpolate(lhs->sep, rhs->sep, ratio);
+    target.smoothing = interpolate(lhs->smoothing, rhs->smoothing, ratio);
+    target.spectrum = interpolate(lhs->spectrum, rhs->spectrum, ratio);
+    target.thick = interpolate(lhs->thick, rhs->thick, ratio);
+    target.masterAlpha = interpolate(lhs->masterAlpha, rhs->masterAlpha, ratio);
 
-            target.additive = interpolate(lhs->additive, rhs->additive, ratio);
-            target.dots = interpolate(lhs->dots, rhs->dots, ratio);
-            target.samples = (rhs->samples > lhs-> samples) ? lhs->samples : rhs->samples;
-            target.scaling = interpolate(lhs->scaling, rhs->scaling, ratio);
-            target.sep = interpolate(lhs->sep, rhs->sep, ratio);
-            target.smoothing = interpolate(lhs->smoothing, rhs->smoothing, ratio);
-            target.spectrum = interpolate(lhs->spectrum, rhs->spectrum, ratio);
-            target.thick = interpolate(lhs->thick, rhs->thick, ratio);
-            target.masterAlpha = interpolate(lhs->masterAlpha, rhs->masterAlpha, ratio);
-
-            return ret;
-*/
-        }
+    return ret;
+    */
+  }
 };
 
 
@@ -197,40 +199,41 @@
 /// incoming type parameters.
 class MasterRenderItemMerge : public RenderItemMerge<RenderItem> {
 
-typedef std::map<TypeIdPair, RenderItemMergeFunction*> MergeFunctionMap;
+  typedef std::map<TypeIdPair, RenderItemMergeFunction*> MergeFunctionMap;
 public:
 
-	MasterRenderItemMerge() {}
-	virtual ~MasterRenderItemMerge() {}
+  MasterRenderItemMerge() {}
+  virtual ~MasterRenderItemMerge() {}
 
-	inline void add(RenderItemMergeFunction * fun) {
-		_mergeFunctionMap[fun->typeIdPair()] = fun;
-	}
+  inline void add(RenderItemMergeFunction * fun)
+  {
+    _mergeFunctionMap[fun->typeIdPair()] = fun;
+  }
 
 protected:
-	virtual inline RenderItem * computeMerge(const RenderItem * lhs, const RenderItem * rhs,  double ratio) const {
+  virtual inline RenderItem * computeMerge(const RenderItem * lhs, const RenderItem * rhs,  double ratio) const
+  {
+    RenderItemMergeFunction * mergeFunction;
 
-		RenderItemMergeFunction * mergeFunction;
+    TypeIdPair pair(typeid(lhs), typeid(rhs));
+    if (_mergeFunctionMap.count(pair)) {
+      mergeFunction = _mergeFunctionMap[pair];
+    } else if (_mergeFunctionMap.count(pair = TypeIdPair(typeid(rhs), typeid(lhs)))) {
+      mergeFunction = _mergeFunctionMap[pair];
+    } else {
+      mergeFunction  = 0;
+    }
 
-		TypeIdPair pair(typeid(lhs), typeid(rhs));
-		if (_mergeFunctionMap.count(pair)) {
-			mergeFunction = _mergeFunctionMap[pair];
-		} else if (_mergeFunctionMap.count(pair = TypeIdPair(typeid(rhs), typeid(lhs)))) {
-			mergeFunction = _mergeFunctionMap[pair];
-		} else {
-			mergeFunction  = 0;
-		}
-
-		// If specialized mergeFunction exists, use it to get higher granularity
-		// of correctness
-		if (mergeFunction)
-			return (*mergeFunction)(lhs, rhs, ratio);
-		else
-			return 0;
-	}
+    // If specialized mergeFunction exists, use it to get higher granularity
+    // of correctness
+    if (mergeFunction)
+      return (*mergeFunction)(lhs, rhs, ratio);
+    else
+      return 0;
+  }
 
 private:
-	mutable MergeFunctionMap _mergeFunctionMap;
+  mutable MergeFunctionMap _mergeFunctionMap;
 };
 
 #endif /* RenderItemMergeFunction_HPP_ */
diff --git a/src/libprojectM/Renderer/Renderable.cpp b/src/libprojectM/Renderer/Renderable.cpp
index 926b34f..224f846 100644
--- a/src/libprojectM/Renderer/Renderable.cpp
+++ b/src/libprojectM/Renderer/Renderable.cpp
@@ -1,4 +1,3 @@
-
 #include "Common.hpp"
 
 #ifdef USE_GLES1
@@ -16,6 +15,7 @@
 #include "Renderable.hpp"
 #include <math.h>
 
+
 typedef float floatPair[2];
 typedef float floatTriple[3];
 typedef float floatQuad[4];
@@ -45,335 +45,336 @@
 #endif
 
 RenderContext::RenderContext()
-	: time(0),texsize(512), aspectRatio(1), aspectCorrect(false){};
+  : time(0),
+    texsize(512),
+    aspectRatio(1),
+    aspectCorrect(false)
+{};
 
-RenderItem::RenderItem():masterAlpha(1){}
+RenderItem::RenderItem() : masterAlpha(1) {}
 
-DarkenCenter::DarkenCenter():RenderItem(){}
-MotionVectors::MotionVectors():RenderItem(){}
-Border::Border():RenderItem(){}
+DarkenCenter::DarkenCenter() : RenderItem() {}
+MotionVectors::MotionVectors() : RenderItem() {}
+Border::Border() : RenderItem() {}
 
-void DarkenCenter::Draw(RenderContext &context)
-	{
-		//float unit=0.05f;
+void
+DarkenCenter::Draw(RenderContext &context)
+{
+  //float unit=0.05f;
 
-		glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+  glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
 
-		float colors[6][4] = {{0, 0, 0, (3.0f/32.0f) * masterAlpha},
-				      {0, 0, 0, 0},
-				      {0, 0, 0, 0},
-				      {0, 0, 0, 0},
-				      {0, 0, 0, 0},
-				      {0, 0, 0, 0}};
+  float colors[6][4] = {{0, 0, 0, (3.0f/32.0f) * masterAlpha},
+                        {0, 0, 0, 0},
+                        {0, 0, 0, 0},
+                        {0, 0, 0, 0},
+                        {0, 0, 0, 0},
+                        {0, 0, 0, 0}};
 
-		float points[6][2] = {{ 0.5,  0.5},
-				      { 0.45, 0.5},
-				      { 0.5,  0.45},
-				      { 0.55, 0.5},
-				      { 0.5,  0.55},
-				      { 0.45, 0.5}};
+  float points[6][2] = {{ 0.5,  0.5},
+                        { 0.45, 0.5},
+                        { 0.5,  0.45},
+                        { 0.55, 0.5},
+                        { 0.5,  0.55},
+                        { 0.45, 0.5}};
 
-		glEnableClientState(GL_VERTEX_ARRAY);
-		glEnableClientState(GL_COLOR_ARRAY);
-		glDisableClientState(GL_TEXTURE_COORD_ARRAY);
+  glEnableClientState(GL_VERTEX_ARRAY);
+  glEnableClientState(GL_COLOR_ARRAY);
+  glDisableClientState(GL_TEXTURE_COORD_ARRAY);
 
-		glVertexPointer(2,GL_FLOAT,0,points);
-		glColorPointer(4,GL_FLOAT,0,colors);
+  glVertexPointer(2,GL_FLOAT,0,points);
+  glColorPointer(4,GL_FLOAT,0,colors);
 
-		glDrawArrays(GL_TRIANGLE_FAN,0,6);
-
-	}
+  glDrawArrays(GL_TRIANGLE_FAN,0,6);
+}
 
 Shape::Shape():RenderItem()
 {
-	 std::string imageUrl = "";
-	     sides = 4;
-	     thickOutline = false;
-	     enabled = true;
-	     additive = false;
-	     textured = false;
+  std::string imageUrl = "";
 
-	     tex_zoom = 1.0;
-	     tex_ang = 0.0;
+  sides = 4;
+  thickOutline = false;
+  enabled = true;
+  additive = false;
+  textured = false;
 
-	     x = 0.5;
-	     y = 0.5;
-	     radius = 1.0;
-	     ang = 0.0;
+  tex_zoom = 1.0;
+  tex_ang = 0.0;
 
-	     r = 0.0; /* red color value */
-	     g = 0.0; /* green color value */
-	     b = 0.0; /* blue color value */
-	     a = 0.0; /* alpha color value */
+  x = 0.5;
+  y = 0.5;
+  radius = 1.0;
+  ang = 0.0;
 
-	     r2 = 0.0; /* red color value */
-	     g2 = 0.0; /* green color value */
-	     b2 = 0.0; /* blue color value */
-	     a2 = 0.0; /* alpha color value */
+  r = 0.0; /* red color value */
+  g = 0.0; /* green color value */
+  b = 0.0; /* blue color value */
+  a = 0.0; /* alpha color value */
 
-	     border_r = 0.0; /* red color value */
-	     border_g = 0.0; /* green color value */
-	     border_b = 0.0; /* blue color value */
-	     border_a = 0.0; /* alpha color value */
+  r2 = 0.0; /* red color value */
+  g2 = 0.0; /* green color value */
+  b2 = 0.0; /* blue color value */
+  a2 = 0.0; /* alpha color value */
 
-
+  border_r = 0.0; /* red color value */
+  border_g = 0.0; /* green color value */
+  border_b = 0.0; /* blue color value */
+  border_a = 0.0; /* alpha color value */
 }
 
-void Shape::Draw(RenderContext &context)
+void
+Shape::Draw(RenderContext &context)
 {
+  float xval, yval;
+  float t;
 
-	float xval, yval;
-	float t;
+  // printf("drawing shape %f\n", ang);
 
-			// printf("drawing shape %f\n", ang);
+  float temp_radius= radius*(.707*.707*.707*1.04);
 
-			float temp_radius= radius*(.707*.707*.707*1.04);
-			//Additive Drawing or Overwrite
-			if ( additive==0)  glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-			else    glBlendFunc(GL_SRC_ALPHA, GL_ONE);
+  //Additive Drawing or Overwrite
+  if (additive == 0)  glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+  else                glBlendFunc(GL_SRC_ALPHA, GL_ONE);
 
-			xval= x;
-			yval= -(y-1);
+  xval= x;
+  yval= -(y-1);
 
-			if ( textured)
-			{
-				if (imageUrl !="")
-				{
-					GLuint tex= context.textureManager->getTexture(imageUrl);
-					if (tex != 0)
-					{
-						glBindTexture(GL_TEXTURE_2D, tex);
-						context.aspectRatio=1.0;
-					}
-				}
+  if ( textured)
+  {
+    if (imageUrl !="")
+    {
+      GLuint tex= context.textureManager->getTexture(imageUrl);
+      if (tex != 0)
+      {
+        glBindTexture(GL_TEXTURE_2D, tex);
+        context.aspectRatio=1.0;
+      }
+    }
 
-				glMatrixMode(GL_TEXTURE);
-				glPushMatrix();
-				glLoadIdentity();
+    glMatrixMode(GL_TEXTURE);
+    glPushMatrix();
+    glLoadIdentity();
 
-				glEnable(GL_TEXTURE_2D);
+    glEnable(GL_TEXTURE_2D);
 
-				glEnableClientState(GL_VERTEX_ARRAY);
-				glEnableClientState(GL_COLOR_ARRAY);
-				glEnableClientState(GL_TEXTURE_COORD_ARRAY);
+    glEnableClientState(GL_VERTEX_ARRAY);
+    glEnableClientState(GL_COLOR_ARRAY);
+    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
 
-				floatQuad *colors = new float[sides+2][4];
-				floatPair *tex = new float[sides+2][2];
-				floatPair *points = new float[sides+2][2];
+    floatQuad *colors = new float[sides+2][4];
+    floatPair *tex    = new float[sides+2][2];
+    floatPair *points = new float[sides+2][2];
 
-				//Define the center point of the shape
-				colors[0][0] = r;
-				colors[0][1] = g;
-				colors[0][2] = b;
-				colors[0][3] = a * masterAlpha;
-			  	   tex[0][0] = 0.5;
-				   tex[0][1] = 0.5;
-				points[0][0] = xval;
-				points[0][1] = yval;
+    //Define the center point of the shape
+    colors[0][0] = r;
+    colors[0][1] = g;
+    colors[0][2] = b;
+    colors[0][3] = a * masterAlpha;
+    tex[0][0] = 0.5;
+    tex[0][1] = 0.5;
+    points[0][0] = xval;
+    points[0][1] = yval;
 
-				for ( int i=1;i< sides+2;i++)
-				{
-				  colors[i][0]= r2;
-				  colors[i][1]=g2;
-				  colors[i][2]=b2;
-				  colors[i][3]=a2 * masterAlpha;
+    for ( int i=1;i< sides+2;i++)
+    {
+      colors[i][0] = r2;
+      colors[i][1] = g2;
+      colors[i][2] = b2;
+      colors[i][3] = a2 * masterAlpha;
 
-				  t = (i-1)/(float) sides;
-				  tex[i][0] =0.5f + 0.5f*cosf(t*3.1415927f*2 +  tex_ang + 3.1415927f*0.25f)*(context.aspectCorrect ? context.aspectRatio : 1.0)/ tex_zoom;
-				  tex[i][1] =  0.5f + 0.5f*sinf(t*3.1415927f*2 +  tex_ang + 3.1415927f*0.25f)/ tex_zoom;
-				  points[i][0]=temp_radius*cosf(t*3.1415927f*2 +  ang + 3.1415927f*0.25f)*(context.aspectCorrect ? context.aspectRatio : 1.0)+xval;
-				  points[i][1]=temp_radius*sinf(t*3.1415927f*2 +  ang + 3.1415927f*0.25f)+yval;
+      t = (i-1)/(float) sides;
+      tex[i][0] =  0.5f + 0.5f*cosf(t*3.1415927f*2 +  tex_ang + 3.1415927f*0.25f)*(context.aspectCorrect ? context.aspectRatio : 1.0)/ tex_zoom;
+      tex[i][1] =  0.5f + 0.5f*sinf(t*3.1415927f*2 +  tex_ang + 3.1415927f*0.25f)/ tex_zoom;
+      points[i][0]=temp_radius*cosf(t*3.1415927f*2 +  ang + 3.1415927f*0.25f)*(context.aspectCorrect ? context.aspectRatio : 1.0)+xval;
+      points[i][1]=temp_radius*sinf(t*3.1415927f*2 +  ang + 3.1415927f*0.25f)+yval;
+    }
 
+    glVertexPointer(2,GL_FLOAT,0,points);
+    glColorPointer(4,GL_FLOAT,0,colors);
+    glTexCoordPointer(2,GL_FLOAT,0,tex);
 
-				}
+    glDrawArrays(GL_TRIANGLE_FAN,0,sides+2);
 
-				glVertexPointer(2,GL_FLOAT,0,points);
-				glColorPointer(4,GL_FLOAT,0,colors);
-				glTexCoordPointer(2,GL_FLOAT,0,tex);
+    glDisable(GL_TEXTURE_2D);
+    glPopMatrix();
+    glMatrixMode(GL_MODELVIEW);
 
-				glDrawArrays(GL_TRIANGLE_FAN,0,sides+2);
+    //Reset Texture state since we might have changed it
+    /*
+    if(this->renderTarget->useFBO)
+    {
+      glBindTexture( GL_TEXTURE_2D, renderTarget->textureID[1] );
+    }
+    else
+    {
+      glBindTexture( GL_TEXTURE_2D, renderTarget->textureID[0] );
+    }
+    */
 
-				glDisable(GL_TEXTURE_2D);
-				glPopMatrix();
-				glMatrixMode(GL_MODELVIEW);
+    delete[] colors;
+    delete[] tex;
+    delete[] points;
+  }
+  else
+  {
+    //Untextured (use color values)
 
-				//Reset Texture state since we might have changed it
-/*
-				if(this->renderTarget->useFBO)
-				{
-					glBindTexture( GL_TEXTURE_2D, renderTarget->textureID[1] );
-				}
-				else
-				{
-					glBindTexture( GL_TEXTURE_2D, renderTarget->textureID[0] );
-				}
-*/
+    glEnableClientState(GL_VERTEX_ARRAY);
+    glEnableClientState(GL_COLOR_ARRAY);
+    glDisableClientState(GL_TEXTURE_COORD_ARRAY);
 
-				delete[] colors;
-				delete[] tex;
-				delete[] points;							
-			}
-			else
-			{//Untextured (use color values)
+    floatQuad *colors = new float[sides+2][4];
+    floatPair *points = new float[sides+2][2];
 
-
-			  glEnableClientState(GL_VERTEX_ARRAY);
-			  glEnableClientState(GL_COLOR_ARRAY);
-			  glDisableClientState(GL_TEXTURE_COORD_ARRAY);
-
-			  floatQuad *colors = new float[sides+2][4];
-			  floatPair *points = new float[sides+2][2];
-
-			  //Define the center point of the shape
-			  colors[0][0]=r;
-			  colors[0][1]=g;
-			  colors[0][2]=b;
-			  colors[0][3]=a * masterAlpha;
-			  points[0][0]=xval;
-			  points[0][1]=yval;
+    //Define the center point of the shape
+    colors[0][0]=r;
+    colors[0][1]=g;
+    colors[0][2]=b;
+    colors[0][3]=a * masterAlpha;
+    points[0][0]=xval;
+    points[0][1]=yval;
 
 
 
-			  for ( int i=1;i< sides+2;i++)
-			    {
-			      colors[i][0]=r2;
-			      colors[i][1]=g2;
-			      colors[i][2]=b2;
-			      colors[i][3]=a2 * masterAlpha;
-			      t = (i-1)/(float) sides;
-			      points[i][0]=temp_radius*cosf(t*3.1415927f*2 +  ang + 3.1415927f*0.25f)*(context.aspectCorrect ? context.aspectRatio : 1.0)+xval;
-			      points[i][1]=temp_radius*sinf(t*3.1415927f*2 +  ang + 3.1415927f*0.25f)+yval;
+    for ( int i=1;i< sides+2;i++)
+    {
+      colors[i][0]=r2;
+      colors[i][1]=g2;
+      colors[i][2]=b2;
+      colors[i][3]=a2 * masterAlpha;
+      t = (i-1)/(float) sides;
+      points[i][0]=temp_radius*cosf(t*3.1415927f*2 +  ang + 3.1415927f*0.25f)*(context.aspectCorrect ? context.aspectRatio : 1.0)+xval;
+      points[i][1]=temp_radius*sinf(t*3.1415927f*2 +  ang + 3.1415927f*0.25f)+yval;
 
-			    }
+    }
 
-			  glVertexPointer(2,GL_FLOAT,0,points);
-			  glColorPointer(4,GL_FLOAT,0,colors);
+    glVertexPointer(2,GL_FLOAT,0,points);
+    glColorPointer(4,GL_FLOAT,0,colors);
 
 
-			  glDrawArrays(GL_TRIANGLE_FAN,0,sides+2);
-			  //draw first n-1 triangular pieces
+    glDrawArrays(GL_TRIANGLE_FAN,0,sides+2);
+    //draw first n-1 triangular pieces
 
-			  delete[] colors;
-			  delete[] points;
-			}
-			if (thickOutline==1)  glLineWidth(context.texsize < 512 ? 1 : 2*context.texsize/512);
+    delete[] colors;
+    delete[] points;
+  }
+  if (thickOutline==1)  glLineWidth(context.texsize < 512 ? 1 : 2*context.texsize/512);
 
-			glEnableClientState(GL_VERTEX_ARRAY);
-			glDisableClientState(GL_COLOR_ARRAY);
+  glEnableClientState(GL_VERTEX_ARRAY);
+  glDisableClientState(GL_COLOR_ARRAY);
 
-			floatPair *points = new float[sides+1][2];
+  floatPair *points = new float[sides+1][2];
 
-			glColor4f( border_r, border_g, border_b, border_a * masterAlpha);
+  glColor4f( border_r, border_g, border_b, border_a * masterAlpha);
 
-			for ( int i=0;i< sides;i++)
-			{
-				t = (i-1)/(float) sides;
-				points[i][0]= temp_radius*cosf(t*3.1415927f*2 +  ang + 3.1415927f*0.25f)*(context.aspectCorrect ? context.aspectRatio : 1.0)+xval;
-				points[i][1]=  temp_radius*sinf(t*3.1415927f*2 +  ang + 3.1415927f*0.25f)+yval;
+  for ( int i=0;i< sides;i++)
+  {
+    t = (i-1)/(float) sides;
+    points[i][0] = temp_radius*cosf(t*3.1415927f*2 +  ang + 3.1415927f*0.25f)*(context.aspectCorrect ? context.aspectRatio : 1.0)+xval;
+    points[i][1] = temp_radius*sinf(t*3.1415927f*2 +  ang + 3.1415927f*0.25f)+yval;
+  }
 
-			}
+  glVertexPointer(2,GL_FLOAT,0,points);
+  glDrawArrays(GL_LINE_LOOP,0,sides);
 
-			glVertexPointer(2,GL_FLOAT,0,points);
-			glDrawArrays(GL_LINE_LOOP,0,sides);
+  if (thickOutline==1)  glLineWidth(context.texsize < 512 ? 1 : context.texsize/512);
 
-			if (thickOutline==1)  glLineWidth(context.texsize < 512 ? 1 : context.texsize/512);
-
-			delete[] points;
-
-
+  delete[] points;
 }
 
-void MotionVectors::Draw(RenderContext &context)
+void
+MotionVectors::Draw(RenderContext &context)
 {
-	glEnableClientState(GL_VERTEX_ARRAY);
-	glDisableClientState(GL_TEXTURE_COORD_ARRAY);
-	glDisableClientState(GL_COLOR_ARRAY);
+  glEnableClientState(GL_VERTEX_ARRAY);
+  glDisableClientState(GL_TEXTURE_COORD_ARRAY);
+  glDisableClientState(GL_COLOR_ARRAY);
 
-	float  intervalx=1.0/x_num;
-	float  intervaly=1.0/y_num;
+  float  intervalx=1.0/x_num;
+  float  intervaly=1.0/y_num;
 
-	glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+  glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
 
-	glPointSize(length);
-	glColor4f(r, g, b, a * masterAlpha);
+  glPointSize(length);
+  glColor4f(r, g, b, a * masterAlpha);
 
-	if (x_num + y_num < 600)
-	  {
-	int size = x_num * y_num ;
+  if (x_num + y_num < 600)
+  {
+    int size = x_num * y_num ;
 
-	floatPair *points = new float[size][2];
+    floatPair *points = new float[size][2];
 
-	for (int x=0;x<(int)x_num;x++)
-	{
-		for(int y=0;y<(int)y_num;y++)
-		{
-			float lx, ly, lz;
-			lx = x_offset+x*intervalx;
-			ly = y_offset+y*intervaly;
+    for (int x=0;x<(int)x_num;x++)
+    {
+      for(int y=0;y<(int)y_num;y++)
+      {
+        float lx, ly, lz;
+        lx = x_offset+x*intervalx;
+        ly = y_offset+y*intervaly;
 
-			points[(x * (int)y_num) + y][0] = lx;
-			points[(x * (int)y_num) + y][1] = ly;
-		}
-	}
+        points[(x * (int)y_num) + y][0] = lx;
+        points[(x * (int)y_num) + y][1] = ly;
+      }
+    }
 
-	glVertexPointer(2,GL_FLOAT,0,points);
-	glDrawArrays(GL_POINTS,0,size);
+    glVertexPointer(2,GL_FLOAT,0,points);
+    glDrawArrays(GL_POINTS,0,size);
 
-	delete[] points;
-	  }
+    delete[] points;
+  }
 }
 
-void Border::Draw(RenderContext &context)
+void
+Border::Draw(RenderContext &context)
 {
-	glEnableClientState(GL_VERTEX_ARRAY);
-	glDisableClientState(GL_COLOR_ARRAY);
-	glDisableClientState(GL_TEXTURE_COORD_ARRAY);
-	//Draw Borders
-	float of=outer_size*.5;
-	float iff=inner_size*.5;
-	float texof=1.0-of;
+  glEnableClientState(GL_VERTEX_ARRAY);
+  glDisableClientState(GL_COLOR_ARRAY);
+  glDisableClientState(GL_TEXTURE_COORD_ARRAY);
+  //Draw Borders
+  float of=outer_size*.5;
+  float iff=inner_size*.5;
+  float texof=1.0-of;
 
-	//no additive drawing for borders
-	glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-	glColor4f(outer_r, outer_g, outer_b, outer_a * masterAlpha);
+  //no additive drawing for borders
+  glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+  glColor4f(outer_r, outer_g, outer_b, outer_a * masterAlpha);
 
-	float pointsA[4][2] = {{0,0},{0,1},{of,0},{of,1}};
-	glVertexPointer(2,GL_FLOAT,0,pointsA);
-	glDrawArrays(GL_TRIANGLE_STRIP,0,4);
+  float pointsA[4][2] = {{0,0},{0,1},{of,0},{of,1}};
+  glVertexPointer(2,GL_FLOAT,0,pointsA);
+  glDrawArrays(GL_TRIANGLE_STRIP,0,4);
 
-	float pointsB[4][2] = {{of,0},{of,of},{texof,0},{texof,of}};
-	glVertexPointer(2,GL_FLOAT,0,pointsB);
-	glDrawArrays(GL_TRIANGLE_STRIP,0,4);
+  float pointsB[4][2] = {{of,0},{of,of},{texof,0},{texof,of}};
+  glVertexPointer(2,GL_FLOAT,0,pointsB);
+  glDrawArrays(GL_TRIANGLE_STRIP,0,4);
 
-	float pointsC[4][2] = {{texof,0},{texof,1},{1,0},{1,1}};
-	glVertexPointer(2,GL_FLOAT,0,pointsC);
-	glDrawArrays(GL_TRIANGLE_STRIP,0,4);
+  float pointsC[4][2] = {{texof,0},{texof,1},{1,0},{1,1}};
+  glVertexPointer(2,GL_FLOAT,0,pointsC);
+  glDrawArrays(GL_TRIANGLE_STRIP,0,4);
 
-	float pointsD[4][2] = {{of,1},{of,texof},{texof,1},{texof,texof}};
-	glVertexPointer(2,GL_FLOAT,0,pointsD);
-	glDrawArrays(GL_TRIANGLE_STRIP,0,4);
+  float pointsD[4][2] = {{of,1},{of,texof},{texof,1},{texof,texof}};
+  glVertexPointer(2,GL_FLOAT,0,pointsD);
+  glDrawArrays(GL_TRIANGLE_STRIP,0,4);
 
-	glColor4f(inner_r, inner_g, inner_b, inner_a * masterAlpha);
+  glColor4f(inner_r, inner_g, inner_b, inner_a * masterAlpha);
 
-	glRectf(of, of, of+iff, texof);
-	glRectf(of+iff, of, texof-iff, of+iff);
-	glRectf(texof-iff, of, texof, texof);
-	glRectf(of+iff, texof, texof-iff, texof-iff);
+  glRectf(of, of, of+iff, texof);
+  glRectf(of+iff, of, texof-iff, of+iff);
+  glRectf(texof-iff, of, texof, texof);
+  glRectf(of+iff, texof, texof-iff, texof-iff);
 
-	float pointsE[4][2] = {{of,of},{of,texof},{of+iff,of},{of+iff,texof}};
-	glVertexPointer(2,GL_FLOAT,0,pointsE);
-	glDrawArrays(GL_TRIANGLE_STRIP,0,4);
+  float pointsE[4][2] = {{of,of},{of,texof},{of+iff,of},{of+iff,texof}};
+  glVertexPointer(2,GL_FLOAT,0,pointsE);
+  glDrawArrays(GL_TRIANGLE_STRIP,0,4);
 
-	float pointsF[4][2] = {{of+iff,of},{of+iff,of+iff},{texof-iff,of},{texof-iff,of+iff}};
-	glVertexPointer(2,GL_FLOAT,0,pointsF);
-	glDrawArrays(GL_TRIANGLE_STRIP,0,4);
+  float pointsF[4][2] = {{of+iff,of},{of+iff,of+iff},{texof-iff,of},{texof-iff,of+iff}};
+  glVertexPointer(2,GL_FLOAT,0,pointsF);
+  glDrawArrays(GL_TRIANGLE_STRIP,0,4);
 
-	float pointsG[4][2] = {{texof-iff,of},{texof-iff,texof},{texof,of},{texof,texof}};
-	glVertexPointer(2,GL_FLOAT,0,pointsG);
-	glDrawArrays(GL_TRIANGLE_STRIP,0,4);
+  float pointsG[4][2] = {{texof-iff,of},{texof-iff,texof},{texof,of},{texof,texof}};
+  glVertexPointer(2,GL_FLOAT,0,pointsG);
+  glDrawArrays(GL_TRIANGLE_STRIP,0,4);
 
-	float pointsH[4][2] = {{of+iff,texof},{of+iff,texof-iff},{texof-iff,texof},{texof-iff,texof-iff}};
-	glVertexPointer(2,GL_FLOAT,0,pointsH);
-	glDrawArrays(GL_TRIANGLE_STRIP,0,4);
+  float pointsH[4][2] = {{of+iff,texof},{of+iff,texof-iff},{texof-iff,texof},{texof-iff,texof-iff}};
+  glVertexPointer(2,GL_FLOAT,0,pointsH);
+  glDrawArrays(GL_TRIANGLE_STRIP,0,4);
 
 }
diff --git a/src/libprojectM/Renderer/Renderable.hpp b/src/libprojectM/Renderer/Renderable.hpp
index b2aa72f..4f759e0 100644
--- a/src/libprojectM/Renderer/Renderable.hpp
+++ b/src/libprojectM/Renderer/Renderable.hpp
@@ -3,28 +3,30 @@
 #include <vector>
 #include <typeinfo>
 #include "TextureManager.hpp"
+
+
 class BeatDetect;
 
 
 class RenderContext
 {
 public:
-	float time;
-	int texsize;
-	float aspectRatio;
-	bool aspectCorrect;
-	BeatDetect *beatDetect;
-	TextureManager *textureManager;
+  float time;
+  int   texsize;
+  float aspectRatio;
+  bool  aspectCorrect;
+  BeatDetect *beatDetect;
+  TextureManager *textureManager;
 
-	RenderContext();
+  RenderContext();
 };
 
 class RenderItem
 {
 public:
-	float masterAlpha;
-	virtual void Draw(RenderContext &context) = 0;
-	RenderItem();
+  float masterAlpha;
+  virtual void Draw(RenderContext &context) = 0;
+  RenderItem();
 };
 
 typedef std::vector<RenderItem*> RenderItemList;
@@ -32,46 +34,46 @@
 class DarkenCenter : public RenderItem
 {
 public:
-	DarkenCenter();
-	void Draw(RenderContext &context);
+  DarkenCenter();
+  void Draw(RenderContext &context);
 };
 
 class Shape : public RenderItem
 {
 public:
-    std::string imageUrl;
-    int sides;
-    bool thickOutline;
-    bool enabled;
-    bool additive;
-    bool textured;
+  std::string imageUrl;
+  int   sides;
+  bool  thickOutline;
+  bool  enabled;
+  bool  additive;
+  bool  textured;
 
-    float tex_zoom;
-    float tex_ang;
+  float tex_zoom;
+  float tex_ang;
 
-    float x; /* x position  */
-    float y; /* y position  */
-    float radius;
-    float ang;
+  float x; /* x position  */
+  float y; /* y position  */
+  float radius;
+  float ang;
 
-    float r; /* red color value */
-    float g; /* green color value */
-    float b; /* blue color value */
-    float a; /* alpha color value */
+  float r; /* red color value */
+  float g; /* green color value */
+  float b; /* blue color value */
+  float a; /* alpha color value */
 
-    float r2; /* red color value */
-    float g2; /* green color value */
-    float b2; /* blue color value */
-    float a2; /* alpha color value */
+  float r2; /* red color value */
+  float g2; /* green color value */
+  float b2; /* blue color value */
+  float a2; /* alpha color value */
 
-    float border_r; /* red color value */
-    float border_g; /* green color value */
-    float border_b; /* blue color value */
-    float border_a; /* alpha color value */
+  float border_r; /* red color value */
+  float border_g; /* green color value */
+  float border_b; /* blue color value */
+  float border_a; /* alpha color value */
 
 
-    Shape();
-    virtual void Draw(RenderContext &context);
+  Shape();
+  virtual void Draw(RenderContext &context);
 };
 
 class Text : RenderItem
@@ -81,55 +83,56 @@
 class MotionVectors : public RenderItem
 {
 public:
-    float r;
-    float g;
-    float b;
-    float a;
-    float length;
-    float x_num;
-    float y_num;
-    float x_offset;
-    float y_offset;
+  float r;
+  float g;
+  float b;
+  float a;
+  float length;
+  float x_num;
+  float y_num;
+  float x_offset;
+  float y_offset;
 
-    void Draw(RenderContext &context);
-    MotionVectors();
+  void Draw(RenderContext &context);
+  MotionVectors();
 };
 
 class Border : public RenderItem
 {
 public:
-    float outer_size;
-    float outer_r;
-    float outer_g;
-    float outer_b;
-    float outer_a;
+  float outer_size;
+  float outer_r;
+  float outer_g;
+  float outer_b;
+  float outer_a;
 
-    float inner_size;
-    float inner_r;
-    float inner_g;
-    float inner_b;
-    float inner_a;
+  float inner_size;
+  float inner_r;
+  float inner_g;
+  float inner_b;
+  float inner_a;
 
-    void Draw(RenderContext &context);
-    Border();
+  void Draw(RenderContext &context);
+  Border();
 };
 
+/*  FIXME: 'struct'?  Really?  */
 struct TypeIdPair {
-	TypeIdPair(const std::type_info & info1, const std::type_info & info2): id1(info1.name()), id2(info2.name()) {}
-	TypeIdPair(const std::string & id1, const std::string & id2): id1(id1), id2(id2) {}
-	std::string id1;
-	std::string id2;
-	inline bool operator<(const TypeIdPair & rhs) const {
-		return this->id1 < rhs.id1 || (this->id1 == rhs.id1 && this->id2 < rhs.id2);
-	}
+  TypeIdPair(const std::type_info & info1, const std::type_info & info2): id1(info1.name()), id2(info2.name()) {}
+  TypeIdPair(const std::string & id1, const std::string & id2): id1(id1), id2(id2) {}
+  std::string id1;
+  std::string id2;
+  inline bool operator<(const TypeIdPair & rhs) const {
+    return this->id1 < rhs.id1 || (this->id1 == rhs.id1 && this->id2 < rhs.id2);
+  }
 
-	inline bool operator>(const TypeIdPair & rhs) const {
-		return !operator<(rhs) && !operator==(rhs);
-	}
+  inline bool operator>(const TypeIdPair & rhs) const {
+    return !operator<(rhs) && !operator==(rhs);
+  }
 
-	inline bool operator==(const TypeIdPair & rhs) const {
-			return this->id1 == rhs.id1 && this->id2 == rhs.id2;
-	}
+  inline bool operator==(const TypeIdPair & rhs) const {
+    return this->id1 == rhs.id1 && this->id2 == rhs.id2;
+  }
 };
 
 #endif
diff --git a/src/libprojectM/Renderer/Renderer.cpp b/src/libprojectM/Renderer/Renderer.cpp
index 509ea79..0e72cb9 100644
--- a/src/libprojectM/Renderer/Renderer.cpp
+++ b/src/libprojectM/Renderer/Renderer.cpp
@@ -11,771 +11,799 @@
 #include "omptl/omptl_algorithm"
 #include "UserTexture.hpp"
 
+
 class Preset;
 
-Renderer::Renderer(int width, int height, int gx, int gy, int texsize, BeatDetect *beatDetect, std::string _presetURL,
-		std::string _titlefontURL, std::string _menufontURL) :
-	title_fontURL(_titlefontURL), menu_fontURL(_menufontURL), presetURL(_presetURL), m_presetName("None"), vw(width),
-			vh(height), texsize(texsize), mesh(gx, gy)
+Renderer::Renderer (
+int         width,
+int         height,
+int         gx,
+int         gy,
+int         texsize,
+BeatDetect  *beatDetect,
+std::string _presetURL,
+std::string _titlefontURL,
+std::string _menufontURL
+)
+  : title_fontURL(_titlefontURL),
+    menu_fontURL(_menufontURL),
+    presetURL(_presetURL),
+    m_presetName("None"),
+    vw(width), vh(height),
+    texsize(texsize),
+    mesh(gx, gy)
 {
-	int x;
-	int y;
+  int x;
+  int y;
 
-	this->totalframes = 1;
-	this->noSwitch = false;
-	this->showfps = false;
-	this->showtitle = false;
-	this->showpreset = false;
-	this->showhelp = false;
-	this->showstats = false;
-	this->studio = false;
-	this->realfps = 0;
+  this->totalframes = 1;
+  this->noSwitch = false;
+  this->showfps = false;
+  this->showtitle = false;
+  this->showpreset = false;
+  this->showhelp = false;
+  this->showstats = false;
+  this->studio = false;
+  this->realfps = 0;
 
-	this->drawtitle = 0;
+  this->drawtitle = 0;
 
-	//this->title = "Unknown";
+  //this->title = "Unknown";
 
-	/** Other stuff... */
-	this->correction = true;
-	this->aspect = (float) height / (float) width;;
+  /** Other stuff... */
+  this->correction = true;
+  this->aspect = (float) height / (float) width;;
 
-	/// @bug put these on member init list
-	this->renderTarget = new RenderTarget(texsize, width, height);
-	this->textureManager = new TextureManager(presetURL);
-	this->beatDetect = beatDetect;
+  /// @bug put these on member init list
+  this->renderTarget = new RenderTarget(texsize, width, height);
+  this->textureManager = new TextureManager(presetURL);
+  this->beatDetect = beatDetect;
 
 #ifdef USE_FTGL
-	/**f Load the standard fonts */
+  /**f Load the standard fonts */
 
-	title_font = new FTGLPixmapFont(title_fontURL.c_str());
-	other_font = new FTGLPixmapFont(menu_fontURL.c_str());
-	poly_font = new FTGLExtrdFont(title_fontURL.c_str());
+  title_font = new FTGLPixmapFont(title_fontURL.c_str());
+  other_font = new FTGLPixmapFont(menu_fontURL.c_str());
+  poly_font = new FTGLExtrdFont(title_fontURL.c_str());
 
-	if(title_font->Error()) {
-		fprintf(stderr, "Failed to open font %s\n", title_fontURL.c_str());
-	} else {
-		title_font->UseDisplayList(true);
-	}
+  if(title_font->Error()) {
+    fprintf(stderr, "Failed to open font %s\n", title_fontURL.c_str());
+  } else {
+    title_font->UseDisplayList(true);
+  }
 
-	other_font->UseDisplayList(true);
+  other_font->UseDisplayList(true);
 
-	if(poly_font->Error()) {
-		fprintf(stderr, "Failed to open font %s\n", title_fontURL.c_str());
-	} else {
-		poly_font->UseDisplayList(true);
-		poly_font->Depth(20);
-		poly_font->FaceSize(72);
-	}
-
+  if(poly_font->Error()) {
+    fprintf(stderr, "Failed to open font %s\n", title_fontURL.c_str());
+  } else {
+    poly_font->UseDisplayList(true);
+    poly_font->Depth(20);
+    poly_font->FaceSize(72);
+  }
 #endif /** USE_FTGL */
 
 
-	int size = (mesh.height - 1) *mesh.width * 5 * 2;
-	p = ( float * ) wipemalloc ( size * sizeof ( float ) );
+  int size = (mesh.height - 1) *mesh.width * 5 * 2;
+  p = ( float * ) wipemalloc ( size * sizeof ( float ) );
 
 
-	for (int j = 0; j < mesh.height - 1; j++)
-	{
-		int base = j * mesh.width * 2 * 5;
+  for (int j = 0; j < mesh.height - 1; j++)
+  {
+    int base = j * mesh.width * 2 * 5;
 
-
-		for (int i = 0; i < mesh.width; i++)
-		{
-			int index = j * mesh.width + i;
-			int index2 = (j + 1) * mesh.width + i;
-
-			int strip = base + i * 10;
-			p[strip + 2] = mesh.identity[index].x;
-			p[strip + 3] = mesh.identity[index].y;
-			p[strip + 4] = 0;
-
-			p[strip + 7] = mesh.identity[index2].x;
-			p[strip + 8] = mesh.identity[index2].y;
-			p[strip + 9] = 0;
-		}
-	}
-
-
-#ifdef USE_CG
-	shaderEngine.setParams(renderTarget->texsize, renderTarget->textureID[1], aspect, beatDetect, textureManager);
-#endif
-
-}
-
-void Renderer::SetPipeline(Pipeline &pipeline)
-{
-	currentPipe = &pipeline;
-#ifdef USE_CG
-	shaderEngine.reset();
-	shaderEngine.loadShader(pipeline.warpShader);
-	shaderEngine.loadShader(pipeline.compositeShader);
-#endif
-}
-
-void Renderer::ResetTextures()
-{
-	textureManager->Clear();
-
-	delete (renderTarget);
-	renderTarget = new RenderTarget(texsize, vw, vh);
-	reset(vw, vh);
-
-	textureManager->Preload();
-}
-
-void Renderer::SetupPass1(const Pipeline &pipeline, const PipelineContext &pipelineContext)
-{
-	//glMatrixMode(GL_PROJECTION);
-	//glPushMatrix();
-	//glMatrixMode(GL_MODELVIEW);
-	//glPushMatrix();
-
-	totalframes++;
-	renderTarget->lock();
-	glViewport(0, 0, renderTarget->texsize, renderTarget->texsize);
-
-	glEnable(GL_TEXTURE_2D);
-
-	//If using FBO, switch to FBO texture
-
-	glMatrixMode(GL_TEXTURE);
-	glLoadIdentity();
-
-	glMatrixMode(GL_PROJECTION);
-	glLoadIdentity();
-
-#ifdef USE_GLES1
-	glOrthof(0.0, 1, 0.0, 1, -40, 40);
-#else
-	glOrtho(0.0, 1, 0.0, 1, -40, 40);
-#endif
-
-	glMatrixMode(GL_MODELVIEW);
-	glLoadIdentity();
-
-#ifdef USE_CG
-	shaderEngine.RenderBlurTextures(pipeline, pipelineContext, renderTarget->texsize);
-#endif
-}
-
-void Renderer::RenderItems(const Pipeline &pipeline, const PipelineContext &pipelineContext)
-{
-	renderContext.time = pipelineContext.time;
-	renderContext.texsize = texsize;
-	renderContext.aspectCorrect = correction;
-	renderContext.aspectRatio = aspect;
-	renderContext.textureManager = textureManager;
-	renderContext.beatDetect = beatDetect;
-
-	for (std::vector<RenderItem*>::const_iterator pos = pipeline.drawables.begin(); pos != pipeline.drawables.end(); ++pos)
+    for (int i = 0; i < mesh.width; i++)
     {
-      if (*pos != NULL)
-      {
-		(*pos)->Draw(renderContext);
-      }
+      int index = j * mesh.width + i;
+      int index2 = (j + 1) * mesh.width + i;
+
+      int strip = base + i * 10;
+      p[strip + 2] = mesh.identity[index].x;
+      p[strip + 3] = mesh.identity[index].y;
+      p[strip + 4] = 0;
+
+      p[strip + 7] = mesh.identity[index2].x;
+      p[strip + 8] = mesh.identity[index2].y;
+      p[strip + 9] = 0;
     }
-}
+  }
 
-void Renderer::FinishPass1()
-{
-	draw_title_to_texture();
-	/** Restore original view state */
-	//glMatrixMode(GL_MODELVIEW);
-	//glPopMatrix();
-
-	//glMatrixMode(GL_PROJECTION);
-	//glPopMatrix();
-
-	renderTarget->unlock();
-
-}
-
-void Renderer::Pass2(const Pipeline &pipeline, const PipelineContext &pipelineContext)
-{
-	//BEGIN PASS 2
-	//
-	//end of texture rendering
-	//now we copy the texture from the FBO or framebuffer to
-	//video texture memory and render fullscreen.
-
-	/** Reset the viewport size */
-#ifdef USE_FBO
-	if (renderTarget->renderToTexture)
-	{
-		glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, this->renderTarget->fbuffer[1]);
-		glViewport(0, 0, this->renderTarget->texsize, this->renderTarget->texsize);
-	}
-	else
-#endif
-		glViewport(0, 0, this->vw, this->vh);
-
-	glBindTexture(GL_TEXTURE_2D, this->renderTarget->textureID[0]);
-
-	glMatrixMode(GL_PROJECTION);
-	glLoadIdentity();
-#ifdef USE_GLES1
-	glOrthof(-0.5, 0.5, -0.5, 0.5, -40, 40);
-#else
-	glOrtho(-0.5, 0.5, -0.5, 0.5, -40, 40);
-#endif
-	glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-
-	glLineWidth(this->renderTarget->texsize < 512 ? 1 : this->renderTarget->texsize / 512.0);
-
-	CompositeOutput(pipeline, pipelineContext);
-
-	glMatrixMode(GL_MODELVIEW);
-	glLoadIdentity();
-	glTranslatef(-0.5, -0.5, 0);
-
-	// When console refreshes, there is a chance the preset has been changed by the user
-	refreshConsole();
-	draw_title_to_screen(false);
-	if (this->showhelp % 2)
-		draw_help();
-	if (this->showtitle % 2)
-		draw_title();
-	if (this->showfps % 2)
-		draw_fps(this->realfps);
-	if (this->showpreset % 2)
-		draw_preset();
-	if (this->showstats % 2)
-		draw_stats();
-	glTranslatef(0.5, 0.5, 0);
-
-#ifdef USE_FBO
-	if (renderTarget->renderToTexture)
-		glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
-#endif
-}
-
-void Renderer::RenderFrame(const Pipeline &pipeline, const PipelineContext &pipelineContext)
-{
-
-	SetupPass1(pipeline, pipelineContext);
 
 #ifdef USE_CG
-	shaderEngine.enableShader(currentPipe->warpShader, pipeline, pipelineContext);
-#endif
-	Interpolation(pipeline);
-#ifdef USE_CG
-	shaderEngine.disableShader();
+  shaderEngine.setParams(renderTarget->texsize, renderTarget->textureID[1], aspect, beatDetect, textureManager);
 #endif
 
-	RenderItems(pipeline, pipelineContext);
-	FinishPass1();
-	Pass2(pipeline, pipelineContext);
 }
 
-void Renderer::Interpolation(const Pipeline &pipeline)
+void
+Renderer::SetPipeline(Pipeline &pipeline)
 {
-	if (this->renderTarget->useFBO)
-		glBindTexture(GL_TEXTURE_2D, renderTarget->textureID[1]);
-	else
-		glBindTexture(GL_TEXTURE_2D, renderTarget->textureID[0]);
-
-	//Texture wrapping( clamp vs. wrap)
-	if (pipeline.textureWrap == 0)
-	{
-#ifdef USE_GLES1
-		glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
-		glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
-#else
-		glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
-		glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
+  currentPipe = &pipeline;
+#ifdef USE_CG
+  shaderEngine.reset();
+  shaderEngine.loadShader(pipeline.warpShader);
+  shaderEngine.loadShader(pipeline.compositeShader);
 #endif
-	}
-	else
-	{
-		glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
-		glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
-	}
+}
 
-	glMatrixMode(GL_TEXTURE);
-	glLoadIdentity();
+void
+Renderer::ResetTextures()
+{
+  textureManager->Clear();
 
-	glBlendFunc(GL_SRC_ALPHA, GL_ZERO);
+  delete (renderTarget);
+  renderTarget = new RenderTarget(texsize, vw, vh);
+  reset(vw, vh);
 
-	glColor4f(1.0, 1.0, 1.0, pipeline.screenDecay);
+  textureManager->Preload();
+}
 
-	glEnable(GL_TEXTURE_2D);
+void
+Renderer::SetupPass1(const Pipeline &pipeline, const PipelineContext &pipelineContext)
+{
+  //glMatrixMode(GL_PROJECTION);
+  //glPushMatrix();
+  //glMatrixMode(GL_MODELVIEW);
+  //glPushMatrix();
+
+  totalframes++;
+  renderTarget->lock();
+  glViewport(0, 0, renderTarget->texsize, renderTarget->texsize);
+
+  glEnable(GL_TEXTURE_2D);
+
+  //If using FBO, switch to FBO texture
+
+  glMatrixMode(GL_TEXTURE);
+  glLoadIdentity();
+
+  glMatrixMode(GL_PROJECTION);
+  glLoadIdentity();
+
+#ifdef USE_GLES1
+  glOrthof(0.0, 1, 0.0, 1, -40, 40);
+#else
+  glOrtho(0.0, 1, 0.0, 1, -40, 40);
+#endif
+
+  glMatrixMode(GL_MODELVIEW);
+  glLoadIdentity();
+
+#ifdef USE_CG
+  shaderEngine.RenderBlurTextures(pipeline, pipelineContext, renderTarget->texsize);
+#endif
+}
+
+void
+Renderer::RenderItems(const Pipeline &pipeline, const PipelineContext &pipelineContext)
+{
+  renderContext.time = pipelineContext.time;
+  renderContext.texsize = texsize;
+  renderContext.aspectCorrect = correction;
+  renderContext.aspectRatio = aspect;
+  renderContext.textureManager = textureManager;
+  renderContext.beatDetect = beatDetect;
+
+  for (std::vector<RenderItem*>::const_iterator pos = pipeline.drawables.begin();
+       pos != pipeline.drawables.end();
+       ++pos)
+  {
+    if (*pos != NULL)
+    {
+      (*pos)->Draw(renderContext);
+    }
+  }
+}
+
+void
+Renderer::FinishPass1()
+{
+  draw_title_to_texture();
+  /** Restore original view state */
+  //glMatrixMode(GL_MODELVIEW);
+  //glPopMatrix();
+
+  //glMatrixMode(GL_PROJECTION);
+  //glPopMatrix();
+
+  renderTarget->unlock();
+}
+
+void
+Renderer::Pass2(const Pipeline &pipeline, const PipelineContext &pipelineContext)
+{
+  //BEGIN PASS 2
+  //
+  //end of texture rendering
+  //now we copy the texture from the FBO or framebuffer to
+  //video texture memory and render fullscreen.
+
+  /** Reset the viewport size */
+#ifdef USE_FBO
+  if (renderTarget->renderToTexture)
+  {
+    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, this->renderTarget->fbuffer[1]);
+    glViewport(0, 0, this->renderTarget->texsize, this->renderTarget->texsize);
+  }
+  else
+#endif
+    glViewport(0, 0, this->vw, this->vh);
+
+  glBindTexture(GL_TEXTURE_2D, this->renderTarget->textureID[0]);
+
+  glMatrixMode(GL_PROJECTION);
+  glLoadIdentity();
+#ifdef USE_GLES1
+  glOrthof(-0.5, 0.5, -0.5, 0.5, -40, 40);
+#else
+  glOrtho(-0.5, 0.5, -0.5, 0.5, -40, 40);
+#endif
+  glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
+  glLineWidth(this->renderTarget->texsize < 512 ? 1 : this->renderTarget->texsize / 512.0);
+
+  CompositeOutput(pipeline, pipelineContext);
+
+  glMatrixMode(GL_MODELVIEW);
+  glLoadIdentity();
+  glTranslatef(-0.5, -0.5, 0);
+
+  // When console refreshes, there is a chance the preset has been changed by the user
+  refreshConsole();
+  draw_title_to_screen(false);
+  if (this->showhelp % 2)
+    draw_help();
+  if (this->showtitle % 2)
+    draw_title();
+  if (this->showfps % 2)
+    draw_fps(this->realfps);
+  if (this->showpreset % 2)
+    draw_preset();
+  if (this->showstats % 2)
+    draw_stats();
+  glTranslatef(0.5, 0.5, 0);
+
+#ifdef USE_FBO
+  if (renderTarget->renderToTexture)
+    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
+#endif
+}
+
+void
+Renderer::RenderFrame(const Pipeline &pipeline, const PipelineContext &pipelineContext)
+{
+
+  SetupPass1(pipeline, pipelineContext);
+
+#ifdef USE_CG
+  shaderEngine.enableShader(currentPipe->warpShader, pipeline, pipelineContext);
+#endif
+  Interpolation(pipeline);
+#ifdef USE_CG
+  shaderEngine.disableShader();
+#endif
+
+  RenderItems(pipeline, pipelineContext);
+  FinishPass1();
+  Pass2(pipeline, pipelineContext);
+}
+
+void
+Renderer::Interpolation(const Pipeline &pipeline)
+{
+  if (this->renderTarget->useFBO)
+    glBindTexture(GL_TEXTURE_2D, renderTarget->textureID[1]);
+  else
+    glBindTexture(GL_TEXTURE_2D, renderTarget->textureID[0]);
+
+  //Texture wrapping( clamp vs. wrap)
+  if (pipeline.textureWrap == 0)
+  {
+#ifdef USE_GLES1
+    glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+    glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+#else
+    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
+    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
+#endif
+  }
+  else
+  {
+    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+  }
+
+  glMatrixMode(GL_TEXTURE);
+  glLoadIdentity();
+
+  glBlendFunc(GL_SRC_ALPHA, GL_ZERO);
+
+  glColor4f(1.0, 1.0, 1.0, pipeline.screenDecay);
+
+  glEnable(GL_TEXTURE_2D);
 
 
-	glEnableClientState(GL_VERTEX_ARRAY);
-	glEnableClientState(GL_TEXTURE_COORD_ARRAY);
-	glDisableClientState(GL_COLOR_ARRAY);
+  glEnableClientState(GL_VERTEX_ARRAY);
+  glEnableClientState(GL_TEXTURE_COORD_ARRAY);
+  glDisableClientState(GL_COLOR_ARRAY);
 
 
-	//glVertexPointer(2, GL_FLOAT, 0, p);
-	//glTexCoordPointer(2, GL_FLOAT, 0, t);
+  //glVertexPointer(2, GL_FLOAT, 0, p);
+  //glTexCoordPointer(2, GL_FLOAT, 0, t);
   glTexCoordPointer (2, GL_FLOAT, sizeof (GLfloat) * 5, (GLfloat *) p);
   glVertexPointer (3, GL_FLOAT, sizeof (GLfloat) * 5, (GLfloat *) p + 2);
 
 
-	if (pipeline.staticPerPixel)
-	{
-		for (int j = 0; j < mesh.height - 1; j++)
-		{
-			int base = j * mesh.width * 2 * 5;
+  if (pipeline.staticPerPixel)
+  {
+    for (int j = 0; j < mesh.height - 1; j++)
+    {
+      int base = j * mesh.width * 2 * 5;
 
-			for (int i = 0; i < mesh.width; i++)
-			{
-				int strip = base + i * 10;
-				p[strip] = pipeline.x_mesh[i][j];
-				p[strip + 1] = pipeline.y_mesh[i][j];
+      for (int i = 0; i < mesh.width; i++)
+      {
+        int strip = base + i * 10;
+        p[strip] = pipeline.x_mesh[i][j];
+        p[strip + 1] = pipeline.y_mesh[i][j];
 
-				p[strip + 5] = pipeline.x_mesh[i][j+1];
-				p[strip + 6] = pipeline.y_mesh[i][j+1];
-			}
-		}
+        p[strip + 5] = pipeline.x_mesh[i][j+1];
+        p[strip + 6] = pipeline.y_mesh[i][j+1];
+      }
+    }
+  }
+  else
+  {
+    mesh.Reset();
+    omptl::transform(mesh.p.begin(), mesh.p.end(), mesh.identity.begin(), mesh.p.begin(), &Renderer::PerPixel);
 
-	}
-	else
-	{
-		mesh.Reset();
-		omptl::transform(mesh.p.begin(), mesh.p.end(), mesh.identity.begin(), mesh.p.begin(), &Renderer::PerPixel);
+    for (int j = 0; j < mesh.height - 1; j++)
+    {
+      int base = j * mesh.width * 2 * 5;
 
-	for (int j = 0; j < mesh.height - 1; j++)
-	{
-		int base = j * mesh.width * 2 * 5;
+      for (int i = 0; i < mesh.width; i++)
+      {
+        int strip = base + i * 10;
+        int index = j * mesh.width + i;
+        int index2 = (j + 1) * mesh.width + i;
 
-		for (int i = 0; i < mesh.width; i++)
-		{
-			int strip = base + i * 10;
-			int index = j * mesh.width + i;
-			int index2 = (j + 1) * mesh.width + i;
+        p[strip] = mesh.p[index].x;
+        p[strip + 1] = mesh.p[index].y;
 
-			p[strip] = mesh.p[index].x;
-			p[strip + 1] = mesh.p[index].y;
-
-			p[strip + 5] = mesh.p[index2].x;
-			p[strip + 6] = mesh.p[index2].y;
+        p[strip + 5] = mesh.p[index2].x;
+        p[strip + 6] = mesh.p[index2].y;
 
 
-		}
-	}
+      }
+    }
+  }
 
-	}
-
-	for (int j = 0; j < mesh.height - 1; j++)
-		glDrawArrays(GL_TRIANGLE_STRIP,j* mesh.width* 2,mesh.width*2);
+  for (int j = 0; j < mesh.height - 1; j++)
+    glDrawArrays(GL_TRIANGLE_STRIP,j* mesh.width* 2,mesh.width*2);
 
 
-	glDisable(GL_TEXTURE_2D);
+  glDisable(GL_TEXTURE_2D);
 
-	glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+  glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
 
 }
+
 Pipeline* Renderer::currentPipe;
 
 Renderer::~Renderer()
 {
 
-	int x;
+  int x;
 
-	if (renderTarget)
-		delete (renderTarget);
-	if (textureManager)
-		delete (textureManager);
+  if (renderTarget)
+    delete (renderTarget);
+  if (textureManager)
+    delete (textureManager);
 
-	//std::cerr << "grid assign end" << std::endl;
+  //std::cerr << "grid assign end" << std::endl;
 
-	free(p);
+  free(p);
 
 #ifdef USE_FTGL
-	//	std::cerr << "freeing title fonts" << std::endl;
-	if (title_font)
-		delete title_font;
-	if (poly_font)
-		delete poly_font;
-	if (other_font)
-		delete other_font;
-	//	std::cerr << "freeing title fonts finished" << std::endl;
+  //  std::cerr << "freeing title fonts" << std::endl;
+  if (title_font)
+    delete title_font;
+  if (poly_font)
+    delete poly_font;
+  if (other_font)
+    delete other_font;
+  //  std::cerr << "freeing title fonts finished" << std::endl;
 #endif
-	//	std::cerr << "exiting destructor" << std::endl;
+  //  std::cerr << "exiting destructor" << std::endl;
 }
 
-void Renderer::reset(int w, int h)
+void
+Renderer::reset(int w, int h)
 {
-	aspect = (float) h / (float) w;
-	this -> vw = w;
-	this -> vh = h;
+  aspect = (float) h / (float) w;
+  this -> vw = w;
+  this -> vh = h;
 
 #if USE_CG
-	shaderEngine.setAspect(aspect);
+  shaderEngine.setAspect(aspect);
 #endif
 
-	glShadeModel(GL_SMOOTH);
+  glShadeModel(GL_SMOOTH);
 
-	glCullFace(GL_BACK);
-	//glFrontFace( GL_CCW );
+  glCullFace(GL_BACK);
+  //glFrontFace( GL_CCW );
 
-	glClearColor(0, 0, 0, 0);
+  glClearColor(0, 0, 0, 0);
 
-	glViewport(0, 0, w, h);
+  glViewport(0, 0, w, h);
 
-	glMatrixMode(GL_TEXTURE);
-	glLoadIdentity();
+  glMatrixMode(GL_TEXTURE);
+  glLoadIdentity();
 
-	glMatrixMode(GL_PROJECTION);
-	glLoadIdentity();
+  glMatrixMode(GL_PROJECTION);
+  glLoadIdentity();
 
-	glMatrixMode(GL_MODELVIEW);
-	glLoadIdentity();
+  glMatrixMode(GL_MODELVIEW);
+  glLoadIdentity();
 
 #ifndef USE_GLES1
-	glDrawBuffer(GL_BACK);
-	glReadBuffer(GL_BACK);
+  glDrawBuffer(GL_BACK);
+  glReadBuffer(GL_BACK);
 #endif
-	glEnable(GL_BLEND);
+  glEnable(GL_BLEND);
 
-	glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+  glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
 
-	glEnable(GL_LINE_SMOOTH);
+  glEnable(GL_LINE_SMOOTH);
 
-	glEnable(GL_POINT_SMOOTH);
-	glClear(GL_COLOR_BUFFER_BIT);
+  glEnable(GL_POINT_SMOOTH);
+  glClear(GL_COLOR_BUFFER_BIT);
 
 #ifndef USE_GLES1
-	glLineStipple(2, 0xAAAA);
+  glLineStipple(2, 0xAAAA);
 #endif
 
-	glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-	glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
 
-	glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+  glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
 
-	//glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);
-	//glHint(GL_POINT_SMOOTH_HINT, GL_NICEST);
-	//glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
+  //glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);
+  //glHint(GL_POINT_SMOOTH_HINT, GL_NICEST);
+  //glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
 
-	if (!this->renderTarget->useFBO)
-	{
-		this->renderTarget->fallbackRescale(w, h);
-	}
+  if (!this->renderTarget->useFBO)
+  {
+    this->renderTarget->fallbackRescale(w, h);
+  }
 }
 
-GLuint Renderer::initRenderToTexture()
+GLuint
+Renderer::initRenderToTexture()
 {
-	return renderTarget->initRenderToTexture();
+  return renderTarget->initRenderToTexture();
 }
 
-void Renderer::draw_title_to_texture()
+void
+Renderer::draw_title_to_texture()
 {
 #ifdef USE_FTGL
-	if (this->drawtitle > 100)
-	{
-		draw_title_to_screen(true);
-		this->drawtitle = 0;
-	}
+  if (this->drawtitle > 100)
+  {
+    draw_title_to_screen(true);
+    this->drawtitle = 0;
+  }
 #endif /** USE_FTGL */
 }
 
 float title_y;
 
-void Renderer::draw_title_to_screen(bool flip)
+void
+Renderer::draw_title_to_screen(bool flip)
 {
 
 #ifdef USE_FTGL
-	if (this->drawtitle > 0)
-	{
+  if (this->drawtitle > 0)
+  {
 
-		//setUpLighting();
+    //setUpLighting();
 
-		//glEnable(GL_POLYGON_SMOOTH);
-		//glEnable( GL_CULL_FACE);
-		glEnable(GL_DEPTH_TEST);
-		glClear(GL_DEPTH_BUFFER_BIT);
+    //glEnable(GL_POLYGON_SMOOTH);
+    //glEnable( GL_CULL_FACE);
+    glEnable(GL_DEPTH_TEST);
+    glClear(GL_DEPTH_BUFFER_BIT);
 
-		int draw;
-		if (drawtitle >= 80)
-			draw = 80;
-		else
-			draw = drawtitle;
+    int draw;
+    if (drawtitle >= 80)
+      draw = 80;
+    else
+      draw = drawtitle;
 
-		float easein = ((80 - draw) * .0125);
-		float easein2 = easein * easein;
+    float easein = ((80 - draw) * .0125);
+    float easein2 = easein * easein;
 
-		if (drawtitle == 1)
-		{
-			title_y = (float) rand() / RAND_MAX;
-			title_y *= 2;
-			title_y -= 1;
-			title_y *= .6;
-		}
-		glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-		//glBlendFunc(GL_SRC_ALPHA_SATURATE,GL_ONE);
-		glColor4f(1.0, 1.0, 1.0, 1.0);
+    if (drawtitle == 1)
+    {
+      title_y = (float) rand() / RAND_MAX;
+      title_y *= 2;
+      title_y -= 1;
+      title_y *= .6;
+    }
+    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+    //glBlendFunc(GL_SRC_ALPHA_SATURATE,GL_ONE);
+    glColor4f(1.0, 1.0, 1.0, 1.0);
 
-		glMatrixMode(GL_PROJECTION);
-		glPushMatrix();
-		glLoadIdentity();
+    glMatrixMode(GL_PROJECTION);
+    glPushMatrix();
+    glLoadIdentity();
 
-		glFrustum(-1, 1, -1 * (float) vh / (float) vw, 1 * (float) vh / (float) vw, 1, 1000);
-		if (flip)
-			glScalef(1, -1, 1);
-		glMatrixMode(GL_MODELVIEW);
-		glPushMatrix();
-		glLoadIdentity();
+    glFrustum(-1, 1, -1 * (float) vh / (float) vw, 1 * (float) vh / (float) vw, 1, 1000);
+    if (flip)
+      glScalef(1, -1, 1);
+    glMatrixMode(GL_MODELVIEW);
+    glPushMatrix();
+    glLoadIdentity();
 
-		glTranslatef(-850, title_y * 850 * vh / vw, easein2 * 900 - 900);
+    glTranslatef(-850, title_y * 850 * vh / vw, easein2 * 900 - 900);
 
-		glRotatef(easein2 * 360, 1, 0, 0);
+    glRotatef(easein2 * 360, 1, 0, 0);
 
-		poly_font->Render(this->title.c_str());
+    poly_font->Render(this->title.c_str());
 
-		glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
 
-		this->drawtitle++;
+    this->drawtitle++;
 
-		glPopMatrix();
-		glMatrixMode(GL_PROJECTION);
-		glPopMatrix();
+    glPopMatrix();
+    glMatrixMode(GL_PROJECTION);
+    glPopMatrix();
 
-		glMatrixMode(GL_MODELVIEW);
+    glMatrixMode(GL_MODELVIEW);
 
-		glDisable(GL_CULL_FACE);
-		glDisable(GL_DEPTH_TEST);
+    glDisable(GL_CULL_FACE);
+    glDisable(GL_DEPTH_TEST);
 
-		glDisable(GL_COLOR_MATERIAL);
+    glDisable(GL_COLOR_MATERIAL);
 
-		glDisable(GL_LIGHTING);
-		glDisable(GL_POLYGON_SMOOTH);
-	}
+    glDisable(GL_LIGHTING);
+    glDisable(GL_POLYGON_SMOOTH);
+  }
 #endif /** USE_FTGL */
 }
 
-void Renderer::draw_title()
+void
+Renderer::draw_title()
 {
 #ifdef USE_FTGL
-	//glBlendFunc(GL_ONE_MINUS_DST_COLOR,GL_ZERO);
+  //glBlendFunc(GL_ONE_MINUS_DST_COLOR,GL_ZERO);
 
-	glColor4f(1.0, 1.0, 1.0, 1.0);
-	//  glPushMatrix();
-	//  glTranslatef(this->vw*.001,this->vh*.03, -1);
-	//  glScalef(this->vw*.015,this->vh*.025,0);
+  glColor4f(1.0, 1.0, 1.0, 1.0);
+  //  glPushMatrix();
+  //  glTranslatef(this->vw*.001,this->vh*.03, -1);
+  //  glScalef(this->vw*.015,this->vh*.025,0);
 
-	glRasterPos2f(0.01, 0.05);
-	title_font->FaceSize((unsigned) (20 * (this->vh / 512.0)));
+  glRasterPos2f(0.01, 0.05);
+  title_font->FaceSize((unsigned) (20 * (this->vh / 512.0)));
 
-	title_font->Render(this->title.c_str());
-	//  glPopMatrix();
-	//glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
+  title_font->Render(this->title.c_str());
+  //  glPopMatrix();
+  //glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
 
 #endif /** USE_FTGL */
 }
 
-void Renderer::draw_preset()
+void
+Renderer::draw_preset()
 {
 #ifdef USE_FTGL
-	//glBlendFunc(GL_ONE_MINUS_DST_COLOR,GL_ZERO);
+  //glBlendFunc(GL_ONE_MINUS_DST_COLOR,GL_ZERO);
 
-	glColor4f(1.0, 1.0, 1.0, 1.0);
-	//      glPushMatrix();
-	//glTranslatef(this->vw*.001,this->vh*-.01, -1);
-	//glScalef(this->vw*.003,this->vh*.004,0);
+  glColor4f(1.0, 1.0, 1.0, 1.0);
+  //      glPushMatrix();
+  //glTranslatef(this->vw*.001,this->vh*-.01, -1);
+  //glScalef(this->vw*.003,this->vh*.004,0);
 
 
-	glRasterPos2f(0.01, 0.01);
+  glRasterPos2f(0.01, 0.01);
 
-	title_font->FaceSize((unsigned) (12 * (this->vh / 512.0)));
-	if (this->noSwitch)
-		title_font->Render("[LOCKED]  ");
-	title_font->FaceSize((unsigned) (20 * (this->vh / 512.0)));
+  title_font->FaceSize((unsigned) (12 * (this->vh / 512.0)));
+  if (this->noSwitch)
+    title_font->Render("[LOCKED]  ");
+  title_font->FaceSize((unsigned) (20 * (this->vh / 512.0)));
 
-	title_font->Render(this->presetName().c_str());
+  title_font->Render(this->presetName().c_str());
 
-	//glPopMatrix();
-	// glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
+  //glPopMatrix();
+  // glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
 #endif /** USE_FTGL */
 }
 
-void Renderer::draw_help()
+void
+Renderer::draw_help()
 {
-
 #ifdef USE_FTGL
-	//glBlendFunc(GL_ONE_MINUS_DST_COLOR,GL_ZERO);
+  //glBlendFunc(GL_ONE_MINUS_DST_COLOR,GL_ZERO);
 
-	glColor4f(1.0, 1.0, 1.0, 1.0);
-	glPushMatrix();
-	glTranslatef(0, 1, 0);
-	//glScalef(this->vw*.02,this->vh*.02 ,0);
+  glColor4f(1.0, 1.0, 1.0, 1.0);
+  glPushMatrix();
+  glTranslatef(0, 1, 0);
+  //glScalef(this->vw*.02,this->vh*.02 ,0);
 
 
-	title_font->FaceSize((unsigned) (18 * (this->vh / 512.0)));
+  title_font->FaceSize((unsigned) (18 * (this->vh / 512.0)));
 
-	glRasterPos2f(0.01, -0.05);
-	title_font->Render("Help");
+  glRasterPos2f(0.01, -0.05);
+  title_font->Render("Help");
 
-	glRasterPos2f(0.01, -0.09);
-	title_font->Render("----------------------------");
+  glRasterPos2f(0.01, -0.09);
+  title_font->Render("----------------------------");
 
-	glRasterPos2f(0.01, -0.13);
-	title_font->Render("F1: This help menu");
+  glRasterPos2f(0.01, -0.13);
+  title_font->Render("F1: This help menu");
 
-	glRasterPos2f(0.01, -0.17);
-	title_font->Render("F2: Show song title");
+  glRasterPos2f(0.01, -0.17);
+  title_font->Render("F2: Show song title");
 
-	glRasterPos2f(0.01, -0.21);
-	title_font->Render("F3: Show preset name");
+  glRasterPos2f(0.01, -0.21);
+  title_font->Render("F3: Show preset name");
 
-	glRasterPos2f(0.01, -0.25);
-	title_font->Render("F4: Show Rendering Settings");
+  glRasterPos2f(0.01, -0.25);
+  title_font->Render("F4: Show Rendering Settings");
 
-	glRasterPos2f(0.01, -0.29);
-	title_font->Render("F5: Show FPS");
+  glRasterPos2f(0.01, -0.29);
+  title_font->Render("F5: Show FPS");
 
-	glRasterPos2f(0.01, -0.35);
-	title_font->Render("F: Fullscreen");
+  glRasterPos2f(0.01, -0.35);
+  title_font->Render("F: Fullscreen");
 
-	glRasterPos2f(0.01, -0.39);
-	title_font->Render("L: Lock/Unlock Preset");
+  glRasterPos2f(0.01, -0.39);
+  title_font->Render("L: Lock/Unlock Preset");
 
-	glRasterPos2f(0.01, -0.43);
-	title_font->Render("M: Show Menu");
+  glRasterPos2f(0.01, -0.43);
+  title_font->Render("M: Show Menu");
 
-	glRasterPos2f(0.01, -0.49);
-	title_font->Render("R: Random preset");
-	glRasterPos2f(0.01, -0.53);
-	title_font->Render("N: Next preset");
+  glRasterPos2f(0.01, -0.49);
+  title_font->Render("R: Random preset");
+  glRasterPos2f(0.01, -0.53);
+  title_font->Render("N: Next preset");
 
-	glRasterPos2f(0.01, -0.57);
-	title_font->Render("P: Previous preset");
+  glRasterPos2f(0.01, -0.57);
+  title_font->Render("P: Previous preset");
 
-	glPopMatrix();
-	//         glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
+  glPopMatrix();
+  //         glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
 
 #endif /** USE_FTGL */
 }
 
-void Renderer::draw_stats()
+void
+Renderer::draw_stats()
 {
-
 #ifdef USE_FTGL
-	char buffer[128];
-	float offset = (this->showfps % 2 ? -0.05 : 0.0);
-	// glBlendFunc(GL_ONE_MINUS_DST_COLOR,GL_ZERO);
+  char buffer[128];
+  float offset = (this->showfps % 2 ? -0.05 : 0.0);
+  // glBlendFunc(GL_ONE_MINUS_DST_COLOR,GL_ZERO);
 
-	glColor4f(1.0, 1.0, 1.0, 1.0);
-	glPushMatrix();
-	glTranslatef(0.01, 1, 0);
-	glRasterPos2f(0, -.05 + offset);
-	other_font->Render(this->correction ? "  aspect: corrected" : "  aspect: stretched");
-	sprintf(buffer, " (%f)", this->aspect);
-	other_font->Render(buffer);
+  glColor4f(1.0, 1.0, 1.0, 1.0);
+  glPushMatrix();
+  glTranslatef(0.01, 1, 0);
+  glRasterPos2f(0, -.05 + offset);
+  other_font->Render(this->correction ? "  aspect: corrected" : "  aspect: stretched");
+  sprintf(buffer, " (%f)", this->aspect);
+  other_font->Render(buffer);
 
-	glRasterPos2f(0, -.09 + offset);
-	other_font->FaceSize((unsigned) (18 * (vh / 512.0)));
+  glRasterPos2f(0, -.09 + offset);
+  other_font->FaceSize((unsigned) (18 * (vh / 512.0)));
 
-	sprintf(buffer, "       texsize: %d", renderTarget->texsize);
-	other_font->Render(buffer);
+  sprintf(buffer, "       texsize: %d", renderTarget->texsize);
+  other_font->Render(buffer);
 
-	glRasterPos2f(0, -.13 + offset);
-	sprintf(buffer, "      viewport: %d x %d", vw, vh);
+  glRasterPos2f(0, -.13 + offset);
+  sprintf(buffer, "      viewport: %d x %d", vw, vh);
 
-	other_font->Render(buffer);
-	glRasterPos2f(0, -.17 + offset);
-	other_font->Render((renderTarget->useFBO ? "           FBO: on" : "           FBO: off"));
+  other_font->Render(buffer);
+  glRasterPos2f(0, -.17 + offset);
+  other_font->Render((renderTarget->useFBO ? "           FBO: on" : "           FBO: off"));
 
-	glRasterPos2f(0, -.21 + offset);
-	sprintf(buffer, "          mesh: %d x %d", mesh.width, mesh.height);
-	other_font->Render(buffer);
+  glRasterPos2f(0, -.21 + offset);
+  sprintf(buffer, "          mesh: %d x %d", mesh.width, mesh.height);
+  other_font->Render(buffer);
 
-	glRasterPos2f(0, -.25 + offset);
-	sprintf(buffer, "      textures: %.1fkB", textureManager->getTextureMemorySize() / 1000.0f);
-	other_font->Render(buffer);
+  glRasterPos2f(0, -.25 + offset);
+  sprintf(buffer, "      textures: %.1fkB", textureManager->getTextureMemorySize() / 1000.0f);
+  other_font->Render(buffer);
 #ifdef USE_CG
-	glRasterPos2f(0, -.29 + offset);
-	sprintf(buffer, "shader profile: %s", shaderEngine.profileName.c_str());
-	other_font->Render(buffer);
+  glRasterPos2f(0, -.29 + offset);
+  sprintf(buffer, "shader profile: %s", shaderEngine.profileName.c_str());
+  other_font->Render(buffer);
 
-	glRasterPos2f(0, -.33 + offset);
-	sprintf(buffer, "   warp shader: %s", currentPipe->warpShader.enabled ? "on" : "off");
-	other_font->Render(buffer);
+  glRasterPos2f(0, -.33 + offset);
+  sprintf(buffer, "   warp shader: %s", currentPipe->warpShader.enabled ? "on" : "off");
+  other_font->Render(buffer);
 
-	glRasterPos2f(0, -.37 + offset);
-	sprintf(buffer, "   comp shader: %s", currentPipe->compositeShader.enabled ? "on" : "off");
-	other_font->Render(buffer);
+  glRasterPos2f(0, -.37 + offset);
+  sprintf(buffer, "   comp shader: %s", currentPipe->compositeShader.enabled ? "on" : "off");
+  other_font->Render(buffer);
 #endif
-	glPopMatrix();
-	// glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
-
+  glPopMatrix();
+  // glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
 
 #endif /** USE_FTGL */
 }
-void Renderer::draw_fps(float realfps)
+
+void
+Renderer::draw_fps(float realfps)
 {
 #ifdef USE_FTGL
-	char bufferfps[20];
-	sprintf(bufferfps, "%.1f fps", realfps);
-	// glBlendFunc(GL_ONE_MINUS_DST_COLOR,GL_ZERO);
+  char bufferfps[20];
+  sprintf(bufferfps, "%.1f fps", realfps);
+  // glBlendFunc(GL_ONE_MINUS_DST_COLOR,GL_ZERO);
 
-	glColor4f(1.0, 1.0, 1.0, 1.0);
-	glPushMatrix();
-	glTranslatef(0.01, 1, 0);
-	glRasterPos2f(0, -0.05);
-	title_font->FaceSize((unsigned) (20 * (this->vh / 512.0)));
-	title_font->Render(bufferfps);
+  glColor4f(1.0, 1.0, 1.0, 1.0);
+  glPushMatrix();
+  glTranslatef(0.01, 1, 0);
+  glRasterPos2f(0, -0.05);
+  title_font->FaceSize((unsigned) (20 * (this->vh / 512.0)));
+  title_font->Render(bufferfps);
 
-	glPopMatrix();
-	// glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
+  glPopMatrix();
+  // glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
 
 #endif /** USE_FTGL */
 }
 
-void Renderer::CompositeOutput(const Pipeline &pipeline, const PipelineContext &pipelineContext)
+void
+Renderer::CompositeOutput(const Pipeline &pipeline, const PipelineContext &pipelineContext)
 {
+  glMatrixMode(GL_TEXTURE);
+  glLoadIdentity();
 
-	glMatrixMode(GL_TEXTURE);
-	glLoadIdentity();
+  glMatrixMode(GL_MODELVIEW);
+  glLoadIdentity();
 
-	glMatrixMode(GL_MODELVIEW);
-	glLoadIdentity();
+  //Overwrite anything on the screen
+  glBlendFunc(GL_ONE, GL_ZERO);
+  glColor4f(1.0, 1.0, 1.0, 1.0f);
 
-	//Overwrite anything on the screen
-	glBlendFunc(GL_ONE, GL_ZERO);
-	glColor4f(1.0, 1.0, 1.0, 1.0f);
-
-	glEnable(GL_TEXTURE_2D);
+  glEnable(GL_TEXTURE_2D);
 
 #ifdef USE_CG
-	shaderEngine.enableShader(currentPipe->compositeShader, pipeline, pipelineContext);
+  shaderEngine.enableShader(currentPipe->compositeShader, pipeline, pipelineContext);
 #endif
 
-	float tex[4][2] =
-	{
-	{ 0, 1 },
-	{ 0, 0 },
-	{ 1, 0 },
-	{ 1, 1 } };
+  float tex[4][2] =
+    {
+    { 0, 1 },
+    { 0, 0 },
+    { 1, 0 },
+    { 1, 1 } };
 
-	float points[4][2] =
-	{
-	{ -0.5, -0.5 },
-	{ -0.5, 0.5 },
-	{ 0.5, 0.5 },
-	{ 0.5, -0.5 } };
+  float points[4][2] =
+    {
+    { -0.5, -0.5 },
+    { -0.5, 0.5 },
+    { 0.5, 0.5 },
+    { 0.5, -0.5 } };
 
-	glEnableClientState(GL_VERTEX_ARRAY);
-	glDisableClientState(GL_COLOR_ARRAY);
-	glEnableClientState(GL_TEXTURE_COORD_ARRAY);
+  glEnableClientState(GL_VERTEX_ARRAY);
+  glDisableClientState(GL_COLOR_ARRAY);
+  glEnableClientState(GL_TEXTURE_COORD_ARRAY);
 
-	glVertexPointer(2, GL_FLOAT, 0, points);
-	glTexCoordPointer(2, GL_FLOAT, 0, tex);
+  glVertexPointer(2, GL_FLOAT, 0, points);
+  glTexCoordPointer(2, GL_FLOAT, 0, tex);
 
-	glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
+  glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
 
-	glDisable(GL_TEXTURE_2D);
-	glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+  glDisable(GL_TEXTURE_2D);
+  glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
 
-	glDisableClientState(GL_TEXTURE_COORD_ARRAY);
+  glDisableClientState(GL_TEXTURE_COORD_ARRAY);
 
 #ifdef USE_CG
-	shaderEngine.disableShader();
+  shaderEngine.disableShader();
 #endif
 
-	for (std::vector<RenderItem*>::const_iterator pos = pipeline.compositeDrawables.begin(); pos
-			!= pipeline.compositeDrawables.end(); ++pos)
-		(*pos)->Draw(renderContext);
-
+  for (std::vector<RenderItem*>::const_iterator pos = pipeline.compositeDrawables.begin();
+       pos != pipeline.compositeDrawables.end();
+       ++pos)
+    (*pos)->Draw(renderContext);
 }
diff --git a/src/libprojectM/Renderer/Renderer.hpp b/src/libprojectM/Renderer/Renderer.hpp
index ea51724..6679c0c 100644
--- a/src/libprojectM/Renderer/Renderer.hpp
+++ b/src/libprojectM/Renderer/Renderer.hpp
@@ -35,13 +35,13 @@
 #include "Transformation.hpp"
 #include "ShaderEngine.hpp"
 
+
 class UserTexture;
 class BeatDetect;
 class TextureManager;
 
 class Renderer
 {
-
 public:
 
   bool showfps;
@@ -86,7 +86,7 @@
 
 private:
 
-	PerPixelMesh mesh;
+  PerPixelMesh mesh;
   RenderTarget *renderTarget;
   BeatDetect *beatDetect;
   TextureManager *textureManager;
@@ -125,7 +125,7 @@
 
   inline static PixelPoint PerPixel(PixelPoint p, PerPixelContext &context)
   {
-	  return currentPipe->PerPixel(p,context);
+    return currentPipe->PerPixel(p,context);
   }
 
   void rescale_per_pixel_matrices();
diff --git a/src/libprojectM/Renderer/SOIL/SOIL.c b/src/libprojectM/Renderer/SOIL/SOIL.c
index 23c145e..b128d25 100644
--- a/src/libprojectM/Renderer/SOIL/SOIL.c
+++ b/src/libprojectM/Renderer/SOIL/SOIL.c
@@ -1,2054 +1,2054 @@
-/*
-	Jonathan Dummer
-	2007-07-26-10.36
-
-	Simple OpenGL Image Library
-
-	Public Domain
-	using Sean Barret's stb_image as a base
-
-	Thanks to:
-	* Sean Barret - for the awesome stb_image
-	* Dan Venkitachalam - for finding some non-compliant DDS files, and patching some explicit casts
-	* everybody at gamedev.net
-*/
-
-#define SOIL_CHECK_FOR_GL_ERRORS 0
-
-#ifdef WIN32
-	#define WIN32_LEAN_AND_MEAN
-	#include <windows.h>
-	#include <wingdi.h>
-	#include <GL/gl.h>
-#elif defined(__APPLE__) || defined(__APPLE_CC__)
-	/*	I can't test this Apple stuff!	*/
-	#include <OpenGL/gl.h>
-	#include <Carbon/Carbon.h>
-	#define APIENTRY
-#else
-  #ifdef USE_GLES1
-    #include <GLES/gl.h>
-    #define APIENTRY
-  #else
-	  #include <GL/gl.h>
-	  #include <GL/glx.h>
-  #endif
-#endif
-
-#include "SOIL.h"
-#include "stb_image_aug.h"
-#include "image_helper.h"
-#include "image_DXT.h"
-
-#include <stdlib.h>
-#include <string.h>
-
-/*	error reporting	*/
-char *result_string_pointer = "SOIL initialized";
-
-/*	for loading cube maps	*/
-enum{
-	SOIL_CAPABILITY_UNKNOWN = -1,
-	SOIL_CAPABILITY_NONE = 0,
-	SOIL_CAPABILITY_PRESENT = 1
-};
-static int has_cubemap_capability = SOIL_CAPABILITY_UNKNOWN;
-int query_cubemap_capability( void );
-#define SOIL_TEXTURE_WRAP_R					0x8072
-#define SOIL_CLAMP_TO_EDGE					0x812F
-#define SOIL_NORMAL_MAP						0x8511
-#define SOIL_REFLECTION_MAP					0x8512
-#define SOIL_TEXTURE_CUBE_MAP				0x8513
-#define SOIL_TEXTURE_BINDING_CUBE_MAP		0x8514
-#define SOIL_TEXTURE_CUBE_MAP_POSITIVE_X	0x8515
-#define SOIL_TEXTURE_CUBE_MAP_NEGATIVE_X	0x8516
-#define SOIL_TEXTURE_CUBE_MAP_POSITIVE_Y	0x8517
-#define SOIL_TEXTURE_CUBE_MAP_NEGATIVE_Y	0x8518
-#define SOIL_TEXTURE_CUBE_MAP_POSITIVE_Z	0x8519
-#define SOIL_TEXTURE_CUBE_MAP_NEGATIVE_Z	0x851A
-#define SOIL_PROXY_TEXTURE_CUBE_MAP			0x851B
-#define SOIL_MAX_CUBE_MAP_TEXTURE_SIZE		0x851C
-/*	for non-power-of-two texture	*/
-static int has_NPOT_capability = SOIL_CAPABILITY_UNKNOWN;
-int query_NPOT_capability( void );
-/*	for texture rectangles	*/
-static int has_tex_rectangle_capability = SOIL_CAPABILITY_UNKNOWN;
-int query_tex_rectangle_capability( void );
-#define SOIL_TEXTURE_RECTANGLE_ARB				0x84F5
-#define SOIL_MAX_RECTANGLE_TEXTURE_SIZE_ARB		0x84F8
-/*	for using DXT compression	*/
-static int has_DXT_capability = SOIL_CAPABILITY_UNKNOWN;
-int query_DXT_capability( void );
-#define SOIL_RGB_S3TC_DXT1		0x83F0
-#define SOIL_RGBA_S3TC_DXT1		0x83F1
-#define SOIL_RGBA_S3TC_DXT3		0x83F2
-#define SOIL_RGBA_S3TC_DXT5		0x83F3
-typedef void (APIENTRY * P_SOIL_GLCOMPRESSEDTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid * data);
-P_SOIL_GLCOMPRESSEDTEXIMAGE2DPROC soilGlCompressedTexImage2D = NULL;
-unsigned int SOIL_direct_load_DDS(
-		const char *filename,
-		unsigned int reuse_texture_ID,
-		int flags,
-		int loading_as_cubemap );
-unsigned int SOIL_direct_load_DDS_from_memory(
-		const unsigned char *const buffer,
-		int buffer_length,
-		unsigned int reuse_texture_ID,
-		int flags,
-		int loading_as_cubemap );
-/*	other functions	*/
-unsigned int
-	SOIL_internal_create_OGL_texture
-	(
-		const unsigned char *const data,
-		int width, int height, int channels,
-		unsigned int reuse_texture_ID,
-		unsigned int flags,
-		unsigned int opengl_texture_type,
-		unsigned int opengl_texture_target,
-		unsigned int texture_check_size_enum
-	);
-
-/*	and the code magic begins here [8^)	*/
-unsigned int
-	SOIL_load_OGL_texture
-	(
-		const char *filename,
-		int force_channels,
-		unsigned int reuse_texture_ID,
-		unsigned int flags
-	)
-
-{
-	int width, height;
-	return SOIL_load_OGL_texture_size(filename,force_channels,reuse_texture_ID,flags,&width, &height);
-}
-
-unsigned int
-	SOIL_load_OGL_texture_size
-	(
-		const char *filename,
-		int force_channels,
-		unsigned int reuse_texture_ID,
-		unsigned int flags,
-		int *width,
-		int *height
-	)
-{
-	/*	variables	*/
-	unsigned char* img;
-	int channels;
-	unsigned int tex_id;
-	/*	does the user want direct uploading of the image as a DDS file?	*/
-	if( flags & SOIL_FLAG_DDS_LOAD_DIRECT )
-	{
-		/*	1st try direct loading of the image as a DDS file
-			note: direct uploading will only load what is in the
-			DDS file, no MIPmaps will be generated, the image will
-			not be flipped, etc.	*/
-		tex_id = SOIL_direct_load_DDS( filename, reuse_texture_ID, flags, 0 );
-		if( tex_id )
-		{
-			/*	hey, it worked!!	*/
-			return tex_id;
-		}
-	}
-	/*	try to load the image	*/
-	img = SOIL_load_image( filename, width, height, &channels, force_channels );
-	/*	channels holds the original number of channels, which may have been forced	*/
-	if( (force_channels >= 1) && (force_channels <= 4) )
-	{
-		channels = force_channels;
-	}
-	if( NULL == img )
-	{
-		/*	image loading failed	*/
-		result_string_pointer = stbi_failure_reason();
-		return 0;
-	}
-	/*	OK, make it a texture!	*/
-	tex_id = SOIL_internal_create_OGL_texture(
-			img, *width, *height, channels,
-			reuse_texture_ID, flags,
-			GL_TEXTURE_2D, GL_TEXTURE_2D,
-			GL_MAX_TEXTURE_SIZE );
-	/*	and nuke the image data	*/
-	SOIL_free_image_data( img );
-	/*	and return the handle, such as it is	*/
-	return tex_id;
-}
-
-unsigned int
-	SOIL_load_OGL_HDR_texture
-	(
-		const char *filename,
-		int fake_HDR_format,
-		int rescale_to_max,
-		unsigned int reuse_texture_ID,
-		unsigned int flags
-	)
-{
-	/*	variables	*/
-	unsigned char* img;
-	int width, height, channels;
-	unsigned int tex_id;
-	/*	no direct uploading of the image as a DDS file	*/
-	/* error check */
-	if( (fake_HDR_format != SOIL_HDR_RGBE) &&
-		(fake_HDR_format != SOIL_HDR_RGBdivA) &&
-		(fake_HDR_format != SOIL_HDR_RGBdivA2) )
-	{
-		result_string_pointer = "Invalid fake HDR format specified";
-		return 0;
-	}
-	/*	try to load the image (only the HDR type) */
-	img = stbi_hdr_load_rgbe( filename, &width, &height, &channels, 4 );
-	/*	channels holds the original number of channels, which may have been forced	*/
-	if( NULL == img )
-	{
-		/*	image loading failed	*/
-		result_string_pointer = stbi_failure_reason();
-		return 0;
-	}
-	/* the load worked, do I need to convert it? */
-	if( fake_HDR_format == SOIL_HDR_RGBdivA )
-	{
-		RGBE_to_RGBdivA( img, width, height, rescale_to_max );
-	} else if( fake_HDR_format == SOIL_HDR_RGBdivA2 )
-	{
-		RGBE_to_RGBdivA2( img, width, height, rescale_to_max );
-	}
-	/*	OK, make it a texture!	*/
-	tex_id = SOIL_internal_create_OGL_texture(
-			img, width, height, channels,
-			reuse_texture_ID, flags,
-			GL_TEXTURE_2D, GL_TEXTURE_2D,
-			GL_MAX_TEXTURE_SIZE );
-	/*	and nuke the image data	*/
-	SOIL_free_image_data( img );
-	/*	and return the handle, such as it is	*/
-	return tex_id;
-}
-
-unsigned int
-	SOIL_load_OGL_texture_from_memory
-	(
-		const unsigned char *const buffer,
-		int buffer_length,
-		int force_channels,
-		unsigned int reuse_texture_ID,
-		unsigned int flags
-	)
-{
-	/*	variables	*/
-	unsigned char* img;
-	int width, height, channels;
-	unsigned int tex_id;
-	/*	does the user want direct uploading of the image as a DDS file?	*/
-	if( flags & SOIL_FLAG_DDS_LOAD_DIRECT )
-	{
-		/*	1st try direct loading of the image as a DDS file
-			note: direct uploading will only load what is in the
-			DDS file, no MIPmaps will be generated, the image will
-			not be flipped, etc.	*/
-		tex_id = SOIL_direct_load_DDS_from_memory(
-				buffer, buffer_length,
-				reuse_texture_ID, flags, 0 );
-		if( tex_id )
-		{
-			/*	hey, it worked!!	*/
-			return tex_id;
-		}
-	}
-	/*	try to load the image	*/
-	img = SOIL_load_image_from_memory(
-					buffer, buffer_length,
-					&width, &height, &channels,
-					force_channels );
-	/*	channels holds the original number of channels, which may have been forced	*/
-	if( (force_channels >= 1) && (force_channels <= 4) )
-	{
-		channels = force_channels;
-	}
-	if( NULL == img )
-	{
-		/*	image loading failed	*/
-		result_string_pointer = stbi_failure_reason();
-		return 0;
-	}
-	/*	OK, make it a texture!	*/
-	tex_id = SOIL_internal_create_OGL_texture(
-			img, width, height, channels,
-			reuse_texture_ID, flags,
-			GL_TEXTURE_2D, GL_TEXTURE_2D,
-			GL_MAX_TEXTURE_SIZE );
-	/*	and nuke the image data	*/
-	SOIL_free_image_data( img );
-	/*	and return the handle, such as it is	*/
-	return tex_id;
-}
-
-unsigned int
-	SOIL_load_OGL_cubemap
-	(
-		const char *x_pos_file,
-		const char *x_neg_file,
-		const char *y_pos_file,
-		const char *y_neg_file,
-		const char *z_pos_file,
-		const char *z_neg_file,
-		int force_channels,
-		unsigned int reuse_texture_ID,
-		unsigned int flags
-	)
-{
-	/*	variables	*/
-	unsigned char* img;
-	int width, height, channels;
-	unsigned int tex_id;
-	/*	error checking	*/
-	if( (x_pos_file == NULL) ||
-		(x_neg_file == NULL) ||
-		(y_pos_file == NULL) ||
-		(y_neg_file == NULL) ||
-		(z_pos_file == NULL) ||
-		(z_neg_file == NULL) )
-	{
-		result_string_pointer = "Invalid cube map files list";
-		return 0;
-	}
-	/*	capability checking	*/
-	if( query_cubemap_capability() != SOIL_CAPABILITY_PRESENT )
-	{
-		result_string_pointer = "No cube map capability present";
-		return 0;
-	}
-	/*	1st face: try to load the image	*/
-	img = SOIL_load_image( x_pos_file, &width, &height, &channels, force_channels );
-	/*	channels holds the original number of channels, which may have been forced	*/
-	if( (force_channels >= 1) && (force_channels <= 4) )
-	{
-		channels = force_channels;
-	}
-	if( NULL == img )
-	{
-		/*	image loading failed	*/
-		result_string_pointer = stbi_failure_reason();
-		return 0;
-	}
-	/*	upload the texture, and create a texture ID if necessary	*/
-	tex_id = SOIL_internal_create_OGL_texture(
-			img, width, height, channels,
-			reuse_texture_ID, flags,
-			SOIL_TEXTURE_CUBE_MAP, SOIL_TEXTURE_CUBE_MAP_POSITIVE_X,
-			SOIL_MAX_CUBE_MAP_TEXTURE_SIZE );
-	/*	and nuke the image data	*/
-	SOIL_free_image_data( img );
-	/*	continue?	*/
-	if( tex_id != 0 )
-	{
-		/*	1st face: try to load the image	*/
-		img = SOIL_load_image( x_neg_file, &width, &height, &channels, force_channels );
-		/*	channels holds the original number of channels, which may have been forced	*/
-		if( (force_channels >= 1) && (force_channels <= 4) )
-		{
-			channels = force_channels;
-		}
-		if( NULL == img )
-		{
-			/*	image loading failed	*/
-			result_string_pointer = stbi_failure_reason();
-			return 0;
-		}
-		/*	upload the texture, but reuse the assigned texture ID	*/
-		tex_id = SOIL_internal_create_OGL_texture(
-				img, width, height, channels,
-				tex_id, flags,
-				SOIL_TEXTURE_CUBE_MAP, SOIL_TEXTURE_CUBE_MAP_NEGATIVE_X,
-				SOIL_MAX_CUBE_MAP_TEXTURE_SIZE );
-		/*	and nuke the image data	*/
-		SOIL_free_image_data( img );
-	}
-	/*	continue?	*/
-	if( tex_id != 0 )
-	{
-		/*	1st face: try to load the image	*/
-		img = SOIL_load_image( y_pos_file, &width, &height, &channels, force_channels );
-		/*	channels holds the original number of channels, which may have been forced	*/
-		if( (force_channels >= 1) && (force_channels <= 4) )
-		{
-			channels = force_channels;
-		}
-		if( NULL == img )
-		{
-			/*	image loading failed	*/
-			result_string_pointer = stbi_failure_reason();
-			return 0;
-		}
-		/*	upload the texture, but reuse the assigned texture ID	*/
-		tex_id = SOIL_internal_create_OGL_texture(
-				img, width, height, channels,
-				tex_id, flags,
-				SOIL_TEXTURE_CUBE_MAP, SOIL_TEXTURE_CUBE_MAP_POSITIVE_Y,
-				SOIL_MAX_CUBE_MAP_TEXTURE_SIZE );
-		/*	and nuke the image data	*/
-		SOIL_free_image_data( img );
-	}
-	/*	continue?	*/
-	if( tex_id != 0 )
-	{
-		/*	1st face: try to load the image	*/
-		img = SOIL_load_image( y_neg_file, &width, &height, &channels, force_channels );
-		/*	channels holds the original number of channels, which may have been forced	*/
-		if( (force_channels >= 1) && (force_channels <= 4) )
-		{
-			channels = force_channels;
-		}
-		if( NULL == img )
-		{
-			/*	image loading failed	*/
-			result_string_pointer = stbi_failure_reason();
-			return 0;
-		}
-		/*	upload the texture, but reuse the assigned texture ID	*/
-		tex_id = SOIL_internal_create_OGL_texture(
-				img, width, height, channels,
-				tex_id, flags,
-				SOIL_TEXTURE_CUBE_MAP, SOIL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
-				SOIL_MAX_CUBE_MAP_TEXTURE_SIZE );
-		/*	and nuke the image data	*/
-		SOIL_free_image_data( img );
-	}
-	/*	continue?	*/
-	if( tex_id != 0 )
-	{
-		/*	1st face: try to load the image	*/
-		img = SOIL_load_image( z_pos_file, &width, &height, &channels, force_channels );
-		/*	channels holds the original number of channels, which may have been forced	*/
-		if( (force_channels >= 1) && (force_channels <= 4) )
-		{
-			channels = force_channels;
-		}
-		if( NULL == img )
-		{
-			/*	image loading failed	*/
-			result_string_pointer = stbi_failure_reason();
-			return 0;
-		}
-		/*	upload the texture, but reuse the assigned texture ID	*/
-		tex_id = SOIL_internal_create_OGL_texture(
-				img, width, height, channels,
-				tex_id, flags,
-				SOIL_TEXTURE_CUBE_MAP, SOIL_TEXTURE_CUBE_MAP_POSITIVE_Z,
-				SOIL_MAX_CUBE_MAP_TEXTURE_SIZE );
-		/*	and nuke the image data	*/
-		SOIL_free_image_data( img );
-	}
-	/*	continue?	*/
-	if( tex_id != 0 )
-	{
-		/*	1st face: try to load the image	*/
-		img = SOIL_load_image( z_neg_file, &width, &height, &channels, force_channels );
-		/*	channels holds the original number of channels, which may have been forced	*/
-		if( (force_channels >= 1) && (force_channels <= 4) )
-		{
-			channels = force_channels;
-		}
-		if( NULL == img )
-		{
-			/*	image loading failed	*/
-			result_string_pointer = stbi_failure_reason();
-			return 0;
-		}
-		/*	upload the texture, but reuse the assigned texture ID	*/
-		tex_id = SOIL_internal_create_OGL_texture(
-				img, width, height, channels,
-				tex_id, flags,
-				SOIL_TEXTURE_CUBE_MAP, SOIL_TEXTURE_CUBE_MAP_NEGATIVE_Z,
-				SOIL_MAX_CUBE_MAP_TEXTURE_SIZE );
-		/*	and nuke the image data	*/
-		SOIL_free_image_data( img );
-	}
-	/*	and return the handle, such as it is	*/
-	return tex_id;
-}
-
-unsigned int
-	SOIL_load_OGL_cubemap_from_memory
-	(
-		const unsigned char *const x_pos_buffer,
-		int x_pos_buffer_length,
-		const unsigned char *const x_neg_buffer,
-		int x_neg_buffer_length,
-		const unsigned char *const y_pos_buffer,
-		int y_pos_buffer_length,
-		const unsigned char *const y_neg_buffer,
-		int y_neg_buffer_length,
-		const unsigned char *const z_pos_buffer,
-		int z_pos_buffer_length,
-		const unsigned char *const z_neg_buffer,
-		int z_neg_buffer_length,
-		int force_channels,
-		unsigned int reuse_texture_ID,
-		unsigned int flags
-	)
-{
-	/*	variables	*/
-	unsigned char* img;
-	int width, height, channels;
-	unsigned int tex_id;
-	/*	error checking	*/
-	if( (x_pos_buffer == NULL) ||
-		(x_neg_buffer == NULL) ||
-		(y_pos_buffer == NULL) ||
-		(y_neg_buffer == NULL) ||
-		(z_pos_buffer == NULL) ||
-		(z_neg_buffer == NULL) )
-	{
-		result_string_pointer = "Invalid cube map buffers list";
-		return 0;
-	}
-	/*	capability checking	*/
-	if( query_cubemap_capability() != SOIL_CAPABILITY_PRESENT )
-	{
-		result_string_pointer = "No cube map capability present";
-		return 0;
-	}
-	/*	1st face: try to load the image	*/
-	img = SOIL_load_image_from_memory(
-			x_pos_buffer, x_pos_buffer_length,
-			&width, &height, &channels, force_channels );
-	/*	channels holds the original number of channels, which may have been forced	*/
-	if( (force_channels >= 1) && (force_channels <= 4) )
-	{
-		channels = force_channels;
-	}
-	if( NULL == img )
-	{
-		/*	image loading failed	*/
-		result_string_pointer = stbi_failure_reason();
-		return 0;
-	}
-	/*	upload the texture, and create a texture ID if necessary	*/
-	tex_id = SOIL_internal_create_OGL_texture(
-			img, width, height, channels,
-			reuse_texture_ID, flags,
-			SOIL_TEXTURE_CUBE_MAP, SOIL_TEXTURE_CUBE_MAP_POSITIVE_X,
-			SOIL_MAX_CUBE_MAP_TEXTURE_SIZE );
-	/*	and nuke the image data	*/
-	SOIL_free_image_data( img );
-	/*	continue?	*/
-	if( tex_id != 0 )
-	{
-		/*	1st face: try to load the image	*/
-		img = SOIL_load_image_from_memory(
-				x_neg_buffer, x_neg_buffer_length,
-				&width, &height, &channels, force_channels );
-		/*	channels holds the original number of channels, which may have been forced	*/
-		if( (force_channels >= 1) && (force_channels <= 4) )
-		{
-			channels = force_channels;
-		}
-		if( NULL == img )
-		{
-			/*	image loading failed	*/
-			result_string_pointer = stbi_failure_reason();
-			return 0;
-		}
-		/*	upload the texture, but reuse the assigned texture ID	*/
-		tex_id = SOIL_internal_create_OGL_texture(
-				img, width, height, channels,
-				tex_id, flags,
-				SOIL_TEXTURE_CUBE_MAP, SOIL_TEXTURE_CUBE_MAP_NEGATIVE_X,
-				SOIL_MAX_CUBE_MAP_TEXTURE_SIZE );
-		/*	and nuke the image data	*/
-		SOIL_free_image_data( img );
-	}
-	/*	continue?	*/
-	if( tex_id != 0 )
-	{
-		/*	1st face: try to load the image	*/
-		img = SOIL_load_image_from_memory(
-				y_pos_buffer, y_pos_buffer_length,
-				&width, &height, &channels, force_channels );
-		/*	channels holds the original number of channels, which may have been forced	*/
-		if( (force_channels >= 1) && (force_channels <= 4) )
-		{
-			channels = force_channels;
-		}
-		if( NULL == img )
-		{
-			/*	image loading failed	*/
-			result_string_pointer = stbi_failure_reason();
-			return 0;
-		}
-		/*	upload the texture, but reuse the assigned texture ID	*/
-		tex_id = SOIL_internal_create_OGL_texture(
-				img, width, height, channels,
-				tex_id, flags,
-				SOIL_TEXTURE_CUBE_MAP, SOIL_TEXTURE_CUBE_MAP_POSITIVE_Y,
-				SOIL_MAX_CUBE_MAP_TEXTURE_SIZE );
-		/*	and nuke the image data	*/
-		SOIL_free_image_data( img );
-	}
-	/*	continue?	*/
-	if( tex_id != 0 )
-	{
-		/*	1st face: try to load the image	*/
-		img = SOIL_load_image_from_memory(
-				y_neg_buffer, y_neg_buffer_length,
-				&width, &height, &channels, force_channels );
-		/*	channels holds the original number of channels, which may have been forced	*/
-		if( (force_channels >= 1) && (force_channels <= 4) )
-		{
-			channels = force_channels;
-		}
-		if( NULL == img )
-		{
-			/*	image loading failed	*/
-			result_string_pointer = stbi_failure_reason();
-			return 0;
-		}
-		/*	upload the texture, but reuse the assigned texture ID	*/
-		tex_id = SOIL_internal_create_OGL_texture(
-				img, width, height, channels,
-				tex_id, flags,
-				SOIL_TEXTURE_CUBE_MAP, SOIL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
-				SOIL_MAX_CUBE_MAP_TEXTURE_SIZE );
-		/*	and nuke the image data	*/
-		SOIL_free_image_data( img );
-	}
-	/*	continue?	*/
-	if( tex_id != 0 )
-	{
-		/*	1st face: try to load the image	*/
-		img = SOIL_load_image_from_memory(
-				z_pos_buffer, z_pos_buffer_length,
-				&width, &height, &channels, force_channels );
-		/*	channels holds the original number of channels, which may have been forced	*/
-		if( (force_channels >= 1) && (force_channels <= 4) )
-		{
-			channels = force_channels;
-		}
-		if( NULL == img )
-		{
-			/*	image loading failed	*/
-			result_string_pointer = stbi_failure_reason();
-			return 0;
-		}
-		/*	upload the texture, but reuse the assigned texture ID	*/
-		tex_id = SOIL_internal_create_OGL_texture(
-				img, width, height, channels,
-				tex_id, flags,
-				SOIL_TEXTURE_CUBE_MAP, SOIL_TEXTURE_CUBE_MAP_POSITIVE_Z,
-				SOIL_MAX_CUBE_MAP_TEXTURE_SIZE );
-		/*	and nuke the image data	*/
-		SOIL_free_image_data( img );
-	}
-	/*	continue?	*/
-	if( tex_id != 0 )
-	{
-		/*	1st face: try to load the image	*/
-		img = SOIL_load_image_from_memory(
-				z_neg_buffer, z_neg_buffer_length,
-				&width, &height, &channels, force_channels );
-		/*	channels holds the original number of channels, which may have been forced	*/
-		if( (force_channels >= 1) && (force_channels <= 4) )
-		{
-			channels = force_channels;
-		}
-		if( NULL == img )
-		{
-			/*	image loading failed	*/
-			result_string_pointer = stbi_failure_reason();
-			return 0;
-		}
-		/*	upload the texture, but reuse the assigned texture ID	*/
-		tex_id = SOIL_internal_create_OGL_texture(
-				img, width, height, channels,
-				tex_id, flags,
-				SOIL_TEXTURE_CUBE_MAP, SOIL_TEXTURE_CUBE_MAP_NEGATIVE_Z,
-				SOIL_MAX_CUBE_MAP_TEXTURE_SIZE );
-		/*	and nuke the image data	*/
-		SOIL_free_image_data( img );
-	}
-	/*	and return the handle, such as it is	*/
-	return tex_id;
-}
-
-unsigned int
-	SOIL_load_OGL_single_cubemap
-	(
-		const char *filename,
-		const char face_order[6],
-		int force_channels,
-		unsigned int reuse_texture_ID,
-		unsigned int flags
-	)
-{
-	/*	variables	*/
-	unsigned char* img;
-	int width, height, channels, i;
-	unsigned int tex_id = 0;
-	/*	error checking	*/
-	if( filename == NULL )
-	{
-		result_string_pointer = "Invalid single cube map file name";
-		return 0;
-	}
-	/*	does the user want direct uploading of the image as a DDS file?	*/
-	if( flags & SOIL_FLAG_DDS_LOAD_DIRECT )
-	{
-		/*	1st try direct loading of the image as a DDS file
-			note: direct uploading will only load what is in the
-			DDS file, no MIPmaps will be generated, the image will
-			not be flipped, etc.	*/
-		tex_id = SOIL_direct_load_DDS( filename, reuse_texture_ID, flags, 1 );
-		if( tex_id )
-		{
-			/*	hey, it worked!!	*/
-			return tex_id;
-		}
-	}
-	/*	face order checking	*/
-	for( i = 0; i < 6; ++i )
-	{
-		if( (face_order[i] != 'N') &&
-			(face_order[i] != 'S') &&
-			(face_order[i] != 'W') &&
-			(face_order[i] != 'E') &&
-			(face_order[i] != 'U') &&
-			(face_order[i] != 'D') )
-		{
-			result_string_pointer = "Invalid single cube map face order";
-			return 0;
-		};
-	}
-	/*	capability checking	*/
-	if( query_cubemap_capability() != SOIL_CAPABILITY_PRESENT )
-	{
-		result_string_pointer = "No cube map capability present";
-		return 0;
-	}
-	/*	1st off, try to load the full image	*/
-	img = SOIL_load_image( filename, &width, &height, &channels, force_channels );
-	/*	channels holds the original number of channels, which may have been forced	*/
-	if( (force_channels >= 1) && (force_channels <= 4) )
-	{
-		channels = force_channels;
-	}
-	if( NULL == img )
-	{
-		/*	image loading failed	*/
-		result_string_pointer = stbi_failure_reason();
-		return 0;
-	}
-	/*	now, does this image have the right dimensions?	*/
-	if( (width != 6*height) &&
-		(6*width != height) )
-	{
-		SOIL_free_image_data( img );
-		result_string_pointer = "Single cubemap image must have a 6:1 ratio";
-		return 0;
-	}
-	/*	try the image split and create	*/
-	tex_id = SOIL_create_OGL_single_cubemap(
-			img, width, height, channels,
-			face_order, reuse_texture_ID, flags
-			);
-	/*	nuke the temporary image data and return the texture handle	*/
-	SOIL_free_image_data( img );
-	return tex_id;
-}
-
-unsigned int
-	SOIL_load_OGL_single_cubemap_from_memory
-	(
-		const unsigned char *const buffer,
-		int buffer_length,
-		const char face_order[6],
-		int force_channels,
-		unsigned int reuse_texture_ID,
-		unsigned int flags
-	)
-{
-	/*	variables	*/
-	unsigned char* img;
-	int width, height, channels, i;
-	unsigned int tex_id = 0;
-	/*	error checking	*/
-	if( buffer == NULL )
-	{
-		result_string_pointer = "Invalid single cube map buffer";
-		return 0;
-	}
-	/*	does the user want direct uploading of the image as a DDS file?	*/
-	if( flags & SOIL_FLAG_DDS_LOAD_DIRECT )
-	{
-		/*	1st try direct loading of the image as a DDS file
-			note: direct uploading will only load what is in the
-			DDS file, no MIPmaps will be generated, the image will
-			not be flipped, etc.	*/
-		tex_id = SOIL_direct_load_DDS_from_memory(
-				buffer, buffer_length,
-				reuse_texture_ID, flags, 1 );
-		if( tex_id )
-		{
-			/*	hey, it worked!!	*/
-			return tex_id;
-		}
-	}
-	/*	face order checking	*/
-	for( i = 0; i < 6; ++i )
-	{
-		if( (face_order[i] != 'N') &&
-			(face_order[i] != 'S') &&
-			(face_order[i] != 'W') &&
-			(face_order[i] != 'E') &&
-			(face_order[i] != 'U') &&
-			(face_order[i] != 'D') )
-		{
-			result_string_pointer = "Invalid single cube map face order";
-			return 0;
-		};
-	}
-	/*	capability checking	*/
-	if( query_cubemap_capability() != SOIL_CAPABILITY_PRESENT )
-	{
-		result_string_pointer = "No cube map capability present";
-		return 0;
-	}
-	/*	1st off, try to load the full image	*/
-	img = SOIL_load_image_from_memory(
-			buffer, buffer_length,
-			&width, &height, &channels,
-			force_channels );
-	/*	channels holds the original number of channels, which may have been forced	*/
-	if( (force_channels >= 1) && (force_channels <= 4) )
-	{
-		channels = force_channels;
-	}
-	if( NULL == img )
-	{
-		/*	image loading failed	*/
-		result_string_pointer = stbi_failure_reason();
-		return 0;
-	}
-	/*	now, does this image have the right dimensions?	*/
-	if( (width != 6*height) &&
-		(6*width != height) )
-	{
-		SOIL_free_image_data( img );
-		result_string_pointer = "Single cubemap image must have a 6:1 ratio";
-		return 0;
-	}
-	/*	try the image split and create	*/
-	tex_id = SOIL_create_OGL_single_cubemap(
-			img, width, height, channels,
-			face_order, reuse_texture_ID, flags
-			);
-	/*	nuke the temporary image data and return the texture handle	*/
-	SOIL_free_image_data( img );
-	return tex_id;
-}
-
-unsigned int
-	SOIL_create_OGL_single_cubemap
-	(
-		const unsigned char *const data,
-		int width, int height, int channels,
-		const char face_order[6],
-		unsigned int reuse_texture_ID,
-		unsigned int flags
-	)
-{
-	/*	variables	*/
-	unsigned char* sub_img;
-	int dw, dh, sz, i;
-	unsigned int tex_id;
-	/*	error checking	*/
-	if( data == NULL )
-	{
-		result_string_pointer = "Invalid single cube map image data";
-		return 0;
-	}
-	/*	face order checking	*/
-	for( i = 0; i < 6; ++i )
-	{
-		if( (face_order[i] != 'N') &&
-			(face_order[i] != 'S') &&
-			(face_order[i] != 'W') &&
-			(face_order[i] != 'E') &&
-			(face_order[i] != 'U') &&
-			(face_order[i] != 'D') )
-		{
-			result_string_pointer = "Invalid single cube map face order";
-			return 0;
-		};
-	}
-	/*	capability checking	*/
-	if( query_cubemap_capability() != SOIL_CAPABILITY_PRESENT )
-	{
-		result_string_pointer = "No cube map capability present";
-		return 0;
-	}
-	/*	now, does this image have the right dimensions?	*/
-	if( (width != 6*height) &&
-		(6*width != height) )
-	{
-		result_string_pointer = "Single cubemap image must have a 6:1 ratio";
-		return 0;
-	}
-	/*	which way am I stepping?	*/
-	if( width > height )
-	{
-		dw = height;
-		dh = 0;
-	} else
-	{
-		dw = 0;
-		dh = width;
-	}
-	sz = dw+dh;
-	sub_img = (unsigned char *)malloc( sz*sz*channels );
-	/*	do the splitting and uploading	*/
-	tex_id = reuse_texture_ID;
-	for( i = 0; i < 6; ++i )
-	{
-		int x, y, idx = 0;
-		unsigned int cubemap_target = 0;
-		/*	copy in the sub-image	*/
-		for( y = i*dh; y < i*dh+sz; ++y )
-		{
-			for( x = i*dw*channels; x < (i*dw+sz)*channels; ++x )
-			{
-				sub_img[idx++] = data[y*width*channels+x];
-			}
-		}
-		/*	what is my texture target?
-			remember, this coordinate system is
-			LHS if viewed from inside the cube!	*/
-		switch( face_order[i] )
-		{
-		case 'N':
-			cubemap_target = SOIL_TEXTURE_CUBE_MAP_POSITIVE_Z;
-			break;
-		case 'S':
-			cubemap_target = SOIL_TEXTURE_CUBE_MAP_NEGATIVE_Z;
-			break;
-		case 'W':
-			cubemap_target = SOIL_TEXTURE_CUBE_MAP_NEGATIVE_X;
-			break;
-		case 'E':
-			cubemap_target = SOIL_TEXTURE_CUBE_MAP_POSITIVE_X;
-			break;
-		case 'U':
-			cubemap_target = SOIL_TEXTURE_CUBE_MAP_POSITIVE_Y;
-			break;
-		case 'D':
-			cubemap_target = SOIL_TEXTURE_CUBE_MAP_NEGATIVE_Y;
-			break;
-		}
-		/*	upload it as a texture	*/
-		tex_id = SOIL_internal_create_OGL_texture(
-				sub_img, sz, sz, channels,
-				tex_id, flags,
-				SOIL_TEXTURE_CUBE_MAP,
-				cubemap_target,
-				SOIL_MAX_CUBE_MAP_TEXTURE_SIZE );
-	}
-	/*	and nuke the image and sub-image data	*/
-	SOIL_free_image_data( sub_img );
-	/*	and return the handle, such as it is	*/
-	return tex_id;
-}
-
-unsigned int
-	SOIL_create_OGL_texture
-	(
-		const unsigned char *const data,
-		int width, int height, int channels,
-		unsigned int reuse_texture_ID,
-		unsigned int flags
-	)
-{
-	/*	wrapper function for 2D textures	*/
-	return SOIL_internal_create_OGL_texture(
-				data, width, height, channels,
-				reuse_texture_ID, flags,
-				GL_TEXTURE_2D, GL_TEXTURE_2D,
-				GL_MAX_TEXTURE_SIZE );
-}
-
-#if SOIL_CHECK_FOR_GL_ERRORS
-void check_for_GL_errors( const char *calling_location )
-{
-	/*	check for errors	*/
-	GLenum err_code = glGetError();
-	while( GL_NO_ERROR != err_code )
-	{
-		printf( "OpenGL Error @ %s: %i", calling_location, err_code );
-		err_code = glGetError();
-	}
-}
-#else
-void check_for_GL_errors( const char *calling_location )
-{
-	/*	no check for errors	*/
-}
-#endif
-
-unsigned int
-	SOIL_internal_create_OGL_texture
-	(
-		const unsigned char *const data,
-		int width, int height, int channels,
-		unsigned int reuse_texture_ID,
-		unsigned int flags,
-		unsigned int opengl_texture_type,
-		unsigned int opengl_texture_target,
-		unsigned int texture_check_size_enum
-	)
-{
-	/*	variables	*/
-	unsigned char* img;
-	unsigned int tex_id;
-	unsigned int internal_texture_format = 0, original_texture_format = 0;
-	int DXT_mode = SOIL_CAPABILITY_UNKNOWN;
-	int max_supported_size;
-	/*	If the user wants to use the texture rectangle I kill a few flags	*/
-	if( flags & SOIL_FLAG_TEXTURE_RECTANGLE )
-	{
-		/*	well, the user asked for it, can we do that?	*/
-		if( query_tex_rectangle_capability() == SOIL_CAPABILITY_PRESENT )
-		{
-			/*	only allow this if the user in _NOT_ trying to do a cubemap!	*/
-			if( opengl_texture_type == GL_TEXTURE_2D )
-			{
-				/*	clean out the flags that cannot be used with texture rectangles	*/
-				flags &= ~(
-						SOIL_FLAG_POWER_OF_TWO | SOIL_FLAG_MIPMAPS |
-						SOIL_FLAG_TEXTURE_REPEATS
-					);
-				/*	and change my target	*/
-				opengl_texture_target = SOIL_TEXTURE_RECTANGLE_ARB;
-				opengl_texture_type = SOIL_TEXTURE_RECTANGLE_ARB;
-			} else
-			{
-				/*	not allowed for any other uses (yes, I'm looking at you, cubemaps!)	*/
-				flags &= ~SOIL_FLAG_TEXTURE_RECTANGLE;
-			}
-
-		} else
-		{
-			/*	can't do it, and that is a breakable offense (uv coords use pixels instead of [0,1]!)	*/
-			result_string_pointer = "Texture Rectangle extension unsupported";
-			return 0;
-		}
-	}
-	/*	create a copy the image data	*/
-	img = (unsigned char*)malloc( width*height*channels );
-	memcpy( img, data, width*height*channels );
-	/*	does the user want me to invert the image?	*/
-	if( flags & SOIL_FLAG_INVERT_Y )
-	{
-		int i, j;
-		for( j = 0; j*2 < height; ++j )
-		{
-			int index1 = j * width * channels;
-			int index2 = (height - 1 - j) * width * channels;
-			for( i = width * channels; i > 0; --i )
-			{
-				unsigned char temp = img[index1];
-				img[index1] = img[index2];
-				img[index2] = temp;
-				++index1;
-				++index2;
-			}
-		}
-	}
-	/*	does the user want me to scale the colors into the NTSC safe RGB range?	*/
-	if( flags & SOIL_FLAG_NTSC_SAFE_RGB )
-	{
-		scale_image_RGB_to_NTSC_safe( img, width, height, channels );
-	}
-	/*	does the user want me to convert from straight to pre-multiplied alpha?
-		(and do we even _have_ alpha?)	*/
-	if( flags & SOIL_FLAG_MULTIPLY_ALPHA )
-	{
-		int i;
-		switch( channels )
-		{
-		case 2:
-			for( i = 0; i < 2*width*height; i += 2 )
-			{
-				img[i] = (img[i] * img[i+1] + 128) >> 8;
-			}
-			break;
-		case 4:
-			for( i = 0; i < 4*width*height; i += 4 )
-			{
-				img[i+0] = (img[i+0] * img[i+3] + 128) >> 8;
-				img[i+1] = (img[i+1] * img[i+3] + 128) >> 8;
-				img[i+2] = (img[i+2] * img[i+3] + 128) >> 8;
-			}
-			break;
-		default:
-			/*	no other number of channels contains alpha data	*/
-			break;
-		}
-	}
-	/*	if the user can't support NPOT textures, make sure we force the POT option	*/
-	if( (query_NPOT_capability() == SOIL_CAPABILITY_NONE) &&
-		!(flags & SOIL_FLAG_TEXTURE_RECTANGLE) )
-	{
-		/*	add in the POT flag */
-		flags |= SOIL_FLAG_POWER_OF_TWO;
-	}
-	/*	how large of a texture can this OpenGL implementation handle?	*/
-	/*	texture_check_size_enum will be GL_MAX_TEXTURE_SIZE or SOIL_MAX_CUBE_MAP_TEXTURE_SIZE	*/
-	glGetIntegerv( texture_check_size_enum, &max_supported_size );
-	/*	do I need to make it a power of 2?	*/
-	if(
-		(flags & SOIL_FLAG_POWER_OF_TWO) ||	/*	user asked for it	*/
-		(flags & SOIL_FLAG_MIPMAPS) ||		/*	need it for the MIP-maps	*/
-		(width > max_supported_size) ||		/*	it's too big, (make sure it's	*/
-		(height > max_supported_size) )		/*	2^n for later down-sampling)	*/
-	{
-		int new_width = 1;
-		int new_height = 1;
-		while( new_width < width )
-		{
-			new_width *= 2;
-		}
-		while( new_height < height )
-		{
-			new_height *= 2;
-		}
-		/*	still?	*/
-		if( (new_width != width) || (new_height != height) )
-		{
-			/*	yep, resize	*/
-			unsigned char *resampled = (unsigned char*)malloc( channels*new_width*new_height );
-			up_scale_image(
-					img, width, height, channels,
-					resampled, new_width, new_height );
-			/*	OJO	this is for debug only!	*/
-			/*
-			SOIL_save_image( "\\showme.bmp", SOIL_SAVE_TYPE_BMP,
-							new_width, new_height, channels,
-							resampled );
-			*/
-			/*	nuke the old guy, then point it at the new guy	*/
-			SOIL_free_image_data( img );
-			img = resampled;
-			width = new_width;
-			height = new_height;
-		}
-	}
-	/*	now, if it is too large...	*/
-	if( (width > max_supported_size) || (height > max_supported_size) )
-	{
-		/*	I've already made it a power of two, so simply use the MIPmapping
-			code to reduce its size to the allowable maximum.	*/
-		unsigned char *resampled;
-		int reduce_block_x = 1, reduce_block_y = 1;
-		int new_width, new_height;
-		if( width > max_supported_size )
-		{
-			reduce_block_x = width / max_supported_size;
-		}
-		if( height > max_supported_size )
-		{
-			reduce_block_y = height / max_supported_size;
-		}
-		new_width = width / reduce_block_x;
-		new_height = height / reduce_block_y;
-		resampled = (unsigned char*)malloc( channels*new_width*new_height );
-		/*	perform the actual reduction	*/
-		mipmap_image(	img, width, height, channels,
-						resampled, reduce_block_x, reduce_block_y );
-		/*	nuke the old guy, then point it at the new guy	*/
-		SOIL_free_image_data( img );
-		img = resampled;
-		width = new_width;
-		height = new_height;
-	}
-	/*	does the user want us to use YCoCg color space?	*/
-	if( flags & SOIL_FLAG_CoCg_Y )
-	{
-		/*	this will only work with RGB and RGBA images */
-		convert_RGB_to_YCoCg( img, width, height, channels );
-		/*
-		save_image_as_DDS( "CoCg_Y.dds", width, height, channels, img );
-		*/
-	}
-	/*	create the OpenGL texture ID handle
-    	(note: allowing a forced texture ID lets me reload a texture)	*/
-    tex_id = reuse_texture_ID;
-    if( tex_id == 0 )
-    {
-		glGenTextures( 1, &tex_id );
-    }
-	check_for_GL_errors( "glGenTextures" );
-	/* Note: sometimes glGenTextures fails (usually no OpenGL context)	*/
-	if( tex_id )
-	{
-		/*	and what type am I using as the internal texture format?	*/
-		switch( channels )
-		{
-		case 1:
-			original_texture_format = GL_LUMINANCE;
-			break;
-		case 2:
-			original_texture_format = GL_LUMINANCE_ALPHA;
-			break;
-		case 3:
-			original_texture_format = GL_RGB;
-			break;
-		case 4:
-			original_texture_format = GL_RGBA;
-			break;
-		}
-		internal_texture_format = original_texture_format;
-		/*	does the user want me to, and can I, save as DXT?	*/
-		if( flags & SOIL_FLAG_COMPRESS_TO_DXT )
-		{
-			DXT_mode = query_DXT_capability();
-			if( DXT_mode == SOIL_CAPABILITY_PRESENT )
-			{
-				/*	I can use DXT, whether I compress it or OpenGL does	*/
-				if( (channels & 1) == 1 )
-				{
-					/*	1 or 3 channels = DXT1	*/
-					internal_texture_format = SOIL_RGB_S3TC_DXT1;
-				} else
-				{
-					/*	2 or 4 channels = DXT5	*/
-					internal_texture_format = SOIL_RGBA_S3TC_DXT5;
-				}
-			}
-		}
-		/*  bind an OpenGL texture ID	*/
-		glBindTexture( opengl_texture_type, tex_id );
-		check_for_GL_errors( "glBindTexture" );
-		/*  upload the main image	*/
-		if( DXT_mode == SOIL_CAPABILITY_PRESENT )
-		{
-			/*	user wants me to do the DXT conversion!	*/
-			int DDS_size;
-			unsigned char *DDS_data = NULL;
-			if( (channels & 1) == 1 )
-			{
-				/*	RGB, use DXT1	*/
-				DDS_data = convert_image_to_DXT1( img, width, height, channels, &DDS_size );
-			} else
-			{
-				/*	RGBA, use DXT5	*/
-				DDS_data = convert_image_to_DXT5( img, width, height, channels, &DDS_size );
-			}
-			if( DDS_data )
-			{
-				soilGlCompressedTexImage2D(
-					opengl_texture_target, 0,
-					internal_texture_format, width, height, 0,
-					DDS_size, DDS_data );
-				check_for_GL_errors( "glCompressedTexImage2D" );
-				SOIL_free_image_data( DDS_data );
-				/*	printf( "Internal DXT compressor\n" );	*/
-			} else
-			{
-				/*	my compression failed, try the OpenGL driver's version	*/
-				glTexImage2D(
-					opengl_texture_target, 0,
-					internal_texture_format, width, height, 0,
-					original_texture_format, GL_UNSIGNED_BYTE, img );
-				check_for_GL_errors( "glTexImage2D" );
-				/*	printf( "OpenGL DXT compressor\n" );	*/
-			}
-		} else
-		{
-			/*	user want OpenGL to do all the work!	*/
-			glTexImage2D(
-				opengl_texture_target, 0,
-				internal_texture_format, width, height, 0,
-				original_texture_format, GL_UNSIGNED_BYTE, img );
-			check_for_GL_errors( "glTexImage2D" );
-			/*printf( "OpenGL DXT compressor\n" );	*/
-		}
-		/*	are any MIPmaps desired?	*/
-		if( flags & SOIL_FLAG_MIPMAPS )
-		{
-			int MIPlevel = 1;
-			int MIPwidth = (width+1) / 2;
-			int MIPheight = (height+1) / 2;
-			unsigned char *resampled = (unsigned char*)malloc( channels*MIPwidth*MIPheight );
-			while( ((1<<MIPlevel) <= width) || ((1<<MIPlevel) <= height) )
-			{
-				/*	do this MIPmap level	*/
-				mipmap_image(
-						img, width, height, channels,
-						resampled,
-						(1 << MIPlevel), (1 << MIPlevel) );
-				/*  upload the MIPmaps	*/
-				if( DXT_mode == SOIL_CAPABILITY_PRESENT )
-				{
-					/*	user wants me to do the DXT conversion!	*/
-					int DDS_size;
-					unsigned char *DDS_data = NULL;
-					if( (channels & 1) == 1 )
-					{
-						/*	RGB, use DXT1	*/
-						DDS_data = convert_image_to_DXT1(
-								resampled, MIPwidth, MIPheight, channels, &DDS_size );
-					} else
-					{
-						/*	RGBA, use DXT5	*/
-						DDS_data = convert_image_to_DXT5(
-								resampled, MIPwidth, MIPheight, channels, &DDS_size );
-					}
-					if( DDS_data )
-					{
-						soilGlCompressedTexImage2D(
-							opengl_texture_target, MIPlevel,
-							internal_texture_format, MIPwidth, MIPheight, 0,
-							DDS_size, DDS_data );
-						check_for_GL_errors( "glCompressedTexImage2D" );
-						SOIL_free_image_data( DDS_data );
-					} else
-					{
-						/*	my compression failed, try the OpenGL driver's version	*/
-						glTexImage2D(
-							opengl_texture_target, MIPlevel,
-							internal_texture_format, MIPwidth, MIPheight, 0,
-							original_texture_format, GL_UNSIGNED_BYTE, resampled );
-						check_for_GL_errors( "glTexImage2D" );
-					}
-				} else
-				{
-					/*	user want OpenGL to do all the work!	*/
-					glTexImage2D(
-						opengl_texture_target, MIPlevel,
-						internal_texture_format, MIPwidth, MIPheight, 0,
-						original_texture_format, GL_UNSIGNED_BYTE, resampled );
-					check_for_GL_errors( "glTexImage2D" );
-				}
-				/*	prep for the next level	*/
-				++MIPlevel;
-				MIPwidth = (MIPwidth + 1) / 2;
-				MIPheight = (MIPheight + 1) / 2;
-			}
-			SOIL_free_image_data( resampled );
-			/*	instruct OpenGL to use the MIPmaps	*/
-			glTexParameteri( opengl_texture_type, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
-			glTexParameteri( opengl_texture_type, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR );
-			check_for_GL_errors( "GL_TEXTURE_MIN/MAG_FILTER" );
-		} else
-		{
-			/*	instruct OpenGL _NOT_ to use the MIPmaps	*/
-			glTexParameteri( opengl_texture_type, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
-			glTexParameteri( opengl_texture_type, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
-			check_for_GL_errors( "GL_TEXTURE_MIN/MAG_FILTER" );
-		}
-		/*	does the user want clamping, or wrapping?	*/
-		if( flags & SOIL_FLAG_TEXTURE_REPEATS )
-		{
-			glTexParameteri( opengl_texture_type, GL_TEXTURE_WRAP_S, GL_REPEAT );
-			glTexParameteri( opengl_texture_type, GL_TEXTURE_WRAP_T, GL_REPEAT );
-			if( opengl_texture_type == SOIL_TEXTURE_CUBE_MAP )
-			{
-				/*	SOIL_TEXTURE_WRAP_R is invalid if cubemaps aren't supported	*/
-				glTexParameteri( opengl_texture_type, SOIL_TEXTURE_WRAP_R, GL_REPEAT );
-			}
-			check_for_GL_errors( "GL_TEXTURE_WRAP_*" );
-		} else
-		{
-			/*	unsigned int clamp_mode = SOIL_CLAMP_TO_EDGE;	*/
-			unsigned int clamp_mode = GL_CLAMP_TO_EDGE;
-			glTexParameteri( opengl_texture_type, GL_TEXTURE_WRAP_S, clamp_mode );
-			glTexParameteri( opengl_texture_type, GL_TEXTURE_WRAP_T, clamp_mode );
-			if( opengl_texture_type == SOIL_TEXTURE_CUBE_MAP )
-			{
-				/*	SOIL_TEXTURE_WRAP_R is invalid if cubemaps aren't supported	*/
-				glTexParameteri( opengl_texture_type, SOIL_TEXTURE_WRAP_R, clamp_mode );
-			}
-			check_for_GL_errors( "GL_TEXTURE_WRAP_*" );
-		}
-		/*	done	*/
-		result_string_pointer = "Image loaded as an OpenGL texture";
-	} else
-	{
-		/*	failed	*/
-		result_string_pointer = "Failed to generate an OpenGL texture name; missing OpenGL context?";
-	}
-	SOIL_free_image_data( img );
-	return tex_id;
-}
-
-int
-	SOIL_save_screenshot
-	(
-		const char *filename,
-		int image_type,
-		int x, int y,
-		int width, int height
-	)
-{
-	unsigned char *pixel_data;
-	int i, j;
-	int save_result;
-
-	/*	error checks	*/
-	if( (width < 1) || (height < 1) )
-	{
-		result_string_pointer = "Invalid screenshot dimensions";
-		return 0;
-	}
-	if( (x < 0) || (y < 0) )
-	{
-		result_string_pointer = "Invalid screenshot location";
-		return 0;
-	}
-	if( filename == NULL )
-	{
-		result_string_pointer = "Invalid screenshot filename";
-		return 0;
-	}
-
-    /*  Get the data from OpenGL	*/
-    pixel_data = (unsigned char*)malloc( 3*width*height );
-    glReadPixels (x, y, width, height, GL_RGB, GL_UNSIGNED_BYTE, pixel_data);
-
-    /*	invert the image	*/
-    for( j = 0; j*2 < height; ++j )
-	{
-		int index1 = j * width * 3;
-		int index2 = (height - 1 - j) * width * 3;
-		for( i = width * 3; i > 0; --i )
-		{
-			unsigned char temp = pixel_data[index1];
-			pixel_data[index1] = pixel_data[index2];
-			pixel_data[index2] = temp;
-			++index1;
-			++index2;
-		}
-	}
-
-    /*	save the image	*/
-    save_result = SOIL_save_image( filename, image_type, width, height, 3, pixel_data);
-
-    /*  And free the memory	*/
-    SOIL_free_image_data( pixel_data );
-	return save_result;
-}
-
-unsigned char*
-	SOIL_load_image
-	(
-		const char *filename,
-		int *width, int *height, int *channels,
-		int force_channels
-	)
-{
-	unsigned char *result = stbi_load( filename,
-			width, height, channels, force_channels );
-	if( result == NULL )
-	{
-		result_string_pointer = stbi_failure_reason();
-	} else
-	{
-		result_string_pointer = "Image loaded";
-	}
-	return result;
-}
-
-unsigned char*
-	SOIL_load_image_from_memory
-	(
-		const unsigned char *const buffer,
-		int buffer_length,
-		int *width, int *height, int *channels,
-		int force_channels
-	)
-{
-	unsigned char *result = stbi_load_from_memory(
-				buffer, buffer_length,
-				width, height, channels,
-				force_channels );
-	if( result == NULL )
-	{
-		result_string_pointer = stbi_failure_reason();
-	} else
-	{
-		result_string_pointer = "Image loaded from memory";
-	}
-	return result;
-}
-
-int
-	SOIL_save_image
-	(
-		const char *filename,
-		int image_type,
-		int width, int height, int channels,
-		const unsigned char *const data
-	)
-{
-	int save_result;
-
-	/*	error check	*/
-	if( (width < 1) || (height < 1) ||
-		(channels < 1) || (channels > 4) ||
-		(data == NULL) ||
-		(filename == NULL) )
-	{
-		return 0;
-	}
-	if( image_type == SOIL_SAVE_TYPE_BMP )
-	{
-		save_result = stbi_write_bmp( filename,
-				width, height, channels, (void*)data );
-	} else
-	if( image_type == SOIL_SAVE_TYPE_TGA )
-	{
-		save_result = stbi_write_tga( filename,
-				width, height, channels, (void*)data );
-	} else
-	if( image_type == SOIL_SAVE_TYPE_DDS )
-	{
-		save_result = save_image_as_DDS( filename,
-				width, height, channels, (const unsigned char *const)data );
-	} else
-	{
-		save_result = 0;
-	}
-	if( save_result == 0 )
-	{
-		result_string_pointer = "Saving the image failed";
-	} else
-	{
-		result_string_pointer = "Image saved";
-	}
-	return save_result;
-}
-
-void
-	SOIL_free_image_data
-	(
-		unsigned char *img_data
-	)
-{
-	free( (void*)img_data );
-}
-
-const char*
-	SOIL_last_result
-	(
-		void
-	)
-{
-	return result_string_pointer;
-}
-
-unsigned int SOIL_direct_load_DDS_from_memory(
-		const unsigned char *const buffer,
-		int buffer_length,
-		unsigned int reuse_texture_ID,
-		int flags,
-		int loading_as_cubemap )
-{
-	/*	variables	*/
-	DDS_header header;
-	unsigned int buffer_index = 0;
-	unsigned int tex_ID = 0;
-	/*	file reading variables	*/
-	unsigned int S3TC_type = 0;
-	unsigned char *DDS_data;
-	unsigned int DDS_main_size;
-	unsigned int DDS_full_size;
-	unsigned int width, height;
-	int mipmaps, cubemap, uncompressed, block_size = 16;
-	unsigned int flag;
-	unsigned int cf_target, ogl_target_start, ogl_target_end;
-	unsigned int opengl_texture_type;
-	int i;
-	/*	1st off, does the filename even exist?	*/
-	if( NULL == buffer )
-	{
-		/*	we can't do it!	*/
-		result_string_pointer = "NULL buffer";
-		return 0;
-	}
-	if( buffer_length < sizeof( DDS_header ) )
-	{
-		/*	we can't do it!	*/
-		result_string_pointer = "DDS file was too small to contain the DDS header";
-		return 0;
-	}
-	/*	try reading in the header	*/
-	memcpy ( (void*)(&header), (const void *)buffer, sizeof( DDS_header ) );
-	buffer_index = sizeof( DDS_header );
-	/*	guilty until proven innocent	*/
-	result_string_pointer = "Failed to read a known DDS header";
-	/*	validate the header (warning, "goto"'s ahead, shield your eyes!!)	*/
-	flag = ('D'<<0)|('D'<<8)|('S'<<16)|(' '<<24);
-	if( header.dwMagic != flag ) {goto quick_exit;}
-	if( header.dwSize != 124 ) {goto quick_exit;}
-	/*	I need all of these	*/
-	flag = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH | DDSD_PIXELFORMAT;
-	if( (header.dwFlags & flag) != flag ) {goto quick_exit;}
-	/*	According to the MSDN spec, the dwFlags should contain
-		DDSD_LINEARSIZE if it's compressed, or DDSD_PITCH if
-		uncompressed.  Some DDS writers do not conform to the
-		spec, so I need to make my reader more tolerant	*/
-	/*	I need one of these	*/
-	flag = DDPF_FOURCC | DDPF_RGB;
-	if( (header.sPixelFormat.dwFlags & flag) == 0 ) {goto quick_exit;}
-	if( header.sPixelFormat.dwSize != 32 ) {goto quick_exit;}
-	if( (header.sCaps.dwCaps1 & DDSCAPS_TEXTURE) == 0 ) {goto quick_exit;}
-	/*	make sure it is a type we can upload	*/
-	if( (header.sPixelFormat.dwFlags & DDPF_FOURCC) &&
-		!(
-		(header.sPixelFormat.dwFourCC == (('D'<<0)|('X'<<8)|('T'<<16)|('1'<<24))) ||
-		(header.sPixelFormat.dwFourCC == (('D'<<0)|('X'<<8)|('T'<<16)|('3'<<24))) ||
-		(header.sPixelFormat.dwFourCC == (('D'<<0)|('X'<<8)|('T'<<16)|('5'<<24)))
-		) )
-	{
-		goto quick_exit;
-	}
-	/*	OK, validated the header, let's load the image data	*/
-	result_string_pointer = "DDS header loaded and validated";
-	width = header.dwWidth;
-	height = header.dwHeight;
-	uncompressed = 1 - (header.sPixelFormat.dwFlags & DDPF_FOURCC) / DDPF_FOURCC;
-	cubemap = (header.sCaps.dwCaps2 & DDSCAPS2_CUBEMAP) / DDSCAPS2_CUBEMAP;
-	if( uncompressed )
-	{
-		S3TC_type = GL_RGB;
-		block_size = 3;
-		if( header.sPixelFormat.dwFlags & DDPF_ALPHAPIXELS )
-		{
-			S3TC_type = GL_RGBA;
-			block_size = 4;
-		}
-		DDS_main_size = width * height * block_size;
-	} else
-	{
-		/*	can we even handle direct uploading to OpenGL DXT compressed images?	*/
-		if( query_DXT_capability() != SOIL_CAPABILITY_PRESENT )
-		{
-			/*	we can't do it!	*/
-			result_string_pointer = "Direct upload of S3TC images not supported by the OpenGL driver";
-			return 0;
-		}
-		/*	well, we know it is DXT1/3/5, because we checked above	*/
-		switch( (header.sPixelFormat.dwFourCC >> 24) - '0' )
-		{
-		case 1:
-			S3TC_type = SOIL_RGBA_S3TC_DXT1;
-			block_size = 8;
-			break;
-		case 3:
-			S3TC_type = SOIL_RGBA_S3TC_DXT3;
-			block_size = 16;
-			break;
-		case 5:
-			S3TC_type = SOIL_RGBA_S3TC_DXT5;
-			block_size = 16;
-			break;
-		}
-		DDS_main_size = ((width+3)>>2)*((height+3)>>2)*block_size;
-	}
-	if( cubemap )
-	{
-		/* does the user want a cubemap?	*/
-		if( !loading_as_cubemap )
-		{
-			/*	we can't do it!	*/
-			result_string_pointer = "DDS image was a cubemap";
-			return 0;
-		}
-		/*	can we even handle cubemaps with the OpenGL driver?	*/
-		if( query_cubemap_capability() != SOIL_CAPABILITY_PRESENT )
-		{
-			/*	we can't do it!	*/
-			result_string_pointer = "Direct upload of cubemap images not supported by the OpenGL driver";
-			return 0;
-		}
-		ogl_target_start = SOIL_TEXTURE_CUBE_MAP_POSITIVE_X;
-		ogl_target_end =   SOIL_TEXTURE_CUBE_MAP_NEGATIVE_Z;
-		opengl_texture_type = SOIL_TEXTURE_CUBE_MAP;
-	} else
-	{
-		/* does the user want a non-cubemap?	*/
-		if( loading_as_cubemap )
-		{
-			/*	we can't do it!	*/
-			result_string_pointer = "DDS image was not a cubemap";
-			return 0;
-		}
-		ogl_target_start = GL_TEXTURE_2D;
-		ogl_target_end =   GL_TEXTURE_2D;
-		opengl_texture_type = GL_TEXTURE_2D;
-	}
-	if( (header.sCaps.dwCaps1 & DDSCAPS_MIPMAP) && (header.dwMipMapCount > 1) )
-	{
-		int shift_offset;
-		mipmaps = header.dwMipMapCount - 1;
-		DDS_full_size = DDS_main_size;
-		if( uncompressed )
-		{
-			/*	uncompressed DDS, simple MIPmap size calculation	*/
-			shift_offset = 0;
-		} else
-		{
-			/*	compressed DDS, MIPmap size calculation is block based	*/
-			shift_offset = 2;
-		}
-		for( i = 1; i <= mipmaps; ++ i )
-		{
-			int w, h;
-			w = width >> (shift_offset + i);
-			h = height >> (shift_offset + i);
-			if( w < 1 )
-			{
-				w = 1;
-			}
-			if( h < 1 )
-			{
-				h = 1;
-			}
-			DDS_full_size += w*h*block_size;
-		}
-	} else
-	{
-		mipmaps = 0;
-		DDS_full_size = DDS_main_size;
-	}
-	DDS_data = (unsigned char*)malloc( DDS_full_size );
-	/*	got the image data RAM, create or use an existing OpenGL texture handle	*/
-	tex_ID = reuse_texture_ID;
-	if( tex_ID == 0 )
-	{
-		glGenTextures( 1, &tex_ID );
-	}
-	/*  bind an OpenGL texture ID	*/
-	glBindTexture( opengl_texture_type, tex_ID );
-	/*	do this for each face of the cubemap!	*/
-	for( cf_target = ogl_target_start; cf_target <= ogl_target_end; ++cf_target )
-	{
-		if( buffer_index + DDS_full_size <= buffer_length )
-		{
-			unsigned int byte_offset = DDS_main_size;
-			memcpy( (void*)DDS_data, (const void*)(&buffer[buffer_index]), DDS_full_size );
-			buffer_index += DDS_full_size;
-			/*	upload the main chunk	*/
-			if( uncompressed )
-			{
-				/*	and remember, DXT uncompressed uses BGR(A),
-					so swap to RGB(A) for ALL MIPmap levels	*/
-				for( i = 0; i < DDS_full_size; i += block_size )
-				{
-					unsigned char temp = DDS_data[i];
-					DDS_data[i] = DDS_data[i+2];
-					DDS_data[i+2] = temp;
-				}
-				glTexImage2D(
-					cf_target, 0,
-					S3TC_type, width, height, 0,
-					S3TC_type, GL_UNSIGNED_BYTE, DDS_data );
-			} else
-			{
-				soilGlCompressedTexImage2D(
-					cf_target, 0,
-					S3TC_type, width, height, 0,
-					DDS_main_size, DDS_data );
-			}
-			/*	upload the mipmaps, if we have them	*/
-			for( i = 1; i <= mipmaps; ++i )
-			{
-				int w, h, mip_size;
-				w = width >> i;
-				h = height >> i;
-				if( w < 1 )
-				{
-					w = 1;
-				}
-				if( h < 1 )
-				{
-					h = 1;
-				}
-				/*	upload this mipmap	*/
-				if( uncompressed )
-				{
-					mip_size = w*h*block_size;
-					glTexImage2D(
-						cf_target, i,
-						S3TC_type, w, h, 0,
-						S3TC_type, GL_UNSIGNED_BYTE, &DDS_data[byte_offset] );
-				} else
-				{
-					mip_size = ((w+3)/4)*((h+3)/4)*block_size;
-					soilGlCompressedTexImage2D(
-						cf_target, i,
-						S3TC_type, w, h, 0,
-						mip_size, &DDS_data[byte_offset] );
-				}
-				/*	and move to the next mipmap	*/
-				byte_offset += mip_size;
-			}
-			/*	it worked!	*/
-			result_string_pointer = "DDS file loaded";
-		} else
-		{
-			glDeleteTextures( 1, & tex_ID );
-			tex_ID = 0;
-			cf_target = ogl_target_end + 1;
-			result_string_pointer = "DDS file was too small for expected image data";
-		}
-	}/* end reading each face */
-	SOIL_free_image_data( DDS_data );
-	if( tex_ID )
-	{
-		/*	did I have MIPmaps?	*/
-		if( mipmaps > 0 )
-		{
-			/*	instruct OpenGL to use the MIPmaps	*/
-			glTexParameteri( opengl_texture_type, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
-			glTexParameteri( opengl_texture_type, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR );
-		} else
-		{
-			/*	instruct OpenGL _NOT_ to use the MIPmaps	*/
-			glTexParameteri( opengl_texture_type, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
-			glTexParameteri( opengl_texture_type, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
-		}
-		/*	does the user want clamping, or wrapping?	*/
-		if( flags & SOIL_FLAG_TEXTURE_REPEATS )
-		{
-			glTexParameteri( opengl_texture_type, GL_TEXTURE_WRAP_S, GL_REPEAT );
-			glTexParameteri( opengl_texture_type, GL_TEXTURE_WRAP_T, GL_REPEAT );
-			glTexParameteri( opengl_texture_type, SOIL_TEXTURE_WRAP_R, GL_REPEAT );
-		} else
-		{
-			/*	unsigned int clamp_mode = SOIL_CLAMP_TO_EDGE;	*/
-			unsigned int clamp_mode = GL_CLAMP_TO_EDGE;
-			glTexParameteri( opengl_texture_type, GL_TEXTURE_WRAP_S, clamp_mode );
-			glTexParameteri( opengl_texture_type, GL_TEXTURE_WRAP_T, clamp_mode );
-			glTexParameteri( opengl_texture_type, SOIL_TEXTURE_WRAP_R, clamp_mode );
-		}
-	}
-
-quick_exit:
-	/*	report success or failure	*/
-	return tex_ID;
-}
-
-unsigned int SOIL_direct_load_DDS(
-		const char *filename,
-		unsigned int reuse_texture_ID,
-		int flags,
-		int loading_as_cubemap )
-{
-	FILE *f;
-	unsigned char *buffer;
-	size_t buffer_length, bytes_read;
-	unsigned int tex_ID = 0;
-	/*	error checks	*/
-	if( NULL == filename )
-	{
-		result_string_pointer = "NULL filename";
-		return 0;
-	}
-	f = fopen( filename, "rb" );
-	if( NULL == f )
-	{
-		/*	the file doesn't seem to exist (or be open-able)	*/
-		result_string_pointer = "Can not find DDS file";
-		return 0;
-	}
-	fseek( f, 0, SEEK_END );
-	buffer_length = ftell( f );
-	fseek( f, 0, SEEK_SET );
-	buffer = (unsigned char *) malloc( buffer_length );
-	if( NULL == buffer )
-	{
-		result_string_pointer = "malloc failed";
-		fclose( f );
-		return 0;
-	}
-	bytes_read = fread( (void*)buffer, 1, buffer_length, f );
-	fclose( f );
-	if( bytes_read < buffer_length )
-	{
-		/*	huh?	*/
-		buffer_length = bytes_read;
-	}
-	/*	now try to do the loading	*/
-	tex_ID = SOIL_direct_load_DDS_from_memory(
-		(const unsigned char *const)buffer, buffer_length,
-		reuse_texture_ID, flags, loading_as_cubemap );
-	SOIL_free_image_data( buffer );
-	return tex_ID;
-}
-
-int query_NPOT_capability( void )
-{
-	/*	check for the capability	*/
-	if( has_NPOT_capability == SOIL_CAPABILITY_UNKNOWN )
-	{
-		/*	we haven't yet checked for the capability, do so	*/
-		if(
-			(NULL == strstr( (char const*)glGetString( GL_EXTENSIONS ),
-				"GL_ARB_texture_non_power_of_two" ) )
-			)
-		{
-			/*	not there, flag the failure	*/
-			has_NPOT_capability = SOIL_CAPABILITY_NONE;
-		} else
-		{
-			/*	it's there!	*/
-			has_NPOT_capability = SOIL_CAPABILITY_PRESENT;
-		}
-	}
-	/*	let the user know if we can do non-power-of-two textures or not	*/
-	return has_NPOT_capability;
-}
-
-int query_tex_rectangle_capability( void )
-{
-	/*	check for the capability	*/
-	if( has_tex_rectangle_capability == SOIL_CAPABILITY_UNKNOWN )
-	{
-		/*	we haven't yet checked for the capability, do so	*/
-		if(
-			(NULL == strstr( (char const*)glGetString( GL_EXTENSIONS ),
-				"GL_ARB_texture_rectangle" ) )
-		&&
-			(NULL == strstr( (char const*)glGetString( GL_EXTENSIONS ),
-				"GL_EXT_texture_rectangle" ) )
-		&&
-			(NULL == strstr( (char const*)glGetString( GL_EXTENSIONS ),
-				"GL_NV_texture_rectangle" ) )
-			)
-		{
-			/*	not there, flag the failure	*/
-			has_tex_rectangle_capability = SOIL_CAPABILITY_NONE;
-		} else
-		{
-			/*	it's there!	*/
-			has_tex_rectangle_capability = SOIL_CAPABILITY_PRESENT;
-		}
-	}
-	/*	let the user know if we can do texture rectangles or not	*/
-	return has_tex_rectangle_capability;
-}
-
-int query_cubemap_capability( void )
-{
-	/*	check for the capability	*/
-	if( has_cubemap_capability == SOIL_CAPABILITY_UNKNOWN )
-	{
-		/*	we haven't yet checked for the capability, do so	*/
-		if(
-			(NULL == strstr( (char const*)glGetString( GL_EXTENSIONS ),
-				"GL_ARB_texture_cube_map" ) )
-		&&
-			(NULL == strstr( (char const*)glGetString( GL_EXTENSIONS ),
-				"GL_EXT_texture_cube_map" ) )
-			)
-		{
-			/*	not there, flag the failure	*/
-			has_cubemap_capability = SOIL_CAPABILITY_NONE;
-		} else
-		{
-			/*	it's there!	*/
-			has_cubemap_capability = SOIL_CAPABILITY_PRESENT;
-		}
-	}
-	/*	let the user know if we can do cubemaps or not	*/
-	return has_cubemap_capability;
-}
-
-int query_DXT_capability( void )
-{
-#ifdef USE_GLES1
-  /*
-   * GLES1 has no S3-style texture compression extension.
-   * GLES2 has GL_EXT_texture_compression_dxt1 available which only supports,
-   * obviously enough, DXT1 compression.
-   */
-  has_DXT_capability = SOIL_CAPABILITY_NONE;
-#else
-	/*	check for the capability	*/
-	if( has_DXT_capability == SOIL_CAPABILITY_UNKNOWN )
-	{
-		/*	we haven't yet checked for the capability, do so	*/
-		if( NULL == strstr(
-				(char const*)glGetString( GL_EXTENSIONS ),
-				"GL_EXT_texture_compression_s3tc" ) )
-		{
-			/*	not there, flag the failure	*/
-			has_DXT_capability = SOIL_CAPABILITY_NONE;
-		} else
-		{
-			/*	and find the address of the extension function	*/
-			P_SOIL_GLCOMPRESSEDTEXIMAGE2DPROC ext_addr = NULL;
-			#ifdef WIN32
-				ext_addr = (P_SOIL_GLCOMPRESSEDTEXIMAGE2DPROC)
-						wglGetProcAddress
-						(
-							"glCompressedTexImage2DARB"
-						);
-			#elif defined(__APPLE__) || defined(__APPLE_CC__)
-				/*	I can't test this Apple stuff!	*/
-				CFBundleRef bundle;
-				CFURLRef bundleURL =
-					CFURLCreateWithFileSystemPath(
-						kCFAllocatorDefault,
-						CFSTR("/System/Library/Frameworks/OpenGL.framework"),
-						kCFURLPOSIXPathStyle,
-						true );
-				CFStringRef extensionName =
-					CFStringCreateWithCString(
-						kCFAllocatorDefault,
-						"glCompressedTexImage2DARB",
-						kCFStringEncodingASCII );
-				bundle = CFBundleCreate( kCFAllocatorDefault, bundleURL );
-				assert( bundle != NULL );
-				ext_addr = (P_SOIL_GLCOMPRESSEDTEXIMAGE2DPROC)
-						CFBundleGetFunctionPointerForName
-						(
-							bundle, extensionName
-						);
-				CFRelease( bundleURL );
-				CFRelease( extensionName );
-				CFRelease( bundle );
-			#else
-				ext_addr = (P_SOIL_GLCOMPRESSEDTEXIMAGE2DPROC)
-						glXGetProcAddressARB
-						(
-							(const GLubyte *)"glCompressedTexImage2DARB"
-						);
-			#endif
-			/*	Flag it so no checks needed later	*/
-			if( NULL == ext_addr )
-			{
-				/*	hmm, not good!!  This should not happen, but does on my
-					laptop's VIA chipset.  The GL_EXT_texture_compression_s3tc
-					spec requires that ARB_texture_compression be present too.
-					this means I can upload and have the OpenGL drive do the
-					conversion, but I can't use my own routines or load DDS files
-					from disk and upload them directly [8^(	*/
-				has_DXT_capability = SOIL_CAPABILITY_NONE;
-			} else
-			{
-				/*	all's well!	*/
-				soilGlCompressedTexImage2D = ext_addr;
-				has_DXT_capability = SOIL_CAPABILITY_PRESENT;
-			}
-		}
-	}
-#endif
-	/*	let the user know if we can do DXT or not	*/
-	return has_DXT_capability;
-}
+/*
+	Jonathan Dummer
+	2007-07-26-10.36
+
+	Simple OpenGL Image Library
+
+	Public Domain
+	using Sean Barret's stb_image as a base
+
+	Thanks to:
+	* Sean Barret - for the awesome stb_image
+	* Dan Venkitachalam - for finding some non-compliant DDS files, and patching some explicit casts
+	* everybody at gamedev.net
+*/
+
+#define SOIL_CHECK_FOR_GL_ERRORS 0
+
+#ifdef WIN32
+	#define WIN32_LEAN_AND_MEAN
+	#include <windows.h>
+	#include <wingdi.h>
+	#include <GL/gl.h>
+#elif defined(__APPLE__) || defined(__APPLE_CC__)
+	/*	I can't test this Apple stuff!	*/
+	#include <OpenGL/gl.h>
+	#include <Carbon/Carbon.h>
+	#define APIENTRY
+#else
+  #ifdef USE_GLES1
+    #include <GLES/gl.h>
+    #define APIENTRY
+  #else
+	  #include <GL/gl.h>
+	  #include <GL/glx.h>
+  #endif
+#endif
+
+#include "SOIL.h"
+#include "stb_image_aug.h"
+#include "image_helper.h"
+#include "image_DXT.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+/*	error reporting	*/
+char *result_string_pointer = "SOIL initialized";
+
+/*	for loading cube maps	*/
+enum{
+	SOIL_CAPABILITY_UNKNOWN = -1,
+	SOIL_CAPABILITY_NONE = 0,
+	SOIL_CAPABILITY_PRESENT = 1
+};
+static int has_cubemap_capability = SOIL_CAPABILITY_UNKNOWN;
+int query_cubemap_capability( void );
+#define SOIL_TEXTURE_WRAP_R					0x8072
+#define SOIL_CLAMP_TO_EDGE					0x812F
+#define SOIL_NORMAL_MAP						0x8511
+#define SOIL_REFLECTION_MAP					0x8512
+#define SOIL_TEXTURE_CUBE_MAP				0x8513
+#define SOIL_TEXTURE_BINDING_CUBE_MAP		0x8514
+#define SOIL_TEXTURE_CUBE_MAP_POSITIVE_X	0x8515
+#define SOIL_TEXTURE_CUBE_MAP_NEGATIVE_X	0x8516
+#define SOIL_TEXTURE_CUBE_MAP_POSITIVE_Y	0x8517
+#define SOIL_TEXTURE_CUBE_MAP_NEGATIVE_Y	0x8518
+#define SOIL_TEXTURE_CUBE_MAP_POSITIVE_Z	0x8519
+#define SOIL_TEXTURE_CUBE_MAP_NEGATIVE_Z	0x851A
+#define SOIL_PROXY_TEXTURE_CUBE_MAP			0x851B
+#define SOIL_MAX_CUBE_MAP_TEXTURE_SIZE		0x851C
+/*	for non-power-of-two texture	*/
+static int has_NPOT_capability = SOIL_CAPABILITY_UNKNOWN;
+int query_NPOT_capability( void );
+/*	for texture rectangles	*/
+static int has_tex_rectangle_capability = SOIL_CAPABILITY_UNKNOWN;
+int query_tex_rectangle_capability( void );
+#define SOIL_TEXTURE_RECTANGLE_ARB				0x84F5
+#define SOIL_MAX_RECTANGLE_TEXTURE_SIZE_ARB		0x84F8
+/*	for using DXT compression	*/
+static int has_DXT_capability = SOIL_CAPABILITY_UNKNOWN;
+int query_DXT_capability( void );
+#define SOIL_RGB_S3TC_DXT1		0x83F0
+#define SOIL_RGBA_S3TC_DXT1		0x83F1
+#define SOIL_RGBA_S3TC_DXT3		0x83F2
+#define SOIL_RGBA_S3TC_DXT5		0x83F3
+typedef void (APIENTRY * P_SOIL_GLCOMPRESSEDTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid * data);
+P_SOIL_GLCOMPRESSEDTEXIMAGE2DPROC soilGlCompressedTexImage2D = NULL;
+unsigned int SOIL_direct_load_DDS(
+		const char *filename,
+		unsigned int reuse_texture_ID,
+		int flags,
+		int loading_as_cubemap );
+unsigned int SOIL_direct_load_DDS_from_memory(
+		const unsigned char *const buffer,
+		int buffer_length,
+		unsigned int reuse_texture_ID,
+		int flags,
+		int loading_as_cubemap );
+/*	other functions	*/
+unsigned int
+	SOIL_internal_create_OGL_texture
+	(
+		const unsigned char *const data,
+		int width, int height, int channels,
+		unsigned int reuse_texture_ID,
+		unsigned int flags,
+		unsigned int opengl_texture_type,
+		unsigned int opengl_texture_target,
+		unsigned int texture_check_size_enum
+	);
+
+/*	and the code magic begins here [8^)	*/
+unsigned int
+	SOIL_load_OGL_texture
+	(
+		const char *filename,
+		int force_channels,
+		unsigned int reuse_texture_ID,
+		unsigned int flags
+	)
+
+{
+	int width, height;
+	return SOIL_load_OGL_texture_size(filename,force_channels,reuse_texture_ID,flags,&width, &height);
+}
+
+unsigned int
+	SOIL_load_OGL_texture_size
+	(
+		const char *filename,
+		int force_channels,
+		unsigned int reuse_texture_ID,
+		unsigned int flags,
+		int *width,
+		int *height
+	)
+{
+	/*	variables	*/
+	unsigned char* img;
+	int channels;
+	unsigned int tex_id;
+	/*	does the user want direct uploading of the image as a DDS file?	*/
+	if( flags & SOIL_FLAG_DDS_LOAD_DIRECT )
+	{
+		/*	1st try direct loading of the image as a DDS file
+			note: direct uploading will only load what is in the
+			DDS file, no MIPmaps will be generated, the image will
+			not be flipped, etc.	*/
+		tex_id = SOIL_direct_load_DDS( filename, reuse_texture_ID, flags, 0 );
+		if( tex_id )
+		{
+			/*	hey, it worked!!	*/
+			return tex_id;
+		}
+	}
+	/*	try to load the image	*/
+	img = SOIL_load_image( filename, width, height, &channels, force_channels );
+	/*	channels holds the original number of channels, which may have been forced	*/
+	if( (force_channels >= 1) && (force_channels <= 4) )
+	{
+		channels = force_channels;
+	}
+	if( NULL == img )
+	{
+		/*	image loading failed	*/
+		result_string_pointer = stbi_failure_reason();
+		return 0;
+	}
+	/*	OK, make it a texture!	*/
+	tex_id = SOIL_internal_create_OGL_texture(
+			img, *width, *height, channels,
+			reuse_texture_ID, flags,
+			GL_TEXTURE_2D, GL_TEXTURE_2D,
+			GL_MAX_TEXTURE_SIZE );
+	/*	and nuke the image data	*/
+	SOIL_free_image_data( img );
+	/*	and return the handle, such as it is	*/
+	return tex_id;
+}
+
+unsigned int
+	SOIL_load_OGL_HDR_texture
+	(
+		const char *filename,
+		int fake_HDR_format,
+		int rescale_to_max,
+		unsigned int reuse_texture_ID,
+		unsigned int flags
+	)
+{
+	/*	variables	*/
+	unsigned char* img;
+	int width, height, channels;
+	unsigned int tex_id;
+	/*	no direct uploading of the image as a DDS file	*/
+	/* error check */
+	if( (fake_HDR_format != SOIL_HDR_RGBE) &&
+		(fake_HDR_format != SOIL_HDR_RGBdivA) &&
+		(fake_HDR_format != SOIL_HDR_RGBdivA2) )
+	{
+		result_string_pointer = "Invalid fake HDR format specified";
+		return 0;
+	}
+	/*	try to load the image (only the HDR type) */
+	img = stbi_hdr_load_rgbe( filename, &width, &height, &channels, 4 );
+	/*	channels holds the original number of channels, which may have been forced	*/
+	if( NULL == img )
+	{
+		/*	image loading failed	*/
+		result_string_pointer = stbi_failure_reason();
+		return 0;
+	}
+	/* the load worked, do I need to convert it? */
+	if( fake_HDR_format == SOIL_HDR_RGBdivA )
+	{
+		RGBE_to_RGBdivA( img, width, height, rescale_to_max );
+	} else if( fake_HDR_format == SOIL_HDR_RGBdivA2 )
+	{
+		RGBE_to_RGBdivA2( img, width, height, rescale_to_max );
+	}
+	/*	OK, make it a texture!	*/
+	tex_id = SOIL_internal_create_OGL_texture(
+			img, width, height, channels,
+			reuse_texture_ID, flags,
+			GL_TEXTURE_2D, GL_TEXTURE_2D,
+			GL_MAX_TEXTURE_SIZE );
+	/*	and nuke the image data	*/
+	SOIL_free_image_data( img );
+	/*	and return the handle, such as it is	*/
+	return tex_id;
+}
+
+unsigned int
+	SOIL_load_OGL_texture_from_memory
+	(
+		const unsigned char *const buffer,
+		int buffer_length,
+		int force_channels,
+		unsigned int reuse_texture_ID,
+		unsigned int flags
+	)
+{
+	/*	variables	*/
+	unsigned char* img;
+	int width, height, channels;
+	unsigned int tex_id;
+	/*	does the user want direct uploading of the image as a DDS file?	*/
+	if( flags & SOIL_FLAG_DDS_LOAD_DIRECT )
+	{
+		/*	1st try direct loading of the image as a DDS file
+			note: direct uploading will only load what is in the
+			DDS file, no MIPmaps will be generated, the image will
+			not be flipped, etc.	*/
+		tex_id = SOIL_direct_load_DDS_from_memory(
+				buffer, buffer_length,
+				reuse_texture_ID, flags, 0 );
+		if( tex_id )
+		{
+			/*	hey, it worked!!	*/
+			return tex_id;
+		}
+	}
+	/*	try to load the image	*/
+	img = SOIL_load_image_from_memory(
+					buffer, buffer_length,
+					&width, &height, &channels,
+					force_channels );
+	/*	channels holds the original number of channels, which may have been forced	*/
+	if( (force_channels >= 1) && (force_channels <= 4) )
+	{
+		channels = force_channels;
+	}
+	if( NULL == img )
+	{
+		/*	image loading failed	*/
+		result_string_pointer = stbi_failure_reason();
+		return 0;
+	}
+	/*	OK, make it a texture!	*/
+	tex_id = SOIL_internal_create_OGL_texture(
+			img, width, height, channels,
+			reuse_texture_ID, flags,
+			GL_TEXTURE_2D, GL_TEXTURE_2D,
+			GL_MAX_TEXTURE_SIZE );
+	/*	and nuke the image data	*/
+	SOIL_free_image_data( img );
+	/*	and return the handle, such as it is	*/
+	return tex_id;
+}
+
+unsigned int
+	SOIL_load_OGL_cubemap
+	(
+		const char *x_pos_file,
+		const char *x_neg_file,
+		const char *y_pos_file,
+		const char *y_neg_file,
+		const char *z_pos_file,
+		const char *z_neg_file,
+		int force_channels,
+		unsigned int reuse_texture_ID,
+		unsigned int flags
+	)
+{
+	/*	variables	*/
+	unsigned char* img;
+	int width, height, channels;
+	unsigned int tex_id;
+	/*	error checking	*/
+	if( (x_pos_file == NULL) ||
+		(x_neg_file == NULL) ||
+		(y_pos_file == NULL) ||
+		(y_neg_file == NULL) ||
+		(z_pos_file == NULL) ||
+		(z_neg_file == NULL) )
+	{
+		result_string_pointer = "Invalid cube map files list";
+		return 0;
+	}
+	/*	capability checking	*/
+	if( query_cubemap_capability() != SOIL_CAPABILITY_PRESENT )
+	{
+		result_string_pointer = "No cube map capability present";
+		return 0;
+	}
+	/*	1st face: try to load the image	*/
+	img = SOIL_load_image( x_pos_file, &width, &height, &channels, force_channels );
+	/*	channels holds the original number of channels, which may have been forced	*/
+	if( (force_channels >= 1) && (force_channels <= 4) )
+	{
+		channels = force_channels;
+	}
+	if( NULL == img )
+	{
+		/*	image loading failed	*/
+		result_string_pointer = stbi_failure_reason();
+		return 0;
+	}
+	/*	upload the texture, and create a texture ID if necessary	*/
+	tex_id = SOIL_internal_create_OGL_texture(
+			img, width, height, channels,
+			reuse_texture_ID, flags,
+			SOIL_TEXTURE_CUBE_MAP, SOIL_TEXTURE_CUBE_MAP_POSITIVE_X,
+			SOIL_MAX_CUBE_MAP_TEXTURE_SIZE );
+	/*	and nuke the image data	*/
+	SOIL_free_image_data( img );
+	/*	continue?	*/
+	if( tex_id != 0 )
+	{
+		/*	1st face: try to load the image	*/
+		img = SOIL_load_image( x_neg_file, &width, &height, &channels, force_channels );
+		/*	channels holds the original number of channels, which may have been forced	*/
+		if( (force_channels >= 1) && (force_channels <= 4) )
+		{
+			channels = force_channels;
+		}
+		if( NULL == img )
+		{
+			/*	image loading failed	*/
+			result_string_pointer = stbi_failure_reason();
+			return 0;
+		}
+		/*	upload the texture, but reuse the assigned texture ID	*/
+		tex_id = SOIL_internal_create_OGL_texture(
+				img, width, height, channels,
+				tex_id, flags,
+				SOIL_TEXTURE_CUBE_MAP, SOIL_TEXTURE_CUBE_MAP_NEGATIVE_X,
+				SOIL_MAX_CUBE_MAP_TEXTURE_SIZE );
+		/*	and nuke the image data	*/
+		SOIL_free_image_data( img );
+	}
+	/*	continue?	*/
+	if( tex_id != 0 )
+	{
+		/*	1st face: try to load the image	*/
+		img = SOIL_load_image( y_pos_file, &width, &height, &channels, force_channels );
+		/*	channels holds the original number of channels, which may have been forced	*/
+		if( (force_channels >= 1) && (force_channels <= 4) )
+		{
+			channels = force_channels;
+		}
+		if( NULL == img )
+		{
+			/*	image loading failed	*/
+			result_string_pointer = stbi_failure_reason();
+			return 0;
+		}
+		/*	upload the texture, but reuse the assigned texture ID	*/
+		tex_id = SOIL_internal_create_OGL_texture(
+				img, width, height, channels,
+				tex_id, flags,
+				SOIL_TEXTURE_CUBE_MAP, SOIL_TEXTURE_CUBE_MAP_POSITIVE_Y,
+				SOIL_MAX_CUBE_MAP_TEXTURE_SIZE );
+		/*	and nuke the image data	*/
+		SOIL_free_image_data( img );
+	}
+	/*	continue?	*/
+	if( tex_id != 0 )
+	{
+		/*	1st face: try to load the image	*/
+		img = SOIL_load_image( y_neg_file, &width, &height, &channels, force_channels );
+		/*	channels holds the original number of channels, which may have been forced	*/
+		if( (force_channels >= 1) && (force_channels <= 4) )
+		{
+			channels = force_channels;
+		}
+		if( NULL == img )
+		{
+			/*	image loading failed	*/
+			result_string_pointer = stbi_failure_reason();
+			return 0;
+		}
+		/*	upload the texture, but reuse the assigned texture ID	*/
+		tex_id = SOIL_internal_create_OGL_texture(
+				img, width, height, channels,
+				tex_id, flags,
+				SOIL_TEXTURE_CUBE_MAP, SOIL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
+				SOIL_MAX_CUBE_MAP_TEXTURE_SIZE );
+		/*	and nuke the image data	*/
+		SOIL_free_image_data( img );
+	}
+	/*	continue?	*/
+	if( tex_id != 0 )
+	{
+		/*	1st face: try to load the image	*/
+		img = SOIL_load_image( z_pos_file, &width, &height, &channels, force_channels );
+		/*	channels holds the original number of channels, which may have been forced	*/
+		if( (force_channels >= 1) && (force_channels <= 4) )
+		{
+			channels = force_channels;
+		}
+		if( NULL == img )
+		{
+			/*	image loading failed	*/
+			result_string_pointer = stbi_failure_reason();
+			return 0;
+		}
+		/*	upload the texture, but reuse the assigned texture ID	*/
+		tex_id = SOIL_internal_create_OGL_texture(
+				img, width, height, channels,
+				tex_id, flags,
+				SOIL_TEXTURE_CUBE_MAP, SOIL_TEXTURE_CUBE_MAP_POSITIVE_Z,
+				SOIL_MAX_CUBE_MAP_TEXTURE_SIZE );
+		/*	and nuke the image data	*/
+		SOIL_free_image_data( img );
+	}
+	/*	continue?	*/
+	if( tex_id != 0 )
+	{
+		/*	1st face: try to load the image	*/
+		img = SOIL_load_image( z_neg_file, &width, &height, &channels, force_channels );
+		/*	channels holds the original number of channels, which may have been forced	*/
+		if( (force_channels >= 1) && (force_channels <= 4) )
+		{
+			channels = force_channels;
+		}
+		if( NULL == img )
+		{
+			/*	image loading failed	*/
+			result_string_pointer = stbi_failure_reason();
+			return 0;
+		}
+		/*	upload the texture, but reuse the assigned texture ID	*/
+		tex_id = SOIL_internal_create_OGL_texture(
+				img, width, height, channels,
+				tex_id, flags,
+				SOIL_TEXTURE_CUBE_MAP, SOIL_TEXTURE_CUBE_MAP_NEGATIVE_Z,
+				SOIL_MAX_CUBE_MAP_TEXTURE_SIZE );
+		/*	and nuke the image data	*/
+		SOIL_free_image_data( img );
+	}
+	/*	and return the handle, such as it is	*/
+	return tex_id;
+}
+
+unsigned int
+	SOIL_load_OGL_cubemap_from_memory
+	(
+		const unsigned char *const x_pos_buffer,
+		int x_pos_buffer_length,
+		const unsigned char *const x_neg_buffer,
+		int x_neg_buffer_length,
+		const unsigned char *const y_pos_buffer,
+		int y_pos_buffer_length,
+		const unsigned char *const y_neg_buffer,
+		int y_neg_buffer_length,
+		const unsigned char *const z_pos_buffer,
+		int z_pos_buffer_length,
+		const unsigned char *const z_neg_buffer,
+		int z_neg_buffer_length,
+		int force_channels,
+		unsigned int reuse_texture_ID,
+		unsigned int flags
+	)
+{
+	/*	variables	*/
+	unsigned char* img;
+	int width, height, channels;
+	unsigned int tex_id;
+	/*	error checking	*/
+	if( (x_pos_buffer == NULL) ||
+		(x_neg_buffer == NULL) ||
+		(y_pos_buffer == NULL) ||
+		(y_neg_buffer == NULL) ||
+		(z_pos_buffer == NULL) ||
+		(z_neg_buffer == NULL) )
+	{
+		result_string_pointer = "Invalid cube map buffers list";
+		return 0;
+	}
+	/*	capability checking	*/
+	if( query_cubemap_capability() != SOIL_CAPABILITY_PRESENT )
+	{
+		result_string_pointer = "No cube map capability present";
+		return 0;
+	}
+	/*	1st face: try to load the image	*/
+	img = SOIL_load_image_from_memory(
+			x_pos_buffer, x_pos_buffer_length,
+			&width, &height, &channels, force_channels );
+	/*	channels holds the original number of channels, which may have been forced	*/
+	if( (force_channels >= 1) && (force_channels <= 4) )
+	{
+		channels = force_channels;
+	}
+	if( NULL == img )
+	{
+		/*	image loading failed	*/
+		result_string_pointer = stbi_failure_reason();
+		return 0;
+	}
+	/*	upload the texture, and create a texture ID if necessary	*/
+	tex_id = SOIL_internal_create_OGL_texture(
+			img, width, height, channels,
+			reuse_texture_ID, flags,
+			SOIL_TEXTURE_CUBE_MAP, SOIL_TEXTURE_CUBE_MAP_POSITIVE_X,
+			SOIL_MAX_CUBE_MAP_TEXTURE_SIZE );
+	/*	and nuke the image data	*/
+	SOIL_free_image_data( img );
+	/*	continue?	*/
+	if( tex_id != 0 )
+	{
+		/*	1st face: try to load the image	*/
+		img = SOIL_load_image_from_memory(
+				x_neg_buffer, x_neg_buffer_length,
+				&width, &height, &channels, force_channels );
+		/*	channels holds the original number of channels, which may have been forced	*/
+		if( (force_channels >= 1) && (force_channels <= 4) )
+		{
+			channels = force_channels;
+		}
+		if( NULL == img )
+		{
+			/*	image loading failed	*/
+			result_string_pointer = stbi_failure_reason();
+			return 0;
+		}
+		/*	upload the texture, but reuse the assigned texture ID	*/
+		tex_id = SOIL_internal_create_OGL_texture(
+				img, width, height, channels,
+				tex_id, flags,
+				SOIL_TEXTURE_CUBE_MAP, SOIL_TEXTURE_CUBE_MAP_NEGATIVE_X,
+				SOIL_MAX_CUBE_MAP_TEXTURE_SIZE );
+		/*	and nuke the image data	*/
+		SOIL_free_image_data( img );
+	}
+	/*	continue?	*/
+	if( tex_id != 0 )
+	{
+		/*	1st face: try to load the image	*/
+		img = SOIL_load_image_from_memory(
+				y_pos_buffer, y_pos_buffer_length,
+				&width, &height, &channels, force_channels );
+		/*	channels holds the original number of channels, which may have been forced	*/
+		if( (force_channels >= 1) && (force_channels <= 4) )
+		{
+			channels = force_channels;
+		}
+		if( NULL == img )
+		{
+			/*	image loading failed	*/
+			result_string_pointer = stbi_failure_reason();
+			return 0;
+		}
+		/*	upload the texture, but reuse the assigned texture ID	*/
+		tex_id = SOIL_internal_create_OGL_texture(
+				img, width, height, channels,
+				tex_id, flags,
+				SOIL_TEXTURE_CUBE_MAP, SOIL_TEXTURE_CUBE_MAP_POSITIVE_Y,
+				SOIL_MAX_CUBE_MAP_TEXTURE_SIZE );
+		/*	and nuke the image data	*/
+		SOIL_free_image_data( img );
+	}
+	/*	continue?	*/
+	if( tex_id != 0 )
+	{
+		/*	1st face: try to load the image	*/
+		img = SOIL_load_image_from_memory(
+				y_neg_buffer, y_neg_buffer_length,
+				&width, &height, &channels, force_channels );
+		/*	channels holds the original number of channels, which may have been forced	*/
+		if( (force_channels >= 1) && (force_channels <= 4) )
+		{
+			channels = force_channels;
+		}
+		if( NULL == img )
+		{
+			/*	image loading failed	*/
+			result_string_pointer = stbi_failure_reason();
+			return 0;
+		}
+		/*	upload the texture, but reuse the assigned texture ID	*/
+		tex_id = SOIL_internal_create_OGL_texture(
+				img, width, height, channels,
+				tex_id, flags,
+				SOIL_TEXTURE_CUBE_MAP, SOIL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
+				SOIL_MAX_CUBE_MAP_TEXTURE_SIZE );
+		/*	and nuke the image data	*/
+		SOIL_free_image_data( img );
+	}
+	/*	continue?	*/
+	if( tex_id != 0 )
+	{
+		/*	1st face: try to load the image	*/
+		img = SOIL_load_image_from_memory(
+				z_pos_buffer, z_pos_buffer_length,
+				&width, &height, &channels, force_channels );
+		/*	channels holds the original number of channels, which may have been forced	*/
+		if( (force_channels >= 1) && (force_channels <= 4) )
+		{
+			channels = force_channels;
+		}
+		if( NULL == img )
+		{
+			/*	image loading failed	*/
+			result_string_pointer = stbi_failure_reason();
+			return 0;
+		}
+		/*	upload the texture, but reuse the assigned texture ID	*/
+		tex_id = SOIL_internal_create_OGL_texture(
+				img, width, height, channels,
+				tex_id, flags,
+				SOIL_TEXTURE_CUBE_MAP, SOIL_TEXTURE_CUBE_MAP_POSITIVE_Z,
+				SOIL_MAX_CUBE_MAP_TEXTURE_SIZE );
+		/*	and nuke the image data	*/
+		SOIL_free_image_data( img );
+	}
+	/*	continue?	*/
+	if( tex_id != 0 )
+	{
+		/*	1st face: try to load the image	*/
+		img = SOIL_load_image_from_memory(
+				z_neg_buffer, z_neg_buffer_length,
+				&width, &height, &channels, force_channels );
+		/*	channels holds the original number of channels, which may have been forced	*/
+		if( (force_channels >= 1) && (force_channels <= 4) )
+		{
+			channels = force_channels;
+		}
+		if( NULL == img )
+		{
+			/*	image loading failed	*/
+			result_string_pointer = stbi_failure_reason();
+			return 0;
+		}
+		/*	upload the texture, but reuse the assigned texture ID	*/
+		tex_id = SOIL_internal_create_OGL_texture(
+				img, width, height, channels,
+				tex_id, flags,
+				SOIL_TEXTURE_CUBE_MAP, SOIL_TEXTURE_CUBE_MAP_NEGATIVE_Z,
+				SOIL_MAX_CUBE_MAP_TEXTURE_SIZE );
+		/*	and nuke the image data	*/
+		SOIL_free_image_data( img );
+	}
+	/*	and return the handle, such as it is	*/
+	return tex_id;
+}
+
+unsigned int
+	SOIL_load_OGL_single_cubemap
+	(
+		const char *filename,
+		const char face_order[6],
+		int force_channels,
+		unsigned int reuse_texture_ID,
+		unsigned int flags
+	)
+{
+	/*	variables	*/
+	unsigned char* img;
+	int width, height, channels, i;
+	unsigned int tex_id = 0;
+	/*	error checking	*/
+	if( filename == NULL )
+	{
+		result_string_pointer = "Invalid single cube map file name";
+		return 0;
+	}
+	/*	does the user want direct uploading of the image as a DDS file?	*/
+	if( flags & SOIL_FLAG_DDS_LOAD_DIRECT )
+	{
+		/*	1st try direct loading of the image as a DDS file
+			note: direct uploading will only load what is in the
+			DDS file, no MIPmaps will be generated, the image will
+			not be flipped, etc.	*/
+		tex_id = SOIL_direct_load_DDS( filename, reuse_texture_ID, flags, 1 );
+		if( tex_id )
+		{
+			/*	hey, it worked!!	*/
+			return tex_id;
+		}
+	}
+	/*	face order checking	*/
+	for( i = 0; i < 6; ++i )
+	{
+		if( (face_order[i] != 'N') &&
+			(face_order[i] != 'S') &&
+			(face_order[i] != 'W') &&
+			(face_order[i] != 'E') &&
+			(face_order[i] != 'U') &&
+			(face_order[i] != 'D') )
+		{
+			result_string_pointer = "Invalid single cube map face order";
+			return 0;
+		};
+	}
+	/*	capability checking	*/
+	if( query_cubemap_capability() != SOIL_CAPABILITY_PRESENT )
+	{
+		result_string_pointer = "No cube map capability present";
+		return 0;
+	}
+	/*	1st off, try to load the full image	*/
+	img = SOIL_load_image( filename, &width, &height, &channels, force_channels );
+	/*	channels holds the original number of channels, which may have been forced	*/
+	if( (force_channels >= 1) && (force_channels <= 4) )
+	{
+		channels = force_channels;
+	}
+	if( NULL == img )
+	{
+		/*	image loading failed	*/
+		result_string_pointer = stbi_failure_reason();
+		return 0;
+	}
+	/*	now, does this image have the right dimensions?	*/
+	if( (width != 6*height) &&
+		(6*width != height) )
+	{
+		SOIL_free_image_data( img );
+		result_string_pointer = "Single cubemap image must have a 6:1 ratio";
+		return 0;
+	}
+	/*	try the image split and create	*/
+	tex_id = SOIL_create_OGL_single_cubemap(
+			img, width, height, channels,
+			face_order, reuse_texture_ID, flags
+			);
+	/*	nuke the temporary image data and return the texture handle	*/
+	SOIL_free_image_data( img );
+	return tex_id;
+}
+
+unsigned int
+	SOIL_load_OGL_single_cubemap_from_memory
+	(
+		const unsigned char *const buffer,
+		int buffer_length,
+		const char face_order[6],
+		int force_channels,
+		unsigned int reuse_texture_ID,
+		unsigned int flags
+	)
+{
+	/*	variables	*/
+	unsigned char* img;
+	int width, height, channels, i;
+	unsigned int tex_id = 0;
+	/*	error checking	*/
+	if( buffer == NULL )
+	{
+		result_string_pointer = "Invalid single cube map buffer";
+		return 0;
+	}
+	/*	does the user want direct uploading of the image as a DDS file?	*/
+	if( flags & SOIL_FLAG_DDS_LOAD_DIRECT )
+	{
+		/*	1st try direct loading of the image as a DDS file
+			note: direct uploading will only load what is in the
+			DDS file, no MIPmaps will be generated, the image will
+			not be flipped, etc.	*/
+		tex_id = SOIL_direct_load_DDS_from_memory(
+				buffer, buffer_length,
+				reuse_texture_ID, flags, 1 );
+		if( tex_id )
+		{
+			/*	hey, it worked!!	*/
+			return tex_id;
+		}
+	}
+	/*	face order checking	*/
+	for( i = 0; i < 6; ++i )
+	{
+		if( (face_order[i] != 'N') &&
+			(face_order[i] != 'S') &&
+			(face_order[i] != 'W') &&
+			(face_order[i] != 'E') &&
+			(face_order[i] != 'U') &&
+			(face_order[i] != 'D') )
+		{
+			result_string_pointer = "Invalid single cube map face order";
+			return 0;
+		};
+	}
+	/*	capability checking	*/
+	if( query_cubemap_capability() != SOIL_CAPABILITY_PRESENT )
+	{
+		result_string_pointer = "No cube map capability present";
+		return 0;
+	}
+	/*	1st off, try to load the full image	*/
+	img = SOIL_load_image_from_memory(
+			buffer, buffer_length,
+			&width, &height, &channels,
+			force_channels );
+	/*	channels holds the original number of channels, which may have been forced	*/
+	if( (force_channels >= 1) && (force_channels <= 4) )
+	{
+		channels = force_channels;
+	}
+	if( NULL == img )
+	{
+		/*	image loading failed	*/
+		result_string_pointer = stbi_failure_reason();
+		return 0;
+	}
+	/*	now, does this image have the right dimensions?	*/
+	if( (width != 6*height) &&
+		(6*width != height) )
+	{
+		SOIL_free_image_data( img );
+		result_string_pointer = "Single cubemap image must have a 6:1 ratio";
+		return 0;
+	}
+	/*	try the image split and create	*/
+	tex_id = SOIL_create_OGL_single_cubemap(
+			img, width, height, channels,
+			face_order, reuse_texture_ID, flags
+			);
+	/*	nuke the temporary image data and return the texture handle	*/
+	SOIL_free_image_data( img );
+	return tex_id;
+}
+
+unsigned int
+	SOIL_create_OGL_single_cubemap
+	(
+		const unsigned char *const data,
+		int width, int height, int channels,
+		const char face_order[6],
+		unsigned int reuse_texture_ID,
+		unsigned int flags
+	)
+{
+	/*	variables	*/
+	unsigned char* sub_img;
+	int dw, dh, sz, i;
+	unsigned int tex_id;
+	/*	error checking	*/
+	if( data == NULL )
+	{
+		result_string_pointer = "Invalid single cube map image data";
+		return 0;
+	}
+	/*	face order checking	*/
+	for( i = 0; i < 6; ++i )
+	{
+		if( (face_order[i] != 'N') &&
+			(face_order[i] != 'S') &&
+			(face_order[i] != 'W') &&
+			(face_order[i] != 'E') &&
+			(face_order[i] != 'U') &&
+			(face_order[i] != 'D') )
+		{
+			result_string_pointer = "Invalid single cube map face order";
+			return 0;
+		};
+	}
+	/*	capability checking	*/
+	if( query_cubemap_capability() != SOIL_CAPABILITY_PRESENT )
+	{
+		result_string_pointer = "No cube map capability present";
+		return 0;
+	}
+	/*	now, does this image have the right dimensions?	*/
+	if( (width != 6*height) &&
+		(6*width != height) )
+	{
+		result_string_pointer = "Single cubemap image must have a 6:1 ratio";
+		return 0;
+	}
+	/*	which way am I stepping?	*/
+	if( width > height )
+	{
+		dw = height;
+		dh = 0;
+	} else
+	{
+		dw = 0;
+		dh = width;
+	}
+	sz = dw+dh;
+	sub_img = (unsigned char *)malloc( sz*sz*channels );
+	/*	do the splitting and uploading	*/
+	tex_id = reuse_texture_ID;
+	for( i = 0; i < 6; ++i )
+	{
+		int x, y, idx = 0;
+		unsigned int cubemap_target = 0;
+		/*	copy in the sub-image	*/
+		for( y = i*dh; y < i*dh+sz; ++y )
+		{
+			for( x = i*dw*channels; x < (i*dw+sz)*channels; ++x )
+			{
+				sub_img[idx++] = data[y*width*channels+x];
+			}
+		}
+		/*	what is my texture target?
+			remember, this coordinate system is
+			LHS if viewed from inside the cube!	*/
+		switch( face_order[i] )
+		{
+		case 'N':
+			cubemap_target = SOIL_TEXTURE_CUBE_MAP_POSITIVE_Z;
+			break;
+		case 'S':
+			cubemap_target = SOIL_TEXTURE_CUBE_MAP_NEGATIVE_Z;
+			break;
+		case 'W':
+			cubemap_target = SOIL_TEXTURE_CUBE_MAP_NEGATIVE_X;
+			break;
+		case 'E':
+			cubemap_target = SOIL_TEXTURE_CUBE_MAP_POSITIVE_X;
+			break;
+		case 'U':
+			cubemap_target = SOIL_TEXTURE_CUBE_MAP_POSITIVE_Y;
+			break;
+		case 'D':
+			cubemap_target = SOIL_TEXTURE_CUBE_MAP_NEGATIVE_Y;
+			break;
+		}
+		/*	upload it as a texture	*/
+		tex_id = SOIL_internal_create_OGL_texture(
+				sub_img, sz, sz, channels,
+				tex_id, flags,
+				SOIL_TEXTURE_CUBE_MAP,
+				cubemap_target,
+				SOIL_MAX_CUBE_MAP_TEXTURE_SIZE );
+	}
+	/*	and nuke the image and sub-image data	*/
+	SOIL_free_image_data( sub_img );
+	/*	and return the handle, such as it is	*/
+	return tex_id;
+}
+
+unsigned int
+	SOIL_create_OGL_texture
+	(
+		const unsigned char *const data,
+		int width, int height, int channels,
+		unsigned int reuse_texture_ID,
+		unsigned int flags
+	)
+{
+	/*	wrapper function for 2D textures	*/
+	return SOIL_internal_create_OGL_texture(
+				data, width, height, channels,
+				reuse_texture_ID, flags,
+				GL_TEXTURE_2D, GL_TEXTURE_2D,
+				GL_MAX_TEXTURE_SIZE );
+}
+
+#if SOIL_CHECK_FOR_GL_ERRORS
+void check_for_GL_errors( const char *calling_location )
+{
+	/*	check for errors	*/
+	GLenum err_code = glGetError();
+	while( GL_NO_ERROR != err_code )
+	{
+		printf( "OpenGL Error @ %s: %i", calling_location, err_code );
+		err_code = glGetError();
+	}
+}
+#else
+void check_for_GL_errors( const char *calling_location )
+{
+	/*	no check for errors	*/
+}
+#endif
+
+unsigned int
+	SOIL_internal_create_OGL_texture
+	(
+		const unsigned char *const data,
+		int width, int height, int channels,
+		unsigned int reuse_texture_ID,
+		unsigned int flags,
+		unsigned int opengl_texture_type,
+		unsigned int opengl_texture_target,
+		unsigned int texture_check_size_enum
+	)
+{
+	/*	variables	*/
+	unsigned char* img;
+	unsigned int tex_id;
+	unsigned int internal_texture_format = 0, original_texture_format = 0;
+	int DXT_mode = SOIL_CAPABILITY_UNKNOWN;
+	int max_supported_size;
+	/*	If the user wants to use the texture rectangle I kill a few flags	*/
+	if( flags & SOIL_FLAG_TEXTURE_RECTANGLE )
+	{
+		/*	well, the user asked for it, can we do that?	*/
+		if( query_tex_rectangle_capability() == SOIL_CAPABILITY_PRESENT )
+		{
+			/*	only allow this if the user in _NOT_ trying to do a cubemap!	*/
+			if( opengl_texture_type == GL_TEXTURE_2D )
+			{
+				/*	clean out the flags that cannot be used with texture rectangles	*/
+				flags &= ~(
+						SOIL_FLAG_POWER_OF_TWO | SOIL_FLAG_MIPMAPS |
+						SOIL_FLAG_TEXTURE_REPEATS
+					);
+				/*	and change my target	*/
+				opengl_texture_target = SOIL_TEXTURE_RECTANGLE_ARB;
+				opengl_texture_type = SOIL_TEXTURE_RECTANGLE_ARB;
+			} else
+			{
+				/*	not allowed for any other uses (yes, I'm looking at you, cubemaps!)	*/
+				flags &= ~SOIL_FLAG_TEXTURE_RECTANGLE;
+			}
+
+		} else
+		{
+			/*	can't do it, and that is a breakable offense (uv coords use pixels instead of [0,1]!)	*/
+			result_string_pointer = "Texture Rectangle extension unsupported";
+			return 0;
+		}
+	}
+	/*	create a copy the image data	*/
+	img = (unsigned char*)malloc( width*height*channels );
+	memcpy( img, data, width*height*channels );
+	/*	does the user want me to invert the image?	*/
+	if( flags & SOIL_FLAG_INVERT_Y )
+	{
+		int i, j;
+		for( j = 0; j*2 < height; ++j )
+		{
+			int index1 = j * width * channels;
+			int index2 = (height - 1 - j) * width * channels;
+			for( i = width * channels; i > 0; --i )
+			{
+				unsigned char temp = img[index1];
+				img[index1] = img[index2];
+				img[index2] = temp;
+				++index1;
+				++index2;
+			}
+		}
+	}
+	/*	does the user want me to scale the colors into the NTSC safe RGB range?	*/
+	if( flags & SOIL_FLAG_NTSC_SAFE_RGB )
+	{
+		scale_image_RGB_to_NTSC_safe( img, width, height, channels );
+	}
+	/*	does the user want me to convert from straight to pre-multiplied alpha?
+		(and do we even _have_ alpha?)	*/
+	if( flags & SOIL_FLAG_MULTIPLY_ALPHA )
+	{
+		int i;
+		switch( channels )
+		{
+		case 2:
+			for( i = 0; i < 2*width*height; i += 2 )
+			{
+				img[i] = (img[i] * img[i+1] + 128) >> 8;
+			}
+			break;
+		case 4:
+			for( i = 0; i < 4*width*height; i += 4 )
+			{
+				img[i+0] = (img[i+0] * img[i+3] + 128) >> 8;
+				img[i+1] = (img[i+1] * img[i+3] + 128) >> 8;
+				img[i+2] = (img[i+2] * img[i+3] + 128) >> 8;
+			}
+			break;
+		default:
+			/*	no other number of channels contains alpha data	*/
+			break;
+		}
+	}
+	/*	if the user can't support NPOT textures, make sure we force the POT option	*/
+	if( (query_NPOT_capability() == SOIL_CAPABILITY_NONE) &&
+		!(flags & SOIL_FLAG_TEXTURE_RECTANGLE) )
+	{
+		/*	add in the POT flag */
+		flags |= SOIL_FLAG_POWER_OF_TWO;
+	}
+	/*	how large of a texture can this OpenGL implementation handle?	*/
+	/*	texture_check_size_enum will be GL_MAX_TEXTURE_SIZE or SOIL_MAX_CUBE_MAP_TEXTURE_SIZE	*/
+	glGetIntegerv( texture_check_size_enum, &max_supported_size );
+	/*	do I need to make it a power of 2?	*/
+	if(
+		(flags & SOIL_FLAG_POWER_OF_TWO) ||	/*	user asked for it	*/
+		(flags & SOIL_FLAG_MIPMAPS) ||		/*	need it for the MIP-maps	*/
+		(width > max_supported_size) ||		/*	it's too big, (make sure it's	*/
+		(height > max_supported_size) )		/*	2^n for later down-sampling)	*/
+	{
+		int new_width = 1;
+		int new_height = 1;
+		while( new_width < width )
+		{
+			new_width *= 2;
+		}
+		while( new_height < height )
+		{
+			new_height *= 2;
+		}
+		/*	still?	*/
+		if( (new_width != width) || (new_height != height) )
+		{
+			/*	yep, resize	*/
+			unsigned char *resampled = (unsigned char*)malloc( channels*new_width*new_height );
+			up_scale_image(
+					img, width, height, channels,
+					resampled, new_width, new_height );
+			/*	OJO	this is for debug only!	*/
+			/*
+			SOIL_save_image( "\\showme.bmp", SOIL_SAVE_TYPE_BMP,
+							new_width, new_height, channels,
+							resampled );
+			*/
+			/*	nuke the old guy, then point it at the new guy	*/
+			SOIL_free_image_data( img );
+			img = resampled;
+			width = new_width;
+			height = new_height;
+		}
+	}
+	/*	now, if it is too large...	*/
+	if( (width > max_supported_size) || (height > max_supported_size) )
+	{
+		/*	I've already made it a power of two, so simply use the MIPmapping
+			code to reduce its size to the allowable maximum.	*/
+		unsigned char *resampled;
+		int reduce_block_x = 1, reduce_block_y = 1;
+		int new_width, new_height;
+		if( width > max_supported_size )
+		{
+			reduce_block_x = width / max_supported_size;
+		}
+		if( height > max_supported_size )
+		{
+			reduce_block_y = height / max_supported_size;
+		}
+		new_width = width / reduce_block_x;
+		new_height = height / reduce_block_y;
+		resampled = (unsigned char*)malloc( channels*new_width*new_height );
+		/*	perform the actual reduction	*/
+		mipmap_image(	img, width, height, channels,
+						resampled, reduce_block_x, reduce_block_y );
+		/*	nuke the old guy, then point it at the new guy	*/
+		SOIL_free_image_data( img );
+		img = resampled;
+		width = new_width;
+		height = new_height;
+	}
+	/*	does the user want us to use YCoCg color space?	*/
+	if( flags & SOIL_FLAG_CoCg_Y )
+	{
+		/*	this will only work with RGB and RGBA images */
+		convert_RGB_to_YCoCg( img, width, height, channels );
+		/*
+		save_image_as_DDS( "CoCg_Y.dds", width, height, channels, img );
+		*/
+	}
+	/*	create the OpenGL texture ID handle
+    	(note: allowing a forced texture ID lets me reload a texture)	*/
+    tex_id = reuse_texture_ID;
+    if( tex_id == 0 )
+    {
+		glGenTextures( 1, &tex_id );
+    }
+	check_for_GL_errors( "glGenTextures" );
+	/* Note: sometimes glGenTextures fails (usually no OpenGL context)	*/
+	if( tex_id )
+	{
+		/*	and what type am I using as the internal texture format?	*/
+		switch( channels )
+		{
+		case 1:
+			original_texture_format = GL_LUMINANCE;
+			break;
+		case 2:
+			original_texture_format = GL_LUMINANCE_ALPHA;
+			break;
+		case 3:
+			original_texture_format = GL_RGB;
+			break;
+		case 4:
+			original_texture_format = GL_RGBA;
+			break;
+		}
+		internal_texture_format = original_texture_format;
+		/*	does the user want me to, and can I, save as DXT?	*/
+		if( flags & SOIL_FLAG_COMPRESS_TO_DXT )
+		{
+			DXT_mode = query_DXT_capability();
+			if( DXT_mode == SOIL_CAPABILITY_PRESENT )
+			{
+				/*	I can use DXT, whether I compress it or OpenGL does	*/
+				if( (channels & 1) == 1 )
+				{
+					/*	1 or 3 channels = DXT1	*/
+					internal_texture_format = SOIL_RGB_S3TC_DXT1;
+				} else
+				{
+					/*	2 or 4 channels = DXT5	*/
+					internal_texture_format = SOIL_RGBA_S3TC_DXT5;
+				}
+			}
+		}
+		/*  bind an OpenGL texture ID	*/
+		glBindTexture( opengl_texture_type, tex_id );
+		check_for_GL_errors( "glBindTexture" );
+		/*  upload the main image	*/
+		if( DXT_mode == SOIL_CAPABILITY_PRESENT )
+		{
+			/*	user wants me to do the DXT conversion!	*/
+			int DDS_size;
+			unsigned char *DDS_data = NULL;
+			if( (channels & 1) == 1 )
+			{
+				/*	RGB, use DXT1	*/
+				DDS_data = convert_image_to_DXT1( img, width, height, channels, &DDS_size );
+			} else
+			{
+				/*	RGBA, use DXT5	*/
+				DDS_data = convert_image_to_DXT5( img, width, height, channels, &DDS_size );
+			}
+			if( DDS_data )
+			{
+				soilGlCompressedTexImage2D(
+					opengl_texture_target, 0,
+					internal_texture_format, width, height, 0,
+					DDS_size, DDS_data );
+				check_for_GL_errors( "glCompressedTexImage2D" );
+				SOIL_free_image_data( DDS_data );
+				/*	printf( "Internal DXT compressor\n" );	*/
+			} else
+			{
+				/*	my compression failed, try the OpenGL driver's version	*/
+				glTexImage2D(
+					opengl_texture_target, 0,
+					internal_texture_format, width, height, 0,
+					original_texture_format, GL_UNSIGNED_BYTE, img );
+				check_for_GL_errors( "glTexImage2D" );
+				/*	printf( "OpenGL DXT compressor\n" );	*/
+			}
+		} else
+		{
+			/*	user want OpenGL to do all the work!	*/
+			glTexImage2D(
+				opengl_texture_target, 0,
+				internal_texture_format, width, height, 0,
+				original_texture_format, GL_UNSIGNED_BYTE, img );
+			check_for_GL_errors( "glTexImage2D" );
+			/*printf( "OpenGL DXT compressor\n" );	*/
+		}
+		/*	are any MIPmaps desired?	*/
+		if( flags & SOIL_FLAG_MIPMAPS )
+		{
+			int MIPlevel = 1;
+			int MIPwidth = (width+1) / 2;
+			int MIPheight = (height+1) / 2;
+			unsigned char *resampled = (unsigned char*)malloc( channels*MIPwidth*MIPheight );
+			while( ((1<<MIPlevel) <= width) || ((1<<MIPlevel) <= height) )
+			{
+				/*	do this MIPmap level	*/
+				mipmap_image(
+						img, width, height, channels,
+						resampled,
+						(1 << MIPlevel), (1 << MIPlevel) );
+				/*  upload the MIPmaps	*/
+				if( DXT_mode == SOIL_CAPABILITY_PRESENT )
+				{
+					/*	user wants me to do the DXT conversion!	*/
+					int DDS_size;
+					unsigned char *DDS_data = NULL;
+					if( (channels & 1) == 1 )
+					{
+						/*	RGB, use DXT1	*/
+						DDS_data = convert_image_to_DXT1(
+								resampled, MIPwidth, MIPheight, channels, &DDS_size );
+					} else
+					{
+						/*	RGBA, use DXT5	*/
+						DDS_data = convert_image_to_DXT5(
+								resampled, MIPwidth, MIPheight, channels, &DDS_size );
+					}
+					if( DDS_data )
+					{
+						soilGlCompressedTexImage2D(
+							opengl_texture_target, MIPlevel,
+							internal_texture_format, MIPwidth, MIPheight, 0,
+							DDS_size, DDS_data );
+						check_for_GL_errors( "glCompressedTexImage2D" );
+						SOIL_free_image_data( DDS_data );
+					} else
+					{
+						/*	my compression failed, try the OpenGL driver's version	*/
+						glTexImage2D(
+							opengl_texture_target, MIPlevel,
+							internal_texture_format, MIPwidth, MIPheight, 0,
+							original_texture_format, GL_UNSIGNED_BYTE, resampled );
+						check_for_GL_errors( "glTexImage2D" );
+					}
+				} else
+				{
+					/*	user want OpenGL to do all the work!	*/
+					glTexImage2D(
+						opengl_texture_target, MIPlevel,
+						internal_texture_format, MIPwidth, MIPheight, 0,
+						original_texture_format, GL_UNSIGNED_BYTE, resampled );
+					check_for_GL_errors( "glTexImage2D" );
+				}
+				/*	prep for the next level	*/
+				++MIPlevel;
+				MIPwidth = (MIPwidth + 1) / 2;
+				MIPheight = (MIPheight + 1) / 2;
+			}
+			SOIL_free_image_data( resampled );
+			/*	instruct OpenGL to use the MIPmaps	*/
+			glTexParameteri( opengl_texture_type, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
+			glTexParameteri( opengl_texture_type, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR );
+			check_for_GL_errors( "GL_TEXTURE_MIN/MAG_FILTER" );
+		} else
+		{
+			/*	instruct OpenGL _NOT_ to use the MIPmaps	*/
+			glTexParameteri( opengl_texture_type, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
+			glTexParameteri( opengl_texture_type, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
+			check_for_GL_errors( "GL_TEXTURE_MIN/MAG_FILTER" );
+		}
+		/*	does the user want clamping, or wrapping?	*/
+		if( flags & SOIL_FLAG_TEXTURE_REPEATS )
+		{
+			glTexParameteri( opengl_texture_type, GL_TEXTURE_WRAP_S, GL_REPEAT );
+			glTexParameteri( opengl_texture_type, GL_TEXTURE_WRAP_T, GL_REPEAT );
+			if( opengl_texture_type == SOIL_TEXTURE_CUBE_MAP )
+			{
+				/*	SOIL_TEXTURE_WRAP_R is invalid if cubemaps aren't supported	*/
+				glTexParameteri( opengl_texture_type, SOIL_TEXTURE_WRAP_R, GL_REPEAT );
+			}
+			check_for_GL_errors( "GL_TEXTURE_WRAP_*" );
+		} else
+		{
+			/*	unsigned int clamp_mode = SOIL_CLAMP_TO_EDGE;	*/
+			unsigned int clamp_mode = GL_CLAMP_TO_EDGE;
+			glTexParameteri( opengl_texture_type, GL_TEXTURE_WRAP_S, clamp_mode );
+			glTexParameteri( opengl_texture_type, GL_TEXTURE_WRAP_T, clamp_mode );
+			if( opengl_texture_type == SOIL_TEXTURE_CUBE_MAP )
+			{
+				/*	SOIL_TEXTURE_WRAP_R is invalid if cubemaps aren't supported	*/
+				glTexParameteri( opengl_texture_type, SOIL_TEXTURE_WRAP_R, clamp_mode );
+			}
+			check_for_GL_errors( "GL_TEXTURE_WRAP_*" );
+		}
+		/*	done	*/
+		result_string_pointer = "Image loaded as an OpenGL texture";
+	} else
+	{
+		/*	failed	*/
+		result_string_pointer = "Failed to generate an OpenGL texture name; missing OpenGL context?";
+	}
+	SOIL_free_image_data( img );
+	return tex_id;
+}
+
+int
+	SOIL_save_screenshot
+	(
+		const char *filename,
+		int image_type,
+		int x, int y,
+		int width, int height
+	)
+{
+	unsigned char *pixel_data;
+	int i, j;
+	int save_result;
+
+	/*	error checks	*/
+	if( (width < 1) || (height < 1) )
+	{
+		result_string_pointer = "Invalid screenshot dimensions";
+		return 0;
+	}
+	if( (x < 0) || (y < 0) )
+	{
+		result_string_pointer = "Invalid screenshot location";
+		return 0;
+	}
+	if( filename == NULL )
+	{
+		result_string_pointer = "Invalid screenshot filename";
+		return 0;
+	}
+
+    /*  Get the data from OpenGL	*/
+    pixel_data = (unsigned char*)malloc( 3*width*height );
+    glReadPixels (x, y, width, height, GL_RGB, GL_UNSIGNED_BYTE, pixel_data);
+
+    /*	invert the image	*/
+    for( j = 0; j*2 < height; ++j )
+	{
+		int index1 = j * width * 3;
+		int index2 = (height - 1 - j) * width * 3;
+		for( i = width * 3; i > 0; --i )
+		{
+			unsigned char temp = pixel_data[index1];
+			pixel_data[index1] = pixel_data[index2];
+			pixel_data[index2] = temp;
+			++index1;
+			++index2;
+		}
+	}
+
+    /*	save the image	*/
+    save_result = SOIL_save_image( filename, image_type, width, height, 3, pixel_data);
+
+    /*  And free the memory	*/
+    SOIL_free_image_data( pixel_data );
+	return save_result;
+}
+
+unsigned char*
+	SOIL_load_image
+	(
+		const char *filename,
+		int *width, int *height, int *channels,
+		int force_channels
+	)
+{
+	unsigned char *result = stbi_load( filename,
+			width, height, channels, force_channels );
+	if( result == NULL )
+	{
+		result_string_pointer = stbi_failure_reason();
+	} else
+	{
+		result_string_pointer = "Image loaded";
+	}
+	return result;
+}
+
+unsigned char*
+	SOIL_load_image_from_memory
+	(
+		const unsigned char *const buffer,
+		int buffer_length,
+		int *width, int *height, int *channels,
+		int force_channels
+	)
+{
+	unsigned char *result = stbi_load_from_memory(
+				buffer, buffer_length,
+				width, height, channels,
+				force_channels );
+	if( result == NULL )
+	{
+		result_string_pointer = stbi_failure_reason();
+	} else
+	{
+		result_string_pointer = "Image loaded from memory";
+	}
+	return result;
+}
+
+int
+	SOIL_save_image
+	(
+		const char *filename,
+		int image_type,
+		int width, int height, int channels,
+		const unsigned char *const data
+	)
+{
+	int save_result;
+
+	/*	error check	*/
+	if( (width < 1) || (height < 1) ||
+		(channels < 1) || (channels > 4) ||
+		(data == NULL) ||
+		(filename == NULL) )
+	{
+		return 0;
+	}
+	if( image_type == SOIL_SAVE_TYPE_BMP )
+	{
+		save_result = stbi_write_bmp( filename,
+				width, height, channels, (void*)data );
+	} else
+	if( image_type == SOIL_SAVE_TYPE_TGA )
+	{
+		save_result = stbi_write_tga( filename,
+				width, height, channels, (void*)data );
+	} else
+	if( image_type == SOIL_SAVE_TYPE_DDS )
+	{
+		save_result = save_image_as_DDS( filename,
+				width, height, channels, (const unsigned char *const)data );
+	} else
+	{
+		save_result = 0;
+	}
+	if( save_result == 0 )
+	{
+		result_string_pointer = "Saving the image failed";
+	} else
+	{
+		result_string_pointer = "Image saved";
+	}
+	return save_result;
+}
+
+void
+	SOIL_free_image_data
+	(
+		unsigned char *img_data
+	)
+{
+	free( (void*)img_data );
+}
+
+const char*
+	SOIL_last_result
+	(
+		void
+	)
+{
+	return result_string_pointer;
+}
+
+unsigned int SOIL_direct_load_DDS_from_memory(
+		const unsigned char *const buffer,
+		int buffer_length,
+		unsigned int reuse_texture_ID,
+		int flags,
+		int loading_as_cubemap )
+{
+	/*	variables	*/
+	DDS_header header;
+	unsigned int buffer_index = 0;
+	unsigned int tex_ID = 0;
+	/*	file reading variables	*/
+	unsigned int S3TC_type = 0;
+	unsigned char *DDS_data;
+	unsigned int DDS_main_size;
+	unsigned int DDS_full_size;
+	unsigned int width, height;
+	int mipmaps, cubemap, uncompressed, block_size = 16;
+	unsigned int flag;
+	unsigned int cf_target, ogl_target_start, ogl_target_end;
+	unsigned int opengl_texture_type;
+	int i;
+	/*	1st off, does the filename even exist?	*/
+	if( NULL == buffer )
+	{
+		/*	we can't do it!	*/
+		result_string_pointer = "NULL buffer";
+		return 0;
+	}
+	if( buffer_length < sizeof( DDS_header ) )
+	{
+		/*	we can't do it!	*/
+		result_string_pointer = "DDS file was too small to contain the DDS header";
+		return 0;
+	}
+	/*	try reading in the header	*/
+	memcpy ( (void*)(&header), (const void *)buffer, sizeof( DDS_header ) );
+	buffer_index = sizeof( DDS_header );
+	/*	guilty until proven innocent	*/
+	result_string_pointer = "Failed to read a known DDS header";
+	/*	validate the header (warning, "goto"'s ahead, shield your eyes!!)	*/
+	flag = ('D'<<0)|('D'<<8)|('S'<<16)|(' '<<24);
+	if( header.dwMagic != flag ) {goto quick_exit;}
+	if( header.dwSize != 124 ) {goto quick_exit;}
+	/*	I need all of these	*/
+	flag = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH | DDSD_PIXELFORMAT;
+	if( (header.dwFlags & flag) != flag ) {goto quick_exit;}
+	/*	According to the MSDN spec, the dwFlags should contain
+		DDSD_LINEARSIZE if it's compressed, or DDSD_PITCH if
+		uncompressed.  Some DDS writers do not conform to the
+		spec, so I need to make my reader more tolerant	*/
+	/*	I need one of these	*/
+	flag = DDPF_FOURCC | DDPF_RGB;
+	if( (header.sPixelFormat.dwFlags & flag) == 0 ) {goto quick_exit;}
+	if( header.sPixelFormat.dwSize != 32 ) {goto quick_exit;}
+	if( (header.sCaps.dwCaps1 & DDSCAPS_TEXTURE) == 0 ) {goto quick_exit;}
+	/*	make sure it is a type we can upload	*/
+	if( (header.sPixelFormat.dwFlags & DDPF_FOURCC) &&
+		!(
+		(header.sPixelFormat.dwFourCC == (('D'<<0)|('X'<<8)|('T'<<16)|('1'<<24))) ||
+		(header.sPixelFormat.dwFourCC == (('D'<<0)|('X'<<8)|('T'<<16)|('3'<<24))) ||
+		(header.sPixelFormat.dwFourCC == (('D'<<0)|('X'<<8)|('T'<<16)|('5'<<24)))
+		) )
+	{
+		goto quick_exit;
+	}
+	/*	OK, validated the header, let's load the image data	*/
+	result_string_pointer = "DDS header loaded and validated";
+	width = header.dwWidth;
+	height = header.dwHeight;
+	uncompressed = 1 - (header.sPixelFormat.dwFlags & DDPF_FOURCC) / DDPF_FOURCC;
+	cubemap = (header.sCaps.dwCaps2 & DDSCAPS2_CUBEMAP) / DDSCAPS2_CUBEMAP;
+	if( uncompressed )
+	{
+		S3TC_type = GL_RGB;
+		block_size = 3;
+		if( header.sPixelFormat.dwFlags & DDPF_ALPHAPIXELS )
+		{
+			S3TC_type = GL_RGBA;
+			block_size = 4;
+		}
+		DDS_main_size = width * height * block_size;
+	} else
+	{
+		/*	can we even handle direct uploading to OpenGL DXT compressed images?	*/
+		if( query_DXT_capability() != SOIL_CAPABILITY_PRESENT )
+		{
+			/*	we can't do it!	*/
+			result_string_pointer = "Direct upload of S3TC images not supported by the OpenGL driver";
+			return 0;
+		}
+		/*	well, we know it is DXT1/3/5, because we checked above	*/
+		switch( (header.sPixelFormat.dwFourCC >> 24) - '0' )
+		{
+		case 1:
+			S3TC_type = SOIL_RGBA_S3TC_DXT1;
+			block_size = 8;
+			break;
+		case 3:
+			S3TC_type = SOIL_RGBA_S3TC_DXT3;
+			block_size = 16;
+			break;
+		case 5:
+			S3TC_type = SOIL_RGBA_S3TC_DXT5;
+			block_size = 16;
+			break;
+		}
+		DDS_main_size = ((width+3)>>2)*((height+3)>>2)*block_size;
+	}
+	if( cubemap )
+	{
+		/* does the user want a cubemap?	*/
+		if( !loading_as_cubemap )
+		{
+			/*	we can't do it!	*/
+			result_string_pointer = "DDS image was a cubemap";
+			return 0;
+		}
+		/*	can we even handle cubemaps with the OpenGL driver?	*/
+		if( query_cubemap_capability() != SOIL_CAPABILITY_PRESENT )
+		{
+			/*	we can't do it!	*/
+			result_string_pointer = "Direct upload of cubemap images not supported by the OpenGL driver";
+			return 0;
+		}
+		ogl_target_start = SOIL_TEXTURE_CUBE_MAP_POSITIVE_X;
+		ogl_target_end =   SOIL_TEXTURE_CUBE_MAP_NEGATIVE_Z;
+		opengl_texture_type = SOIL_TEXTURE_CUBE_MAP;
+	} else
+	{
+		/* does the user want a non-cubemap?	*/
+		if( loading_as_cubemap )
+		{
+			/*	we can't do it!	*/
+			result_string_pointer = "DDS image was not a cubemap";
+			return 0;
+		}
+		ogl_target_start = GL_TEXTURE_2D;
+		ogl_target_end =   GL_TEXTURE_2D;
+		opengl_texture_type = GL_TEXTURE_2D;
+	}
+	if( (header.sCaps.dwCaps1 & DDSCAPS_MIPMAP) && (header.dwMipMapCount > 1) )
+	{
+		int shift_offset;
+		mipmaps = header.dwMipMapCount - 1;
+		DDS_full_size = DDS_main_size;
+		if( uncompressed )
+		{
+			/*	uncompressed DDS, simple MIPmap size calculation	*/
+			shift_offset = 0;
+		} else
+		{
+			/*	compressed DDS, MIPmap size calculation is block based	*/
+			shift_offset = 2;
+		}
+		for( i = 1; i <= mipmaps; ++ i )
+		{
+			int w, h;
+			w = width >> (shift_offset + i);
+			h = height >> (shift_offset + i);
+			if( w < 1 )
+			{
+				w = 1;
+			}
+			if( h < 1 )
+			{
+				h = 1;
+			}
+			DDS_full_size += w*h*block_size;
+		}
+	} else
+	{
+		mipmaps = 0;
+		DDS_full_size = DDS_main_size;
+	}
+	DDS_data = (unsigned char*)malloc( DDS_full_size );
+	/*	got the image data RAM, create or use an existing OpenGL texture handle	*/
+	tex_ID = reuse_texture_ID;
+	if( tex_ID == 0 )
+	{
+		glGenTextures( 1, &tex_ID );
+	}
+	/*  bind an OpenGL texture ID	*/
+	glBindTexture( opengl_texture_type, tex_ID );
+	/*	do this for each face of the cubemap!	*/
+	for( cf_target = ogl_target_start; cf_target <= ogl_target_end; ++cf_target )
+	{
+		if( buffer_index + DDS_full_size <= buffer_length )
+		{
+			unsigned int byte_offset = DDS_main_size;
+			memcpy( (void*)DDS_data, (const void*)(&buffer[buffer_index]), DDS_full_size );
+			buffer_index += DDS_full_size;
+			/*	upload the main chunk	*/
+			if( uncompressed )
+			{
+				/*	and remember, DXT uncompressed uses BGR(A),
+					so swap to RGB(A) for ALL MIPmap levels	*/
+				for( i = 0; i < DDS_full_size; i += block_size )
+				{
+					unsigned char temp = DDS_data[i];
+					DDS_data[i] = DDS_data[i+2];
+					DDS_data[i+2] = temp;
+				}
+				glTexImage2D(
+					cf_target, 0,
+					S3TC_type, width, height, 0,
+					S3TC_type, GL_UNSIGNED_BYTE, DDS_data );
+			} else
+			{
+				soilGlCompressedTexImage2D(
+					cf_target, 0,
+					S3TC_type, width, height, 0,
+					DDS_main_size, DDS_data );
+			}
+			/*	upload the mipmaps, if we have them	*/
+			for( i = 1; i <= mipmaps; ++i )
+			{
+				int w, h, mip_size;
+				w = width >> i;
+				h = height >> i;
+				if( w < 1 )
+				{
+					w = 1;
+				}
+				if( h < 1 )
+				{
+					h = 1;
+				}
+				/*	upload this mipmap	*/
+				if( uncompressed )
+				{
+					mip_size = w*h*block_size;
+					glTexImage2D(
+						cf_target, i,
+						S3TC_type, w, h, 0,
+						S3TC_type, GL_UNSIGNED_BYTE, &DDS_data[byte_offset] );
+				} else
+				{
+					mip_size = ((w+3)/4)*((h+3)/4)*block_size;
+					soilGlCompressedTexImage2D(
+						cf_target, i,
+						S3TC_type, w, h, 0,
+						mip_size, &DDS_data[byte_offset] );
+				}
+				/*	and move to the next mipmap	*/
+				byte_offset += mip_size;
+			}
+			/*	it worked!	*/
+			result_string_pointer = "DDS file loaded";
+		} else
+		{
+			glDeleteTextures( 1, & tex_ID );
+			tex_ID = 0;
+			cf_target = ogl_target_end + 1;
+			result_string_pointer = "DDS file was too small for expected image data";
+		}
+	}/* end reading each face */
+	SOIL_free_image_data( DDS_data );
+	if( tex_ID )
+	{
+		/*	did I have MIPmaps?	*/
+		if( mipmaps > 0 )
+		{
+			/*	instruct OpenGL to use the MIPmaps	*/
+			glTexParameteri( opengl_texture_type, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
+			glTexParameteri( opengl_texture_type, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR );
+		} else
+		{
+			/*	instruct OpenGL _NOT_ to use the MIPmaps	*/
+			glTexParameteri( opengl_texture_type, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
+			glTexParameteri( opengl_texture_type, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
+		}
+		/*	does the user want clamping, or wrapping?	*/
+		if( flags & SOIL_FLAG_TEXTURE_REPEATS )
+		{
+			glTexParameteri( opengl_texture_type, GL_TEXTURE_WRAP_S, GL_REPEAT );
+			glTexParameteri( opengl_texture_type, GL_TEXTURE_WRAP_T, GL_REPEAT );
+			glTexParameteri( opengl_texture_type, SOIL_TEXTURE_WRAP_R, GL_REPEAT );
+		} else
+		{
+			/*	unsigned int clamp_mode = SOIL_CLAMP_TO_EDGE;	*/
+			unsigned int clamp_mode = GL_CLAMP_TO_EDGE;
+			glTexParameteri( opengl_texture_type, GL_TEXTURE_WRAP_S, clamp_mode );
+			glTexParameteri( opengl_texture_type, GL_TEXTURE_WRAP_T, clamp_mode );
+			glTexParameteri( opengl_texture_type, SOIL_TEXTURE_WRAP_R, clamp_mode );
+		}
+	}
+
+quick_exit:
+	/*	report success or failure	*/
+	return tex_ID;
+}
+
+unsigned int SOIL_direct_load_DDS(
+		const char *filename,
+		unsigned int reuse_texture_ID,
+		int flags,
+		int loading_as_cubemap )
+{
+	FILE *f;
+	unsigned char *buffer;
+	size_t buffer_length, bytes_read;
+	unsigned int tex_ID = 0;
+	/*	error checks	*/
+	if( NULL == filename )
+	{
+		result_string_pointer = "NULL filename";
+		return 0;
+	}
+	f = fopen( filename, "rb" );
+	if( NULL == f )
+	{
+		/*	the file doesn't seem to exist (or be open-able)	*/
+		result_string_pointer = "Can not find DDS file";
+		return 0;
+	}
+	fseek( f, 0, SEEK_END );
+	buffer_length = ftell( f );
+	fseek( f, 0, SEEK_SET );
+	buffer = (unsigned char *) malloc( buffer_length );
+	if( NULL == buffer )
+	{
+		result_string_pointer = "malloc failed";
+		fclose( f );
+		return 0;
+	}
+	bytes_read = fread( (void*)buffer, 1, buffer_length, f );
+	fclose( f );
+	if( bytes_read < buffer_length )
+	{
+		/*	huh?	*/
+		buffer_length = bytes_read;
+	}
+	/*	now try to do the loading	*/
+	tex_ID = SOIL_direct_load_DDS_from_memory(
+		(const unsigned char *const)buffer, buffer_length,
+		reuse_texture_ID, flags, loading_as_cubemap );
+	SOIL_free_image_data( buffer );
+	return tex_ID;
+}
+
+int query_NPOT_capability( void )
+{
+	/*	check for the capability	*/
+	if( has_NPOT_capability == SOIL_CAPABILITY_UNKNOWN )
+	{
+		/*	we haven't yet checked for the capability, do so	*/
+		if(
+			(NULL == strstr( (char const*)glGetString( GL_EXTENSIONS ),
+				"GL_ARB_texture_non_power_of_two" ) )
+			)
+		{
+			/*	not there, flag the failure	*/
+			has_NPOT_capability = SOIL_CAPABILITY_NONE;
+		} else
+		{
+			/*	it's there!	*/
+			has_NPOT_capability = SOIL_CAPABILITY_PRESENT;
+		}
+	}
+	/*	let the user know if we can do non-power-of-two textures or not	*/
+	return has_NPOT_capability;
+}
+
+int query_tex_rectangle_capability( void )
+{
+	/*	check for the capability	*/
+	if( has_tex_rectangle_capability == SOIL_CAPABILITY_UNKNOWN )
+	{
+		/*	we haven't yet checked for the capability, do so	*/
+		if(
+			(NULL == strstr( (char const*)glGetString( GL_EXTENSIONS ),
+				"GL_ARB_texture_rectangle" ) )
+		&&
+			(NULL == strstr( (char const*)glGetString( GL_EXTENSIONS ),
+				"GL_EXT_texture_rectangle" ) )
+		&&
+			(NULL == strstr( (char const*)glGetString( GL_EXTENSIONS ),
+				"GL_NV_texture_rectangle" ) )
+			)
+		{
+			/*	not there, flag the failure	*/
+			has_tex_rectangle_capability = SOIL_CAPABILITY_NONE;
+		} else
+		{
+			/*	it's there!	*/
+			has_tex_rectangle_capability = SOIL_CAPABILITY_PRESENT;
+		}
+	}
+	/*	let the user know if we can do texture rectangles or not	*/
+	return has_tex_rectangle_capability;
+}
+
+int query_cubemap_capability( void )
+{
+	/*	check for the capability	*/
+	if( has_cubemap_capability == SOIL_CAPABILITY_UNKNOWN )
+	{
+		/*	we haven't yet checked for the capability, do so	*/
+		if(
+			(NULL == strstr( (char const*)glGetString( GL_EXTENSIONS ),
+				"GL_ARB_texture_cube_map" ) )
+		&&
+			(NULL == strstr( (char const*)glGetString( GL_EXTENSIONS ),
+				"GL_EXT_texture_cube_map" ) )
+			)
+		{
+			/*	not there, flag the failure	*/
+			has_cubemap_capability = SOIL_CAPABILITY_NONE;
+		} else
+		{
+			/*	it's there!	*/
+			has_cubemap_capability = SOIL_CAPABILITY_PRESENT;
+		}
+	}
+	/*	let the user know if we can do cubemaps or not	*/
+	return has_cubemap_capability;
+}
+
+int query_DXT_capability( void )
+{
+#ifdef USE_GLES1
+  /*
+   * GLES1 has no S3-style texture compression extension.
+   * GLES2 has GL_EXT_texture_compression_dxt1 available which only supports,
+   * obviously enough, DXT1 compression.
+   */
+  has_DXT_capability = SOIL_CAPABILITY_NONE;
+#else
+	/*	check for the capability	*/
+	if( has_DXT_capability == SOIL_CAPABILITY_UNKNOWN )
+	{
+		/*	we haven't yet checked for the capability, do so	*/
+		if( NULL == strstr(
+				(char const*)glGetString( GL_EXTENSIONS ),
+				"GL_EXT_texture_compression_s3tc" ) )
+		{
+			/*	not there, flag the failure	*/
+			has_DXT_capability = SOIL_CAPABILITY_NONE;
+		} else
+		{
+			/*	and find the address of the extension function	*/
+			P_SOIL_GLCOMPRESSEDTEXIMAGE2DPROC ext_addr = NULL;
+			#ifdef WIN32
+				ext_addr = (P_SOIL_GLCOMPRESSEDTEXIMAGE2DPROC)
+						wglGetProcAddress
+						(
+							"glCompressedTexImage2DARB"
+						);
+			#elif defined(__APPLE__) || defined(__APPLE_CC__)
+				/*	I can't test this Apple stuff!	*/
+				CFBundleRef bundle;
+				CFURLRef bundleURL =
+					CFURLCreateWithFileSystemPath(
+						kCFAllocatorDefault,
+						CFSTR("/System/Library/Frameworks/OpenGL.framework"),
+						kCFURLPOSIXPathStyle,
+						true );
+				CFStringRef extensionName =
+					CFStringCreateWithCString(
+						kCFAllocatorDefault,
+						"glCompressedTexImage2DARB",
+						kCFStringEncodingASCII );
+				bundle = CFBundleCreate( kCFAllocatorDefault, bundleURL );
+				assert( bundle != NULL );
+				ext_addr = (P_SOIL_GLCOMPRESSEDTEXIMAGE2DPROC)
+						CFBundleGetFunctionPointerForName
+						(
+							bundle, extensionName
+						);
+				CFRelease( bundleURL );
+				CFRelease( extensionName );
+				CFRelease( bundle );
+			#else
+				ext_addr = (P_SOIL_GLCOMPRESSEDTEXIMAGE2DPROC)
+						glXGetProcAddressARB
+						(
+							(const GLubyte *)"glCompressedTexImage2DARB"
+						);
+			#endif
+			/*	Flag it so no checks needed later	*/
+			if( NULL == ext_addr )
+			{
+				/*	hmm, not good!!  This should not happen, but does on my
+					laptop's VIA chipset.  The GL_EXT_texture_compression_s3tc
+					spec requires that ARB_texture_compression be present too.
+					this means I can upload and have the OpenGL drive do the
+					conversion, but I can't use my own routines or load DDS files
+					from disk and upload them directly [8^(	*/
+				has_DXT_capability = SOIL_CAPABILITY_NONE;
+			} else
+			{
+				/*	all's well!	*/
+				soilGlCompressedTexImage2D = ext_addr;
+				has_DXT_capability = SOIL_CAPABILITY_PRESENT;
+			}
+		}
+	}
+#endif
+	/*	let the user know if we can do DXT or not	*/
+	return has_DXT_capability;
+}
diff --git a/src/libprojectM/Renderer/Shader.cpp b/src/libprojectM/Renderer/Shader.cpp
index 1ffb119..16979d1 100644
--- a/src/libprojectM/Renderer/Shader.cpp
+++ b/src/libprojectM/Renderer/Shader.cpp
@@ -4,9 +4,9 @@
  *  Created on: Jun 29, 2008
  *      Author: pete
  */
-
 #include "Shader.hpp"
 
+
 Shader::Shader()
-	: enabled(false)
-	{}
+  : enabled(false)
+{}
diff --git a/src/libprojectM/Renderer/Shader.hpp b/src/libprojectM/Renderer/Shader.hpp
index beecb79..a5a5fcd 100644
--- a/src/libprojectM/Renderer/Shader.hpp
+++ b/src/libprojectM/Renderer/Shader.hpp
@@ -4,7 +4,6 @@
  *  Created on: Jun 29, 2008
  *      Author: pete
  */
-
 #ifndef SHADER_HPP_
 #define SHADER_HPP_
 
@@ -12,17 +11,18 @@
 #include <map>
 #include "UserTexture.hpp"
 
+
 class Shader
 {
 public:
 
-    std::map<std::string, UserTexture*> textures;
+  std::map<std::string, UserTexture*> textures;
 
-    bool enabled;
+  bool enabled;
 
-	std::string programSource;
+  std::string programSource;
 
-	Shader();
+  Shader();
 };
 
 #endif /* SHADER_HPP_ */
diff --git a/src/libprojectM/Renderer/ShaderEngine.cpp b/src/libprojectM/Renderer/ShaderEngine.cpp
index 054a170..745b4be 100644
--- a/src/libprojectM/Renderer/ShaderEngine.cpp
+++ b/src/libprojectM/Renderer/ShaderEngine.cpp
@@ -9,691 +9,700 @@
 #include "ShaderEngine.hpp"
 #include "BeatDetect.hpp"
 
+
 ShaderEngine::ShaderEngine()
 {
 #ifdef USE_CG
-	SetupCg();
+  SetupCg();
 #endif
 }
 
 ShaderEngine::~ShaderEngine()
 {
-	// TODO Auto-generated destructor stub
+  // TODO Auto-generated destructor stub
 }
 
 #ifdef USE_CG
 
-void ShaderEngine::setParams(const int texsize, const unsigned int texId, const float aspect, BeatDetect *beatDetect,
-		TextureManager *textureManager)
+void
+ShaderEngine::setParams (
+const int           texsize,
+const unsigned int  texId,
+const float         aspect,
+BeatDetect          *beatDetect,
+TextureManager      *textureManager
+)
 {
-	mainTextureId = texId;
-	this->beatDetect = beatDetect;
-	this->textureManager = textureManager;
-	this->aspect = aspect;
-	this->texsize = texsize;
+  mainTextureId = texId;
+  this->beatDetect = beatDetect;
+  this->textureManager = textureManager;
+  this->aspect = aspect;
+  this->texsize = texsize;
 
-	textureManager->setTexture("main", texId, texsize, texsize);
+  textureManager->setTexture("main", texId, texsize, texsize);
 
-	glGenTextures(1, &blur1_tex);
-	glBindTexture(GL_TEXTURE_2D, blur1_tex);
-	glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texsize/2, texsize/2, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL );
-	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
-	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+  glGenTextures(1, &blur1_tex);
+  glBindTexture(GL_TEXTURE_2D, blur1_tex);
+  glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texsize/2, texsize/2, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL );
+  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
 
-	glGenTextures(1, &blur2_tex);
-	glBindTexture(GL_TEXTURE_2D, blur2_tex);
-	glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texsize / 4, texsize / 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL );
-	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
-	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+  glGenTextures(1, &blur2_tex);
+  glBindTexture(GL_TEXTURE_2D, blur2_tex);
+  glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texsize / 4, texsize / 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL );
+  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
 
-	glGenTextures(1, &blur3_tex);
-	glBindTexture(GL_TEXTURE_2D, blur3_tex);
-	glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texsize / 8, texsize / 8, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL );
-	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
-	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+  glGenTextures(1, &blur3_tex);
+  glBindTexture(GL_TEXTURE_2D, blur3_tex);
+  glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texsize / 8, texsize / 8, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL );
+  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
 
-	blur1_enabled = false;
-	blur2_enabled = false;
-	blur3_enabled = false;
+  blur1_enabled = false;
+  blur2_enabled = false;
+  blur3_enabled = false;
 
-	//std::cout << "Generating Noise Textures" << std::endl;
+  //std::cout << "Generating Noise Textures" << std::endl;
 
-	PerlinNoise noise;
+  PerlinNoise noise;
 
-	glGenTextures(1, &noise_texture_lq_lite);
-	glBindTexture(GL_TEXTURE_2D, noise_texture_lq_lite);
-	glTexImage2D(GL_TEXTURE_2D, 0, 4, 32, 32, 0, GL_LUMINANCE, GL_FLOAT, noise.noise_lq_lite);
-	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
-	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
-	textureManager->setTexture("noise_lq_lite", noise_texture_lq_lite, 32, 32);
+  glGenTextures(1, &noise_texture_lq_lite);
+  glBindTexture(GL_TEXTURE_2D, noise_texture_lq_lite);
+  glTexImage2D(GL_TEXTURE_2D, 0, 4, 32, 32, 0, GL_LUMINANCE, GL_FLOAT, noise.noise_lq_lite);
+  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+  textureManager->setTexture("noise_lq_lite", noise_texture_lq_lite, 32, 32);
 
-	glGenTextures(1, &noise_texture_lq);
-	glBindTexture(GL_TEXTURE_2D, noise_texture_lq);
-	glTexImage2D(GL_TEXTURE_2D, 0, 4, 256, 256, 0, GL_LUMINANCE, GL_FLOAT, noise.noise_lq);
-	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
-	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
-	textureManager->setTexture("noise_lq", noise_texture_lq, 256, 256);
+  glGenTextures(1, &noise_texture_lq);
+  glBindTexture(GL_TEXTURE_2D, noise_texture_lq);
+  glTexImage2D(GL_TEXTURE_2D, 0, 4, 256, 256, 0, GL_LUMINANCE, GL_FLOAT, noise.noise_lq);
+  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+  textureManager->setTexture("noise_lq", noise_texture_lq, 256, 256);
 
-	glGenTextures(1, &noise_texture_mq);
-	glBindTexture(GL_TEXTURE_2D, noise_texture_mq);
-	glTexImage2D(GL_TEXTURE_2D, 0, 4, 256, 256, 0, GL_LUMINANCE, GL_FLOAT, noise.noise_mq);
-	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
-	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
-	textureManager->setTexture("noise_mq", noise_texture_mq, 256, 256);
+  glGenTextures(1, &noise_texture_mq);
+  glBindTexture(GL_TEXTURE_2D, noise_texture_mq);
+  glTexImage2D(GL_TEXTURE_2D, 0, 4, 256, 256, 0, GL_LUMINANCE, GL_FLOAT, noise.noise_mq);
+  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+  textureManager->setTexture("noise_mq", noise_texture_mq, 256, 256);
 
-	glGenTextures(1, &noise_texture_hq);
-	glBindTexture(GL_TEXTURE_2D, noise_texture_hq);
-	glTexImage2D(GL_TEXTURE_2D, 0, 4, 256, 256, 0, GL_LUMINANCE, GL_FLOAT, noise.noise_hq);
-	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
-	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
-	textureManager->setTexture("noise_hq", noise_texture_hq, 256, 256);
+  glGenTextures(1, &noise_texture_hq);
+  glBindTexture(GL_TEXTURE_2D, noise_texture_hq);
+  glTexImage2D(GL_TEXTURE_2D, 0, 4, 256, 256, 0, GL_LUMINANCE, GL_FLOAT, noise.noise_hq);
+  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+  textureManager->setTexture("noise_hq", noise_texture_hq, 256, 256);
 
-	glGenTextures(1, &noise_texture_perlin);
-	glBindTexture(GL_TEXTURE_2D, noise_texture_perlin);
-	glTexImage2D(GL_TEXTURE_2D, 0, 4, 512, 512, 0, GL_LUMINANCE, GL_FLOAT, noise.noise_perlin);
-	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
-	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
-	textureManager->setTexture("noise_perlin", noise_texture_perlin, 512, 512);
+  glGenTextures(1, &noise_texture_perlin);
+  glBindTexture(GL_TEXTURE_2D, noise_texture_perlin);
+  glTexImage2D(GL_TEXTURE_2D, 0, 4, 512, 512, 0, GL_LUMINANCE, GL_FLOAT, noise.noise_perlin);
+  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+  textureManager->setTexture("noise_perlin", noise_texture_perlin, 512, 512);
 
-	/*
-	 glGenTextures( 1, &noise_texture_lq_vol );
-	 glBindTexture( GL_TEXTURE_3D, noise_texture_lq_vol );
-	 glTexImage3D(GL_TEXTURE_3D,0,4,32,32,32,0,GL_LUMINANCE,GL_FLOAT,noise.noise_lq_vol);
-	 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-	 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-	 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
-	 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
-	 textureManager->setTexture("noisevol_lq", noise_texture_lq_vol, 256, 256);
+  /*
+  glGenTextures( 1, &noise_texture_lq_vol );
+  glBindTexture( GL_TEXTURE_3D, noise_texture_lq_vol );
+  glTexImage3D(GL_TEXTURE_3D,0,4,32,32,32,0,GL_LUMINANCE,GL_FLOAT,noise.noise_lq_vol);
+  glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+  glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+  textureManager->setTexture("noisevol_lq", noise_texture_lq_vol, 256, 256);
 
-	 glGenTextures( 1, &noise_texture_hq_vol );
-	 glBindTexture( GL_TEXTURE_3D, noise_texture_hq_vol );
-	 glTexImage3D(GL_TEXTURE_3D,0,4,32,32,32,0,GL_LUMINANCE,GL_FLOAT,noise.noise_hq_vol);
-	 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-	 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-	 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
-	 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
-	 textureManager->setTexture("noisevol_hq", noise_texture_hq_vol, 8, 8);
-	 */
+  glGenTextures( 1, &noise_texture_hq_vol );
+  glBindTexture( GL_TEXTURE_3D, noise_texture_hq_vol );
+  glTexImage3D(GL_TEXTURE_3D,0,4,32,32,32,0,GL_LUMINANCE,GL_FLOAT,noise.noise_hq_vol);
+  glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+  glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+  textureManager->setTexture("noisevol_hq", noise_texture_hq_vol, 8, 8);
+  */
+}
+
+bool
+ShaderEngine::LoadCgProgram(Shader &shader)
+{
+  //if (p != NULL) cgDestroyProgram(p);
+  //  p = NULL;
+  std::string program = shader.programSource;
+
+  if (program.length() > 0)
+  {
+    size_t found = program.rfind('}');
+    if (found != std::string::npos)
+    {
+      //std::cout << "last '}' found at: " << int(found) << std::endl;
+      program.replace(int(found), 1, "OUT.color.xyz=ret.xyz;\nOUT.color.w=1;\nreturn OUT;\n}");
+    }
+    else
+      return false;
+    found = program.rfind('{');
+    if (found != std::string::npos)
+    {
+      //std::cout << "first '{' found at: " << int(found) << std::endl;
+      program.replace(int(found), 1, "{\nfloat rad=getrad;\nfloat ang=getang;\n");
+    }
+    else
+      return false;
+    found = program.find("shader_body");
+    if (found != std::string::npos)
+    {
+      //std::cout << "first 'shader_body' found at: " << int(found) << std::endl;
+      program.replace(int(found), 11, "outtype projectm(float2 uv : TEXCOORD0)\n");
+    }
+    else
+      return false;
+
+    shader.textures.clear();
+
+    found = 0;
+    found = program.find("sampler_", found);
+    while (found != std::string::npos)
+    {
+      found += 8;
+      size_t end = program.find_first_of(" ;,\n\r)", found);
+
+      if (end != std::string::npos)
+      {
+        std::string sampler = program.substr((int) found, (int) end - found);
+        UserTexture* texture = new UserTexture(sampler);
+
+        texture->texID = textureManager->getTexture(texture->name);
+        if (texture->texID != 0)
+        {
+          texture->width = textureManager->getTextureWidth(texture->name);
+          texture->height = textureManager->getTextureHeight(texture->name);
+        }
+        else
+        {
+          if (sampler.substr(0, 4) == "rand")
+          {
+            std::string random_name = textureManager->getRandomTextureName(texture->name);
+
+            if (random_name.size() > 0)
+            {
+              texture->texID = textureManager->getTexture(random_name);
+              texture->width = textureManager->getTextureWidth(random_name);
+              texture->height = textureManager->getTextureHeight(random_name);
+            }
+          }
+          else
+          {
+            std::string extensions[6];
+            extensions[0] = ".jpg";
+            extensions[1] = ".dds";
+            extensions[2] = ".png";
+            extensions[3] = ".tga";
+            extensions[4] = ".bmp";
+            extensions[5] = ".dib";
+
+            for (int x = 0; x < 6; x++)
+            {
+              std::string filename = texture->name + extensions[x];
+
+              texture->texID = textureManager->getTexture(filename);
+              if (texture->texID != 0)
+              {
+                texture->width = textureManager->getTextureWidth(filename);
+                texture->height = textureManager->getTextureHeight(filename);
+                break;
+              }
+            }
+          }
+        }
+        if (texture->texID != 0 && shader.textures.find(texture->qname) == shader.textures.end())
+          shader.textures[texture->qname] = texture;
+        else
+          delete (texture);
+      }
+
+      found = program.find("sampler_", found);
+    }
+    textureManager->clearRandomTextures();
+
+    found = 0;
+    found = program.find("texsize_", found);
+    while (found != std::string::npos)
+    {
+      found += 8;
+      size_t end = program.find_first_of(" ;.,\n\r)", found);
+
+      if (end != std::string::npos)
+      {
+        std::string tex = program.substr((int) found, (int) end - found);
+        if (shader.textures.find(tex) != shader.textures.end())
+        {
+          UserTexture* texture = shader.textures[tex];
+          texture->texsizeDefined = true;
+          //std::cout << "texsize_" << tex << " found" << std::endl;
+        }
+      }
+      found = program.find("texsize_", found);
+    }
+
+    found = program.find("GetBlur3");
+    if (found != std::string::npos)
+      blur1_enabled = blur2_enabled = blur3_enabled = true;
+    else
+    {
+      found = program.find("GetBlur2");
+      if (found != std::string::npos)
+        blur1_enabled = blur2_enabled = true;
+      else
+      {
+        found = program.find("GetBlur1");
+        if (found != std::string::npos)
+          blur1_enabled = true;
+      }
+    }
+
+    std::string temp;
+
+    temp.append(cgTemplate);
+    temp.append(program);
+
+    //std::cout << "Cg: Compilation Results:" << std::endl << std::endl;
+    //std::cout << program << std::endl;
+
+    CGprogram p = cgCreateProgram(myCgContext, CG_SOURCE, temp.c_str(),//temp.c_str(),
+    myCgProfile, "projectm", NULL);
+
+    checkForCgCompileError("creating shader program");
+    if (p == NULL)
+      return false;
+
+    cgGLLoadProgram(p);
+
+    if (checkForCgCompileError("loading shader program"))
+    {
+      p = NULL;
+      return false;
+    }
+
+    programs[&shader] = p;
+
+    return true;
+  }
+  else
+    return false;
+}
+
+bool
+ShaderEngine::checkForCgCompileError(const char *situation)
+{
+  CGerror error;
+  const char *string = cgGetLastErrorString(&error);
+
+  error = cgGetError();
+  if (error != CG_NO_ERROR)
+  {
+    std::cout << "Cg: Compilation Error" << std::endl;
+    std::cout << "Cg: %" << situation << " - " << string << std::endl;
+    if (error == CG_COMPILER_ERROR)
+    {
+      std::cout << "Cg: " << cgGetLastListing(myCgContext) << std::endl;
+    }
+    return true;
+  }
+
+  return false;
+}
+
+void
+ShaderEngine::checkForCgError(const char *situation)
+{
+  CGerror error;
+  const char *string = cgGetLastErrorString(&error);
+
+  if (error != CG_NO_ERROR)
+  {
+    std::cout << "Cg: %" << situation << " - " << string << std::endl;
+    if (error == CG_COMPILER_ERROR)
+    {
+      std::cout << "Cg: " << cgGetLastListing(myCgContext) << std::endl;
+    }
+    exit(1);
+  }
+}
+
+void
+ShaderEngine::SetupCg()
+{
+  std::string line;
+  std::ifstream myfile(CMAKE_INSTALL_PREFIX "/share/projectM/shaders/projectM.cg");
+
+  if (myfile.is_open())
+  {
+    while (!myfile.eof())
+    {
+      std::getline(myfile, line);
+      cgTemplate.append(line + "\n");
+    }
+    myfile.close();
+  }
+  else
+    std::cout << "Unable to load shader template \"" << CMAKE_INSTALL_PREFIX "/share/projectM/shaders/projectM.cg\"" << std::endl;
+
+  std::ifstream myfile2(CMAKE_INSTALL_PREFIX "/share/projectM/shaders/blur.cg");
+  if (myfile2.is_open())
+  {
+    while (!myfile2.eof())
+    {
+      std::getline(myfile2, line);
+      blurProgram.append(line + "\n");
+    }
+    myfile2.close();
+  }
+  else
+    std::cout << "Unable to load blur template" << std::endl;
+
+  myCgContext = cgCreateContext();
+  checkForCgError("creating context");
+  cgGLSetDebugMode(CG_FALSE);
+  cgSetParameterSettingMode(myCgContext, CG_DEFERRED_PARAMETER_SETTING);
+
+  myCgProfile = cgGLGetLatestProfile(CG_GL_FRAGMENT);
+
+  // HACK breaks with buggy ati video drivers such as my own
+  // -carmelo.piccione@gmail.com 7/26/2010
+  //cgGLSetOptimalOptions(myCgProfile);
+  checkForCgError("selecting fragment profile");
+
+  profileName = cgGetProfileString(myCgProfile);
+  std::cout << "Cg: Initialized profile: " << profileName << std::endl;
+  //std::cout<< blurProgram.c_str()<<std::endl;
+  blur1Program = cgCreateProgram(myCgContext, CG_SOURCE, blurProgram.c_str(), myCgProfile, "blur1", NULL);
+
+  checkForCgCompileError("creating blur1 program");
+  if (blur1Program == NULL)
+    exit(1);
+  cgGLLoadProgram(blur1Program);
+
+  checkForCgError("loading blur1 program");
+
+  blur2Program = cgCreateProgram(myCgContext, CG_SOURCE, blurProgram.c_str(), myCgProfile, "blurVert", NULL);
+
+  checkForCgCompileError("creating blur2 program");
+  if (blur2Program == NULL)
+    exit(1);
+  cgGLLoadProgram(blur2Program);
+
+  checkForCgError("loading blur2 program");
 
 }
 
-bool ShaderEngine::LoadCgProgram(Shader &shader)
+void
+ShaderEngine::SetupCgVariables(CGprogram program, const Pipeline &pipeline, const PipelineContext &context)
 {
-	//if (p != NULL) cgDestroyProgram(p);
-	//p = NULL;
-	std::string program = shader.programSource;
 
-	if (program.length() > 0)
-	{
-		size_t found = program.rfind('}');
-		if (found != std::string::npos)
-		{
-			//std::cout << "last '}' found at: " << int(found) << std::endl;
-			program.replace(int(found), 1, "OUT.color.xyz=ret.xyz;\nOUT.color.w=1;\nreturn OUT;\n}");
-		}
-		else
-			return false;
-		found = program.rfind('{');
-		if (found != std::string::npos)
-		{
-			//std::cout << "first '{' found at: " << int(found) << std::endl;
-			program.replace(int(found), 1, "{\nfloat rad=getrad;\nfloat ang=getang;\n");
-		}
-		else
-			return false;
-		found = program.find("shader_body");
-		if (found != std::string::npos)
-		{
-			//std::cout << "first 'shader_body' found at: " << int(found) << std::endl;
-			program.replace(int(found), 11, "outtype projectm(float2 uv : TEXCOORD0)\n");
-		}
-		else
-			return false;
+  float slow_roam_cos[4] =  { 0.5 + 0.5 * cos(context.time * 0.005), 0.5 + 0.5 * cos(context.time * 0.008), 0.5 + 0.5 * cos(context.time * 0.013), 0.5 + 0.5 * cos(context.time * 0.022) };
+  float roam_cos[4] = { 0.5 + 0.5 * cos(context.time * 0.3), 0.5 + 0.5 * cos(context.time * 1.3), 0.5 + 0.5 * cos(context.time * 5), 0.5  + 0.5 * cos(context.time * 20) };
+  float slow_roam_sin[4] =  { 0.5 + 0.5 * sin(context.time * 0.005), 0.5 + 0.5 * sin(context.time * 0.008), 0.5 + 0.5 * sin(context.time * 0.013), 0.5 + 0.5 * sin(context.time * 0.022) };
+  float roam_sin[4] = { 0.5 + 0.5 * sin(context.time * 0.3), 0.5 + 0.5 * sin(context.time * 1.3), 0.5 + 0.5 * sin(context.time * 5), 0.5  + 0.5 * sin(context.time * 20) };
 
-		shader.textures.clear();
+  cgGLSetParameter4fv(cgGetNamedParameter(program, "slow_roam_cos"), slow_roam_cos);
+  cgGLSetParameter4fv(cgGetNamedParameter(program, "roam_cos"), roam_cos);
+  cgGLSetParameter4fv(cgGetNamedParameter(program, "slow_roam_sin"), slow_roam_sin);
+  cgGLSetParameter4fv(cgGetNamedParameter(program, "roam_sin"), roam_sin);
 
-		found = 0;
-		found = program.find("sampler_", found);
-		while (found != std::string::npos)
-		{
-			found += 8;
-			size_t end = program.find_first_of(" ;,\n\r)", found);
+  cgGLSetParameter1f(cgGetNamedParameter(program, "time"), context.time);
+  cgGLSetParameter4f(cgGetNamedParameter(program, "rand_preset"), rand_preset[0], rand_preset[1], rand_preset[2], rand_preset[3]);
+  cgGLSetParameter4f(cgGetNamedParameter(program, "rand_frame"), (rand() % 100) * .01, (rand() % 100) * .01, (rand()% 100) * .01, (rand() % 100) * .01);
+  cgGLSetParameter1f(cgGetNamedParameter(program, "fps"), context.fps);
+  cgGLSetParameter1f(cgGetNamedParameter(program, "frame"), context.frame);
+  cgGLSetParameter1f(cgGetNamedParameter(program, "progress"), context.progress);
 
-			if (end != std::string::npos)
-			{
+  cgGLSetParameter1f(cgGetNamedParameter(program, "blur1_min"), pipeline.blur1n);
+  cgGLSetParameter1f(cgGetNamedParameter(program, "blur1_max"), pipeline.blur1x);
+  cgGLSetParameter1f(cgGetNamedParameter(program, "blur2_min"), pipeline.blur2n);
+  cgGLSetParameter1f(cgGetNamedParameter(program, "blur2_max"), pipeline.blur2x);
+  cgGLSetParameter1f(cgGetNamedParameter(program, "blur3_min"), pipeline.blur3n);
+  cgGLSetParameter1f(cgGetNamedParameter(program, "blur3_max"), pipeline.blur3x);
 
-				std::string sampler = program.substr((int) found, (int) end - found);
-				UserTexture* texture = new UserTexture(sampler);
+  cgGLSetParameter1f(cgGetNamedParameter(program, "bass"), beatDetect->bass);
+  cgGLSetParameter1f(cgGetNamedParameter(program, "mid"), beatDetect->mid);
+  cgGLSetParameter1f(cgGetNamedParameter(program, "treb"), beatDetect->treb);
+  cgGLSetParameter1f(cgGetNamedParameter(program, "bass_att"), beatDetect->bass_att);
+  cgGLSetParameter1f(cgGetNamedParameter(program, "mid_att"), beatDetect->mid_att);
+  cgGLSetParameter1f(cgGetNamedParameter(program, "treb_att"), beatDetect->treb_att);
+  cgGLSetParameter1f(cgGetNamedParameter(program, "vol"), beatDetect->vol);
+  cgGLSetParameter1f(cgGetNamedParameter(program, "vol_att"), beatDetect->vol);
 
-				texture->texID = textureManager->getTexture(texture->name);
-				if (texture->texID != 0)
-				{
-					texture->width = textureManager->getTextureWidth(texture->name);
-					texture->height = textureManager->getTextureHeight(texture->name);
-				}
-				else
-				{
-					if (sampler.substr(0, 4) == "rand")
-					{
-						std::string random_name = textureManager->getRandomTextureName(texture->name);
-						if (random_name.size() > 0)
-						{
-							texture->texID = textureManager->getTexture(random_name);
-							texture->width = textureManager->getTextureWidth(random_name);
-							texture->height = textureManager->getTextureHeight(random_name);
-						}
-					}
-					else
-					{
-						std::string extensions[6];
-						extensions[0] = ".jpg";
-						extensions[1] = ".dds";
-						extensions[2] = ".png";
-						extensions[3] = ".tga";
-						extensions[4] = ".bmp";
-						extensions[5] = ".dib";
+  cgGLSetParameter4f(cgGetNamedParameter(program, "texsize"), texsize, texsize, 1 / (float) texsize, 1
+  / (float) texsize);
+  cgGLSetParameter4f(cgGetNamedParameter(program, "aspect"), 1 / aspect, 1, aspect, 1);
 
-						for (int x = 0; x < 6; x++)
-						{
-
-							std::string filename = texture->name + extensions[x];
-							texture->texID = textureManager->getTexture(filename);
-							if (texture->texID != 0)
-							{
-								texture->width = textureManager->getTextureWidth(filename);
-								texture->height = textureManager->getTextureHeight(filename);
-								break;
-							}
-						}
-
-					}
-				}
-				if (texture->texID != 0 && shader.textures.find(texture->qname) == shader.textures.end())
-					shader.textures[texture->qname] = texture;
-
-				else
-					delete (texture);
-
-			}
-
-			found = program.find("sampler_", found);
-		}
-		textureManager->clearRandomTextures();
-
-		found = 0;
-		found = program.find("texsize_", found);
-		while (found != std::string::npos)
-		{
-			found += 8;
-			size_t end = program.find_first_of(" ;.,\n\r)", found);
-
-			if (end != std::string::npos)
-			{
-				std::string tex = program.substr((int) found, (int) end - found);
-				if (shader.textures.find(tex) != shader.textures.end())
-				{
-					UserTexture* texture = shader.textures[tex];
-					texture->texsizeDefined = true;
-					//std::cout << "texsize_" << tex << " found" << std::endl;
-				}
-			}
-			found = program.find("texsize_", found);
-		}
-
-		found = program.find("GetBlur3");
-		if (found != std::string::npos)
-			blur1_enabled = blur2_enabled = blur3_enabled = true;
-		else
-		{
-			found = program.find("GetBlur2");
-			if (found != std::string::npos)
-				blur1_enabled = blur2_enabled = true;
-			else
-			{
-				found = program.find("GetBlur1");
-				if (found != std::string::npos)
-					blur1_enabled = true;
-			}
-		}
-
-		std::string temp;
-
-		temp.append(cgTemplate);
-		temp.append(program);
-
-		//std::cout << "Cg: Compilation Results:" << std::endl << std::endl;
-		//std::cout << program << std::endl;
-
-		CGprogram p = cgCreateProgram(myCgContext, CG_SOURCE, temp.c_str(),//temp.c_str(),
-				myCgProfile, "projectm", NULL);
-
-		checkForCgCompileError("creating shader program");
-		if (p == NULL)
-			return false;
-
-		cgGLLoadProgram(p);
-
-		if (checkForCgCompileError("loading shader program"))
-		{
-			p = NULL;
-			return false;
-		}
-
-		programs[&shader] = p;
-
-		return true;
-	}
-	else
-		return false;
+  if (blur1_enabled)
+  {
+    cgGLSetTextureParameter(cgGetNamedParameter(program, "sampler_blur1"), blur1_tex);
+    cgGLEnableTextureParameter(cgGetNamedParameter(program, "sampler_blur1"));
+  }
+  if (blur2_enabled)
+  {
+    cgGLSetTextureParameter(cgGetNamedParameter(program, "sampler_blur2"), blur2_tex);
+    cgGLEnableTextureParameter(cgGetNamedParameter(program, "sampler_blur2"));
+  }
+  if (blur3_enabled)
+  {
+    cgGLSetTextureParameter(cgGetNamedParameter(program, "sampler_blur3"), blur3_tex);
+    cgGLEnableTextureParameter(cgGetNamedParameter(program, "sampler_blur3"));
+  }
 }
 
-bool ShaderEngine::checkForCgCompileError(const char *situation)
+void
+ShaderEngine::SetupUserTexture(CGprogram program, const UserTexture* texture)
 {
-	CGerror error;
-	const char *string = cgGetLastErrorString(&error);
-	error = cgGetError();
-	if (error != CG_NO_ERROR)
-	{
-		std::cout << "Cg: Compilation Error" << std::endl;
-		std::cout << "Cg: %" << situation << " - " << string << std::endl;
-		if (error == CG_COMPILER_ERROR)
-		{
-			std::cout << "Cg: " << cgGetLastListing(myCgContext) << std::endl;
+  std::string samplerName = "sampler_" + texture->qname;
 
-		}
-		return true;
-	}
+  CGparameter param = cgGetNamedParameter(program, samplerName.c_str());
+  checkForCgError("getting parameter");
+  cgGLSetTextureParameter(param, texture->texID);
+  checkForCgError("setting parameter");
+  cgGLEnableTextureParameter(param);
+  checkForCgError("enabling parameter");
+  //std::cout<<texture->texID<<" "<<samplerName<<std::endl;
 
-	return false;
+  if (texture->texsizeDefined)
+  {
+    std::string texsizeName = "texsize_" + texture->name;
+    cgGLSetParameter4f (cgGetNamedParameter (program, texsizeName.c_str()),
+                        texture->width, texture->height,
+                        1 / (float) texture->width, 1 / (float) texture->height);
+    checkForCgError("setting parameter texsize");
+  }
 }
 
-void ShaderEngine::checkForCgError(const char *situation)
+void
+ShaderEngine::SetupUserTextureState( const UserTexture* texture)
 {
-	CGerror error;
-	const char *string = cgGetLastErrorString(&error);
-
-	if (error != CG_NO_ERROR)
-	{
-		std::cout << "Cg: %" << situation << " - " << string << std::endl;
-		if (error == CG_COMPILER_ERROR)
-		{
-			std::cout << "Cg: " << cgGetLastListing(myCgContext) << std::endl;
-		}
-		exit(1);
-	}
+  glBindTexture(GL_TEXTURE_2D, texture->texID);
+  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, texture->bilinear ? GL_LINEAR : GL_NEAREST);
+  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, texture->bilinear ? GL_LINEAR : GL_NEAREST);
+  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, texture->wrap ? GL_REPEAT : GL_CLAMP);
+  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, texture->wrap ? GL_REPEAT : GL_CLAMP);
 }
 
-void ShaderEngine::SetupCg()
+void
+ShaderEngine::SetupCgQVariables(CGprogram program, const Pipeline &q)
 {
-	std::string line;
-	std::ifstream myfile(CMAKE_INSTALL_PREFIX "/share/projectM/shaders/projectM.cg");
-	if (myfile.is_open())
-	{
-		while (!myfile.eof())
-		{
-			std::getline(myfile, line);
-			cgTemplate.append(line + "\n");
-		}
-		myfile.close();
-	}
-
-	else
-		std::cout << "Unable to load shader template \"" << CMAKE_INSTALL_PREFIX "/share/projectM/shaders/projectM.cg\"" << std::endl;
-
-	std::ifstream myfile2(CMAKE_INSTALL_PREFIX "/share/projectM/shaders/blur.cg");
-	if (myfile2.is_open())
-	{
-		while (!myfile2.eof())
-		{
-			std::getline(myfile2, line);
-			blurProgram.append(line + "\n");
-		}
-		myfile2.close();
-	}
-
-	else
-		std::cout << "Unable to load blur template" << std::endl;
-
-	myCgContext = cgCreateContext();
-	checkForCgError("creating context");
-	cgGLSetDebugMode(CG_FALSE);
-	cgSetParameterSettingMode(myCgContext, CG_DEFERRED_PARAMETER_SETTING);
-
-	myCgProfile = cgGLGetLatestProfile(CG_GL_FRAGMENT);
-	
-	// HACK breaks with buggy ati video drivers such as my own
-	// -carmelo.piccione@gmail.com 7/26/2010
-	//cgGLSetOptimalOptions(myCgProfile);
-	checkForCgError("selecting fragment profile");
-
-	profileName = cgGetProfileString(myCgProfile);
-	std::cout << "Cg: Initialized profile: " << profileName << std::endl;
-//std::cout<< blurProgram.c_str()<<std::endl;
-	blur1Program = cgCreateProgram(myCgContext, CG_SOURCE, blurProgram.c_str(), myCgProfile, "blur1", NULL);
-
-	checkForCgCompileError("creating blur1 program");
-	if (blur1Program == NULL)
-		exit(1);
-	cgGLLoadProgram(blur1Program);
-
-	checkForCgError("loading blur1 program");
-
-	blur2Program = cgCreateProgram(myCgContext, CG_SOURCE, blurProgram.c_str(), myCgProfile, "blurVert", NULL);
-
-	checkForCgCompileError("creating blur2 program");
-	if (blur2Program == NULL)
-		exit(1);
-	cgGLLoadProgram(blur2Program);
-
-	checkForCgError("loading blur2 program");
-
+  cgGLSetParameter4f(cgGetNamedParameter(program, "_qa"), q.q[0], q.q[1], q.q[2], q.q[3]);
+  cgGLSetParameter4f(cgGetNamedParameter(program, "_qb"), q.q[4], q.q[5], q.q[6], q.q[7]);
+  cgGLSetParameter4f(cgGetNamedParameter(program, "_qc"), q.q[8], q.q[9], q.q[10], q.q[11]);
+  cgGLSetParameter4f(cgGetNamedParameter(program, "_qd"), q.q[12], q.q[13], q.q[14], q.q[15]);
+  cgGLSetParameter4f(cgGetNamedParameter(program, "_qe"), q.q[16], q.q[17], q.q[18], q.q[19]);
+  cgGLSetParameter4f(cgGetNamedParameter(program, "_qf"), q.q[20], q.q[21], q.q[22], q.q[23]);
+  cgGLSetParameter4f(cgGetNamedParameter(program, "_qg"), q.q[24], q.q[25], q.q[26], q.q[27]);
+  cgGLSetParameter4f(cgGetNamedParameter(program, "_qh"), q.q[28], q.q[29], q.q[30], q.q[31]);
 }
 
-void ShaderEngine::SetupCgVariables(CGprogram program, const Pipeline &pipeline, const PipelineContext &context)
+void
+ShaderEngine::setAspect(float aspect)
 {
+  this->aspect = aspect;
+}
+void
+ShaderEngine::RenderBlurTextures(const Pipeline &pipeline, const PipelineContext &pipelineContext, const int texsize)
+{
+  if (blur1_enabled || blur2_enabled || blur3_enabled)
+  {
+    float tex[4][2] =
+      {
+      { 0, 1 },
+      { 0, 0 },
+      { 1, 0 },
+      { 1, 1 } };
 
-	float slow_roam_cos[4] =	{ 0.5 + 0.5 * cos(context.time * 0.005), 0.5 + 0.5 * cos(context.time * 0.008), 0.5 + 0.5 * cos(context.time * 0.013), 0.5 + 0.5 * cos(context.time * 0.022) };
-	float roam_cos[4] =	{ 0.5 + 0.5 * cos(context.time * 0.3), 0.5 + 0.5 * cos(context.time * 1.3), 0.5 + 0.5 * cos(context.time * 5), 0.5	+ 0.5 * cos(context.time * 20) };
-	float slow_roam_sin[4] =	{ 0.5 + 0.5 * sin(context.time * 0.005), 0.5 + 0.5 * sin(context.time * 0.008), 0.5 + 0.5 * sin(context.time * 0.013), 0.5 + 0.5 * sin(context.time * 0.022) };
-	float roam_sin[4] =	{ 0.5 + 0.5 * sin(context.time * 0.3), 0.5 + 0.5 * sin(context.time * 1.3), 0.5 + 0.5 * sin(context.time * 5), 0.5	+ 0.5 * sin(context.time * 20) };
+    glBlendFunc(GL_ONE, GL_ZERO);
+    glColor4f(1.0, 1.0, 1.0, 1.0f);
 
-	cgGLSetParameter4fv(cgGetNamedParameter(program, "slow_roam_cos"), slow_roam_cos);
-	cgGLSetParameter4fv(cgGetNamedParameter(program, "roam_cos"), roam_cos);
-	cgGLSetParameter4fv(cgGetNamedParameter(program, "slow_roam_sin"), slow_roam_sin);
-	cgGLSetParameter4fv(cgGetNamedParameter(program, "roam_sin"), roam_sin);
+    glBindTexture(GL_TEXTURE_2D, mainTextureId);
+    glEnable(GL_TEXTURE_2D);
 
-	cgGLSetParameter1f(cgGetNamedParameter(program, "time"), context.time);
-	cgGLSetParameter4f(cgGetNamedParameter(program, "rand_preset"), rand_preset[0], rand_preset[1], rand_preset[2],	rand_preset[3]);
-	cgGLSetParameter4f(cgGetNamedParameter(program, "rand_frame"), (rand() % 100) * .01, (rand() % 100) * .01, (rand()% 100) * .01, (rand() % 100) * .01);
-	cgGLSetParameter1f(cgGetNamedParameter(program, "fps"), context.fps);
-	cgGLSetParameter1f(cgGetNamedParameter(program, "frame"), context.frame);
-	cgGLSetParameter1f(cgGetNamedParameter(program, "progress"), context.progress);
+    glEnableClientState(GL_VERTEX_ARRAY);
+    glDisableClientState(GL_COLOR_ARRAY);
+    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
+    glTexCoordPointer(2, GL_FLOAT, 0, tex);
 
-	cgGLSetParameter1f(cgGetNamedParameter(program, "blur1_min"), pipeline.blur1n);
-	cgGLSetParameter1f(cgGetNamedParameter(program, "blur1_max"), pipeline.blur1x);
-	cgGLSetParameter1f(cgGetNamedParameter(program, "blur2_min"), pipeline.blur2n);
-	cgGLSetParameter1f(cgGetNamedParameter(program, "blur2_max"), pipeline.blur2x);
-	cgGLSetParameter1f(cgGetNamedParameter(program, "blur3_min"), pipeline.blur3n);
-	cgGLSetParameter1f(cgGetNamedParameter(program, "blur3_max"), pipeline.blur3x);
+    cgGLEnableProfile(myCgProfile);
+    checkForCgError("enabling profile");
 
-	cgGLSetParameter1f(cgGetNamedParameter(program, "bass"), beatDetect->bass);
-	cgGLSetParameter1f(cgGetNamedParameter(program, "mid"), beatDetect->mid);
-	cgGLSetParameter1f(cgGetNamedParameter(program, "treb"), beatDetect->treb);
-	cgGLSetParameter1f(cgGetNamedParameter(program, "bass_att"), beatDetect->bass_att);
-	cgGLSetParameter1f(cgGetNamedParameter(program, "mid_att"), beatDetect->mid_att);
-	cgGLSetParameter1f(cgGetNamedParameter(program, "treb_att"), beatDetect->treb_att);
-	cgGLSetParameter1f(cgGetNamedParameter(program, "vol"), beatDetect->vol);
-	cgGLSetParameter1f(cgGetNamedParameter(program, "vol_att"), beatDetect->vol);
+    if (blur1_enabled)
+    {
+      cgGLSetParameter4f (cgGetNamedParameter(blur1Program, "srctexsize"), texsize/2, texsize/2,
+                          2 / (float) texsize, 2 / (float) texsize);
+      cgGLSetParameter4f (cgGetNamedParameter(blur2Program, "srctexsize"), texsize/2 , texsize/2,
+                          2 / (float) texsize, 2 / (float) texsize);
 
-	cgGLSetParameter4f(cgGetNamedParameter(program, "texsize"), texsize, texsize, 1 / (float) texsize, 1
-			/ (float) texsize);
-	cgGLSetParameter4f(cgGetNamedParameter(program, "aspect"), 1 / aspect, 1, aspect, 1);
 
-	if (blur1_enabled)
-	{
-		cgGLSetTextureParameter(cgGetNamedParameter(program, "sampler_blur1"), blur1_tex);
-		cgGLEnableTextureParameter(cgGetNamedParameter(program, "sampler_blur1"));
-	}
-	if (blur2_enabled)
-	{
-		cgGLSetTextureParameter(cgGetNamedParameter(program, "sampler_blur2"), blur2_tex);
-		cgGLEnableTextureParameter(cgGetNamedParameter(program, "sampler_blur2"));
-	}
-	if (blur3_enabled)
-	{
-		cgGLSetTextureParameter(cgGetNamedParameter(program, "sampler_blur3"), blur3_tex);
-		cgGLEnableTextureParameter(cgGetNamedParameter(program, "sampler_blur3"));
-	}
+      float pointsold[4][2] =
+        {
+        { 0, 1 },
+        { 0, 0 },
+        { 1, 0 },
+        { 1, 1 } };
+      float points[4][2] =
+        {
+        { 0, 0.5 },
+        { 0, 0 },
+        { 0.5, 0 },
+        { 0.5, 0.5 } };
 
+      cgGLBindProgram(blur1Program);
+      checkForCgError("binding blur1 program");
+
+      glVertexPointer(2, GL_FLOAT, 0, points);
+      glBlendFunc(GL_ONE,GL_ZERO);
+      glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
+
+
+      glBindTexture(GL_TEXTURE_2D, blur1_tex);
+      glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, texsize/2, texsize/2);
+    }
+
+    if (blur2_enabled)
+    {
+      cgGLSetParameter4f (cgGetNamedParameter(blur1Program, "srctexsize"), texsize/2, texsize/2,
+                          2 / (float) texsize, 2 / (float) texsize);
+      cgGLSetParameter4f (cgGetNamedParameter(blur2Program, "srctexsize"), texsize/2, texsize/2,
+                          2 / (float) texsize, 2 / (float) texsize);
+
+
+      float points[4][2] =
+        {
+        { 0, 0.25 },
+        { 0, 0 },
+        { 0.25, 0 },
+        { 0.25, 0.25 } };
+
+      glVertexPointer(2, GL_FLOAT, 0, points);
+      glBlendFunc(GL_ONE,GL_ZERO);
+      glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
+
+
+
+      glBindTexture(GL_TEXTURE_2D, blur2_tex);
+      glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, texsize/4, texsize/4);
+    }
+
+    if (blur3_enabled)
+    {
+      cgGLSetParameter4f (cgGetNamedParameter(blur2Program, "srctexsize"), texsize / 4, texsize / 4,
+                          4 / (float) texsize, 4 / (float) texsize);
+      cgGLSetParameter4f (cgGetNamedParameter(blur2Program, "srctexsize"), texsize / 4, texsize / 4,
+                          4 / (float) texsize, 4 / (float) texsize);
+      float points[4][2] =
+        {
+        { 0, 0.125 },
+        { 0, 0 },
+        { 0.125, 0 },
+        { 0.125, 0.125 } };
+
+      glVertexPointer(2, GL_FLOAT, 0, points);
+      glBlendFunc(GL_ONE,GL_ZERO);
+      glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
+
+
+
+      glBindTexture(GL_TEXTURE_2D, blur3_tex);
+      glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, texsize/8, texsize/8);
+    }
+
+
+    cgGLUnbindProgram(myCgProfile);
+    checkForCgError("unbinding blur2 program");
+
+
+    cgGLDisableProfile(myCgProfile);
+    checkForCgError("disabling blur profile");
+
+    glDisable(GL_TEXTURE_2D);
+    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+  }
 }
 
-void ShaderEngine::SetupUserTexture(CGprogram program, const UserTexture* texture)
+void
+ShaderEngine::loadShader(Shader &shader)
 {
-	std::string samplerName = "sampler_" + texture->qname;
-
-	CGparameter param = cgGetNamedParameter(program, samplerName.c_str());
-	checkForCgError("getting parameter");
-	cgGLSetTextureParameter(param, texture->texID);
-	checkForCgError("setting parameter");
-	cgGLEnableTextureParameter(param);
-	checkForCgError("enabling parameter");
-	//std::cout<<texture->texID<<" "<<samplerName<<std::endl;
-
-	if (texture->texsizeDefined)
-	{
-		std::string texsizeName = "texsize_" + texture->name;
-		cgGLSetParameter4f(cgGetNamedParameter(program, texsizeName.c_str()), texture->width, texture->height, 1
-				/ (float) texture->width, 1 / (float) texture->height);
-		checkForCgError("setting parameter texsize");
-	}
+  if (shader.enabled)
+  {
+    cgDestroyProgram(programs[&shader]);
+    programs.erase(&shader);
+  }
+  shader.enabled = LoadCgProgram(shader);
 }
 
-void ShaderEngine::SetupUserTextureState( const UserTexture* texture)
+void
+ShaderEngine::disableShader()
 {
-	    glBindTexture(GL_TEXTURE_2D, texture->texID);
-		glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, texture->bilinear ? GL_LINEAR : GL_NEAREST);
-		glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, texture->bilinear ? GL_LINEAR : GL_NEAREST);
-		glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, texture->wrap ? GL_REPEAT : GL_CLAMP);
-		glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, texture->wrap ? GL_REPEAT : GL_CLAMP);
+  if (enabled)
+  {
+    cgGLUnbindProgram(myCgProfile);
+    checkForCgError("disabling fragment profile");
+    cgGLDisableProfile(myCgProfile);
+    checkForCgError("disabling fragment profile");
+  }
+  enabled = false;
 }
 
-void ShaderEngine::SetupCgQVariables(CGprogram program, const Pipeline &q)
+void
+ShaderEngine::enableShader(Shader &shader, const Pipeline &pipeline, const PipelineContext &pipelineContext)
 {
-		cgGLSetParameter4f(cgGetNamedParameter(program, "_qa"), q.q[0], q.q[1], q.q[2], q.q[3]);
-		cgGLSetParameter4f(cgGetNamedParameter(program, "_qb"), q.q[4], q.q[5], q.q[6], q.q[7]);
-		cgGLSetParameter4f(cgGetNamedParameter(program, "_qc"), q.q[8], q.q[9], q.q[10], q.q[11]);
-		cgGLSetParameter4f(cgGetNamedParameter(program, "_qd"), q.q[12], q.q[13], q.q[14], q.q[15]);
-		cgGLSetParameter4f(cgGetNamedParameter(program, "_qe"), q.q[16], q.q[17], q.q[18], q.q[19]);
-		cgGLSetParameter4f(cgGetNamedParameter(program, "_qf"), q.q[20], q.q[21], q.q[22], q.q[23]);
-		cgGLSetParameter4f(cgGetNamedParameter(program, "_qg"), q.q[24], q.q[25], q.q[26], q.q[27]);
-		cgGLSetParameter4f(cgGetNamedParameter(program, "_qh"), q.q[28], q.q[29], q.q[30], q.q[31]);
+  enabled = false;
+  if (shader.enabled)
+  {
+
+    for (std::map<std::string, UserTexture*>::const_iterator pos = shader.textures.begin();
+         pos != shader.textures.end();
+         ++pos)
+      SetupUserTextureState( pos->second);
+
+
+    CGprogram program = programs[&shader];
+    for (std::map<std::string, UserTexture*>::const_iterator pos = shader.textures.begin();
+         pos != shader.textures.end();
+         ++pos)
+    SetupUserTexture(program, pos->second);
+
+    cgGLEnableProfile(myCgProfile);
+    checkForCgError("enabling warp profile");
+
+    cgGLBindProgram(program);
+    checkForCgError("binding warp program");
+
+    SetupCgVariables(program, pipeline, pipelineContext);
+    SetupCgQVariables(program, pipeline);
+
+    enabled = true;
+  }
 }
 
-void ShaderEngine::setAspect(float aspect)
+void
+ShaderEngine::reset()
 {
-	this->aspect = aspect;
-}
-void ShaderEngine::RenderBlurTextures(const Pipeline &pipeline, const PipelineContext &pipelineContext,
-		const int texsize)
-{
-	if (blur1_enabled || blur2_enabled || blur3_enabled)
-	{
-		float tex[4][2] =
-		{
-		{ 0, 1 },
-		{ 0, 0 },
-		{ 1, 0 },
-		{ 1, 1 } };
-
-		glBlendFunc(GL_ONE, GL_ZERO);
-		glColor4f(1.0, 1.0, 1.0, 1.0f);
-
-		glBindTexture(GL_TEXTURE_2D, mainTextureId);
-		glEnable(GL_TEXTURE_2D);
-
-		glEnableClientState(GL_VERTEX_ARRAY);
-		glDisableClientState(GL_COLOR_ARRAY);
-		glEnableClientState(GL_TEXTURE_COORD_ARRAY);
-		glTexCoordPointer(2, GL_FLOAT, 0, tex);
-
-		cgGLEnableProfile(myCgProfile);
-		checkForCgError("enabling profile");
-
-		if (blur1_enabled)
-		{
-			cgGLSetParameter4f(cgGetNamedParameter(blur1Program, "srctexsize"), texsize/2, texsize/2, 2 / (float) texsize,
-					2 / (float) texsize);
-			cgGLSetParameter4f(cgGetNamedParameter(blur2Program, "srctexsize"), texsize/2 , texsize/2, 2 / (float) texsize,
-								2 / (float) texsize);
-
-
-
-			float pointsold[4][2] =
-			{
-			{ 0, 1 },
-			{ 0, 0 },
-			{ 1, 0 },
-			{ 1, 1 } };
-			float points[4][2] =
-						{
-						{ 0, 0.5 },
-						{ 0, 0 },
-						{ 0.5, 0 },
-						{ 0.5, 0.5 } };
-
-			cgGLBindProgram(blur1Program);
-						checkForCgError("binding blur1 program");
-
-			glVertexPointer(2, GL_FLOAT, 0, points);
-			glBlendFunc(GL_ONE,GL_ZERO);
-			glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
-
-
-			glBindTexture(GL_TEXTURE_2D, blur1_tex);
-			glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, texsize/2, texsize/2);
-
-
-		}
-
-		if (blur2_enabled)
-		{
-			cgGLSetParameter4f(cgGetNamedParameter(blur1Program, "srctexsize"), texsize/2, texsize/2, 2 / (float) texsize,
-								2 / (float) texsize);
-			cgGLSetParameter4f(cgGetNamedParameter(blur2Program, "srctexsize"), texsize/2, texsize/2, 2 / (float) texsize,
-					2 / (float) texsize);
-
-
-
-			float points[4][2] =
-			{
-			{ 0, 0.25 },
-			{ 0, 0 },
-			{ 0.25, 0 },
-			{ 0.25, 0.25 } };
-
-			glVertexPointer(2, GL_FLOAT, 0, points);
-			glBlendFunc(GL_ONE,GL_ZERO);
-			glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
-
-
-
-						glBindTexture(GL_TEXTURE_2D, blur2_tex);
-						glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, texsize/4, texsize/4);
-
-
-		}
-
-		if (blur3_enabled)
-		{
-			cgGLSetParameter4f(cgGetNamedParameter(blur2Program, "srctexsize"), texsize/4, texsize/4, 4 / (float) texsize,
-								4/ (float) texsize);
-			cgGLSetParameter4f(cgGetNamedParameter(blur2Program, "srctexsize"), texsize / 4, texsize / 4, 4
-					/ (float) texsize, 4 / (float) texsize);
-			float points[4][2] =
-			{
-			{ 0, 0.125 },
-			{ 0, 0 },
-			{ 0.125, 0 },
-			{ 0.125, 0.125 } };
-
-			glVertexPointer(2, GL_FLOAT, 0, points);
-			glBlendFunc(GL_ONE,GL_ZERO);
-			glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
-
-
-
-						glBindTexture(GL_TEXTURE_2D, blur3_tex);
-						glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, texsize/8, texsize/8);
-
-
-		}
-
-
-			cgGLUnbindProgram(myCgProfile);
-			checkForCgError("unbinding blur2 program");
-
-
-		cgGLDisableProfile(myCgProfile);
-		checkForCgError("disabling blur profile");
-
-		glDisable(GL_TEXTURE_2D);
-		glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-
-	}
-}
-
-void ShaderEngine::loadShader(Shader &shader)
-{
-	if (shader.enabled)
-	{
-		cgDestroyProgram(programs[&shader]);
-		programs.erase(&shader);
-	}
-	shader.enabled = LoadCgProgram(shader);
-}
-
-void ShaderEngine::disableShader()
-{
-	if (enabled)
-	{
-		cgGLUnbindProgram(myCgProfile);
-		checkForCgError("disabling fragment profile");
-		cgGLDisableProfile(myCgProfile);
-		checkForCgError("disabling fragment profile");
-	}
-	enabled = false;
-}
-
-void ShaderEngine::enableShader(Shader &shader, const Pipeline &pipeline, const PipelineContext &pipelineContext)
-{
-	enabled = false;
-	if (shader.enabled)
-	{
-
-		for (std::map<std::string, UserTexture*>::const_iterator pos = shader.textures.begin(); pos	!= shader.textures.end(); ++pos)
-							SetupUserTextureState( pos->second);
-
-
-		CGprogram program = programs[&shader];
-		for (std::map<std::string, UserTexture*>::const_iterator pos = shader.textures.begin(); pos
-						!= shader.textures.end(); ++pos)
-					SetupUserTexture(program, pos->second);
-
-		cgGLEnableProfile(myCgProfile);
-		checkForCgError("enabling warp profile");
-
-		cgGLBindProgram(program);
-		checkForCgError("binding warp program");
-
-		SetupCgVariables(program, pipeline, pipelineContext);
-		SetupCgQVariables(program, pipeline);
-
-		enabled = true;
-	}
-}
-
-void ShaderEngine::reset()
-{
-	rand_preset[0] = (rand() % 100) * .01;
-	rand_preset[1] = (rand() % 100) * .01;
-	rand_preset[2] = (rand() % 100) * .01;
-	rand_preset[3] = (rand() % 100) * .01;
+  rand_preset[0] = (rand() % 100) * .01;
+  rand_preset[1] = (rand() % 100) * .01;
+  rand_preset[2] = (rand() % 100) * .01;
+  rand_preset[3] = (rand() % 100) * .01;
 }
 
 #endif
diff --git a/src/libprojectM/Renderer/ShaderEngine.hpp b/src/libprojectM/Renderer/ShaderEngine.hpp
index 7542896..0789411 100644
--- a/src/libprojectM/Renderer/ShaderEngine.hpp
+++ b/src/libprojectM/Renderer/ShaderEngine.hpp
@@ -4,7 +4,6 @@
  *  Created on: Jul 18, 2008
  *      Author: pete
  */
-
 #ifndef SHADERENGINE_HPP_
 #define SHADERENGINE_HPP_
 
@@ -38,11 +37,11 @@
 #include <iostream>
 #include <map>
 #include "Shader.hpp"
+
+
 class ShaderEngine
 {
 #ifdef USE_CG
-
-
   unsigned int mainTextureId;
   int texsize;
   float aspect;
@@ -67,7 +66,7 @@
   float rand_preset[4];
 
   CGcontext   myCgContext;
-  CGprofile myCgProfile;
+  CGprofile   myCgProfile;
   CGprogram   blur1Program;
   CGprogram   blur2Program;
 
@@ -75,39 +74,35 @@
 
   std::map<Shader*,CGprogram> programs;
 
-   std::string cgTemplate;
-   std::string blurProgram;
+  std::string cgTemplate;
+  std::string blurProgram;
 
- bool LoadCgProgram(Shader &shader);
- bool checkForCgCompileError(const char *situation);
- void checkForCgError(const char *situation);
+  bool LoadCgProgram(Shader &shader);
+  bool checkForCgCompileError(const char *situation);
+  void checkForCgError(const char *situation);
 
- void SetupCg();
- void SetupCgVariables(CGprogram program, const Pipeline &pipeline, const PipelineContext &pipelineContext);
- void SetupCgQVariables(CGprogram program, const Pipeline &pipeline);
+  void SetupCg();
+  void SetupCgVariables(CGprogram program, const Pipeline &pipeline, const PipelineContext &pipelineContext);
+  void SetupCgQVariables(CGprogram program, const Pipeline &pipeline);
 
- void SetupUserTexture(CGprogram program, const UserTexture* texture);
- void SetupUserTextureState(const UserTexture* texture);
-
-
-
+  void SetupUserTexture(CGprogram program, const UserTexture* texture);
+  void SetupUserTextureState(const UserTexture* texture);
 #endif
+
 public:
-	ShaderEngine();
-	virtual ~ShaderEngine();
+  ShaderEngine();
+  virtual ~ShaderEngine();
 #ifdef USE_CG
-    void RenderBlurTextures(const Pipeline  &pipeline, const PipelineContext &pipelineContext, const int texsize);
-	void loadShader(Shader &shader);
+  void RenderBlurTextures(const Pipeline  &pipeline, const PipelineContext &pipelineContext, const int texsize);
+  void loadShader(Shader &shader);
 
-	void setParams(const int texsize, const unsigned int texId, const float aspect, BeatDetect *beatDetect, TextureManager *textureManager);
-	void enableShader(Shader &shader, const Pipeline &pipeline, const PipelineContext &pipelineContext);
-	void disableShader();
-	void reset();
-	void setAspect(float aspect);
-    std::string profileName;
-
+  void setParams(const int texsize, const unsigned int texId, const float aspect, BeatDetect *beatDetect, TextureManager *textureManager);
+  void enableShader(Shader &shader, const Pipeline &pipeline, const PipelineContext &pipelineContext);
+  void disableShader();
+  void reset();
+  void setAspect(float aspect);
+  std::string profileName;
 #endif
 };
 
 #endif /* SHADERENGINE_HPP_ */
-
diff --git a/src/libprojectM/Renderer/TextureManager.cpp b/src/libprojectM/Renderer/TextureManager.cpp
index 0cc4da3..6615cd4 100644
--- a/src/libprojectM/Renderer/TextureManager.cpp
+++ b/src/libprojectM/Renderer/TextureManager.cpp
@@ -35,41 +35,42 @@
 TextureManager::TextureManager(const std::string _presetURL): presetURL(_presetURL)
 {
 #ifdef USE_DEVIL
-ilInit();
-iluInit();
-ilutInit();
-ilutRenderer(ILUT_OPENGL);
+  ilInit();
+  iluInit();
+  ilutInit();
+  ilutRenderer(ILUT_OPENGL);
 #endif
 
- Preload();
- loadTextureDir();
+  Preload();
+  loadTextureDir();
 }
 
 TextureManager::~TextureManager()
 {
- Clear();
+  Clear();
 }
 
-void TextureManager::Preload()
+void
+TextureManager::Preload()
 {
-
 #ifdef USE_DEVIL
-	ILuint image;
-	ilGenImages(1, &image);
-	ilBindImage(image);
-	ilLoadL(IL_TYPE_UNKNOWN,(ILvoid*) M_data, M_bytes);
-	GLuint tex = ilutGLBindTexImage();
-#else
-	 unsigned int tex = SOIL_load_OGL_texture_from_memory(
-					  M_data,
-					  M_bytes,
-					  SOIL_LOAD_AUTO,
-					  SOIL_CREATE_NEW_ID,
+  ILuint image;
 
-					    SOIL_FLAG_POWER_OF_TWO
-					  |  SOIL_FLAG_MULTIPLY_ALPHA
-					 // |  SOIL_FLAG_COMPRESS_TO_DXT
-					  );
+  ilGenImages(1, &image);
+  ilBindImage(image);
+  ilLoadL(IL_TYPE_UNKNOWN,(ILvoid*) M_data, M_bytes);
+  GLuint tex = ilutGLBindTexImage();
+#else
+  unsigned int tex = SOIL_load_OGL_texture_from_memory (
+                       M_data,
+                       M_bytes,
+                       SOIL_LOAD_AUTO,
+                       SOIL_CREATE_NEW_ID,
+
+                       SOIL_FLAG_POWER_OF_TWO
+                       |  SOIL_FLAG_MULTIPLY_ALPHA
+                       // |  SOIL_FLAG_COMPRESS_TO_DXT
+                     );
 #endif
 
   textures["M.tga"]=tex;
@@ -78,16 +79,16 @@
   ilLoadL(IL_TYPE_UNKNOWN,(ILvoid*) project_data,project_bytes);
   tex = ilutGLBindTexImage();
 #else
-  tex = SOIL_load_OGL_texture_from_memory(
-					  project_data,
-					  project_bytes,
-					  SOIL_LOAD_AUTO,
-					  SOIL_CREATE_NEW_ID,
+  tex = SOIL_load_OGL_texture_from_memory (
+          project_data,
+          project_bytes,
+          SOIL_LOAD_AUTO,
+          SOIL_CREATE_NEW_ID,
 
-					  SOIL_FLAG_POWER_OF_TWO
-					  |  SOIL_FLAG_MULTIPLY_ALPHA
-					  //|  SOIL_FLAG_COMPRESS_TO_DXT
-					  );
+          SOIL_FLAG_POWER_OF_TWO
+          |  SOIL_FLAG_MULTIPLY_ALPHA
+          //|  SOIL_FLAG_COMPRESS_TO_DXT
+        );
 #endif
 
   textures["project.tga"]=tex;
@@ -97,184 +98,192 @@
   tex = ilutGLBindTexImage();
 #else
   tex = SOIL_load_OGL_texture_from_memory(
-					  headphones_data,
-					  headphones_bytes,
-					  SOIL_LOAD_AUTO,
-					  SOIL_CREATE_NEW_ID,
+          headphones_data,
+          headphones_bytes,
+          SOIL_LOAD_AUTO,
+          SOIL_CREATE_NEW_ID,
 
-					  SOIL_FLAG_POWER_OF_TWO
-					  |  SOIL_FLAG_MULTIPLY_ALPHA
-					 // |  SOIL_FLAG_COMPRESS_TO_DXT
-					  );
+          SOIL_FLAG_POWER_OF_TWO
+          |  SOIL_FLAG_MULTIPLY_ALPHA
+          // |  SOIL_FLAG_COMPRESS_TO_DXT
+        );
 #endif
 
   textures["headphones.tga"]=tex;
 }
 
-void TextureManager::Clear()
+void
+TextureManager::Clear()
 {
-
-
-  for(std::map<std::string, GLuint>::const_iterator iter = textures.begin(); iter != textures.end(); iter++)
-    {
-      glDeleteTextures(1,&iter->second);
-    }
+  for(std::map<std::string, GLuint>::const_iterator iter = textures.begin();
+      iter != textures.end();
+      iter++)
+  {
+    glDeleteTextures(1,&iter->second);
+  }
   textures.clear();
 }
 
-void TextureManager::setTexture(const std::string name, const unsigned int texId, const int width, const int height)
+void
+TextureManager::setTexture(const std::string name, const unsigned int texId, const int width, const int height)
 {
-		textures[name] = texId;
-		widths[name] = width;
-		heights[name] = height;
+  textures[name] = texId;
+  widths[name] = width;
+  heights[name] = height;
 }
 
-//void TextureManager::unloadTextures(const PresetOutputs::cshape_container &shapes)
+//void
+//TextureManager::unloadTextures(const PresetOutputs::cshape_container &shapes)
 //{
   /*
-   for (PresetOutputs::cshape_container::const_iterator pos = shapes.begin();
-	pos != shapes.end(); ++pos)
+  for (PresetOutputs::cshape_container::const_iterator pos = shapes.begin();
+       pos != shapes.end();
+       ++pos)
+  {
+
+    if( (*pos)->enabled==1)
     {
+      if ( (*pos)->textured)
+      {
+        std::string imageUrl = (*pos)->getImageUrl();
 
-      if( (*pos)->enabled==1)
-	{
-
-	  if ( (*pos)->textured)
-	    {
-	      std::string imageUrl = (*pos)->getImageUrl();
-	      if (imageUrl != "")
-		{
-		  std::string fullUrl = presetURL + "/" + imageUrl;
-		  ReleaseTexture(LoadTexture(fullUrl.c_str()));
-		}
-	    }
-	}
+        if (imageUrl != "")
+        {
+          std::string fullUrl = presetURL + "/" + imageUrl;
+          ReleaseTexture(LoadTexture(fullUrl.c_str()));
+        }
+      }
     }
+  }
   */
 //}
 
-GLuint TextureManager::getTexture(const std::string filename)
+GLuint
+TextureManager::getTexture(const std::string filename)
 {
-	std::string fullURL = presetURL + PATH_SEPARATOR + filename;
-	return getTextureFullpath(filename,fullURL);
+  std::string fullURL = presetURL + PATH_SEPARATOR + filename;
+  return getTextureFullpath(filename,fullURL);
 }
 
-GLuint TextureManager::getTextureFullpath(const std::string filename, const std::string imageURL)
+GLuint
+TextureManager::getTextureFullpath(const std::string filename, const std::string imageURL)
 {
-
-   if (textures.find(filename)!= textures.end())
-     {
-       return textures[filename];
-     }
-   else
-     {
-
+  if (textures.find(filename)!= textures.end())
+  {
+    return textures[filename];
+  }
+  else
+  {
 #ifdef USE_DEVIL
-       GLuint tex = ilutGLLoadImage((char *)imageURL.c_str());
+    GLuint tex = ilutGLLoadImage((char *)imageURL.c_str());
 #else
-       int width, height;
+    int width, height;
 
-       unsigned int tex = SOIL_load_OGL_texture_size(
-    		   imageURL.c_str(),
-					  SOIL_LOAD_AUTO,
-					  SOIL_CREATE_NEW_ID,
+    unsigned int tex = SOIL_load_OGL_texture_size (
+                         imageURL.c_str(),
+                         SOIL_LOAD_AUTO,
+                         SOIL_CREATE_NEW_ID,
 
-					    //SOIL_FLAG_POWER_OF_TWO
-					  //  SOIL_FLAG_MIPMAPS
-					    SOIL_FLAG_MULTIPLY_ALPHA
-					  //|  SOIL_FLAG_COMPRESS_TO_DXT
-					  //| SOIL_FLAG_DDS_LOAD_DIRECT
-					  ,&width,&height);
+                         //SOIL_FLAG_POWER_OF_TWO
+                         //  SOIL_FLAG_MIPMAPS
+                         SOIL_FLAG_MULTIPLY_ALPHA
+                         //|  SOIL_FLAG_COMPRESS_TO_DXT
+                         //| SOIL_FLAG_DDS_LOAD_DIRECT
+                         ,&width,&height
+                       );
 
 #endif
-       textures[filename]=tex;
-       widths[filename]=width;
-       heights[filename]=height;
-       return tex;
-
-
-     }
+    textures[filename]=tex;
+    widths[filename]=width;
+    heights[filename]=height;
+    return tex;
+  }
 }
 
-int TextureManager::getTextureWidth(const std::string imageURL)
+int
+TextureManager::getTextureWidth(const std::string imageURL)
 {
-	return widths[imageURL];
+  return widths[imageURL];
 }
 
-int TextureManager::getTextureHeight(const std::string imageURL)
+int
+TextureManager::getTextureHeight(const std::string imageURL)
 {
-	return heights[imageURL];
+  return heights[imageURL];
 }
 
-unsigned int TextureManager::getTextureMemorySize()
+unsigned int
+TextureManager::getTextureMemorySize()
 {
   return 0;
 }
 
-void TextureManager::loadTextureDir()
+void
+TextureManager::loadTextureDir()
 {
-	std::string dirname = CMAKE_INSTALL_PREFIX "/share/projectM/textures";
+  std::string dirname = CMAKE_INSTALL_PREFIX "/share/projectM/textures";
 
-	  DIR * m_dir;
+  DIR * m_dir;
 
-	 // Allocate a new a stream given the current directory name
-	  if ((m_dir = opendir(dirname.c_str())) == NULL)
-	  {
-	    std::cout<<"No Textures Loaded from "<<dirname<<std::endl;
-	    return; // no files loaded. m_entries is empty
-	  }
+  // Allocate a new a stream given the current directory name
+  if ((m_dir = opendir(dirname.c_str())) == NULL)
+  {
+    std::cout<<"No Textures Loaded from "<<dirname<<std::endl;
+    return; // no files loaded. m_entries is empty
+  }
 
-	  struct dirent * dir_entry;
+  struct dirent * dir_entry;
 
-	  while ((dir_entry = readdir(m_dir)) != NULL)
-	  {
+  while ((dir_entry = readdir(m_dir)) != NULL)
+  {
+    // Convert char * to friendly string
+    std::string filename(dir_entry->d_name);
 
-	    // Convert char * to friendly string
-	    std::string filename(dir_entry->d_name);
+    if (filename.length() > 0 && filename[0] == '.')
+      continue;
 
-	    if (filename.length() > 0 && filename[0] == '.')
-		continue;
+    // Create full path name
+    std::string fullname = dirname + PATH_SEPARATOR + filename;
 
-	    // Create full path name
-	    std::string fullname = dirname + PATH_SEPARATOR + filename;
+    unsigned int texId = getTextureFullpath(filename, fullname);
+    if(texId != 0)
+    {
+      user_textures.push_back(texId);
+      textures[filename]=texId;
+      user_texture_names.push_back(filename);
+    }
+  }
 
-	    unsigned int texId = getTextureFullpath(filename, fullname);
-	    if(texId != 0)
-	    {
-	    	user_textures.push_back(texId);
-	    	textures[filename]=texId;
-	    	user_texture_names.push_back(filename);
-	    }
-	  }
-
-	  if (m_dir)
-	    {
-	      closedir(m_dir);
-	      m_dir = 0;
-	    }
-
+  if (m_dir)
+  {
+    closedir(m_dir);
+    m_dir = 0;
+  }
 }
 
-std::string TextureManager::getRandomTextureName(std::string random_id)
+std::string
+TextureManager::getRandomTextureName(std::string random_id)
 {
-	if (user_texture_names.size() > 0)
-	{
-		std::string random_name = user_texture_names[rand() % user_texture_names.size()];
-		random_textures.push_back(random_id);
-		textures[random_id] = textures[random_name];
-		return random_name;
-	}
-	else return "";
+  if (user_texture_names.size() > 0)
+  {
+    std::string random_name = user_texture_names[rand() % user_texture_names.size()];
+    random_textures.push_back(random_id);
+    textures[random_id] = textures[random_name];
+    return random_name;
+  }
+  else return "";
 }
 
-void TextureManager::clearRandomTextures()
+void
+TextureManager::clearRandomTextures()
 {
-	for (std::vector<std::string>::iterator pos = random_textures.begin(); pos	!= random_textures.end(); ++pos)
-				{
-					textures.erase(*pos);
-					widths.erase(*pos);
-					heights.erase(*pos);
-				}
-	random_textures.clear();
-
+  for (std::vector<std::string>::iterator pos = random_textures.begin();
+       pos != random_textures.end();
+       ++pos)
+  {
+    textures.erase(*pos);
+    widths.erase(*pos);
+    heights.erase(*pos);
+  }
+  random_textures.clear();
 }
diff --git a/src/libprojectM/Renderer/Transformation.hpp b/src/libprojectM/Renderer/Transformation.hpp
index 33940b7..f42a823 100644
--- a/src/libprojectM/Renderer/Transformation.hpp
+++ b/src/libprojectM/Renderer/Transformation.hpp
@@ -9,58 +9,57 @@
 {
 public:
 
-	inline static void Zoom(PixelPoint &p, const PerPixelContext &context, float zoom, float zoomExponent)
-	{
-		float fZoom2 = powf( zoom, powf( zoomExponent, context.rad*2.0f - 1.0f));
-		float fZoom2Inv = 1.0f/fZoom2;
-		p.x -= 0.5;
-		p.y -= 0.5;
-		p.x *= fZoom2Inv;
-		p.y *= fZoom2Inv;
-		p.x += 0.5;
-		p.y += 0.5;
-	}
+  inline static void Zoom(PixelPoint &p, const PerPixelContext &context, float zoom, float zoomExponent)
+  {
+    float fZoom2 = powf( zoom, powf( zoomExponent, context.rad*2.0f - 1.0f));
+    float fZoom2Inv = 1.0f/fZoom2;
+    p.x -= 0.5;
+    p.y -= 0.5;
+    p.x *= fZoom2Inv;
+    p.y *= fZoom2Inv;
+    p.x += 0.5;
+    p.y += 0.5;
+  }
 
-	inline static void Transform(PixelPoint &p, const PerPixelContext &context, float dx, float dy)
-	{
-		p.x -= dx;
-		p.y -= dy;
-	}
+  inline static void Transform(PixelPoint &p, const PerPixelContext &context, float dx, float dy)
+  {
+    p.x -= dx;
+    p.y -= dy;
+  }
 
-	inline static void Scale(PixelPoint &p, const PerPixelContext &context, float sy, float sx, float cx, float cy)
-	{
-		p.x = (p.x - cx)/sx + cx;
-		p.y = (p.y - cy)/sy + cy;
-	}
+  inline static void Scale(PixelPoint &p, const PerPixelContext &context, float sy, float sx, float cx, float cy)
+  {
+    p.x = (p.x - cx)/sx + cx;
+    p.y = (p.y - cy)/sy + cy;
+  }
 
-	inline static void Rotate(PixelPoint &p, const PerPixelContext &context, float angle, float cx, float cy)
-	{
-		float u2 = p.x - cx;
-		float v2 = p.y - cy;
+  inline static void Rotate(PixelPoint &p, const PerPixelContext &context, float angle, float cx, float cy)
+  {
+    float u2 = p.x - cx;
+    float v2 = p.y - cy;
 
-		float cos_rot = cosf(angle);
-		float sin_rot = sinf(angle);
+    float cos_rot = cosf(angle);
+    float sin_rot = sinf(angle);
 
-		p.x = u2*cos_rot - v2*sin_rot + cx;
-		p.y = u2*sin_rot + v2*cos_rot + cy;
-	}
+    p.x = u2*cos_rot - v2*sin_rot + cx;
+    p.y = u2*sin_rot + v2*cos_rot + cy;
+  }
 
-	inline static void Warp(PixelPoint &p, const PerPixelContext &context, float time, float speed, float scale, float warp)
-	{
-		float fWarpTime = time * speed;
-		float fWarpScaleInv = 1.0f / scale;
-		float f[4];
-		f[0] = 11.68f + 4.0f*cosf(fWarpTime*1.413f + 10);
-		f[1] =  8.77f + 3.0f*cosf(fWarpTime*1.113f + 7);
-		f[2] = 10.54f + 3.0f*cosf(fWarpTime*1.233f + 3);
-		f[3] = 11.49f + 4.0f*cosf(fWarpTime*0.933f + 5);
+  inline static void Warp(PixelPoint &p, const PerPixelContext &context, float time, float speed, float scale, float warp)
+  {
+    float fWarpTime = time * speed;
+    float fWarpScaleInv = 1.0f / scale;
+    float f[4];
+    f[0] = 11.68f + 4.0f*cosf(fWarpTime*1.413f + 10);
+    f[1] =  8.77f + 3.0f*cosf(fWarpTime*1.113f + 7);
+    f[2] = 10.54f + 3.0f*cosf(fWarpTime*1.233f + 3);
+    f[3] = 11.49f + 4.0f*cosf(fWarpTime*0.933f + 5);
 
-		p.x += warp*0.0035f*sinf(fWarpTime*0.333f + fWarpScaleInv*(context.x*f[0] - context.y*f[3]));
-		p.y += warp*0.0035f*cosf(fWarpTime*0.375f - fWarpScaleInv*(context.x*f[2] + context.y*f[1]));
-		p.x += warp*0.0035f*cosf(fWarpTime*0.753f - fWarpScaleInv*(context.x*f[1] - context.y*f[2]));
-		p.y += warp*0.0035f*sinf(fWarpTime*0.825f + fWarpScaleInv*(context.x*f[0] + context.y*f[3]));
-	}
-
+    p.x += warp*0.0035f*sinf(fWarpTime*0.333f + fWarpScaleInv*(context.x*f[0] - context.y*f[3]));
+    p.y += warp*0.0035f*cosf(fWarpTime*0.375f - fWarpScaleInv*(context.x*f[2] + context.y*f[1]));
+    p.x += warp*0.0035f*cosf(fWarpTime*0.753f - fWarpScaleInv*(context.x*f[1] - context.y*f[2]));
+    p.y += warp*0.0035f*sinf(fWarpTime*0.825f + fWarpScaleInv*(context.x*f[0] + context.y*f[3]));
+  }
 };
 
 #endif
diff --git a/src/libprojectM/Renderer/UserTexture.cpp b/src/libprojectM/Renderer/UserTexture.cpp
index a280d4c..8db4c5c 100644
--- a/src/libprojectM/Renderer/UserTexture.cpp
+++ b/src/libprojectM/Renderer/UserTexture.cpp
@@ -4,47 +4,46 @@
  *  Created on: Jul 16, 2008
  *      Author: pete
  */
-
 #include "UserTexture.hpp"
 
+
 UserTexture::UserTexture(std::string qualifiedName): qname(qualifiedName)
 {
+  if (qualifiedName.substr(0,3) == "fc_")
+  {
+    name = qualifiedName.substr(3);
+    bilinear = true;
+    wrap = false;
+  }
+  else if (qualifiedName.substr(0,3) == "fw_")
+  {
+    name = qualifiedName.substr(3);
+    bilinear = true;
+    wrap = true;
+  }
+  else if (qualifiedName.substr(0,3) == "pc_")
+  {
+    name = qualifiedName.substr(3);
+    bilinear = false;
+    wrap = false;
+  }
+  else if (qualifiedName.substr(0,3) == "pw_")
+  {
+    name = qualifiedName.substr(3);
+    bilinear = false;
+    wrap = true;
+  }
+  else
+  {
+    name = qualifiedName;
+    bilinear = true;
+    wrap = true;
+  }
 
-	if (qualifiedName.substr(0,3) == "fc_")
-	{
-		name = qualifiedName.substr(3);
-		bilinear = true;
-		wrap = false;
-	}
-	else if (qualifiedName.substr(0,3) == "fw_")
-	{
-		name = qualifiedName.substr(3);
-		bilinear = true;
-		wrap = true;
-	}
-	else if (qualifiedName.substr(0,3) == "pc_")
-	{
-		name = qualifiedName.substr(3);
-		bilinear = false;
-		wrap = false;
-	}
-	else if (qualifiedName.substr(0,3) == "pw_")
-	{
-		name = qualifiedName.substr(3);
-		bilinear = false;
-		wrap = true;
-	}
-	else
-	{
-		name = qualifiedName;
-		bilinear = true;
-		wrap = true;
-	}
-
-	texsizeDefined = false;
+  texsizeDefined = false;
 }
 
 UserTexture::~UserTexture()
 {
-	// TODO Auto-generated destructor stub
+  // TODO Auto-generated destructor stub
 }
diff --git a/src/libprojectM/Renderer/UserTexture.hpp b/src/libprojectM/Renderer/UserTexture.hpp
index 19fdc63..d460382 100644
--- a/src/libprojectM/Renderer/UserTexture.hpp
+++ b/src/libprojectM/Renderer/UserTexture.hpp
@@ -4,31 +4,31 @@
  *  Created on: Jul 16, 2008
  *      Author: pete
  */
-
 #ifndef USERTEXTURE_HPP_
 #define USERTEXTURE_HPP_
 
 #include <string>
 
+
 class UserTexture
 {
 public:
 
-	bool wrap;
-	bool bilinear;
+  bool wrap;
+  bool bilinear;
 
-	bool texsizeDefined;
+  bool texsizeDefined;
 
-	int width;
-	int height;
+  int width;
+  int height;
 
-	unsigned int texID;
+  unsigned int texID;
 
-	std::string qname;
-	std::string name;
+  std::string qname;
+  std::string name;
 
-	UserTexture(std::string qualifiedName);
-	virtual ~UserTexture();
+  UserTexture(std::string qualifiedName);
+  virtual ~UserTexture();
 };
 
 #endif /* USERTEXTURE_HPP_ */
diff --git a/src/libprojectM/Renderer/VideoEcho.cpp b/src/libprojectM/Renderer/VideoEcho.cpp
index 1ddad57..5387a2b 100644
--- a/src/libprojectM/Renderer/VideoEcho.cpp
+++ b/src/libprojectM/Renderer/VideoEcho.cpp
@@ -4,7 +4,6 @@
  *  Created on: Jun 29, 2008
  *      Author: pete
  */
-
 #include "Common.hpp"
 
 #ifdef USE_GLES1
@@ -21,73 +20,71 @@
 
 #include "VideoEcho.hpp"
 
+
 VideoEcho::VideoEcho(): a(0), zoom(1), orientation(Normal)
 {
-	// TODO Auto-generated constructor stub
+  // TODO Auto-generated constructor stub
 
 }
 
 VideoEcho::~VideoEcho()
 {
-	// TODO Auto-generated destructor stub
+  // TODO Auto-generated destructor stub
 }
 
-void VideoEcho::Draw(RenderContext &context)
+void
+VideoEcho::Draw(RenderContext &context)
 {
+  glEnable(GL_TEXTURE_2D);
 
+  float tex[4][2] = {{0, 1},
+                     {0, 0},
+                     {1, 0},
+                     {1, 1}};
 
-		glEnable(GL_TEXTURE_2D);
+  float points[4][2] = {{-0.5, -0.5},
+                        {-0.5,  0.5},
+                        { 0.5,  0.5},
+                        { 0.5,  -0.5}};
 
+  glEnableClientState(GL_VERTEX_ARRAY);
+  glDisableClientState(GL_COLOR_ARRAY);
+  glEnableClientState(GL_TEXTURE_COORD_ARRAY);
 
-		float tex[4][2] = {{0, 1},
-				   {0, 0},
-				   {1, 0},
-				   {1, 1}};
+  glVertexPointer(2,GL_FLOAT,0,points);
+  glTexCoordPointer(2,GL_FLOAT,0,tex);
 
-		float points[4][2] = {{-0.5, -0.5},
-				      {-0.5,  0.5},
-				      { 0.5,  0.5},
-				      { 0.5,  -0.5}};
+  //Now Blend the Video Echo
+  glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
 
-		glEnableClientState(GL_VERTEX_ARRAY);
-		glDisableClientState(GL_COLOR_ARRAY);
-		glEnableClientState(GL_TEXTURE_COORD_ARRAY);
+  glMatrixMode(GL_TEXTURE);
 
-		glVertexPointer(2,GL_FLOAT,0,points);
-		glTexCoordPointer(2,GL_FLOAT,0,tex);
+  //draw video echo
+  glColor4f(1.0, 1.0, 1.0, a * masterAlpha);
+  glTranslatef(.5, .5, 0);
+  glScalef(1.0/zoom, 1.0/zoom, 1);
+  glTranslatef(-.5, -.5, 0);
 
-		//Now Blend the Video Echo
-		glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+  int flipx=1, flipy=1;
+  switch (orientation)
+  {
+  case Normal:  flipx =  1;  flipy =  1;  break;
+  case FlipX:   flipx = -1;  flipy =  1;  break;
+  case FlipY:   flipx =  1;  flipy = -1;  break;
+  case FlipXY:  flipx = -1;  flipy = -1;  break;
+  default:      flipx =  1;  flipy =  1;  break;
+  }
 
-		glMatrixMode(GL_TEXTURE);
+  float pointsFlip[4][2] = {{-0.5*flipx, -0.5*flipy},
+                            {-0.5*flipx,  0.5*flipy},
+                            { 0.5*flipx,  0.5*flipy},
+                            { 0.5*flipx, -0.5*flipy}};
 
-		//draw video echo
-		glColor4f(1.0, 1.0, 1.0, a * masterAlpha);
-		glTranslatef(.5, .5, 0);
-		glScalef(1.0/zoom, 1.0/zoom, 1);
-		glTranslatef(-.5, -.5, 0);
+  glVertexPointer(2,GL_FLOAT,0,pointsFlip);
+  glDrawArrays(GL_TRIANGLE_FAN,0,4);
 
-		int flipx=1, flipy=1;
-		switch (orientation)
-		{
-			case Normal: flipx=1;flipy=1;break;
-			case FlipX: flipx=-1;flipy=1;break;
-			case FlipY: flipx=1;flipy=-1;break;
-			case FlipXY: flipx=-1;flipy=-1;break;
-			default: flipx=1;flipy=1; break;
-		}
+  glDisable(GL_TEXTURE_2D);
+  glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
 
-		float pointsFlip[4][2] = {{-0.5*flipx, -0.5*flipy},
-					  {-0.5*flipx,  0.5*flipy},
-					  { 0.5*flipx,  0.5*flipy},
-					  { 0.5*flipx, -0.5*flipy}};
-
-		glVertexPointer(2,GL_FLOAT,0,pointsFlip);
-		glDrawArrays(GL_TRIANGLE_FAN,0,4);
-
-		glDisable(GL_TEXTURE_2D);
-		glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-
-		glDisableClientState(GL_TEXTURE_COORD_ARRAY);
-
+  glDisableClientState(GL_TEXTURE_COORD_ARRAY);
 }
diff --git a/src/libprojectM/Renderer/VideoEcho.hpp b/src/libprojectM/Renderer/VideoEcho.hpp
index 13f027e..5b4fa99 100644
--- a/src/libprojectM/Renderer/VideoEcho.hpp
+++ b/src/libprojectM/Renderer/VideoEcho.hpp
@@ -4,28 +4,28 @@
  *  Created on: Jun 29, 2008
  *      Author: pete
  */
-
 #ifndef VIDEOECHO_HPP_
 #define VIDEOECHO_HPP_
 
 #include "Renderable.hpp"
 
+
 enum Orientation
 {
-	Normal=0, FlipX, FlipY, FlipXY
+  Normal=0, FlipX, FlipY, FlipXY
 };
 
 class VideoEcho: public RenderItem
 {
 public:
-	VideoEcho();
-	virtual ~VideoEcho();
+  VideoEcho();
+  virtual ~VideoEcho();
 
-	float a;
-	float zoom;
-	Orientation orientation;
+  float a;
+  float zoom;
+  Orientation orientation;
 
-	void Draw(RenderContext &context);
+  void Draw(RenderContext &context);
 };
 
 #endif /* VIDEOECHO_HPP_ */
diff --git a/src/libprojectM/Renderer/Waveform.cpp b/src/libprojectM/Renderer/Waveform.cpp
index 0aca543..d626640 100644
--- a/src/libprojectM/Renderer/Waveform.cpp
+++ b/src/libprojectM/Renderer/Waveform.cpp
@@ -4,7 +4,6 @@
  *  Created on: Jun 25, 2008
  *      Author: pete
  */
-
 #ifdef LINUX
 #ifdef USE_GLES1
 #include <GLES/gl.h>
@@ -20,103 +19,105 @@
 #include <algorithm>
 #include "BeatDetect.hpp"
 
+
 typedef float floatPair[2];
 typedef float floatTriple[3];
 typedef float floatQuad[4];
 
+
 Waveform::Waveform(int samples)
-: RenderItem(),samples(samples), points(samples), pointContext(samples)
+  : RenderItem(),
+    samples(samples),
+    points(samples),
+    pointContext(samples)
 {
+  spectrum = false; /* spectrum data or pcm data */
+  dots = false; /* draw wave as dots or lines */
+  thick = false; /* draw thicker lines */
+  additive = false; /* add color values together */
 
-	spectrum = false; /* spectrum data or pcm data */
-	dots = false; /* draw wave as dots or lines */
-	thick = false; /* draw thicker lines */
-	additive = false; /* add color values together */
-
-	scaling= 1; /* scale factor of waveform */
-	smoothing = 0; /* smooth factor of waveform */
-	sep = 0;
-
+  scaling= 1; /* scale factor of waveform */
+  smoothing = 0; /* smooth factor of waveform */
+  sep = 0;
 }
-void Waveform::Draw(RenderContext &context)
-   {
 
-		//if (samples > 2048) samples = 2048;
+void
+Waveform::Draw(RenderContext &context)
+{
+  //if (samples > 2048) samples = 2048;
+
+  if (additive) glBlendFunc(GL_SRC_ALPHA, GL_ONE);
+  else          glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
+  if (thick)
+  {
+    glLineWidth(context.texsize <= 512 ? 2 : 2*context.texsize/512);
+    glPointSize(context.texsize <= 512 ? 2 : 2*context.texsize/512);
+  }
+  else
+    glPointSize(context.texsize <= 512 ? 1 : context.texsize/512);
 
 
-			if (additive)  glBlendFunc(GL_SRC_ALPHA, GL_ONE);
-			else glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-
-			if (thick)
-			{
-			  glLineWidth(context.texsize <= 512 ? 2 : 2*context.texsize/512);
-			  glPointSize(context.texsize <= 512 ? 2 : 2*context.texsize/512);
-
-			}
-			else glPointSize(context.texsize <= 512 ? 1 : context.texsize/512);
+  float *value1 = new float[samples];
+  float *value2 = new float[samples];
+  context.beatDetect->pcm->getPCM( value1, samples, 0, spectrum, smoothing, 0);
+  context.beatDetect->pcm->getPCM( value2, samples, 1, spectrum, smoothing, 0);
+  // printf("%f\n",pcmL[0]);
 
 
-			float *value1 = new float[samples];
-			float *value2 = new float[samples];
-			context.beatDetect->pcm->getPCM( value1, samples, 0, spectrum, smoothing, 0);
-			context.beatDetect->pcm->getPCM( value2, samples, 1, spectrum, smoothing, 0);
-			// printf("%f\n",pcmL[0]);
+  float mult= scaling*( spectrum ? 0.015f :1.0f);
 
 
-			float mult= scaling*( spectrum ? 0.015f :1.0f);
+  std::transform(&value1[0],&value1[samples],&value1[0],std::bind2nd(std::multiplies<float>(),mult));
+  std::transform(&value2[0],&value2[samples],&value2[0],std::bind2nd(std::multiplies<float>(),mult));
 
+  WaveformContext waveContext(samples, context.beatDetect);
 
-				std::transform(&value1[0],&value1[samples],&value1[0],std::bind2nd(std::multiplies<float>(),mult));
-				std::transform(&value2[0],&value2[samples],&value2[0],std::bind2nd(std::multiplies<float>(),mult));
+  for(int x=0;x< samples;x++)
+  {
+    waveContext.sample = x/(float)(samples - 1);
+    waveContext.sample_int = x;
+    waveContext.left = value1[x];
+    waveContext.right = value2[x];
 
-			WaveformContext waveContext(samples, context.beatDetect);
+    points[x] = PerPoint(points[x],waveContext);
+  }
 
-			for(int x=0;x< samples;x++)
-			{
-				waveContext.sample = x/(float)(samples - 1);
-				waveContext.sample_int = x;
-				waveContext.left = value1[x];
-				waveContext.right = value2[x];
+  floatQuad *colors = new float[samples][4];
+  floatPair *p = new float[samples][2];
 
-				points[x] = PerPoint(points[x],waveContext);
-			}
+  for(int x=0;x< samples;x++)
+  {
+    colors[x][0] = points[x].r;
+    colors[x][1] = points[x].g;
+    colors[x][2] = points[x].b;
+    colors[x][3] = points[x].a * masterAlpha;
 
-			floatQuad *colors = new float[samples][4];
-			floatPair *p = new float[samples][2];
+    p[x][0] = points[x].x;
+    p[x][1] = -(points[x].y-1);
 
-			for(int x=0;x< samples;x++)
-			{
-			  colors[x][0] = points[x].r;
-			  colors[x][1] = points[x].g;
-			  colors[x][2] = points[x].b;
-			  colors[x][3] = points[x].a * masterAlpha;
+  }
 
-			  p[x][0] = points[x].x;
-			  p[x][1] = -(points[x].y-1);
+  glEnableClientState(GL_VERTEX_ARRAY);
+  glEnableClientState(GL_COLOR_ARRAY);
+  glDisableClientState(GL_TEXTURE_COORD_ARRAY);
 
-			}
+  glVertexPointer(2,GL_FLOAT,0,p);
+  glColorPointer(4,GL_FLOAT,0,colors);
 
-			glEnableClientState(GL_VERTEX_ARRAY);
-			glEnableClientState(GL_COLOR_ARRAY);
-			glDisableClientState(GL_TEXTURE_COORD_ARRAY);
+  if (dots) glDrawArrays(GL_POINTS,0,samples);
+  else      glDrawArrays(GL_LINE_STRIP,0,samples);
 
-			glVertexPointer(2,GL_FLOAT,0,p);
-			glColorPointer(4,GL_FLOAT,0,colors);
-
-			if (dots)	glDrawArrays(GL_POINTS,0,samples);
-			else  	glDrawArrays(GL_LINE_STRIP,0,samples);
-
-			glPointSize(context.texsize < 512 ? 1 : context.texsize/512);
-			glLineWidth(context.texsize < 512 ? 1 : context.texsize/512);
+  glPointSize(context.texsize < 512 ? 1 : context.texsize/512);
+  glLineWidth(context.texsize < 512 ? 1 : context.texsize/512);
 #ifndef USE_GLES1
-			glDisable(GL_LINE_STIPPLE);
+  glDisable(GL_LINE_STIPPLE);
 #endif
-			glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-			//  glPopMatrix();
+  glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+  //  glPopMatrix();
 
-			delete[] colors;
-			delete[] p;
-			delete[] value1;
-			delete[] value2;
-
-   }
+  delete[] colors;
+  delete[] p;
+  delete[] value1;
+  delete[] value2;
+}
diff --git a/src/libprojectM/Renderer/Waveform.hpp b/src/libprojectM/Renderer/Waveform.hpp
index b6aa468..f0bf7f8 100644
--- a/src/libprojectM/Renderer/Waveform.hpp
+++ b/src/libprojectM/Renderer/Waveform.hpp
@@ -4,37 +4,37 @@
  *  Created on: Jun 25, 2008
  *      Author: pete
  */
-
 #ifndef WAVEFORM_HPP_
 #define WAVEFORM_HPP_
 
 #include "Renderable.hpp"
 #include <vector>
 
+
 class ColoredPoint
 {
 public:
-	float x;
-	float y;
-	float r;
-	float g;
-	float b;
-	float a;
+  float x;
+  float y;
+  float r;
+  float g;
+  float b;
+  float a;
 
-	ColoredPoint():x(0.5),y(0.5),r(1),g(1),b(1),a(1){};
+  ColoredPoint():x(0.5),y(0.5),r(1),g(1),b(1),a(1){};
 };
 
 class WaveformContext
 {
 public:
-	float sample;
-	int samples;
-	int sample_int;
-	float left;
-	float right;
-	BeatDetect *music;
+  float sample;
+  int samples;
+  int sample_int;
+  float left;
+  float right;
+  BeatDetect *music;
 
-	WaveformContext(int samples, BeatDetect *music):samples(samples),music(music){};
+  WaveformContext(int samples, BeatDetect *music):samples(samples),music(music){};
 };
 
 
@@ -42,23 +42,23 @@
 {
 public:
 
-    int samples; /* number of samples associated with this wave form. Usually powers of 2 */
-    bool spectrum; /* spectrum data or pcm data */
-    bool dots; /* draw wave as dots or lines */
-    bool thick; /* draw thicker lines */
-    bool additive; /* add color values together */
+  int   samples; /* number of samples associated with this wave form. Usually powers of 2 */
+  bool  spectrum; /* spectrum data or pcm data */
+  bool  dots; /* draw wave as dots or lines */
+  bool  thick; /* draw thicker lines */
+  bool  additive; /* add color values together */
 
-    float scaling; /* scale factor of waveform */
-    float smoothing; /* smooth factor of waveform */
-    int sep;  /* no idea what this is yet... */
+  float scaling; /* scale factor of waveform */
+  float smoothing; /* smooth factor of waveform */
+  int   sep;  /* no idea what this is yet... */
 
-    Waveform(int samples);
-    void Draw(RenderContext &context);
+  Waveform(int samples);
+  void Draw(RenderContext &context);
 
 private:
-	virtual ColoredPoint PerPoint(ColoredPoint p, const WaveformContext context)=0;
-	std::vector<ColoredPoint> points;
-	std::vector<float> pointContext;
-
+  virtual ColoredPoint PerPoint(ColoredPoint p, const WaveformContext context)=0;
+  std::vector<ColoredPoint> points;
+  std::vector<float> pointContext;
 };
+
 #endif /* WAVEFORM_HPP_ */
diff --git a/src/libprojectM/TimeKeeper.cpp b/src/libprojectM/TimeKeeper.cpp
index 199cde1..66c6fc8 100644
--- a/src/libprojectM/TimeKeeper.cpp
+++ b/src/libprojectM/TimeKeeper.cpp
@@ -7,100 +7,118 @@
 #include "TimeKeeper.hpp"
 #include "RandomNumberGenerators.hpp"
 
-TimeKeeper::TimeKeeper(double presetDuration, double smoothDuration, double easterEgg)
-  {
-    _smoothDuration = smoothDuration;
-    _presetDuration = presetDuration;
-    _easterEgg = easterEgg;
+
+TimeKeeper::TimeKeeper (double presetDuration, double smoothDuration, double easterEgg)
+{
+  _smoothDuration = smoothDuration;
+  _presetDuration = presetDuration;
+  _easterEgg = easterEgg;
 
 #ifndef WIN32
-	gettimeofday ( &this->startTime, NULL );
+  gettimeofday ( &this->startTime, NULL );
 #else
-	startTime = GetTickCount();
+  startTime = GetTickCount();
 #endif /** !WIN32 */
 
-	UpdateTimers();
-  }
+  UpdateTimers();
+}
 
-  void TimeKeeper::UpdateTimers()
-  {
+void
+TimeKeeper::UpdateTimers()
+{
 #ifndef WIN32
-	_currentTime = getTicks ( &startTime ) * 0.001;
+  _currentTime = getTicks (&startTime) * 0.001;
 #else
-	_currentTime = getTicks ( startTime ) * 0.001;
+  _currentTime = getTicks (startTime) * 0.001;
 #endif /** !WIN32 */
 
-	_presetFrameA++;
-	_presetFrameB++;
+  _presetFrameA++;
+  _presetFrameB++;
+}
 
-  }
+void
+TimeKeeper::StartPreset()
+{
+  _isSmoothing = false;
+  _presetTimeA = _currentTime;
+  _presetFrameA = 1;
+  _presetDurationA = sampledPresetDuration();
+}
 
-  void TimeKeeper::StartPreset()
-  {
-    _isSmoothing = false;
-    _presetTimeA = _currentTime;
-    _presetFrameA = 1;
-    _presetDurationA = sampledPresetDuration();
-  }
-  void TimeKeeper::StartSmoothing()
-  {
-    _isSmoothing = true;
-    _presetTimeB = _currentTime;
-    _presetFrameB = 1;
-    _presetDurationB = sampledPresetDuration();
-  }
-  void TimeKeeper::EndSmoothing()
-  {
-    _isSmoothing = false;
-    _presetTimeA = _presetTimeB;
-    _presetFrameA = _presetFrameB;
-    _presetDurationA = _presetDurationB;
-  }
+void
+TimeKeeper::StartSmoothing()
+{
+  _isSmoothing = true;
+  _presetTimeB = _currentTime;
+  _presetFrameB = 1;
+  _presetDurationB = sampledPresetDuration();
+}
 
-  bool TimeKeeper::CanHardCut()
-  {
-    return ((_currentTime - _presetTimeA) > HARD_CUT_DELAY);
-  }
+void
+TimeKeeper::EndSmoothing()
+{
+  _isSmoothing = false;
+  _presetTimeA = _presetTimeB;
+  _presetFrameA = _presetFrameB;
+  _presetDurationA = _presetDurationB;
+}
 
-  double TimeKeeper::SmoothRatio()
-  {
-    return (_currentTime - _presetTimeB) / _smoothDuration;
-  }
-  bool TimeKeeper::IsSmoothing()
-  {
-    return _isSmoothing;
-  }
+bool
+TimeKeeper::CanHardCut()
+{
+  return ((_currentTime - _presetTimeA) > HARD_CUT_DELAY);
+}
 
-  double TimeKeeper::GetRunningTime()
-  {
-    return _currentTime;
-  }
+double
+TimeKeeper::SmoothRatio()
+{
+  return (_currentTime - _presetTimeB) / _smoothDuration;
+}
 
-  double TimeKeeper::PresetProgressA()
-  {
-    if (_isSmoothing) return 1.0;
-    else return (_currentTime - _presetTimeA) / _presetDurationA;
-  }
-  double TimeKeeper::PresetProgressB()
-  {
-    return (_currentTime - _presetTimeB) / _presetDurationB;
-  }
+bool
+TimeKeeper::IsSmoothing()
+{
+  return _isSmoothing;
+}
 
-int TimeKeeper::PresetFrameB()
-  {
-    return _presetFrameB;
-  }
+double
+TimeKeeper::GetRunningTime()
+{
+  return _currentTime;
+}
 
-int TimeKeeper::PresetFrameA()
-  {
-    return _presetFrameA;
-  }
+double
+TimeKeeper::PresetProgressA()
+{
+  if (_isSmoothing) return 1.0;
+  else              return (_currentTime - _presetTimeA) / _presetDurationA;
+}
 
-double TimeKeeper::sampledPresetDuration() {
+double
+TimeKeeper::PresetProgressB()
+{
+  return (_currentTime - _presetTimeB) / _presetDurationB;
+}
+
+int
+TimeKeeper::PresetFrameB()
+{
+  return _presetFrameB;
+}
+
+int
+TimeKeeper::PresetFrameA()
+{
+  return _presetFrameA;
+}
+
+double
+TimeKeeper::sampledPresetDuration()
+{
 #ifdef WIN32
-	return  _presetDuration;
+  return  _presetDuration;
 #else
-		return fmax(1, fmin(60, RandomNumberGenerators::gaussian
-			(_presetDuration, _easterEgg)));
+  return fmax (1, fmin (60, RandomNumberGenerators::gaussian (_presetDuration,
+                                                              _easterEgg)));
 #endif
 }
diff --git a/src/libprojectM/TimeKeeper.hpp b/src/libprojectM/TimeKeeper.hpp
index 694774a..c84d225 100644
--- a/src/libprojectM/TimeKeeper.hpp
+++ b/src/libprojectM/TimeKeeper.hpp
@@ -7,61 +7,62 @@
 
 #include "timer.h"
 
+
 #define HARD_CUT_DELAY 3
 
+
 class TimeKeeper
 {
-
 public:
 
   TimeKeeper(double presetDuration, double smoothDuration, double easterEgg);
 
-  void UpdateTimers();
+  void    UpdateTimers();
 
-  void StartPreset();
-  void StartSmoothing();
-  void EndSmoothing();
- 
-  bool CanHardCut();
+  void    StartPreset();
+  void    StartSmoothing();
+  void    EndSmoothing();
 
-  double SmoothRatio();
-  bool IsSmoothing();
+  bool    CanHardCut();
 
-  double GetRunningTime(); 
+  double  SmoothRatio();
+  bool    IsSmoothing();
 
-  double PresetProgressA();
-  double PresetProgressB();
+  double  GetRunningTime(); 
 
-  int PresetFrameA();
-  int PresetFrameB();
+  double  PresetProgressA();
+  double  PresetProgressB();
 
-  double sampledPresetDuration();
+  int     PresetFrameA();
+  int     PresetFrameB();
 
-  void ChangePresetDuration(int seconds) { _presetDuration = seconds; }
+  double  sampledPresetDuration();
+
+  void    ChangePresetDuration(int seconds) { _presetDuration = seconds; }
 
 #ifndef WIN32
   /* The first ticks value of the application */
-  struct timeval startTime;
+  struct timeval  startTime;
 #else  
-  long startTime;
+  long            startTime;
 #endif /** !WIN32 */
 
+
 private:
 
-  double _easterEgg;
-  double _presetDuration;
-  double _presetDurationA;
-  double _presetDurationB;
-  double _smoothDuration;
+  double  _easterEgg;
+  double  _presetDuration;
+  double  _presetDurationA;
+  double  _presetDurationB;
+  double  _smoothDuration;
 
-  double _currentTime;
-  double _presetTimeA;
-  double _presetTimeB;
-  int _presetFrameA;
-  int _presetFrameB;
+  double  _currentTime;
+  double  _presetTimeA;
+  double  _presetTimeB;
+  int     _presetFrameA;
+  int     _presetFrameB;
 
-  bool _isSmoothing;
-  
-
+  bool    _isSmoothing;
 };
+
 #endif
diff --git a/src/libprojectM/carbontoprojectM.h b/src/libprojectM/carbontoprojectM.h
index 42f1cdf..bbabf60 100644
--- a/src/libprojectM/carbontoprojectM.h
+++ b/src/libprojectM/carbontoprojectM.h
@@ -1,105 +1,113 @@
-r/**
- * projectM -- Milkdrop-esque visualisation SDK
- * Copyright (C)2003-2007 projectM Team
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- * See 'LICENSE.txt' included within this release
- *
- */
-/**
- * $Id: carbontoprojectM.hpp,v 1.2 2004/11/12 15:12:58 cvs Exp $
- *
- * Translates CARBON -> projectM variables
- *
- * $Log$
- */
-
-#ifndef _CARBONTOPROJECTM_H
-#define _CARBONTOPROJECTM_H
-
-#include "event.h"
-
-#ifdef WIN32
-#else
-#endif
-
-projectMEvent carbon2pmEvent( EventRecord *event ) { 
-
-    switch ( event->what ) { 
-        case updateEvt: 
-            return PROJECTM_VIDEORESIZE; 
-        case keyUp: 
-            return PROJECTM_KEYUP; 
-        case keyDown: 
-            return PROJECTM_KEYDOWN; 
-        default:
-            return PROJECTM_KEYUP; 
-      } 
-  } 
-
-projectMKeycode carbon2pmKeycode( EventRecord *event ) { 
-    projectMKeycode char_code = (projectMKeycode)(event->message & charCodeMask); 
-    switch ( char_code ) { 
-        case kFunctionKeyCharCode: { 
-            switch ( ( event->message << 16 ) >> 24 ) { 
-                case 111: { 
-                    return PROJECTM_K_F12; 
-                  } 
-                case 103: { 
-                    return PROJECTM_K_F11; 
-                  } 
-                case 109: { 
-                    return PROJECTM_K_F10; 
-                  } 
-                case 101: { 
-                    return PROJECTM_K_F9; 
-                  } 
-                case 100: { 
-                    return PROJECTM_K_F8; 
-                  } 
-                case 98: { 
-                    return PROJECTM_K_F7; 
-                  } 
-                case 97: { 
-                    return PROJECTM_K_F6; 
-                  } 
-                case 96: { 
-                    return PROJECTM_K_F5; 
-                  } 
-                case 118: { 
-                    return PROJECTM_K_F4; 
-                  } 
-                case 99: { 
-                    return PROJECTM_K_F3; 
-                  } 
-                case 120: { 
-                    return PROJECTM_K_F2; 
-                  } 
-                case 122: { 
-                    return PROJECTM_K_F1; 
-                  } 
-              } 
-          } 
-        default: { 
-            return char_code; 
-          } 
-      } 
-  } 
-
-projectMModifier carbon2pmModifier( EventRecord *event ) { 
-    return (projectMModifier)PROJECTM_K_LSHIFT; 
-  } 
-
-#endif /** _CARBONTOPROJECTM_H */
+/**
+ * projectM -- Milkdrop-esque visualisation SDK
+ * Copyright (C)2003-2007 projectM Team
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ * See 'LICENSE.txt' included within this release
+ *
+ */
+/**
+ * $Id: carbontoprojectM.hpp,v 1.2 2004/11/12 15:12:58 cvs Exp $
+ *
+ * Translates CARBON -> projectM variables
+ *
+ * $Log$
+ */
+#ifndef _CARBONTOPROJECTM_H
+#define _CARBONTOPROJECTM_H
+
+#include "event.h"
+
+
+#ifdef WIN32
+#else
+#endif
+
+projectMEvent
+carbon2pmEvent( EventRecord *event )
+{
+  switch ( event->what ) {
+  case updateEvt:
+    return PROJECTM_VIDEORESIZE;
+  case keyUp:
+    return PROJECTM_KEYUP;
+  case keyDown:
+    return PROJECTM_KEYDOWN;
+  default:
+    return PROJECTM_KEYUP;
+  }
+}
+
+projectMKeycode
+carbon2pmKeycode( EventRecord *event )
+{
+  projectMKeycode char_code = (projectMKeycode)(event->message & charCodeMask);
+
+  switch ( char_code ) {
+  case kFunctionKeyCharCode:
+    {
+      switch ( ( event->message << 16 ) >> 24 ) {
+      case 111: {
+        return PROJECTM_K_F12;
+        }
+      case 103: {
+        return PROJECTM_K_F11;
+        }
+      case 109: {
+        return PROJECTM_K_F10;
+        }
+      case 101: {
+        return PROJECTM_K_F9;
+        }
+      case 100: {
+        return PROJECTM_K_F8;
+        }
+      case 98: {
+        return PROJECTM_K_F7;
+        }
+      case 97: {
+        return PROJECTM_K_F6;
+        }
+      case 96: {
+        return PROJECTM_K_F5;
+        }
+      case 118: {
+        return PROJECTM_K_F4;
+        }
+      case 99: {
+        return PROJECTM_K_F3;
+        }
+      case 120: {
+        return PROJECTM_K_F2;
+        }
+      case 122: {
+        return PROJECTM_K_F1;
+        }
+      }
+    }
+  default:
+    {
+      return char_code;
+    }
+  }
+}
+
+projectMModifier
+carbon2pmModifier( EventRecord *event )
+{
+  return (projectMModifier)PROJECTM_K_LSHIFT;
+}
+
+#endif /** _CARBONTOPROJECTM_H */
diff --git a/src/libprojectM/config.inp.in b/src/libprojectM/config.inp.in
index b27b193..7cf9697 100644
--- a/src/libprojectM/config.inp.in
+++ b/src/libprojectM/config.inp.in
@@ -1,22 +1,21 @@
-# config.inp
-# Configuration File for projectM
-
-Texture Size = 1024			# Size of internal rendering texture
-Mesh X  = 32            	# Width of PerPixel Equation mesh
-Mesh Y  = 24          		# Height of PerPixel Equation mesh
-FPS  = 35          		# Frames Per Second 
-Fullscreen  = false		
-Window Width  = 512  	       	# startup window width
-Window Height = 512            	# startup window height
-
-Smooth Transition Duration = 5  # in seconds
-Preset Duration = 30 	     	# in seconds
-Easter Egg Parameter = 1
-
-Hard Cut Sensitivity = 10       # Lower to make hard cuts more frequent
-Aspect Correction = true	# Custom Shape Aspect Correction
-
-Preset Path = @CMAKE_INSTALL_PREFIX@/@RESOURCE_PREFIX@/presets # preset location
-Title Font = @CMAKE_INSTALL_PREFIX@/@RESOURCE_PREFIX@/fonts/Vera.ttf
-Menu Font = @CMAKE_INSTALL_PREFIX@/@RESOURCE_PREFIX@/fonts/VeraMono.ttf
- 
+# config.inp
+# Configuration File for projectM
+
+Texture Size = 1024			# Size of internal rendering texture
+Mesh X  = 32            	# Width of PerPixel Equation mesh
+Mesh Y  = 24          		# Height of PerPixel Equation mesh
+FPS  = 35          		# Frames Per Second
+Fullscreen  = false
+Window Width  = 512  	       	# startup window width
+Window Height = 512            	# startup window height
+
+Smooth Transition Duration = 5  # in seconds
+Preset Duration = 30 	     	# in seconds
+Easter Egg Parameter = 1
+
+Hard Cut Sensitivity = 10       # Lower to make hard cuts more frequent
+Aspect Correction = true	# Custom Shape Aspect Correction
+
+Preset Path = @CMAKE_INSTALL_PREFIX@/@RESOURCE_PREFIX@/presets # preset location
+Title Font = @CMAKE_INSTALL_PREFIX@/@RESOURCE_PREFIX@/fonts/Vera.ttf
+Menu Font = @CMAKE_INSTALL_PREFIX@/@RESOURCE_PREFIX@/fonts/VeraMono.ttf
diff --git a/src/libprojectM/dlldefs.h b/src/libprojectM/dlldefs.h
index b944fe7..d6df3a8 100644
--- a/src/libprojectM/dlldefs.h
+++ b/src/libprojectM/dlldefs.h
@@ -1,40 +1,40 @@
-/**
- * projectM -- Milkdrop-esque visualisation SDK
- * Copyright (C)2003-2007 projectM Team
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- * See 'LICENSE.txt' included within this release
- *
- */
-/**
- * $Id$
- *
- * DLL definitions for exporting symbols on various platforms
- *
- * $Log$
- */
-
-#ifndef _DLLDEFS_H
-#define _DLLDEFS_H
-
-#ifndef DLLEXPORT
-#ifdef WIN32
-#define DLLEXPORT __declspec(dllexport)
-#else /** !WIN32 */
-#define DLLEXPORT
-#endif /** WIN32 */
-#endif /** !DLLEXPORT */
-
-#endif /** !_DLLDEFS_H */
+/**
+ * projectM -- Milkdrop-esque visualisation SDK
+ * Copyright (C)2003-2007 projectM Team
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ * See 'LICENSE.txt' included within this release
+ *
+ */
+/**
+ * $Id$
+ *
+ * DLL definitions for exporting symbols on various platforms
+ *
+ * $Log$
+ */
+
+#ifndef _DLLDEFS_H
+#define _DLLDEFS_H
+
+#ifndef DLLEXPORT
+#ifdef WIN32
+#define DLLEXPORT __declspec(dllexport)
+#else /** !WIN32 */
+#define DLLEXPORT
+#endif /** WIN32 */
+#endif /** !DLLEXPORT */
+
+#endif /** !_DLLDEFS_H */
diff --git a/src/libprojectM/event.h b/src/libprojectM/event.h
index 88949f2..2423460 100644
--- a/src/libprojectM/event.h
+++ b/src/libprojectM/event.h
@@ -1,154 +1,155 @@
-/**
- * projectM -- Milkdrop-esque visualisation SDK
- * Copyright (C)2003-2004 projectM Team
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- * See 'LICENSE.txt' included within this release
- *
- */
-/**
- * $Id: event.h,v 1.2 2004/10/08 10:54:27 cvs Exp $
- *
- * projectM keycodes. Enables translation from various event schemes such as Win32, SDL
- * &c.
- *
- * $Log: event.h,v $
- */
-
-#ifndef _PROJECTM_EVENT_H
-#define _PROJECTM_EVENT_H
-
-typedef enum {
-    /** Event types */
-    PROJECTM_KEYUP,
-    PROJECTM_KEYDOWN,
-    PROJECTM_VIDEORESIZE,
-    PROJECTM_VIDEOQUIT,
-  } projectMEvent;
-
-typedef enum {
-    /** Keycodes */
-    PROJECTM_K_RETURN,
-    PROJECTM_K_RIGHT,
-    PROJECTM_K_LEFT,
-    PROJECTM_K_UP,
-    PROJECTM_K_DOWN,
-    PROJECTM_K_PAGEUP,
-    PROJECTM_K_PAGEDOWN,
-    PROJECTM_K_INSERT,
-    PROJECTM_K_DELETE,
-    PROJECTM_K_ESCAPE,
-    PROJECTM_K_LSHIFT,
-    PROJECTM_K_RSHIFT,
-    PROJECTM_K_CAPSLOCK,
-    PROJECTM_K_LCTRL,
-    PROJECTM_K_HOME,
-    PROJECTM_K_END,
-    PROJECTM_K_BACKSPACE,
-
-    PROJECTM_K_F1,
-    PROJECTM_K_F2,
-    PROJECTM_K_F3,
-    PROJECTM_K_F4,
-    PROJECTM_K_F5,
-    PROJECTM_K_F6,
-    PROJECTM_K_F7,
-    PROJECTM_K_F8,
-    PROJECTM_K_F9,
-    PROJECTM_K_F10,
-    PROJECTM_K_F11,
-    PROJECTM_K_F12,
-
-    PROJECTM_K_0 = 48,
-    PROJECTM_K_1,
-    PROJECTM_K_2,
-    PROJECTM_K_3,
-    PROJECTM_K_4,
-    PROJECTM_K_5,
-    PROJECTM_K_6,
-    PROJECTM_K_7,
-    PROJECTM_K_8,
-    PROJECTM_K_9,
-
-    PROJECTM_K_A = 65,
-    PROJECTM_K_B,
-    PROJECTM_K_C,
-    PROJECTM_K_D,
-    PROJECTM_K_E,
-    PROJECTM_K_F,
-    PROJECTM_K_G,
-    PROJECTM_K_H,
-    PROJECTM_K_I,
-    PROJECTM_K_J,
-    PROJECTM_K_K,
-    PROJECTM_K_L,
-    PROJECTM_K_M,
-    PROJECTM_K_N,
-    PROJECTM_K_O,
-    PROJECTM_K_P,
-    PROJECTM_K_Q,
-    PROJECTM_K_R,
-    PROJECTM_K_S,
-    PROJECTM_K_T,
-    PROJECTM_K_U,
-    PROJECTM_K_V,
-    PROJECTM_K_W,
-    PROJECTM_K_X,
-    PROJECTM_K_Y,
-    PROJECTM_K_Z,
-
-    PROJECTM_K_a = 97,
-    PROJECTM_K_b,
-    PROJECTM_K_c,
-    PROJECTM_K_d,
-    PROJECTM_K_e,
-    PROJECTM_K_f,
-    PROJECTM_K_g,
-    PROJECTM_K_h,
-    PROJECTM_K_i,
-    PROJECTM_K_j,
-    PROJECTM_K_k,
-    PROJECTM_K_l,
-    PROJECTM_K_m,
-    PROJECTM_K_n,
-    PROJECTM_K_o,
-    PROJECTM_K_p,
-    PROJECTM_K_q,
-    PROJECTM_K_r,
-    PROJECTM_K_s,
-    PROJECTM_K_t,
-    PROJECTM_K_u,
-    PROJECTM_K_v,
-    PROJECTM_K_w,
-    PROJECTM_K_x,
-    PROJECTM_K_y,
-    PROJECTM_K_z,
-    PROJECTM_K_NONE,
-    PROJECTM_K_PLUS,
-    PROJECTM_K_MINUS,
-    PROJECTM_K_EQUALS
-  } projectMKeycode;
-
-typedef enum {
-    /** Modifiers */
-    PROJECTM_KMOD_LSHIFT,
-    PROJECTM_KMOD_RSHIFT,
-    PROJECTM_KMOD_CAPS,
-    PROJECTM_KMOD_LCTRL,
-    PROJECTM_KMOD_RCTRL,
-  } projectMModifier;
-
-#endif /** !_PROJECTM_EVENT_H */
-
+/**
+ * projectM -- Milkdrop-esque visualisation SDK
+ * Copyright (C)2003-2004 projectM Team
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ * See 'LICENSE.txt' included within this release
+ *
+ */
+/**
+ * $Id: event.h,v 1.2 2004/10/08 10:54:27 cvs Exp $
+ *
+ * projectM keycodes. Enables translation from various event schemes such as Win32, SDL
+ * &c.
+ *
+ * $Log: event.h,v $
+ */
+
+#ifndef _PROJECTM_EVENT_H
+#define _PROJECTM_EVENT_H
+
+
+typedef enum {
+  /** Event types */
+  PROJECTM_KEYUP,
+  PROJECTM_KEYDOWN,
+  PROJECTM_VIDEORESIZE,
+  PROJECTM_VIDEOQUIT,
+} projectMEvent;
+
+typedef enum {
+  /** Keycodes */
+  PROJECTM_K_RETURN,
+  PROJECTM_K_RIGHT,
+  PROJECTM_K_LEFT,
+  PROJECTM_K_UP,
+  PROJECTM_K_DOWN,
+  PROJECTM_K_PAGEUP,
+  PROJECTM_K_PAGEDOWN,
+  PROJECTM_K_INSERT,
+  PROJECTM_K_DELETE,
+  PROJECTM_K_ESCAPE,
+  PROJECTM_K_LSHIFT,
+  PROJECTM_K_RSHIFT,
+  PROJECTM_K_CAPSLOCK,
+  PROJECTM_K_LCTRL,
+  PROJECTM_K_HOME,
+  PROJECTM_K_END,
+  PROJECTM_K_BACKSPACE,
+
+  PROJECTM_K_F1,
+  PROJECTM_K_F2,
+  PROJECTM_K_F3,
+  PROJECTM_K_F4,
+  PROJECTM_K_F5,
+  PROJECTM_K_F6,
+  PROJECTM_K_F7,
+  PROJECTM_K_F8,
+  PROJECTM_K_F9,
+  PROJECTM_K_F10,
+  PROJECTM_K_F11,
+  PROJECTM_K_F12,
+
+  PROJECTM_K_0 = 48,
+  PROJECTM_K_1,
+  PROJECTM_K_2,
+  PROJECTM_K_3,
+  PROJECTM_K_4,
+  PROJECTM_K_5,
+  PROJECTM_K_6,
+  PROJECTM_K_7,
+  PROJECTM_K_8,
+  PROJECTM_K_9,
+
+  PROJECTM_K_A = 65,
+  PROJECTM_K_B,
+  PROJECTM_K_C,
+  PROJECTM_K_D,
+  PROJECTM_K_E,
+  PROJECTM_K_F,
+  PROJECTM_K_G,
+  PROJECTM_K_H,
+  PROJECTM_K_I,
+  PROJECTM_K_J,
+  PROJECTM_K_K,
+  PROJECTM_K_L,
+  PROJECTM_K_M,
+  PROJECTM_K_N,
+  PROJECTM_K_O,
+  PROJECTM_K_P,
+  PROJECTM_K_Q,
+  PROJECTM_K_R,
+  PROJECTM_K_S,
+  PROJECTM_K_T,
+  PROJECTM_K_U,
+  PROJECTM_K_V,
+  PROJECTM_K_W,
+  PROJECTM_K_X,
+  PROJECTM_K_Y,
+  PROJECTM_K_Z,
+
+  PROJECTM_K_a = 97,
+  PROJECTM_K_b,
+  PROJECTM_K_c,
+  PROJECTM_K_d,
+  PROJECTM_K_e,
+  PROJECTM_K_f,
+  PROJECTM_K_g,
+  PROJECTM_K_h,
+  PROJECTM_K_i,
+  PROJECTM_K_j,
+  PROJECTM_K_k,
+  PROJECTM_K_l,
+  PROJECTM_K_m,
+  PROJECTM_K_n,
+  PROJECTM_K_o,
+  PROJECTM_K_p,
+  PROJECTM_K_q,
+  PROJECTM_K_r,
+  PROJECTM_K_s,
+  PROJECTM_K_t,
+  PROJECTM_K_u,
+  PROJECTM_K_v,
+  PROJECTM_K_w,
+  PROJECTM_K_x,
+  PROJECTM_K_y,
+  PROJECTM_K_z,
+  PROJECTM_K_NONE,
+  PROJECTM_K_PLUS,
+  PROJECTM_K_MINUS,
+  PROJECTM_K_EQUALS
+} projectMKeycode;
+
+typedef enum {
+  /** Modifiers */
+  PROJECTM_KMOD_LSHIFT,
+  PROJECTM_KMOD_RSHIFT,
+  PROJECTM_KMOD_CAPS,
+  PROJECTM_KMOD_LCTRL,
+  PROJECTM_KMOD_RCTRL,
+} projectMModifier;
+
+
+#endif /** !_PROJECTM_EVENT_H */
diff --git a/src/libprojectM/fatal.h b/src/libprojectM/fatal.h
index 57a6285..dcb50b7 100644
--- a/src/libprojectM/fatal.h
+++ b/src/libprojectM/fatal.h
@@ -1,43 +1,44 @@
-/**
- * projectM -- Milkdrop-esque visualisation SDK
- * Copyright (C)2003-2007 projectM Team
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- * See 'LICENSE.txt' included within this release
- *
- */
-/**
- * $Id: fatal.h,v 1.1.1.1 2005/12/23 18:05:05 psperl Exp $
- *
- * Error codes
- *
- * $Log$
- */
-
-#ifndef _FATAL_H
-#define _FATAL_H
-
-/* Fatal Error Definitions */
-
-#define PROJECTM_OUTOFMEM_ERROR -7; /* out of memory */
-#define PROJECTM_ERROR -1 /* non specific error */
-#define PROJECTM_SUCCESS 1
-#define PROJECTM_FAILURE -1
-#define PROJECTM_PARSE_ERROR -11
-#define PROJECTM_DIV_BY_ZERO -3
-#define PROJECTM_OK 2
-
-#endif /** !_FATAL_H */
-
+/**
+ * projectM -- Milkdrop-esque visualisation SDK
+ * Copyright (C)2003-2007 projectM Team
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ * See 'LICENSE.txt' included within this release
+ *
+ */
+/**
+ * $Id: fatal.h,v 1.1.1.1 2005/12/23 18:05:05 psperl Exp $
+ *
+ * Error codes
+ *
+ * $Log$
+ */
+
+#ifndef _FATAL_H
+#define _FATAL_H
+
+
+/* Fatal Error Definitions */
+
+#define PROJECTM_OUTOFMEM_ERROR   (-7) /* out of memory */
+#define PROJECTM_ERROR            (-1) /* non specific error */
+#define PROJECTM_SUCCESS          1
+#define PROJECTM_FAILURE          (-1)
+#define PROJECTM_PARSE_ERROR      (-11)
+#define PROJECTM_DIV_BY_ZERO      (-3)
+#define PROJECTM_OK               2
+
+
+#endif /** !_FATAL_H */
diff --git a/src/libprojectM/fftsg.cpp b/src/libprojectM/fftsg.cpp
index d005f77..e9c04fd 100644
--- a/src/libprojectM/fftsg.cpp
+++ b/src/libprojectM/fftsg.cpp
@@ -1,3314 +1,3313 @@
-/*
-Fast Fourier/Cosine/Sine Transform
-    dimension   :one
-    data length :power of 2
-    decimation  :frequency
-    radix       :split-radix
-    data        :inplace
-    table       :use
-functions
-    cdft: Complex Discrete Fourier Transform
-    rdft: Real Discrete Fourier Transform
-    ddct: Discrete Cosine Transform
-    ddst: Discrete Sine Transform
-    dfct: Cosine Transform of RDFT (Real Symmetric DFT)
-    dfst: Sine Transform of RDFT (Real Anti-symmetric DFT)
-function prototypes
-    void cdft(int, int, double *, int *, double *);
-    void rdft(int, int, double *, int *, double *);
-    void ddct(int, int, double *, int *, double *);
-    void ddst(int, int, double *, int *, double *);
-    void dfct(int, double *, double *, int *, double *);
-    void dfst(int, double *, double *, int *, double *);
-macro definitions
-    USE_CDFT_PTHREADS : default=not defined
-        CDFT_THREADS_BEGIN_N  : must be >= 512, default=8192
-        CDFT_4THREADS_BEGIN_N : must be >= 512, default=65536
-    USE_CDFT_WINTHREADS : default=not defined
-        CDFT_THREADS_BEGIN_N  : must be >= 512, default=32768
-        CDFT_4THREADS_BEGIN_N : must be >= 512, default=524288
-
-
--------- Complex DFT (Discrete Fourier Transform) --------
-    [definition]
-        <case1>
-            X[k] = sum_j=0^n-1 x[j]*exp(2*pi*i*j*k/n), 0<=k<n
-        <case2>
-            X[k] = sum_j=0^n-1 x[j]*exp(-2*pi*i*j*k/n), 0<=k<n
-        (notes: sum_j=0^n-1 is a summation from j=0 to n-1)
-    [usage]
-        <case1>
-            ip[0] = 0; // first time only
-            cdft(2*n, 1, a, ip, w);
-        <case2>
-            ip[0] = 0; // first time only
-            cdft(2*n, -1, a, ip, w);
-    [parameters]
-        2*n            :data length (int)
-                        n >= 1, n = power of 2
-        a[0...2*n-1]   :input/output data (double *)
-                        input data
-                            a[2*j] = Re(x[j]), 
-                            a[2*j+1] = Im(x[j]), 0<=j<n
-                        output data
-                            a[2*k] = Re(X[k]), 
-                            a[2*k+1] = Im(X[k]), 0<=k<n
-        ip[0...*]      :work area for bit reversal (int *)
-                        length of ip >= 2+sqrt(n)
-                        strictly, 
-                        length of ip >= 
-                            2+(1<<(int)(log(n+0.5)/log(2))/2).
-                        ip[0],ip[1] are pointers of the cos/sin table.
-        w[0...n/2-1]   :cos/sin table (double *)
-                        w[],ip[] are initialized if ip[0] == 0.
-    [remark]
-        Inverse of 
-            cdft(2*n, -1, a, ip, w);
-        is 
-            cdft(2*n, 1, a, ip, w);
-            for (j = 0; j <= 2 * n - 1; j++) {
-                a[j] *= 1.0 / n;
-            }
-        .
-
-
--------- Real DFT / Inverse of Real DFT --------
-    [definition]
-        <case1> RDFT
-            R[k] = sum_j=0^n-1 a[j]*cos(2*pi*j*k/n), 0<=k<=n/2
-            I[k] = sum_j=0^n-1 a[j]*sin(2*pi*j*k/n), 0<k<n/2
-        <case2> IRDFT (excluding scale)
-            a[k] = (R[0] + R[n/2]*cos(pi*k))/2 + 
-                   sum_j=1^n/2-1 R[j]*cos(2*pi*j*k/n) + 
-                   sum_j=1^n/2-1 I[j]*sin(2*pi*j*k/n), 0<=k<n
-    [usage]
-        <case1>
-            ip[0] = 0; // first time only
-            rdft(n, 1, a, ip, w);
-        <case2>
-            ip[0] = 0; // first time only
-            rdft(n, -1, a, ip, w);
-    [parameters]
-        n              :data length (int)
-                        n >= 2, n = power of 2
-        a[0...n-1]     :input/output data (double *)
-                        <case1>
-                            output data
-                                a[2*k] = R[k], 0<=k<n/2
-                                a[2*k+1] = I[k], 0<k<n/2
-                                a[1] = R[n/2]
-                        <case2>
-                            input data
-                                a[2*j] = R[j], 0<=j<n/2
-                                a[2*j+1] = I[j], 0<j<n/2
-                                a[1] = R[n/2]
-        ip[0...*]      :work area for bit reversal (int *)
-                        length of ip >= 2+sqrt(n/2)
-                        strictly, 
-                        length of ip >= 
-                            2+(1<<(int)(log(n/2+0.5)/log(2))/2).
-                        ip[0],ip[1] are pointers of the cos/sin table.
-        w[0...n/2-1]   :cos/sin table (double *)
-                        w[],ip[] are initialized if ip[0] == 0.
-    [remark]
-        Inverse of 
-            rdft(n, 1, a, ip, w);
-        is 
-            rdft(n, -1, a, ip, w);
-            for (j = 0; j <= n - 1; j++) {
-                a[j] *= 2.0 / n;
-            }
-        .
-
-
--------- DCT (Discrete Cosine Transform) / Inverse of DCT --------
-    [definition]
-        <case1> IDCT (excluding scale)
-            C[k] = sum_j=0^n-1 a[j]*cos(pi*j*(k+1/2)/n), 0<=k<n
-        <case2> DCT
-            C[k] = sum_j=0^n-1 a[j]*cos(pi*(j+1/2)*k/n), 0<=k<n
-    [usage]
-        <case1>
-            ip[0] = 0; // first time only
-            ddct(n, 1, a, ip, w);
-        <case2>
-            ip[0] = 0; // first time only
-            ddct(n, -1, a, ip, w);
-    [parameters]
-        n              :data length (int)
-                        n >= 2, n = power of 2
-        a[0...n-1]     :input/output data (double *)
-                        output data
-                            a[k] = C[k], 0<=k<n
-        ip[0...*]      :work area for bit reversal (int *)
-                        length of ip >= 2+sqrt(n/2)
-                        strictly, 
-                        length of ip >= 
-                            2+(1<<(int)(log(n/2+0.5)/log(2))/2).
-                        ip[0],ip[1] are pointers of the cos/sin table.
-        w[0...n*5/4-1] :cos/sin table (double *)
-                        w[],ip[] are initialized if ip[0] == 0.
-    [remark]
-        Inverse of 
-            ddct(n, -1, a, ip, w);
-        is 
-            a[0] *= 0.5;
-            ddct(n, 1, a, ip, w);
-            for (j = 0; j <= n - 1; j++) {
-                a[j] *= 2.0 / n;
-            }
-        .
-
-
--------- DST (Discrete Sine Transform) / Inverse of DST --------
-    [definition]
-        <case1> IDST (excluding scale)
-            S[k] = sum_j=1^n A[j]*sin(pi*j*(k+1/2)/n), 0<=k<n
-        <case2> DST
-            S[k] = sum_j=0^n-1 a[j]*sin(pi*(j+1/2)*k/n), 0<k<=n
-    [usage]
-        <case1>
-            ip[0] = 0; // first time only
-            ddst(n, 1, a, ip, w);
-        <case2>
-            ip[0] = 0; // first time only
-            ddst(n, -1, a, ip, w);
-    [parameters]
-        n              :data length (int)
-                        n >= 2, n = power of 2
-        a[0...n-1]     :input/output data (double *)
-                        <case1>
-                            input data
-                                a[j] = A[j], 0<j<n
-                                a[0] = A[n]
-                            output data
-                                a[k] = S[k], 0<=k<n
-                        <case2>
-                            output data
-                                a[k] = S[k], 0<k<n
-                                a[0] = S[n]
-        ip[0...*]      :work area for bit reversal (int *)
-                        length of ip >= 2+sqrt(n/2)
-                        strictly, 
-                        length of ip >= 
-                            2+(1<<(int)(log(n/2+0.5)/log(2))/2).
-                        ip[0],ip[1] are pointers of the cos/sin table.
-        w[0...n*5/4-1] :cos/sin table (double *)
-                        w[],ip[] are initialized if ip[0] == 0.
-    [remark]
-        Inverse of 
-            ddst(n, -1, a, ip, w);
-        is 
-            a[0] *= 0.5;
-            ddst(n, 1, a, ip, w);
-            for (j = 0; j <= n - 1; j++) {
-                a[j] *= 2.0 / n;
-            }
-        .
-
-
--------- Cosine Transform of RDFT (Real Symmetric DFT) --------
-    [definition]
-        C[k] = sum_j=0^n a[j]*cos(pi*j*k/n), 0<=k<=n
-    [usage]
-        ip[0] = 0; // first time only
-        dfct(n, a, t, ip, w);
-    [parameters]
-        n              :data length - 1 (int)
-                        n >= 2, n = power of 2
-        a[0...n]       :input/output data (double *)
-                        output data
-                            a[k] = C[k], 0<=k<=n
-        t[0...n/2]     :work area (double *)
-        ip[0...*]      :work area for bit reversal (int *)
-                        length of ip >= 2+sqrt(n/4)
-                        strictly, 
-                        length of ip >= 
-                            2+(1<<(int)(log(n/4+0.5)/log(2))/2).
-                        ip[0],ip[1] are pointers of the cos/sin table.
-        w[0...n*5/8-1] :cos/sin table (double *)
-                        w[],ip[] are initialized if ip[0] == 0.
-    [remark]
-        Inverse of 
-            a[0] *= 0.5;
-            a[n] *= 0.5;
-            dfct(n, a, t, ip, w);
-        is 
-            a[0] *= 0.5;
-            a[n] *= 0.5;
-            dfct(n, a, t, ip, w);
-            for (j = 0; j <= n; j++) {
-                a[j] *= 2.0 / n;
-            }
-        .
-
-
--------- Sine Transform of RDFT (Real Anti-symmetric DFT) --------
-    [definition]
-        S[k] = sum_j=1^n-1 a[j]*sin(pi*j*k/n), 0<k<n
-    [usage]
-        ip[0] = 0; // first time only
-        dfst(n, a, t, ip, w);
-    [parameters]
-        n              :data length + 1 (int)
-                        n >= 2, n = power of 2
-        a[0...n-1]     :input/output data (double *)
-                        output data
-                            a[k] = S[k], 0<k<n
-                        (a[0] is used for work area)
-        t[0...n/2-1]   :work area (double *)
-        ip[0...*]      :work area for bit reversal (int *)
-                        length of ip >= 2+sqrt(n/4)
-                        strictly, 
-                        length of ip >= 
-                            2+(1<<(int)(log(n/4+0.5)/log(2))/2).
-                        ip[0],ip[1] are pointers of the cos/sin table.
-        w[0...n*5/8-1] :cos/sin table (double *)
-                        w[],ip[] are initialized if ip[0] == 0.
-    [remark]
-        Inverse of 
-            dfst(n, a, t, ip, w);
-        is 
-            dfst(n, a, t, ip, w);
-            for (j = 1; j <= n - 1; j++) {
-                a[j] *= 2.0 / n;
-            }
-        .
-
-
-Appendix :
-    The cos/sin table is recalculated when the larger table required.
-    w[] and ip[] are compatible with all routines.
-*/
-
-
-void cdft(int n, int isgn, double *a, int *ip, double *w)
-{
-    void makewt(int nw, int *ip, double *w);
-    void cftfsub(int n, double *a, int *ip, int nw, double *w);
-    void cftbsub(int n, double *a, int *ip, int nw, double *w);
-    int nw;
-    
-    nw = ip[0];
-    if (n > (nw << 2)) {
-        nw = n >> 2;
-        makewt(nw, ip, w);
-    }
-    if (isgn >= 0) {
-        cftfsub(n, a, ip, nw, w);
-    } else {
-        cftbsub(n, a, ip, nw, w);
-    }
-}
-
-
-void rdft(int n, int isgn, double *a, int *ip, double *w)
-{
-    void makewt(int nw, int *ip, double *w);
-    void makect(int nc, int *ip, double *c);
-    void cftfsub(int n, double *a, int *ip, int nw, double *w);
-    void cftbsub(int n, double *a, int *ip, int nw, double *w);
-    void rftfsub(int n, double *a, int nc, double *c);
-    void rftbsub(int n, double *a, int nc, double *c);
-    int nw, nc;
-    double xi;
-    
-    nw = ip[0];
-    if (n > (nw << 2)) {
-        nw = n >> 2;
-        makewt(nw, ip, w);
-    }
-    nc = ip[1];
-    if (n > (nc << 2)) {
-        nc = n >> 2;
-        makect(nc, ip, w + nw);
-    }
-    if (isgn >= 0) {
-        if (n > 4) {
-            cftfsub(n, a, ip, nw, w);
-            rftfsub(n, a, nc, w + nw);
-        } else if (n == 4) {
-            cftfsub(n, a, ip, nw, w);
-        }
-        xi = a[0] - a[1];
-        a[0] += a[1];
-        a[1] = xi;
-    } else {
-        a[1] = 0.5 * (a[0] - a[1]);
-        a[0] -= a[1];
-        if (n > 4) {
-            rftbsub(n, a, nc, w + nw);
-            cftbsub(n, a, ip, nw, w);
-        } else if (n == 4) {
-            cftbsub(n, a, ip, nw, w);
-        }
-    }
-}
-
-
-void ddct(int n, int isgn, double *a, int *ip, double *w)
-{
-    void makewt(int nw, int *ip, double *w);
-    void makect(int nc, int *ip, double *c);
-    void cftfsub(int n, double *a, int *ip, int nw, double *w);
-    void cftbsub(int n, double *a, int *ip, int nw, double *w);
-    void rftfsub(int n, double *a, int nc, double *c);
-    void rftbsub(int n, double *a, int nc, double *c);
-    void dctsub(int n, double *a, int nc, double *c);
-    int j, nw, nc;
-    double xr;
-    
-    nw = ip[0];
-    if (n > (nw << 2)) {
-        nw = n >> 2;
-        makewt(nw, ip, w);
-    }
-    nc = ip[1];
-    if (n > nc) {
-        nc = n;
-        makect(nc, ip, w + nw);
-    }
-    if (isgn < 0) {
-        xr = a[n - 1];
-        for (j = n - 2; j >= 2; j -= 2) {
-            a[j + 1] = a[j] - a[j - 1];
-            a[j] += a[j - 1];
-        }
-        a[1] = a[0] - xr;
-        a[0] += xr;
-        if (n > 4) {
-            rftbsub(n, a, nc, w + nw);
-            cftbsub(n, a, ip, nw, w);
-        } else if (n == 4) {
-            cftbsub(n, a, ip, nw, w);
-        }
-    }
-    dctsub(n, a, nc, w + nw);
-    if (isgn >= 0) {
-        if (n > 4) {
-            cftfsub(n, a, ip, nw, w);
-            rftfsub(n, a, nc, w + nw);
-        } else if (n == 4) {
-            cftfsub(n, a, ip, nw, w);
-        }
-        xr = a[0] - a[1];
-        a[0] += a[1];
-        for (j = 2; j < n; j += 2) {
-            a[j - 1] = a[j] - a[j + 1];
-            a[j] += a[j + 1];
-        }
-        a[n - 1] = xr;
-    }
-}
-
-
-void ddst(int n, int isgn, double *a, int *ip, double *w)
-{
-    void makewt(int nw, int *ip, double *w);
-    void makect(int nc, int *ip, double *c);
-    void cftfsub(int n, double *a, int *ip, int nw, double *w);
-    void cftbsub(int n, double *a, int *ip, int nw, double *w);
-    void rftfsub(int n, double *a, int nc, double *c);
-    void rftbsub(int n, double *a, int nc, double *c);
-    void dstsub(int n, double *a, int nc, double *c);
-    int j, nw, nc;
-    double xr;
-    
-    nw = ip[0];
-    if (n > (nw << 2)) {
-        nw = n >> 2;
-        makewt(nw, ip, w);
-    }
-    nc = ip[1];
-    if (n > nc) {
-        nc = n;
-        makect(nc, ip, w + nw);
-    }
-    if (isgn < 0) {
-        xr = a[n - 1];
-        for (j = n - 2; j >= 2; j -= 2) {
-            a[j + 1] = -a[j] - a[j - 1];
-            a[j] -= a[j - 1];
-        }
-        a[1] = a[0] + xr;
-        a[0] -= xr;
-        if (n > 4) {
-            rftbsub(n, a, nc, w + nw);
-            cftbsub(n, a, ip, nw, w);
-        } else if (n == 4) {
-            cftbsub(n, a, ip, nw, w);
-        }
-    }
-    dstsub(n, a, nc, w + nw);
-    if (isgn >= 0) {
-        if (n > 4) {
-            cftfsub(n, a, ip, nw, w);
-            rftfsub(n, a, nc, w + nw);
-        } else if (n == 4) {
-            cftfsub(n, a, ip, nw, w);
-        }
-        xr = a[0] - a[1];
-        a[0] += a[1];
-        for (j = 2; j < n; j += 2) {
-            a[j - 1] = -a[j] - a[j + 1];
-            a[j] -= a[j + 1];
-        }
-        a[n - 1] = -xr;
-    }
-}
-
-
-void dfct(int n, double *a, double *t, int *ip, double *w)
-{
-    void makewt(int nw, int *ip, double *w);
-    void makect(int nc, int *ip, double *c);
-    void cftfsub(int n, double *a, int *ip, int nw, double *w);
-    void rftfsub(int n, double *a, int nc, double *c);
-    void dctsub(int n, double *a, int nc, double *c);
-    int j, k, l, m, mh, nw, nc;
-    double xr, xi, yr, yi;
-    
-    nw = ip[0];
-    if (n > (nw << 3)) {
-        nw = n >> 3;
-        makewt(nw, ip, w);
-    }
-    nc = ip[1];
-    if (n > (nc << 1)) {
-        nc = n >> 1;
-        makect(nc, ip, w + nw);
-    }
-    m = n >> 1;
-    yi = a[m];
-    xi = a[0] + a[n];
-    a[0] -= a[n];
-    t[0] = xi - yi;
-    t[m] = xi + yi;
-    if (n > 2) {
-        mh = m >> 1;
-        for (j = 1; j < mh; j++) {
-            k = m - j;
-            xr = a[j] - a[n - j];
-            xi = a[j] + a[n - j];
-            yr = a[k] - a[n - k];
-            yi = a[k] + a[n - k];
-            a[j] = xr;
-            a[k] = yr;
-            t[j] = xi - yi;
-            t[k] = xi + yi;
-        }
-        t[mh] = a[mh] + a[n - mh];
-        a[mh] -= a[n - mh];
-        dctsub(m, a, nc, w + nw);
-        if (m > 4) {
-            cftfsub(m, a, ip, nw, w);
-            rftfsub(m, a, nc, w + nw);
-        } else if (m == 4) {
-            cftfsub(m, a, ip, nw, w);
-        }
-        a[n - 1] = a[0] - a[1];
-        a[1] = a[0] + a[1];
-        for (j = m - 2; j >= 2; j -= 2) {
-            a[2 * j + 1] = a[j] + a[j + 1];
-            a[2 * j - 1] = a[j] - a[j + 1];
-        }
-        l = 2;
-        m = mh;
-        while (m >= 2) {
-            dctsub(m, t, nc, w + nw);
-            if (m > 4) {
-                cftfsub(m, t, ip, nw, w);
-                rftfsub(m, t, nc, w + nw);
-            } else if (m == 4) {
-                cftfsub(m, t, ip, nw, w);
-            }
-            a[n - l] = t[0] - t[1];
-            a[l] = t[0] + t[1];
-            k = 0;
-            for (j = 2; j < m; j += 2) {
-                k += l << 2;
-                a[k - l] = t[j] - t[j + 1];
-                a[k + l] = t[j] + t[j + 1];
-            }
-            l <<= 1;
-            mh = m >> 1;
-            for (j = 0; j < mh; j++) {
-                k = m - j;
-                t[j] = t[m + k] - t[m + j];
-                t[k] = t[m + k] + t[m + j];
-            }
-            t[mh] = t[m + mh];
-            m = mh;
-        }
-        a[l] = t[0];
-        a[n] = t[2] - t[1];
-        a[0] = t[2] + t[1];
-    } else {
-        a[1] = a[0];
-        a[2] = t[0];
-        a[0] = t[1];
-    }
-}
-
-
-void dfst(int n, double *a, double *t, int *ip, double *w)
-{
-    void makewt(int nw, int *ip, double *w);
-    void makect(int nc, int *ip, double *c);
-    void cftfsub(int n, double *a, int *ip, int nw, double *w);
-    void rftfsub(int n, double *a, int nc, double *c);
-    void dstsub(int n, double *a, int nc, double *c);
-    int j, k, l, m, mh, nw, nc;
-    double xr, xi, yr, yi;
-    
-    nw = ip[0];
-    if (n > (nw << 3)) {
-        nw = n >> 3;
-        makewt(nw, ip, w);
-    }
-    nc = ip[1];
-    if (n > (nc << 1)) {
-        nc = n >> 1;
-        makect(nc, ip, w + nw);
-    }
-    if (n > 2) {
-        m = n >> 1;
-        mh = m >> 1;
-        for (j = 1; j < mh; j++) {
-            k = m - j;
-            xr = a[j] + a[n - j];
-            xi = a[j] - a[n - j];
-            yr = a[k] + a[n - k];
-            yi = a[k] - a[n - k];
-            a[j] = xr;
-            a[k] = yr;
-            t[j] = xi + yi;
-            t[k] = xi - yi;
-        }
-        t[0] = a[mh] - a[n - mh];
-        a[mh] += a[n - mh];
-        a[0] = a[m];
-        dstsub(m, a, nc, w + nw);
-        if (m > 4) {
-            cftfsub(m, a, ip, nw, w);
-            rftfsub(m, a, nc, w + nw);
-        } else if (m == 4) {
-            cftfsub(m, a, ip, nw, w);
-        }
-        a[n - 1] = a[1] - a[0];
-        a[1] = a[0] + a[1];
-        for (j = m - 2; j >= 2; j -= 2) {
-            a[2 * j + 1] = a[j] - a[j + 1];
-            a[2 * j - 1] = -a[j] - a[j + 1];
-        }
-        l = 2;
-        m = mh;
-        while (m >= 2) {
-            dstsub(m, t, nc, w + nw);
-            if (m > 4) {
-                cftfsub(m, t, ip, nw, w);
-                rftfsub(m, t, nc, w + nw);
-            } else if (m == 4) {
-                cftfsub(m, t, ip, nw, w);
-            }
-            a[n - l] = t[1] - t[0];
-            a[l] = t[0] + t[1];
-            k = 0;
-            for (j = 2; j < m; j += 2) {
-                k += l << 2;
-                a[k - l] = -t[j] - t[j + 1];
-                a[k + l] = t[j] - t[j + 1];
-            }
-            l <<= 1;
-            mh = m >> 1;
-            for (j = 1; j < mh; j++) {
-                k = m - j;
-                t[j] = t[m + k] + t[m + j];
-                t[k] = t[m + k] - t[m + j];
-            }
-            t[0] = t[m + mh];
-            m = mh;
-        }
-        a[l] = t[0];
-    }
-    a[0] = 0;
-}
-
-
-/* -------- initializing routines -------- */
-
-
-#include <math.h>
-
-void makewt(int nw, int *ip, double *w)
-{
-    void makeipt(int nw, int *ip);
-    int j, nwh, nw0, nw1;
-    double delta, wn4r, wk1r, wk1i, wk3r, wk3i;
-    
-    ip[0] = nw;
-    ip[1] = 1;
-    if (nw > 2) {
-        nwh = nw >> 1;
-        delta = atan(1.0) / nwh;
-        wn4r = cos(delta * nwh);
-        w[0] = 1;
-        w[1] = wn4r;
-        if (nwh == 4) {
-            w[2] = cos(delta * 2);
-            w[3] = sin(delta * 2);
-        } else if (nwh > 4) {
-            makeipt(nw, ip);
-            w[2] = 0.5 / cos(delta * 2);
-            w[3] = 0.5 / cos(delta * 6);
-            for (j = 4; j < nwh; j += 4) {
-                w[j] = cos(delta * j);
-                w[j + 1] = sin(delta * j);
-                w[j + 2] = cos(3 * delta * j);
-                w[j + 3] = -sin(3 * delta * j);
-            }
-        }
-        nw0 = 0;
-        while (nwh > 2) {
-            nw1 = nw0 + nwh;
-            nwh >>= 1;
-            w[nw1] = 1;
-            w[nw1 + 1] = wn4r;
-            if (nwh == 4) {
-                wk1r = w[nw0 + 4];
-                wk1i = w[nw0 + 5];
-                w[nw1 + 2] = wk1r;
-                w[nw1 + 3] = wk1i;
-            } else if (nwh > 4) {
-                wk1r = w[nw0 + 4];
-                wk3r = w[nw0 + 6];
-                w[nw1 + 2] = 0.5 / wk1r;
-                w[nw1 + 3] = 0.5 / wk3r;
-                for (j = 4; j < nwh; j += 4) {
-                    wk1r = w[nw0 + 2 * j];
-                    wk1i = w[nw0 + 2 * j + 1];
-                    wk3r = w[nw0 + 2 * j + 2];
-                    wk3i = w[nw0 + 2 * j + 3];
-                    w[nw1 + j] = wk1r;
-                    w[nw1 + j + 1] = wk1i;
-                    w[nw1 + j + 2] = wk3r;
-                    w[nw1 + j + 3] = wk3i;
-                }
-            }
-            nw0 = nw1;
-        }
-    }
-}
-
-
-void makeipt(int nw, int *ip)
-{
-    int j, l, m, m2, p, q;
-    
-    ip[2] = 0;
-    ip[3] = 16;
-    m = 2;
-    for (l = nw; l > 32; l >>= 2) {
-        m2 = m << 1;
-        q = m2 << 3;
-        for (j = m; j < m2; j++) {
-            p = ip[j] << 2;
-            ip[m + j] = p;
-            ip[m2 + j] = p + q;
-        }
-        m = m2;
-    }
-}
-
-
-void makect(int nc, int *ip, double *c)
-{
-    int j, nch;
-    double delta;
-    
-    ip[1] = nc;
-    if (nc > 1) {
-        nch = nc >> 1;
-        delta = atan(1.0) / nch;
-        c[0] = cos(delta * nch);
-        c[nch] = 0.5 * c[0];
-        for (j = 1; j < nch; j++) {
-            c[j] = 0.5 * cos(delta * j);
-            c[nc - j] = 0.5 * sin(delta * j);
-        }
-    }
-}
-
-
-/* -------- child routines -------- */
-
-
-#ifdef USE_CDFT_PTHREADS
-#define USE_CDFT_THREADS
-#ifndef CDFT_THREADS_BEGIN_N
-#define CDFT_THREADS_BEGIN_N 8192
-#endif
-#ifndef CDFT_4THREADS_BEGIN_N
-#define CDFT_4THREADS_BEGIN_N 65536
-#endif
-#include <pthread.h>
-#include <stdio.h>
-#include <stdlib.h>
-#define cdft_thread_t pthread_t
-#define cdft_thread_create(thp,func,argp) { \
-    if (pthread_create(thp, NULL, func, (void *) argp) != 0) { \
-        fprintf(stderr, "cdft thread error\n"); \
-        exit(1); \
-    } \
-}
-#define cdft_thread_wait(th) { \
-    if (pthread_join(th, NULL) != 0) { \
-        fprintf(stderr, "cdft thread error\n"); \
-        exit(1); \
-    } \
-}
-#endif /* USE_CDFT_PTHREADS */
-
-
-#ifdef USE_CDFT_WINTHREADS
-#define USE_CDFT_THREADS
-#ifndef CDFT_THREADS_BEGIN_N
-#define CDFT_THREADS_BEGIN_N 32768
-#endif
-#ifndef CDFT_4THREADS_BEGIN_N
-#define CDFT_4THREADS_BEGIN_N 524288
-#endif
-#include <windows.h>
-#include <stdio.h>
-#include <stdlib.h>
-#define cdft_thread_t HANDLE
-#define cdft_thread_create(thp,func,argp) { \
-    DWORD thid; \
-    *(thp) = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) func, (LPVOID) argp, 0, &thid); \
-    if (*(thp) == 0) { \
-        fprintf(stderr, "cdft thread error\n"); \
-        exit(1); \
-    } \
-}
-#define cdft_thread_wait(th) { \
-    WaitForSingleObject(th, INFINITE); \
-    CloseHandle(th); \
-}
-#endif /* USE_CDFT_WINTHREADS */
-
-
-void cftfsub(int n, double *a, int *ip, int nw, double *w)
-{
-    void bitrv2(int n, int *ip, double *a);
-    void bitrv216(double *a);
-    void bitrv208(double *a);
-    void cftf1st(int n, double *a, double *w);
-    void cftrec4(int n, double *a, int nw, double *w);
-    void cftleaf(int n, int isplt, double *a, int nw, double *w);
-    void cftfx41(int n, double *a, int nw, double *w);
-    void cftf161(double *a, double *w);
-    void cftf081(double *a, double *w);
-    void cftf040(double *a);
-    void cftx020(double *a);
-#ifdef USE_CDFT_THREADS
-    void cftrec4_th(int n, double *a, int nw, double *w);
-#endif /* USE_CDFT_THREADS */
-    
-    if (n > 8) {
-        if (n > 32) {
-            cftf1st(n, a, &w[nw - (n >> 2)]);
-#ifdef USE_CDFT_THREADS
-            if (n > CDFT_THREADS_BEGIN_N) {
-                cftrec4_th(n, a, nw, w);
-            } else 
-#endif /* USE_CDFT_THREADS */
-            if (n > 512) {
-                cftrec4(n, a, nw, w);
-            } else if (n > 128) {
-                cftleaf(n, 1, a, nw, w);
-            } else {
-                cftfx41(n, a, nw, w);
-            }
-            bitrv2(n, ip, a);
-        } else if (n == 32) {
-            cftf161(a, &w[nw - 8]);
-            bitrv216(a);
-        } else {
-            cftf081(a, w);
-            bitrv208(a);
-        }
-    } else if (n == 8) {
-        cftf040(a);
-    } else if (n == 4) {
-        cftx020(a);
-    }
-}
-
-
-void cftbsub(int n, double *a, int *ip, int nw, double *w)
-{
-    void bitrv2conj(int n, int *ip, double *a);
-    void bitrv216neg(double *a);
-    void bitrv208neg(double *a);
-    void cftb1st(int n, double *a, double *w);
-    void cftrec4(int n, double *a, int nw, double *w);
-    void cftleaf(int n, int isplt, double *a, int nw, double *w);
-    void cftfx41(int n, double *a, int nw, double *w);
-    void cftf161(double *a, double *w);
-    void cftf081(double *a, double *w);
-    void cftb040(double *a);
-    void cftx020(double *a);
-#ifdef USE_CDFT_THREADS
-    void cftrec4_th(int n, double *a, int nw, double *w);
-#endif /* USE_CDFT_THREADS */
-    
-    if (n > 8) {
-        if (n > 32) {
-            cftb1st(n, a, &w[nw - (n >> 2)]);
-#ifdef USE_CDFT_THREADS
-            if (n > CDFT_THREADS_BEGIN_N) {
-                cftrec4_th(n, a, nw, w);
-            } else 
-#endif /* USE_CDFT_THREADS */
-            if (n > 512) {
-                cftrec4(n, a, nw, w);
-            } else if (n > 128) {
-                cftleaf(n, 1, a, nw, w);
-            } else {
-                cftfx41(n, a, nw, w);
-            }
-            bitrv2conj(n, ip, a);
-        } else if (n == 32) {
-            cftf161(a, &w[nw - 8]);
-            bitrv216neg(a);
-        } else {
-            cftf081(a, w);
-            bitrv208neg(a);
-        }
-    } else if (n == 8) {
-        cftb040(a);
-    } else if (n == 4) {
-        cftx020(a);
-    }
-}
-
-
-void bitrv2(int n, int *ip, double *a)
-{
-    int j, j1, k, k1, l, m, nh, nm;
-    double xr, xi, yr, yi;
-    
-    m = 1;
-    for (l = n >> 2; l > 8; l >>= 2) {
-        m <<= 1;
-    }
-    nh = n >> 1;
-    nm = 4 * m;
-    if (l == 8) {
-        for (k = 0; k < m; k++) {
-            for (j = 0; j < k; j++) {
-                j1 = 4 * j + 2 * ip[m + k];
-                k1 = 4 * k + 2 * ip[m + j];
-                xr = a[j1];
-                xi = a[j1 + 1];
-                yr = a[k1];
-                yi = a[k1 + 1];
-                a[j1] = yr;
-                a[j1 + 1] = yi;
-                a[k1] = xr;
-                a[k1 + 1] = xi;
-                j1 += nm;
-                k1 += 2 * nm;
-                xr = a[j1];
-                xi = a[j1 + 1];
-                yr = a[k1];
-                yi = a[k1 + 1];
-                a[j1] = yr;
-                a[j1 + 1] = yi;
-                a[k1] = xr;
-                a[k1 + 1] = xi;
-                j1 += nm;
-                k1 -= nm;
-                xr = a[j1];
-                xi = a[j1 + 1];
-                yr = a[k1];
-                yi = a[k1 + 1];
-                a[j1] = yr;
-                a[j1 + 1] = yi;
-                a[k1] = xr;
-                a[k1 + 1] = xi;
-                j1 += nm;
-                k1 += 2 * nm;
-                xr = a[j1];
-                xi = a[j1 + 1];
-                yr = a[k1];
-                yi = a[k1 + 1];
-                a[j1] = yr;
-                a[j1 + 1] = yi;
-                a[k1] = xr;
-                a[k1 + 1] = xi;
-                j1 += nh;
-                k1 += 2;
-                xr = a[j1];
-                xi = a[j1 + 1];
-                yr = a[k1];
-                yi = a[k1 + 1];
-                a[j1] = yr;
-                a[j1 + 1] = yi;
-                a[k1] = xr;
-                a[k1 + 1] = xi;
-                j1 -= nm;
-                k1 -= 2 * nm;
-                xr = a[j1];
-                xi = a[j1 + 1];
-                yr = a[k1];
-                yi = a[k1 + 1];
-                a[j1] = yr;
-                a[j1 + 1] = yi;
-                a[k1] = xr;
-                a[k1 + 1] = xi;
-                j1 -= nm;
-                k1 += nm;
-                xr = a[j1];
-                xi = a[j1 + 1];
-                yr = a[k1];
-                yi = a[k1 + 1];
-                a[j1] = yr;
-                a[j1 + 1] = yi;
-                a[k1] = xr;
-                a[k1 + 1] = xi;
-                j1 -= nm;
-                k1 -= 2 * nm;
-                xr = a[j1];
-                xi = a[j1 + 1];
-                yr = a[k1];
-                yi = a[k1 + 1];
-                a[j1] = yr;
-                a[j1 + 1] = yi;
-                a[k1] = xr;
-                a[k1 + 1] = xi;
-                j1 += 2;
-                k1 += nh;
-                xr = a[j1];
-                xi = a[j1 + 1];
-                yr = a[k1];
-                yi = a[k1 + 1];
-                a[j1] = yr;
-                a[j1 + 1] = yi;
-                a[k1] = xr;
-                a[k1 + 1] = xi;
-                j1 += nm;
-                k1 += 2 * nm;
-                xr = a[j1];
-                xi = a[j1 + 1];
-                yr = a[k1];
-                yi = a[k1 + 1];
-                a[j1] = yr;
-                a[j1 + 1] = yi;
-                a[k1] = xr;
-                a[k1 + 1] = xi;
-                j1 += nm;
-                k1 -= nm;
-                xr = a[j1];
-                xi = a[j1 + 1];
-                yr = a[k1];
-                yi = a[k1 + 1];
-                a[j1] = yr;
-                a[j1 + 1] = yi;
-                a[k1] = xr;
-                a[k1 + 1] = xi;
-                j1 += nm;
-                k1 += 2 * nm;
-                xr = a[j1];
-                xi = a[j1 + 1];
-                yr = a[k1];
-                yi = a[k1 + 1];
-                a[j1] = yr;
-                a[j1 + 1] = yi;
-                a[k1] = xr;
-                a[k1 + 1] = xi;
-                j1 -= nh;
-                k1 -= 2;
-                xr = a[j1];
-                xi = a[j1 + 1];
-                yr = a[k1];
-                yi = a[k1 + 1];
-                a[j1] = yr;
-                a[j1 + 1] = yi;
-                a[k1] = xr;
-                a[k1 + 1] = xi;
-                j1 -= nm;
-                k1 -= 2 * nm;
-                xr = a[j1];
-                xi = a[j1 + 1];
-                yr = a[k1];
-                yi = a[k1 + 1];
-                a[j1] = yr;
-                a[j1 + 1] = yi;
-                a[k1] = xr;
-                a[k1 + 1] = xi;
-                j1 -= nm;
-                k1 += nm;
-                xr = a[j1];
-                xi = a[j1 + 1];
-                yr = a[k1];
-                yi = a[k1 + 1];
-                a[j1] = yr;
-                a[j1 + 1] = yi;
-                a[k1] = xr;
-                a[k1 + 1] = xi;
-                j1 -= nm;
-                k1 -= 2 * nm;
-                xr = a[j1];
-                xi = a[j1 + 1];
-                yr = a[k1];
-                yi = a[k1 + 1];
-                a[j1] = yr;
-                a[j1 + 1] = yi;
-                a[k1] = xr;
-                a[k1 + 1] = xi;
-            }
-            k1 = 4 * k + 2 * ip[m + k];
-            j1 = k1 + 2;
-            k1 += nh;
-            xr = a[j1];
-            xi = a[j1 + 1];
-            yr = a[k1];
-            yi = a[k1 + 1];
-            a[j1] = yr;
-            a[j1 + 1] = yi;
-            a[k1] = xr;
-            a[k1 + 1] = xi;
-            j1 += nm;
-            k1 += 2 * nm;
-            xr = a[j1];
-            xi = a[j1 + 1];
-            yr = a[k1];
-            yi = a[k1 + 1];
-            a[j1] = yr;
-            a[j1 + 1] = yi;
-            a[k1] = xr;
-            a[k1 + 1] = xi;
-            j1 += nm;
-            k1 -= nm;
-            xr = a[j1];
-            xi = a[j1 + 1];
-            yr = a[k1];
-            yi = a[k1 + 1];
-            a[j1] = yr;
-            a[j1 + 1] = yi;
-            a[k1] = xr;
-            a[k1 + 1] = xi;
-            j1 -= 2;
-            k1 -= nh;
-            xr = a[j1];
-            xi = a[j1 + 1];
-            yr = a[k1];
-            yi = a[k1 + 1];
-            a[j1] = yr;
-            a[j1 + 1] = yi;
-            a[k1] = xr;
-            a[k1 + 1] = xi;
-            j1 += nh + 2;
-            k1 += nh + 2;
-            xr = a[j1];
-            xi = a[j1 + 1];
-            yr = a[k1];
-            yi = a[k1 + 1];
-            a[j1] = yr;
-            a[j1 + 1] = yi;
-            a[k1] = xr;
-            a[k1 + 1] = xi;
-            j1 -= nh - nm;
-            k1 += 2 * nm - 2;
-            xr = a[j1];
-            xi = a[j1 + 1];
-            yr = a[k1];
-            yi = a[k1 + 1];
-            a[j1] = yr;
-            a[j1 + 1] = yi;
-            a[k1] = xr;
-            a[k1 + 1] = xi;
-        }
-    } else {
-        for (k = 0; k < m; k++) {
-            for (j = 0; j < k; j++) {
-                j1 = 4 * j + ip[m + k];
-                k1 = 4 * k + ip[m + j];
-                xr = a[j1];
-                xi = a[j1 + 1];
-                yr = a[k1];
-                yi = a[k1 + 1];
-                a[j1] = yr;
-                a[j1 + 1] = yi;
-                a[k1] = xr;
-                a[k1 + 1] = xi;
-                j1 += nm;
-                k1 += nm;
-                xr = a[j1];
-                xi = a[j1 + 1];
-                yr = a[k1];
-                yi = a[k1 + 1];
-                a[j1] = yr;
-                a[j1 + 1] = yi;
-                a[k1] = xr;
-                a[k1 + 1] = xi;
-                j1 += nh;
-                k1 += 2;
-                xr = a[j1];
-                xi = a[j1 + 1];
-                yr = a[k1];
-                yi = a[k1 + 1];
-                a[j1] = yr;
-                a[j1 + 1] = yi;
-                a[k1] = xr;
-                a[k1 + 1] = xi;
-                j1 -= nm;
-                k1 -= nm;
-                xr = a[j1];
-                xi = a[j1 + 1];
-                yr = a[k1];
-                yi = a[k1 + 1];
-                a[j1] = yr;
-                a[j1 + 1] = yi;
-                a[k1] = xr;
-                a[k1 + 1] = xi;
-                j1 += 2;
-                k1 += nh;
-                xr = a[j1];
-                xi = a[j1 + 1];
-                yr = a[k1];
-                yi = a[k1 + 1];
-                a[j1] = yr;
-                a[j1 + 1] = yi;
-                a[k1] = xr;
-                a[k1 + 1] = xi;
-                j1 += nm;
-                k1 += nm;
-                xr = a[j1];
-                xi = a[j1 + 1];
-                yr = a[k1];
-                yi = a[k1 + 1];
-                a[j1] = yr;
-                a[j1 + 1] = yi;
-                a[k1] = xr;
-                a[k1 + 1] = xi;
-                j1 -= nh;
-                k1 -= 2;
-                xr = a[j1];
-                xi = a[j1 + 1];
-                yr = a[k1];
-                yi = a[k1 + 1];
-                a[j1] = yr;
-                a[j1 + 1] = yi;
-                a[k1] = xr;
-                a[k1 + 1] = xi;
-                j1 -= nm;
-                k1 -= nm;
-                xr = a[j1];
-                xi = a[j1 + 1];
-                yr = a[k1];
-                yi = a[k1 + 1];
-                a[j1] = yr;
-                a[j1 + 1] = yi;
-                a[k1] = xr;
-                a[k1 + 1] = xi;
-            }
-            k1 = 4 * k + ip[m + k];
-            j1 = k1 + 2;
-            k1 += nh;
-            xr = a[j1];
-            xi = a[j1 + 1];
-            yr = a[k1];
-            yi = a[k1 + 1];
-            a[j1] = yr;
-            a[j1 + 1] = yi;
-            a[k1] = xr;
-            a[k1 + 1] = xi;
-            j1 += nm;
-            k1 += nm;
-            xr = a[j1];
-            xi = a[j1 + 1];
-            yr = a[k1];
-            yi = a[k1 + 1];
-            a[j1] = yr;
-            a[j1 + 1] = yi;
-            a[k1] = xr;
-            a[k1 + 1] = xi;
-        }
-    }
-}
-
-
-void bitrv2conj(int n, int *ip, double *a)
-{
-    int j, j1, k, k1, l, m, nh, nm;
-    double xr, xi, yr, yi;
-    
-    m = 1;
-    for (l = n >> 2; l > 8; l >>= 2) {
-        m <<= 1;
-    }
-    nh = n >> 1;
-    nm = 4 * m;
-    if (l == 8) {
-        for (k = 0; k < m; k++) {
-            for (j = 0; j < k; j++) {
-                j1 = 4 * j + 2 * ip[m + k];
-                k1 = 4 * k + 2 * ip[m + j];
-                xr = a[j1];
-                xi = -a[j1 + 1];
-                yr = a[k1];
-                yi = -a[k1 + 1];
-                a[j1] = yr;
-                a[j1 + 1] = yi;
-                a[k1] = xr;
-                a[k1 + 1] = xi;
-                j1 += nm;
-                k1 += 2 * nm;
-                xr = a[j1];
-                xi = -a[j1 + 1];
-                yr = a[k1];
-                yi = -a[k1 + 1];
-                a[j1] = yr;
-                a[j1 + 1] = yi;
-                a[k1] = xr;
-                a[k1 + 1] = xi;
-                j1 += nm;
-                k1 -= nm;
-                xr = a[j1];
-                xi = -a[j1 + 1];
-                yr = a[k1];
-                yi = -a[k1 + 1];
-                a[j1] = yr;
-                a[j1 + 1] = yi;
-                a[k1] = xr;
-                a[k1 + 1] = xi;
-                j1 += nm;
-                k1 += 2 * nm;
-                xr = a[j1];
-                xi = -a[j1 + 1];
-                yr = a[k1];
-                yi = -a[k1 + 1];
-                a[j1] = yr;
-                a[j1 + 1] = yi;
-                a[k1] = xr;
-                a[k1 + 1] = xi;
-                j1 += nh;
-                k1 += 2;
-                xr = a[j1];
-                xi = -a[j1 + 1];
-                yr = a[k1];
-                yi = -a[k1 + 1];
-                a[j1] = yr;
-                a[j1 + 1] = yi;
-                a[k1] = xr;
-                a[k1 + 1] = xi;
-                j1 -= nm;
-                k1 -= 2 * nm;
-                xr = a[j1];
-                xi = -a[j1 + 1];
-                yr = a[k1];
-                yi = -a[k1 + 1];
-                a[j1] = yr;
-                a[j1 + 1] = yi;
-                a[k1] = xr;
-                a[k1 + 1] = xi;
-                j1 -= nm;
-                k1 += nm;
-                xr = a[j1];
-                xi = -a[j1 + 1];
-                yr = a[k1];
-                yi = -a[k1 + 1];
-                a[j1] = yr;
-                a[j1 + 1] = yi;
-                a[k1] = xr;
-                a[k1 + 1] = xi;
-                j1 -= nm;
-                k1 -= 2 * nm;
-                xr = a[j1];
-                xi = -a[j1 + 1];
-                yr = a[k1];
-                yi = -a[k1 + 1];
-                a[j1] = yr;
-                a[j1 + 1] = yi;
-                a[k1] = xr;
-                a[k1 + 1] = xi;
-                j1 += 2;
-                k1 += nh;
-                xr = a[j1];
-                xi = -a[j1 + 1];
-                yr = a[k1];
-                yi = -a[k1 + 1];
-                a[j1] = yr;
-                a[j1 + 1] = yi;
-                a[k1] = xr;
-                a[k1 + 1] = xi;
-                j1 += nm;
-                k1 += 2 * nm;
-                xr = a[j1];
-                xi = -a[j1 + 1];
-                yr = a[k1];
-                yi = -a[k1 + 1];
-                a[j1] = yr;
-                a[j1 + 1] = yi;
-                a[k1] = xr;
-                a[k1 + 1] = xi;
-                j1 += nm;
-                k1 -= nm;
-                xr = a[j1];
-                xi = -a[j1 + 1];
-                yr = a[k1];
-                yi = -a[k1 + 1];
-                a[j1] = yr;
-                a[j1 + 1] = yi;
-                a[k1] = xr;
-                a[k1 + 1] = xi;
-                j1 += nm;
-                k1 += 2 * nm;
-                xr = a[j1];
-                xi = -a[j1 + 1];
-                yr = a[k1];
-                yi = -a[k1 + 1];
-                a[j1] = yr;
-                a[j1 + 1] = yi;
-                a[k1] = xr;
-                a[k1 + 1] = xi;
-                j1 -= nh;
-                k1 -= 2;
-                xr = a[j1];
-                xi = -a[j1 + 1];
-                yr = a[k1];
-                yi = -a[k1 + 1];
-                a[j1] = yr;
-                a[j1 + 1] = yi;
-                a[k1] = xr;
-                a[k1 + 1] = xi;
-                j1 -= nm;
-                k1 -= 2 * nm;
-                xr = a[j1];
-                xi = -a[j1 + 1];
-                yr = a[k1];
-                yi = -a[k1 + 1];
-                a[j1] = yr;
-                a[j1 + 1] = yi;
-                a[k1] = xr;
-                a[k1 + 1] = xi;
-                j1 -= nm;
-                k1 += nm;
-                xr = a[j1];
-                xi = -a[j1 + 1];
-                yr = a[k1];
-                yi = -a[k1 + 1];
-                a[j1] = yr;
-                a[j1 + 1] = yi;
-                a[k1] = xr;
-                a[k1 + 1] = xi;
-                j1 -= nm;
-                k1 -= 2 * nm;
-                xr = a[j1];
-                xi = -a[j1 + 1];
-                yr = a[k1];
-                yi = -a[k1 + 1];
-                a[j1] = yr;
-                a[j1 + 1] = yi;
-                a[k1] = xr;
-                a[k1 + 1] = xi;
-            }
-            k1 = 4 * k + 2 * ip[m + k];
-            j1 = k1 + 2;
-            k1 += nh;
-            a[j1 - 1] = -a[j1 - 1];
-            xr = a[j1];
-            xi = -a[j1 + 1];
-            yr = a[k1];
-            yi = -a[k1 + 1];
-            a[j1] = yr;
-            a[j1 + 1] = yi;
-            a[k1] = xr;
-            a[k1 + 1] = xi;
-            a[k1 + 3] = -a[k1 + 3];
-            j1 += nm;
-            k1 += 2 * nm;
-            xr = a[j1];
-            xi = -a[j1 + 1];
-            yr = a[k1];
-            yi = -a[k1 + 1];
-            a[j1] = yr;
-            a[j1 + 1] = yi;
-            a[k1] = xr;
-            a[k1 + 1] = xi;
-            j1 += nm;
-            k1 -= nm;
-            xr = a[j1];
-            xi = -a[j1 + 1];
-            yr = a[k1];
-            yi = -a[k1 + 1];
-            a[j1] = yr;
-            a[j1 + 1] = yi;
-            a[k1] = xr;
-            a[k1 + 1] = xi;
-            j1 -= 2;
-            k1 -= nh;
-            xr = a[j1];
-            xi = -a[j1 + 1];
-            yr = a[k1];
-            yi = -a[k1 + 1];
-            a[j1] = yr;
-            a[j1 + 1] = yi;
-            a[k1] = xr;
-            a[k1 + 1] = xi;
-            j1 += nh + 2;
-            k1 += nh + 2;
-            xr = a[j1];
-            xi = -a[j1 + 1];
-            yr = a[k1];
-            yi = -a[k1 + 1];
-            a[j1] = yr;
-            a[j1 + 1] = yi;
-            a[k1] = xr;
-            a[k1 + 1] = xi;
-            j1 -= nh - nm;
-            k1 += 2 * nm - 2;
-            a[j1 - 1] = -a[j1 - 1];
-            xr = a[j1];
-            xi = -a[j1 + 1];
-            yr = a[k1];
-            yi = -a[k1 + 1];
-            a[j1] = yr;
-            a[j1 + 1] = yi;
-            a[k1] = xr;
-            a[k1 + 1] = xi;
-            a[k1 + 3] = -a[k1 + 3];
-        }
-    } else {
-        for (k = 0; k < m; k++) {
-            for (j = 0; j < k; j++) {
-                j1 = 4 * j + ip[m + k];
-                k1 = 4 * k + ip[m + j];
-                xr = a[j1];
-                xi = -a[j1 + 1];
-                yr = a[k1];
-                yi = -a[k1 + 1];
-                a[j1] = yr;
-                a[j1 + 1] = yi;
-                a[k1] = xr;
-                a[k1 + 1] = xi;
-                j1 += nm;
-                k1 += nm;
-                xr = a[j1];
-                xi = -a[j1 + 1];
-                yr = a[k1];
-                yi = -a[k1 + 1];
-                a[j1] = yr;
-                a[j1 + 1] = yi;
-                a[k1] = xr;
-                a[k1 + 1] = xi;
-                j1 += nh;
-                k1 += 2;
-                xr = a[j1];
-                xi = -a[j1 + 1];
-                yr = a[k1];
-                yi = -a[k1 + 1];
-                a[j1] = yr;
-                a[j1 + 1] = yi;
-                a[k1] = xr;
-                a[k1 + 1] = xi;
-                j1 -= nm;
-                k1 -= nm;
-                xr = a[j1];
-                xi = -a[j1 + 1];
-                yr = a[k1];
-                yi = -a[k1 + 1];
-                a[j1] = yr;
-                a[j1 + 1] = yi;
-                a[k1] = xr;
-                a[k1 + 1] = xi;
-                j1 += 2;
-                k1 += nh;
-                xr = a[j1];
-                xi = -a[j1 + 1];
-                yr = a[k1];
-                yi = -a[k1 + 1];
-                a[j1] = yr;
-                a[j1 + 1] = yi;
-                a[k1] = xr;
-                a[k1 + 1] = xi;
-                j1 += nm;
-                k1 += nm;
-                xr = a[j1];
-                xi = -a[j1 + 1];
-                yr = a[k1];
-                yi = -a[k1 + 1];
-                a[j1] = yr;
-                a[j1 + 1] = yi;
-                a[k1] = xr;
-                a[k1 + 1] = xi;
-                j1 -= nh;
-                k1 -= 2;
-                xr = a[j1];
-                xi = -a[j1 + 1];
-                yr = a[k1];
-                yi = -a[k1 + 1];
-                a[j1] = yr;
-                a[j1 + 1] = yi;
-                a[k1] = xr;
-                a[k1 + 1] = xi;
-                j1 -= nm;
-                k1 -= nm;
-                xr = a[j1];
-                xi = -a[j1 + 1];
-                yr = a[k1];
-                yi = -a[k1 + 1];
-                a[j1] = yr;
-                a[j1 + 1] = yi;
-                a[k1] = xr;
-                a[k1 + 1] = xi;
-            }
-            k1 = 4 * k + ip[m + k];
-            j1 = k1 + 2;
-            k1 += nh;
-            a[j1 - 1] = -a[j1 - 1];
-            xr = a[j1];
-            xi = -a[j1 + 1];
-            yr = a[k1];
-            yi = -a[k1 + 1];
-            a[j1] = yr;
-            a[j1 + 1] = yi;
-            a[k1] = xr;
-            a[k1 + 1] = xi;
-            a[k1 + 3] = -a[k1 + 3];
-            j1 += nm;
-            k1 += nm;
-            a[j1 - 1] = -a[j1 - 1];
-            xr = a[j1];
-            xi = -a[j1 + 1];
-            yr = a[k1];
-            yi = -a[k1 + 1];
-            a[j1] = yr;
-            a[j1 + 1] = yi;
-            a[k1] = xr;
-            a[k1 + 1] = xi;
-            a[k1 + 3] = -a[k1 + 3];
-        }
-    }
-}
-
-
-void bitrv216(double *a)
-{
-    double x1r, x1i, x2r, x2i, x3r, x3i, x4r, x4i, 
-        x5r, x5i, x7r, x7i, x8r, x8i, x10r, x10i, 
-        x11r, x11i, x12r, x12i, x13r, x13i, x14r, x14i;
-    
-    x1r = a[2];
-    x1i = a[3];
-    x2r = a[4];
-    x2i = a[5];
-    x3r = a[6];
-    x3i = a[7];
-    x4r = a[8];
-    x4i = a[9];
-    x5r = a[10];
-    x5i = a[11];
-    x7r = a[14];
-    x7i = a[15];
-    x8r = a[16];
-    x8i = a[17];
-    x10r = a[20];
-    x10i = a[21];
-    x11r = a[22];
-    x11i = a[23];
-    x12r = a[24];
-    x12i = a[25];
-    x13r = a[26];
-    x13i = a[27];
-    x14r = a[28];
-    x14i = a[29];
-    a[2] = x8r;
-    a[3] = x8i;
-    a[4] = x4r;
-    a[5] = x4i;
-    a[6] = x12r;
-    a[7] = x12i;
-    a[8] = x2r;
-    a[9] = x2i;
-    a[10] = x10r;
-    a[11] = x10i;
-    a[14] = x14r;
-    a[15] = x14i;
-    a[16] = x1r;
-    a[17] = x1i;
-    a[20] = x5r;
-    a[21] = x5i;
-    a[22] = x13r;
-    a[23] = x13i;
-    a[24] = x3r;
-    a[25] = x3i;
-    a[26] = x11r;
-    a[27] = x11i;
-    a[28] = x7r;
-    a[29] = x7i;
-}
-
-
-void bitrv216neg(double *a)
-{
-    double x1r, x1i, x2r, x2i, x3r, x3i, x4r, x4i, 
-        x5r, x5i, x6r, x6i, x7r, x7i, x8r, x8i, 
-        x9r, x9i, x10r, x10i, x11r, x11i, x12r, x12i, 
-        x13r, x13i, x14r, x14i, x15r, x15i;
-    
-    x1r = a[2];
-    x1i = a[3];
-    x2r = a[4];
-    x2i = a[5];
-    x3r = a[6];
-    x3i = a[7];
-    x4r = a[8];
-    x4i = a[9];
-    x5r = a[10];
-    x5i = a[11];
-    x6r = a[12];
-    x6i = a[13];
-    x7r = a[14];
-    x7i = a[15];
-    x8r = a[16];
-    x8i = a[17];
-    x9r = a[18];
-    x9i = a[19];
-    x10r = a[20];
-    x10i = a[21];
-    x11r = a[22];
-    x11i = a[23];
-    x12r = a[24];
-    x12i = a[25];
-    x13r = a[26];
-    x13i = a[27];
-    x14r = a[28];
-    x14i = a[29];
-    x15r = a[30];
-    x15i = a[31];
-    a[2] = x15r;
-    a[3] = x15i;
-    a[4] = x7r;
-    a[5] = x7i;
-    a[6] = x11r;
-    a[7] = x11i;
-    a[8] = x3r;
-    a[9] = x3i;
-    a[10] = x13r;
-    a[11] = x13i;
-    a[12] = x5r;
-    a[13] = x5i;
-    a[14] = x9r;
-    a[15] = x9i;
-    a[16] = x1r;
-    a[17] = x1i;
-    a[18] = x14r;
-    a[19] = x14i;
-    a[20] = x6r;
-    a[21] = x6i;
-    a[22] = x10r;
-    a[23] = x10i;
-    a[24] = x2r;
-    a[25] = x2i;
-    a[26] = x12r;
-    a[27] = x12i;
-    a[28] = x4r;
-    a[29] = x4i;
-    a[30] = x8r;
-    a[31] = x8i;
-}
-
-
-void bitrv208(double *a)
-{
-    double x1r, x1i, x3r, x3i, x4r, x4i, x6r, x6i;
-    
-    x1r = a[2];
-    x1i = a[3];
-    x3r = a[6];
-    x3i = a[7];
-    x4r = a[8];
-    x4i = a[9];
-    x6r = a[12];
-    x6i = a[13];
-    a[2] = x4r;
-    a[3] = x4i;
-    a[6] = x6r;
-    a[7] = x6i;
-    a[8] = x1r;
-    a[9] = x1i;
-    a[12] = x3r;
-    a[13] = x3i;
-}
-
-
-void bitrv208neg(double *a)
-{
-    double x1r, x1i, x2r, x2i, x3r, x3i, x4r, x4i, 
-        x5r, x5i, x6r, x6i, x7r, x7i;
-    
-    x1r = a[2];
-    x1i = a[3];
-    x2r = a[4];
-    x2i = a[5];
-    x3r = a[6];
-    x3i = a[7];
-    x4r = a[8];
-    x4i = a[9];
-    x5r = a[10];
-    x5i = a[11];
-    x6r = a[12];
-    x6i = a[13];
-    x7r = a[14];
-    x7i = a[15];
-    a[2] = x7r;
-    a[3] = x7i;
-    a[4] = x3r;
-    a[5] = x3i;
-    a[6] = x5r;
-    a[7] = x5i;
-    a[8] = x1r;
-    a[9] = x1i;
-    a[10] = x6r;
-    a[11] = x6i;
-    a[12] = x2r;
-    a[13] = x2i;
-    a[14] = x4r;
-    a[15] = x4i;
-}
-
-
-void cftf1st(int n, double *a, double *w)
-{
-    int j, j0, j1, j2, j3, k, m, mh;
-    double wn4r, csc1, csc3, wk1r, wk1i, wk3r, wk3i, 
-        wd1r, wd1i, wd3r, wd3i;
-    double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i, 
-        y0r, y0i, y1r, y1i, y2r, y2i, y3r, y3i;
-    
-    mh = n >> 3;
-    m = 2 * mh;
-    j1 = m;
-    j2 = j1 + m;
-    j3 = j2 + m;
-    x0r = a[0] + a[j2];
-    x0i = a[1] + a[j2 + 1];
-    x1r = a[0] - a[j2];
-    x1i = a[1] - a[j2 + 1];
-    x2r = a[j1] + a[j3];
-    x2i = a[j1 + 1] + a[j3 + 1];
-    x3r = a[j1] - a[j3];
-    x3i = a[j1 + 1] - a[j3 + 1];
-    a[0] = x0r + x2r;
-    a[1] = x0i + x2i;
-    a[j1] = x0r - x2r;
-    a[j1 + 1] = x0i - x2i;
-    a[j2] = x1r - x3i;
-    a[j2 + 1] = x1i + x3r;
-    a[j3] = x1r + x3i;
-    a[j3 + 1] = x1i - x3r;
-    wn4r = w[1];
-    csc1 = w[2];
-    csc3 = w[3];
-    wd1r = 1;
-    wd1i = 0;
-    wd3r = 1;
-    wd3i = 0;
-    k = 0;
-    for (j = 2; j < mh - 2; j += 4) {
-        k += 4;
-        wk1r = csc1 * (wd1r + w[k]);
-        wk1i = csc1 * (wd1i + w[k + 1]);
-        wk3r = csc3 * (wd3r + w[k + 2]);
-        wk3i = csc3 * (wd3i + w[k + 3]);
-        wd1r = w[k];
-        wd1i = w[k + 1];
-        wd3r = w[k + 2];
-        wd3i = w[k + 3];
-        j1 = j + m;
-        j2 = j1 + m;
-        j3 = j2 + m;
-        x0r = a[j] + a[j2];
-        x0i = a[j + 1] + a[j2 + 1];
-        x1r = a[j] - a[j2];
-        x1i = a[j + 1] - a[j2 + 1];
-        y0r = a[j + 2] + a[j2 + 2];
-        y0i = a[j + 3] + a[j2 + 3];
-        y1r = a[j + 2] - a[j2 + 2];
-        y1i = a[j + 3] - a[j2 + 3];
-        x2r = a[j1] + a[j3];
-        x2i = a[j1 + 1] + a[j3 + 1];
-        x3r = a[j1] - a[j3];
-        x3i = a[j1 + 1] - a[j3 + 1];
-        y2r = a[j1 + 2] + a[j3 + 2];
-        y2i = a[j1 + 3] + a[j3 + 3];
-        y3r = a[j1 + 2] - a[j3 + 2];
-        y3i = a[j1 + 3] - a[j3 + 3];
-        a[j] = x0r + x2r;
-        a[j + 1] = x0i + x2i;
-        a[j + 2] = y0r + y2r;
-        a[j + 3] = y0i + y2i;
-        a[j1] = x0r - x2r;
-        a[j1 + 1] = x0i - x2i;
-        a[j1 + 2] = y0r - y2r;
-        a[j1 + 3] = y0i - y2i;
-        x0r = x1r - x3i;
-        x0i = x1i + x3r;
-        a[j2] = wk1r * x0r - wk1i * x0i;
-        a[j2 + 1] = wk1r * x0i + wk1i * x0r;
-        x0r = y1r - y3i;
-        x0i = y1i + y3r;
-        a[j2 + 2] = wd1r * x0r - wd1i * x0i;
-        a[j2 + 3] = wd1r * x0i + wd1i * x0r;
-        x0r = x1r + x3i;
-        x0i = x1i - x3r;
-        a[j3] = wk3r * x0r + wk3i * x0i;
-        a[j3 + 1] = wk3r * x0i - wk3i * x0r;
-        x0r = y1r + y3i;
-        x0i = y1i - y3r;
-        a[j3 + 2] = wd3r * x0r + wd3i * x0i;
-        a[j3 + 3] = wd3r * x0i - wd3i * x0r;
-        j0 = m - j;
-        j1 = j0 + m;
-        j2 = j1 + m;
-        j3 = j2 + m;
-        x0r = a[j0] + a[j2];
-        x0i = a[j0 + 1] + a[j2 + 1];
-        x1r = a[j0] - a[j2];
-        x1i = a[j0 + 1] - a[j2 + 1];
-        y0r = a[j0 - 2] + a[j2 - 2];
-        y0i = a[j0 - 1] + a[j2 - 1];
-        y1r = a[j0 - 2] - a[j2 - 2];
-        y1i = a[j0 - 1] - a[j2 - 1];
-        x2r = a[j1] + a[j3];
-        x2i = a[j1 + 1] + a[j3 + 1];
-        x3r = a[j1] - a[j3];
-        x3i = a[j1 + 1] - a[j3 + 1];
-        y2r = a[j1 - 2] + a[j3 - 2];
-        y2i = a[j1 - 1] + a[j3 - 1];
-        y3r = a[j1 - 2] - a[j3 - 2];
-        y3i = a[j1 - 1] - a[j3 - 1];
-        a[j0] = x0r + x2r;
-        a[j0 + 1] = x0i + x2i;
-        a[j0 - 2] = y0r + y2r;
-        a[j0 - 1] = y0i + y2i;
-        a[j1] = x0r - x2r;
-        a[j1 + 1] = x0i - x2i;
-        a[j1 - 2] = y0r - y2r;
-        a[j1 - 1] = y0i - y2i;
-        x0r = x1r - x3i;
-        x0i = x1i + x3r;
-        a[j2] = wk1i * x0r - wk1r * x0i;
-        a[j2 + 1] = wk1i * x0i + wk1r * x0r;
-        x0r = y1r - y3i;
-        x0i = y1i + y3r;
-        a[j2 - 2] = wd1i * x0r - wd1r * x0i;
-        a[j2 - 1] = wd1i * x0i + wd1r * x0r;
-        x0r = x1r + x3i;
-        x0i = x1i - x3r;
-        a[j3] = wk3i * x0r + wk3r * x0i;
-        a[j3 + 1] = wk3i * x0i - wk3r * x0r;
-        x0r = y1r + y3i;
-        x0i = y1i - y3r;
-        a[j3 - 2] = wd3i * x0r + wd3r * x0i;
-        a[j3 - 1] = wd3i * x0i - wd3r * x0r;
-    }
-    wk1r = csc1 * (wd1r + wn4r);
-    wk1i = csc1 * (wd1i + wn4r);
-    wk3r = csc3 * (wd3r - wn4r);
-    wk3i = csc3 * (wd3i - wn4r);
-    j0 = mh;
-    j1 = j0 + m;
-    j2 = j1 + m;
-    j3 = j2 + m;
-    x0r = a[j0 - 2] + a[j2 - 2];
-    x0i = a[j0 - 1] + a[j2 - 1];
-    x1r = a[j0 - 2] - a[j2 - 2];
-    x1i = a[j0 - 1] - a[j2 - 1];
-    x2r = a[j1 - 2] + a[j3 - 2];
-    x2i = a[j1 - 1] + a[j3 - 1];
-    x3r = a[j1 - 2] - a[j3 - 2];
-    x3i = a[j1 - 1] - a[j3 - 1];
-    a[j0 - 2] = x0r + x2r;
-    a[j0 - 1] = x0i + x2i;
-    a[j1 - 2] = x0r - x2r;
-    a[j1 - 1] = x0i - x2i;
-    x0r = x1r - x3i;
-    x0i = x1i + x3r;
-    a[j2 - 2] = wk1r * x0r - wk1i * x0i;
-    a[j2 - 1] = wk1r * x0i + wk1i * x0r;
-    x0r = x1r + x3i;
-    x0i = x1i - x3r;
-    a[j3 - 2] = wk3r * x0r + wk3i * x0i;
-    a[j3 - 1] = wk3r * x0i - wk3i * x0r;
-    x0r = a[j0] + a[j2];
-    x0i = a[j0 + 1] + a[j2 + 1];
-    x1r = a[j0] - a[j2];
-    x1i = a[j0 + 1] - a[j2 + 1];
-    x2r = a[j1] + a[j3];
-    x2i = a[j1 + 1] + a[j3 + 1];
-    x3r = a[j1] - a[j3];
-    x3i = a[j1 + 1] - a[j3 + 1];
-    a[j0] = x0r + x2r;
-    a[j0 + 1] = x0i + x2i;
-    a[j1] = x0r - x2r;
-    a[j1 + 1] = x0i - x2i;
-    x0r = x1r - x3i;
-    x0i = x1i + x3r;
-    a[j2] = wn4r * (x0r - x0i);
-    a[j2 + 1] = wn4r * (x0i + x0r);
-    x0r = x1r + x3i;
-    x0i = x1i - x3r;
-    a[j3] = -wn4r * (x0r + x0i);
-    a[j3 + 1] = -wn4r * (x0i - x0r);
-    x0r = a[j0 + 2] + a[j2 + 2];
-    x0i = a[j0 + 3] + a[j2 + 3];
-    x1r = a[j0 + 2] - a[j2 + 2];
-    x1i = a[j0 + 3] - a[j2 + 3];
-    x2r = a[j1 + 2] + a[j3 + 2];
-    x2i = a[j1 + 3] + a[j3 + 3];
-    x3r = a[j1 + 2] - a[j3 + 2];
-    x3i = a[j1 + 3] - a[j3 + 3];
-    a[j0 + 2] = x0r + x2r;
-    a[j0 + 3] = x0i + x2i;
-    a[j1 + 2] = x0r - x2r;
-    a[j1 + 3] = x0i - x2i;
-    x0r = x1r - x3i;
-    x0i = x1i + x3r;
-    a[j2 + 2] = wk1i * x0r - wk1r * x0i;
-    a[j2 + 3] = wk1i * x0i + wk1r * x0r;
-    x0r = x1r + x3i;
-    x0i = x1i - x3r;
-    a[j3 + 2] = wk3i * x0r + wk3r * x0i;
-    a[j3 + 3] = wk3i * x0i - wk3r * x0r;
-}
-
-
-void cftb1st(int n, double *a, double *w)
-{
-    int j, j0, j1, j2, j3, k, m, mh;
-    double wn4r, csc1, csc3, wk1r, wk1i, wk3r, wk3i, 
-        wd1r, wd1i, wd3r, wd3i;
-    double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i, 
-        y0r, y0i, y1r, y1i, y2r, y2i, y3r, y3i;
-    
-    mh = n >> 3;
-    m = 2 * mh;
-    j1 = m;
-    j2 = j1 + m;
-    j3 = j2 + m;
-    x0r = a[0] + a[j2];
-    x0i = -a[1] - a[j2 + 1];
-    x1r = a[0] - a[j2];
-    x1i = -a[1] + a[j2 + 1];
-    x2r = a[j1] + a[j3];
-    x2i = a[j1 + 1] + a[j3 + 1];
-    x3r = a[j1] - a[j3];
-    x3i = a[j1 + 1] - a[j3 + 1];
-    a[0] = x0r + x2r;
-    a[1] = x0i - x2i;
-    a[j1] = x0r - x2r;
-    a[j1 + 1] = x0i + x2i;
-    a[j2] = x1r + x3i;
-    a[j2 + 1] = x1i + x3r;
-    a[j3] = x1r - x3i;
-    a[j3 + 1] = x1i - x3r;
-    wn4r = w[1];
-    csc1 = w[2];
-    csc3 = w[3];
-    wd1r = 1;
-    wd1i = 0;
-    wd3r = 1;
-    wd3i = 0;
-    k = 0;
-    for (j = 2; j < mh - 2; j += 4) {
-        k += 4;
-        wk1r = csc1 * (wd1r + w[k]);
-        wk1i = csc1 * (wd1i + w[k + 1]);
-        wk3r = csc3 * (wd3r + w[k + 2]);
-        wk3i = csc3 * (wd3i + w[k + 3]);
-        wd1r = w[k];
-        wd1i = w[k + 1];
-        wd3r = w[k + 2];
-        wd3i = w[k + 3];
-        j1 = j + m;
-        j2 = j1 + m;
-        j3 = j2 + m;
-        x0r = a[j] + a[j2];
-        x0i = -a[j + 1] - a[j2 + 1];
-        x1r = a[j] - a[j2];
-        x1i = -a[j + 1] + a[j2 + 1];
-        y0r = a[j + 2] + a[j2 + 2];
-        y0i = -a[j + 3] - a[j2 + 3];
-        y1r = a[j + 2] - a[j2 + 2];
-        y1i = -a[j + 3] + a[j2 + 3];
-        x2r = a[j1] + a[j3];
-        x2i = a[j1 + 1] + a[j3 + 1];
-        x3r = a[j1] - a[j3];
-        x3i = a[j1 + 1] - a[j3 + 1];
-        y2r = a[j1 + 2] + a[j3 + 2];
-        y2i = a[j1 + 3] + a[j3 + 3];
-        y3r = a[j1 + 2] - a[j3 + 2];
-        y3i = a[j1 + 3] - a[j3 + 3];
-        a[j] = x0r + x2r;
-        a[j + 1] = x0i - x2i;
-        a[j + 2] = y0r + y2r;
-        a[j + 3] = y0i - y2i;
-        a[j1] = x0r - x2r;
-        a[j1 + 1] = x0i + x2i;
-        a[j1 + 2] = y0r - y2r;
-        a[j1 + 3] = y0i + y2i;
-        x0r = x1r + x3i;
-        x0i = x1i + x3r;
-        a[j2] = wk1r * x0r - wk1i * x0i;
-        a[j2 + 1] = wk1r * x0i + wk1i * x0r;
-        x0r = y1r + y3i;
-        x0i = y1i + y3r;
-        a[j2 + 2] = wd1r * x0r - wd1i * x0i;
-        a[j2 + 3] = wd1r * x0i + wd1i * x0r;
-        x0r = x1r - x3i;
-        x0i = x1i - x3r;
-        a[j3] = wk3r * x0r + wk3i * x0i;
-        a[j3 + 1] = wk3r * x0i - wk3i * x0r;
-        x0r = y1r - y3i;
-        x0i = y1i - y3r;
-        a[j3 + 2] = wd3r * x0r + wd3i * x0i;
-        a[j3 + 3] = wd3r * x0i - wd3i * x0r;
-        j0 = m - j;
-        j1 = j0 + m;
-        j2 = j1 + m;
-        j3 = j2 + m;
-        x0r = a[j0] + a[j2];
-        x0i = -a[j0 + 1] - a[j2 + 1];
-        x1r = a[j0] - a[j2];
-        x1i = -a[j0 + 1] + a[j2 + 1];
-        y0r = a[j0 - 2] + a[j2 - 2];
-        y0i = -a[j0 - 1] - a[j2 - 1];
-        y1r = a[j0 - 2] - a[j2 - 2];
-        y1i = -a[j0 - 1] + a[j2 - 1];
-        x2r = a[j1] + a[j3];
-        x2i = a[j1 + 1] + a[j3 + 1];
-        x3r = a[j1] - a[j3];
-        x3i = a[j1 + 1] - a[j3 + 1];
-        y2r = a[j1 - 2] + a[j3 - 2];
-        y2i = a[j1 - 1] + a[j3 - 1];
-        y3r = a[j1 - 2] - a[j3 - 2];
-        y3i = a[j1 - 1] - a[j3 - 1];
-        a[j0] = x0r + x2r;
-        a[j0 + 1] = x0i - x2i;
-        a[j0 - 2] = y0r + y2r;
-        a[j0 - 1] = y0i - y2i;
-        a[j1] = x0r - x2r;
-        a[j1 + 1] = x0i + x2i;
-        a[j1 - 2] = y0r - y2r;
-        a[j1 - 1] = y0i + y2i;
-        x0r = x1r + x3i;
-        x0i = x1i + x3r;
-        a[j2] = wk1i * x0r - wk1r * x0i;
-        a[j2 + 1] = wk1i * x0i + wk1r * x0r;
-        x0r = y1r + y3i;
-        x0i = y1i + y3r;
-        a[j2 - 2] = wd1i * x0r - wd1r * x0i;
-        a[j2 - 1] = wd1i * x0i + wd1r * x0r;
-        x0r = x1r - x3i;
-        x0i = x1i - x3r;
-        a[j3] = wk3i * x0r + wk3r * x0i;
-        a[j3 + 1] = wk3i * x0i - wk3r * x0r;
-        x0r = y1r - y3i;
-        x0i = y1i - y3r;
-        a[j3 - 2] = wd3i * x0r + wd3r * x0i;
-        a[j3 - 1] = wd3i * x0i - wd3r * x0r;
-    }
-    wk1r = csc1 * (wd1r + wn4r);
-    wk1i = csc1 * (wd1i + wn4r);
-    wk3r = csc3 * (wd3r - wn4r);
-    wk3i = csc3 * (wd3i - wn4r);
-    j0 = mh;
-    j1 = j0 + m;
-    j2 = j1 + m;
-    j3 = j2 + m;
-    x0r = a[j0 - 2] + a[j2 - 2];
-    x0i = -a[j0 - 1] - a[j2 - 1];
-    x1r = a[j0 - 2] - a[j2 - 2];
-    x1i = -a[j0 - 1] + a[j2 - 1];
-    x2r = a[j1 - 2] + a[j3 - 2];
-    x2i = a[j1 - 1] + a[j3 - 1];
-    x3r = a[j1 - 2] - a[j3 - 2];
-    x3i = a[j1 - 1] - a[j3 - 1];
-    a[j0 - 2] = x0r + x2r;
-    a[j0 - 1] = x0i - x2i;
-    a[j1 - 2] = x0r - x2r;
-    a[j1 - 1] = x0i + x2i;
-    x0r = x1r + x3i;
-    x0i = x1i + x3r;
-    a[j2 - 2] = wk1r * x0r - wk1i * x0i;
-    a[j2 - 1] = wk1r * x0i + wk1i * x0r;
-    x0r = x1r - x3i;
-    x0i = x1i - x3r;
-    a[j3 - 2] = wk3r * x0r + wk3i * x0i;
-    a[j3 - 1] = wk3r * x0i - wk3i * x0r;
-    x0r = a[j0] + a[j2];
-    x0i = -a[j0 + 1] - a[j2 + 1];
-    x1r = a[j0] - a[j2];
-    x1i = -a[j0 + 1] + a[j2 + 1];
-    x2r = a[j1] + a[j3];
-    x2i = a[j1 + 1] + a[j3 + 1];
-    x3r = a[j1] - a[j3];
-    x3i = a[j1 + 1] - a[j3 + 1];
-    a[j0] = x0r + x2r;
-    a[j0 + 1] = x0i - x2i;
-    a[j1] = x0r - x2r;
-    a[j1 + 1] = x0i + x2i;
-    x0r = x1r + x3i;
-    x0i = x1i + x3r;
-    a[j2] = wn4r * (x0r - x0i);
-    a[j2 + 1] = wn4r * (x0i + x0r);
-    x0r = x1r - x3i;
-    x0i = x1i - x3r;
-    a[j3] = -wn4r * (x0r + x0i);
-    a[j3 + 1] = -wn4r * (x0i - x0r);
-    x0r = a[j0 + 2] + a[j2 + 2];
-    x0i = -a[j0 + 3] - a[j2 + 3];
-    x1r = a[j0 + 2] - a[j2 + 2];
-    x1i = -a[j0 + 3] + a[j2 + 3];
-    x2r = a[j1 + 2] + a[j3 + 2];
-    x2i = a[j1 + 3] + a[j3 + 3];
-    x3r = a[j1 + 2] - a[j3 + 2];
-    x3i = a[j1 + 3] - a[j3 + 3];
-    a[j0 + 2] = x0r + x2r;
-    a[j0 + 3] = x0i - x2i;
-    a[j1 + 2] = x0r - x2r;
-    a[j1 + 3] = x0i + x2i;
-    x0r = x1r + x3i;
-    x0i = x1i + x3r;
-    a[j2 + 2] = wk1i * x0r - wk1r * x0i;
-    a[j2 + 3] = wk1i * x0i + wk1r * x0r;
-    x0r = x1r - x3i;
-    x0i = x1i - x3r;
-    a[j3 + 2] = wk3i * x0r + wk3r * x0i;
-    a[j3 + 3] = wk3i * x0i - wk3r * x0r;
-}
-
-
-#ifdef USE_CDFT_THREADS
-struct cdft_arg_st {
-    int n0;
-    int n;
-    double *a;
-    int nw;
-    double *w;
-};
-typedef struct cdft_arg_st cdft_arg_t;
-
-
-void cftrec4_th(int n, double *a, int nw, double *w)
-{
-    void *cftrec1_th(void *p);
-    void *cftrec2_th(void *p);
-    int i, idiv4, m, nthread;
-    cdft_thread_t th[4];
-    cdft_arg_t ag[4];
-    
-    nthread = 2;
-    idiv4 = 0;
-    m = n >> 1;
-    if (n > CDFT_4THREADS_BEGIN_N) {
-        nthread = 4;
-        idiv4 = 1;
-        m >>= 1;
-    }
-    for (i = 0; i < nthread; i++) {
-        ag[i].n0 = n;
-        ag[i].n = m;
-        ag[i].a = &a[i * m];
-        ag[i].nw = nw;
-        ag[i].w = w;
-        if (i != idiv4) {
-            cdft_thread_create(&th[i], cftrec1_th, &ag[i]);
-        } else {
-            cdft_thread_create(&th[i], cftrec2_th, &ag[i]);
-        }
-    }
-    for (i = 0; i < nthread; i++) {
-        cdft_thread_wait(th[i]);
-    }
-}
-
-
-void *cftrec1_th(void *p)
-{
-    int cfttree(int n, int j, int k, double *a, int nw, double *w);
-    void cftleaf(int n, int isplt, double *a, int nw, double *w);
-    void cftmdl1(int n, double *a, double *w);
-    int isplt, j, k, m, n, n0, nw;
-    double *a, *w;
-    
-    n0 = ((cdft_arg_t *) p)->n0;
-    n = ((cdft_arg_t *) p)->n;
-    a = ((cdft_arg_t *) p)->a;
-    nw = ((cdft_arg_t *) p)->nw;
-    w = ((cdft_arg_t *) p)->w;
-    m = n0;
-    while (m > 512) {
-        m >>= 2;
-        cftmdl1(m, &a[n - m], &w[nw - (m >> 1)]);
-    }
-    cftleaf(m, 1, &a[n - m], nw, w);
-    k = 0;
-    for (j = n - m; j > 0; j -= m) {
-        k++;
-        isplt = cfttree(m, j, k, a, nw, w);
-        cftleaf(m, isplt, &a[j - m], nw, w);
-    }
-    return (void *) 0;
-}
-
-
-void *cftrec2_th(void *p)
-{
-    int cfttree(int n, int j, int k, double *a, int nw, double *w);
-    void cftleaf(int n, int isplt, double *a, int nw, double *w);
-    void cftmdl2(int n, double *a, double *w);
-    int isplt, j, k, m, n, n0, nw;
-    double *a, *w;
-    
-    n0 = ((cdft_arg_t *) p)->n0;
-    n = ((cdft_arg_t *) p)->n;
-    a = ((cdft_arg_t *) p)->a;
-    nw = ((cdft_arg_t *) p)->nw;
-    w = ((cdft_arg_t *) p)->w;
-    k = 1;
-    m = n0;
-    while (m > 512) {
-        m >>= 2;
-        k <<= 2;
-        cftmdl2(m, &a[n - m], &w[nw - m]);
-    }
-    cftleaf(m, 0, &a[n - m], nw, w);
-    k >>= 1;
-    for (j = n - m; j > 0; j -= m) {
-        k++;
-        isplt = cfttree(m, j, k, a, nw, w);
-        cftleaf(m, isplt, &a[j - m], nw, w);
-    }
-    return (void *) 0;
-}
-#endif /* USE_CDFT_THREADS */
-
-
-void cftrec4(int n, double *a, int nw, double *w)
-{
-    int cfttree(int n, int j, int k, double *a, int nw, double *w);
-    void cftleaf(int n, int isplt, double *a, int nw, double *w);
-    void cftmdl1(int n, double *a, double *w);
-    int isplt, j, k, m;
-    
-    m = n;
-    while (m > 512) {
-        m >>= 2;
-        cftmdl1(m, &a[n - m], &w[nw - (m >> 1)]);
-    }
-    cftleaf(m, 1, &a[n - m], nw, w);
-    k = 0;
-    for (j = n - m; j > 0; j -= m) {
-        k++;
-        isplt = cfttree(m, j, k, a, nw, w);
-        cftleaf(m, isplt, &a[j - m], nw, w);
-    }
-}
-
-
-int cfttree(int n, int j, int k, double *a, int nw, double *w)
-{
-    void cftmdl1(int n, double *a, double *w);
-    void cftmdl2(int n, double *a, double *w);
-    int i, isplt, m;
-    
-    if ((k & 3) != 0) {
-        isplt = k & 1;
-        if (isplt != 0) {
-            cftmdl1(n, &a[j - n], &w[nw - (n >> 1)]);
-        } else {
-            cftmdl2(n, &a[j - n], &w[nw - n]);
-        }
-    } else {
-        m = n;
-        for (i = k; (i & 3) == 0; i >>= 2) {
-            m <<= 2;
-        }
-        isplt = i & 1;
-        if (isplt != 0) {
-            while (m > 128) {
-                cftmdl1(m, &a[j - m], &w[nw - (m >> 1)]);
-                m >>= 2;
-            }
-        } else {
-            while (m > 128) {
-                cftmdl2(m, &a[j - m], &w[nw - m]);
-                m >>= 2;
-            }
-        }
-    }
-    return isplt;
-}
-
-
-void cftleaf(int n, int isplt, double *a, int nw, double *w)
-{
-    void cftmdl1(int n, double *a, double *w);
-    void cftmdl2(int n, double *a, double *w);
-    void cftf161(double *a, double *w);
-    void cftf162(double *a, double *w);
-    void cftf081(double *a, double *w);
-    void cftf082(double *a, double *w);
-    
-    if (n == 512) {
-        cftmdl1(128, a, &w[nw - 64]);
-        cftf161(a, &w[nw - 8]);
-        cftf162(&a[32], &w[nw - 32]);
-        cftf161(&a[64], &w[nw - 8]);
-        cftf161(&a[96], &w[nw - 8]);
-        cftmdl2(128, &a[128], &w[nw - 128]);
-        cftf161(&a[128], &w[nw - 8]);
-        cftf162(&a[160], &w[nw - 32]);
-        cftf161(&a[192], &w[nw - 8]);
-        cftf162(&a[224], &w[nw - 32]);
-        cftmdl1(128, &a[256], &w[nw - 64]);
-        cftf161(&a[256], &w[nw - 8]);
-        cftf162(&a[288], &w[nw - 32]);
-        cftf161(&a[320], &w[nw - 8]);
-        cftf161(&a[352], &w[nw - 8]);
-        if (isplt != 0) {
-            cftmdl1(128, &a[384], &w[nw - 64]);
-            cftf161(&a[480], &w[nw - 8]);
-        } else {
-            cftmdl2(128, &a[384], &w[nw - 128]);
-            cftf162(&a[480], &w[nw - 32]);
-        }
-        cftf161(&a[384], &w[nw - 8]);
-        cftf162(&a[416], &w[nw - 32]);
-        cftf161(&a[448], &w[nw - 8]);
-    } else {
-        cftmdl1(64, a, &w[nw - 32]);
-        cftf081(a, &w[nw - 8]);
-        cftf082(&a[16], &w[nw - 8]);
-        cftf081(&a[32], &w[nw - 8]);
-        cftf081(&a[48], &w[nw - 8]);
-        cftmdl2(64, &a[64], &w[nw - 64]);
-        cftf081(&a[64], &w[nw - 8]);
-        cftf082(&a[80], &w[nw - 8]);
-        cftf081(&a[96], &w[nw - 8]);
-        cftf082(&a[112], &w[nw - 8]);
-        cftmdl1(64, &a[128], &w[nw - 32]);
-        cftf081(&a[128], &w[nw - 8]);
-        cftf082(&a[144], &w[nw - 8]);
-        cftf081(&a[160], &w[nw - 8]);
-        cftf081(&a[176], &w[nw - 8]);
-        if (isplt != 0) {
-            cftmdl1(64, &a[192], &w[nw - 32]);
-            cftf081(&a[240], &w[nw - 8]);
-        } else {
-            cftmdl2(64, &a[192], &w[nw - 64]);
-            cftf082(&a[240], &w[nw - 8]);
-        }
-        cftf081(&a[192], &w[nw - 8]);
-        cftf082(&a[208], &w[nw - 8]);
-        cftf081(&a[224], &w[nw - 8]);
-    }
-}
-
-
-void cftmdl1(int n, double *a, double *w)
-{
-    int j, j0, j1, j2, j3, k, m, mh;
-    double wn4r, wk1r, wk1i, wk3r, wk3i;
-    double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
-    
-    mh = n >> 3;
-    m = 2 * mh;
-    j1 = m;
-    j2 = j1 + m;
-    j3 = j2 + m;
-    x0r = a[0] + a[j2];
-    x0i = a[1] + a[j2 + 1];
-    x1r = a[0] - a[j2];
-    x1i = a[1] - a[j2 + 1];
-    x2r = a[j1] + a[j3];
-    x2i = a[j1 + 1] + a[j3 + 1];
-    x3r = a[j1] - a[j3];
-    x3i = a[j1 + 1] - a[j3 + 1];
-    a[0] = x0r + x2r;
-    a[1] = x0i + x2i;
-    a[j1] = x0r - x2r;
-    a[j1 + 1] = x0i - x2i;
-    a[j2] = x1r - x3i;
-    a[j2 + 1] = x1i + x3r;
-    a[j3] = x1r + x3i;
-    a[j3 + 1] = x1i - x3r;
-    wn4r = w[1];
-    k = 0;
-    for (j = 2; j < mh; j += 2) {
-        k += 4;
-        wk1r = w[k];
-        wk1i = w[k + 1];
-        wk3r = w[k + 2];
-        wk3i = w[k + 3];
-        j1 = j + m;
-        j2 = j1 + m;
-        j3 = j2 + m;
-        x0r = a[j] + a[j2];
-        x0i = a[j + 1] + a[j2 + 1];
-        x1r = a[j] - a[j2];
-        x1i = a[j + 1] - a[j2 + 1];
-        x2r = a[j1] + a[j3];
-        x2i = a[j1 + 1] + a[j3 + 1];
-        x3r = a[j1] - a[j3];
-        x3i = a[j1 + 1] - a[j3 + 1];
-        a[j] = x0r + x2r;
-        a[j + 1] = x0i + x2i;
-        a[j1] = x0r - x2r;
-        a[j1 + 1] = x0i - x2i;
-        x0r = x1r - x3i;
-        x0i = x1i + x3r;
-        a[j2] = wk1r * x0r - wk1i * x0i;
-        a[j2 + 1] = wk1r * x0i + wk1i * x0r;
-        x0r = x1r + x3i;
-        x0i = x1i - x3r;
-        a[j3] = wk3r * x0r + wk3i * x0i;
-        a[j3 + 1] = wk3r * x0i - wk3i * x0r;
-        j0 = m - j;
-        j1 = j0 + m;
-        j2 = j1 + m;
-        j3 = j2 + m;
-        x0r = a[j0] + a[j2];
-        x0i = a[j0 + 1] + a[j2 + 1];
-        x1r = a[j0] - a[j2];
-        x1i = a[j0 + 1] - a[j2 + 1];
-        x2r = a[j1] + a[j3];
-        x2i = a[j1 + 1] + a[j3 + 1];
-        x3r = a[j1] - a[j3];
-        x3i = a[j1 + 1] - a[j3 + 1];
-        a[j0] = x0r + x2r;
-        a[j0 + 1] = x0i + x2i;
-        a[j1] = x0r - x2r;
-        a[j1 + 1] = x0i - x2i;
-        x0r = x1r - x3i;
-        x0i = x1i + x3r;
-        a[j2] = wk1i * x0r - wk1r * x0i;
-        a[j2 + 1] = wk1i * x0i + wk1r * x0r;
-        x0r = x1r + x3i;
-        x0i = x1i - x3r;
-        a[j3] = wk3i * x0r + wk3r * x0i;
-        a[j3 + 1] = wk3i * x0i - wk3r * x0r;
-    }
-    j0 = mh;
-    j1 = j0 + m;
-    j2 = j1 + m;
-    j3 = j2 + m;
-    x0r = a[j0] + a[j2];
-    x0i = a[j0 + 1] + a[j2 + 1];
-    x1r = a[j0] - a[j2];
-    x1i = a[j0 + 1] - a[j2 + 1];
-    x2r = a[j1] + a[j3];
-    x2i = a[j1 + 1] + a[j3 + 1];
-    x3r = a[j1] - a[j3];
-    x3i = a[j1 + 1] - a[j3 + 1];
-    a[j0] = x0r + x2r;
-    a[j0 + 1] = x0i + x2i;
-    a[j1] = x0r - x2r;
-    a[j1 + 1] = x0i - x2i;
-    x0r = x1r - x3i;
-    x0i = x1i + x3r;
-    a[j2] = wn4r * (x0r - x0i);
-    a[j2 + 1] = wn4r * (x0i + x0r);
-    x0r = x1r + x3i;
-    x0i = x1i - x3r;
-    a[j3] = -wn4r * (x0r + x0i);
-    a[j3 + 1] = -wn4r * (x0i - x0r);
-}
-
-
-void cftmdl2(int n, double *a, double *w)
-{
-    int j, j0, j1, j2, j3, k, kr, m, mh;
-    double wn4r, wk1r, wk1i, wk3r, wk3i, wd1r, wd1i, wd3r, wd3i;
-    double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i, y0r, y0i, y2r, y2i;
-    
-    mh = n >> 3;
-    m = 2 * mh;
-    wn4r = w[1];
-    j1 = m;
-    j2 = j1 + m;
-    j3 = j2 + m;
-    x0r = a[0] - a[j2 + 1];
-    x0i = a[1] + a[j2];
-    x1r = a[0] + a[j2 + 1];
-    x1i = a[1] - a[j2];
-    x2r = a[j1] - a[j3 + 1];
-    x2i = a[j1 + 1] + a[j3];
-    x3r = a[j1] + a[j3 + 1];
-    x3i = a[j1 + 1] - a[j3];
-    y0r = wn4r * (x2r - x2i);
-    y0i = wn4r * (x2i + x2r);
-    a[0] = x0r + y0r;
-    a[1] = x0i + y0i;
-    a[j1] = x0r - y0r;
-    a[j1 + 1] = x0i - y0i;
-    y0r = wn4r * (x3r - x3i);
-    y0i = wn4r * (x3i + x3r);
-    a[j2] = x1r - y0i;
-    a[j2 + 1] = x1i + y0r;
-    a[j3] = x1r + y0i;
-    a[j3 + 1] = x1i - y0r;
-    k = 0;
-    kr = 2 * m;
-    for (j = 2; j < mh; j += 2) {
-        k += 4;
-        wk1r = w[k];
-        wk1i = w[k + 1];
-        wk3r = w[k + 2];
-        wk3i = w[k + 3];
-        kr -= 4;
-        wd1i = w[kr];
-        wd1r = w[kr + 1];
-        wd3i = w[kr + 2];
-        wd3r = w[kr + 3];
-        j1 = j + m;
-        j2 = j1 + m;
-        j3 = j2 + m;
-        x0r = a[j] - a[j2 + 1];
-        x0i = a[j + 1] + a[j2];
-        x1r = a[j] + a[j2 + 1];
-        x1i = a[j + 1] - a[j2];
-        x2r = a[j1] - a[j3 + 1];
-        x2i = a[j1 + 1] + a[j3];
-        x3r = a[j1] + a[j3 + 1];
-        x3i = a[j1 + 1] - a[j3];
-        y0r = wk1r * x0r - wk1i * x0i;
-        y0i = wk1r * x0i + wk1i * x0r;
-        y2r = wd1r * x2r - wd1i * x2i;
-        y2i = wd1r * x2i + wd1i * x2r;
-        a[j] = y0r + y2r;
-        a[j + 1] = y0i + y2i;
-        a[j1] = y0r - y2r;
-        a[j1 + 1] = y0i - y2i;
-        y0r = wk3r * x1r + wk3i * x1i;
-        y0i = wk3r * x1i - wk3i * x1r;
-        y2r = wd3r * x3r + wd3i * x3i;
-        y2i = wd3r * x3i - wd3i * x3r;
-        a[j2] = y0r + y2r;
-        a[j2 + 1] = y0i + y2i;
-        a[j3] = y0r - y2r;
-        a[j3 + 1] = y0i - y2i;
-        j0 = m - j;
-        j1 = j0 + m;
-        j2 = j1 + m;
-        j3 = j2 + m;
-        x0r = a[j0] - a[j2 + 1];
-        x0i = a[j0 + 1] + a[j2];
-        x1r = a[j0] + a[j2 + 1];
-        x1i = a[j0 + 1] - a[j2];
-        x2r = a[j1] - a[j3 + 1];
-        x2i = a[j1 + 1] + a[j3];
-        x3r = a[j1] + a[j3 + 1];
-        x3i = a[j1 + 1] - a[j3];
-        y0r = wd1i * x0r - wd1r * x0i;
-        y0i = wd1i * x0i + wd1r * x0r;
-        y2r = wk1i * x2r - wk1r * x2i;
-        y2i = wk1i * x2i + wk1r * x2r;
-        a[j0] = y0r + y2r;
-        a[j0 + 1] = y0i + y2i;
-        a[j1] = y0r - y2r;
-        a[j1 + 1] = y0i - y2i;
-        y0r = wd3i * x1r + wd3r * x1i;
-        y0i = wd3i * x1i - wd3r * x1r;
-        y2r = wk3i * x3r + wk3r * x3i;
-        y2i = wk3i * x3i - wk3r * x3r;
-        a[j2] = y0r + y2r;
-        a[j2 + 1] = y0i + y2i;
-        a[j3] = y0r - y2r;
-        a[j3 + 1] = y0i - y2i;
-    }
-    wk1r = w[m];
-    wk1i = w[m + 1];
-    j0 = mh;
-    j1 = j0 + m;
-    j2 = j1 + m;
-    j3 = j2 + m;
-    x0r = a[j0] - a[j2 + 1];
-    x0i = a[j0 + 1] + a[j2];
-    x1r = a[j0] + a[j2 + 1];
-    x1i = a[j0 + 1] - a[j2];
-    x2r = a[j1] - a[j3 + 1];
-    x2i = a[j1 + 1] + a[j3];
-    x3r = a[j1] + a[j3 + 1];
-    x3i = a[j1 + 1] - a[j3];
-    y0r = wk1r * x0r - wk1i * x0i;
-    y0i = wk1r * x0i + wk1i * x0r;
-    y2r = wk1i * x2r - wk1r * x2i;
-    y2i = wk1i * x2i + wk1r * x2r;
-    a[j0] = y0r + y2r;
-    a[j0 + 1] = y0i + y2i;
-    a[j1] = y0r - y2r;
-    a[j1 + 1] = y0i - y2i;
-    y0r = wk1i * x1r - wk1r * x1i;
-    y0i = wk1i * x1i + wk1r * x1r;
-    y2r = wk1r * x3r - wk1i * x3i;
-    y2i = wk1r * x3i + wk1i * x3r;
-    a[j2] = y0r - y2r;
-    a[j2 + 1] = y0i - y2i;
-    a[j3] = y0r + y2r;
-    a[j3 + 1] = y0i + y2i;
-}
-
-
-void cftfx41(int n, double *a, int nw, double *w)
-{
-    void cftf161(double *a, double *w);
-    void cftf162(double *a, double *w);
-    void cftf081(double *a, double *w);
-    void cftf082(double *a, double *w);
-    
-    if (n == 128) {
-        cftf161(a, &w[nw - 8]);
-        cftf162(&a[32], &w[nw - 32]);
-        cftf161(&a[64], &w[nw - 8]);
-        cftf161(&a[96], &w[nw - 8]);
-    } else {
-        cftf081(a, &w[nw - 8]);
-        cftf082(&a[16], &w[nw - 8]);
-        cftf081(&a[32], &w[nw - 8]);
-        cftf081(&a[48], &w[nw - 8]);
-    }
-}
-
-
-void cftf161(double *a, double *w)
-{
-    double wn4r, wk1r, wk1i, 
-        x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i, 
-        y0r, y0i, y1r, y1i, y2r, y2i, y3r, y3i, 
-        y4r, y4i, y5r, y5i, y6r, y6i, y7r, y7i, 
-        y8r, y8i, y9r, y9i, y10r, y10i, y11r, y11i, 
-        y12r, y12i, y13r, y13i, y14r, y14i, y15r, y15i;
-    
-    wn4r = w[1];
-    wk1r = w[2];
-    wk1i = w[3];
-    x0r = a[0] + a[16];
-    x0i = a[1] + a[17];
-    x1r = a[0] - a[16];
-    x1i = a[1] - a[17];
-    x2r = a[8] + a[24];
-    x2i = a[9] + a[25];
-    x3r = a[8] - a[24];
-    x3i = a[9] - a[25];
-    y0r = x0r + x2r;
-    y0i = x0i + x2i;
-    y4r = x0r - x2r;
-    y4i = x0i - x2i;
-    y8r = x1r - x3i;
-    y8i = x1i + x3r;
-    y12r = x1r + x3i;
-    y12i = x1i - x3r;
-    x0r = a[2] + a[18];
-    x0i = a[3] + a[19];
-    x1r = a[2] - a[18];
-    x1i = a[3] - a[19];
-    x2r = a[10] + a[26];
-    x2i = a[11] + a[27];
-    x3r = a[10] - a[26];
-    x3i = a[11] - a[27];
-    y1r = x0r + x2r;
-    y1i = x0i + x2i;
-    y5r = x0r - x2r;
-    y5i = x0i - x2i;
-    x0r = x1r - x3i;
-    x0i = x1i + x3r;
-    y9r = wk1r * x0r - wk1i * x0i;
-    y9i = wk1r * x0i + wk1i * x0r;
-    x0r = x1r + x3i;
-    x0i = x1i - x3r;
-    y13r = wk1i * x0r - wk1r * x0i;
-    y13i = wk1i * x0i + wk1r * x0r;
-    x0r = a[4] + a[20];
-    x0i = a[5] + a[21];
-    x1r = a[4] - a[20];
-    x1i = a[5] - a[21];
-    x2r = a[12] + a[28];
-    x2i = a[13] + a[29];
-    x3r = a[12] - a[28];
-    x3i = a[13] - a[29];
-    y2r = x0r + x2r;
-    y2i = x0i + x2i;
-    y6r = x0r - x2r;
-    y6i = x0i - x2i;
-    x0r = x1r - x3i;
-    x0i = x1i + x3r;
-    y10r = wn4r * (x0r - x0i);
-    y10i = wn4r * (x0i + x0r);
-    x0r = x1r + x3i;
-    x0i = x1i - x3r;
-    y14r = wn4r * (x0r + x0i);
-    y14i = wn4r * (x0i - x0r);
-    x0r = a[6] + a[22];
-    x0i = a[7] + a[23];
-    x1r = a[6] - a[22];
-    x1i = a[7] - a[23];
-    x2r = a[14] + a[30];
-    x2i = a[15] + a[31];
-    x3r = a[14] - a[30];
-    x3i = a[15] - a[31];
-    y3r = x0r + x2r;
-    y3i = x0i + x2i;
-    y7r = x0r - x2r;
-    y7i = x0i - x2i;
-    x0r = x1r - x3i;
-    x0i = x1i + x3r;
-    y11r = wk1i * x0r - wk1r * x0i;
-    y11i = wk1i * x0i + wk1r * x0r;
-    x0r = x1r + x3i;
-    x0i = x1i - x3r;
-    y15r = wk1r * x0r - wk1i * x0i;
-    y15i = wk1r * x0i + wk1i * x0r;
-    x0r = y12r - y14r;
-    x0i = y12i - y14i;
-    x1r = y12r + y14r;
-    x1i = y12i + y14i;
-    x2r = y13r - y15r;
-    x2i = y13i - y15i;
-    x3r = y13r + y15r;
-    x3i = y13i + y15i;
-    a[24] = x0r + x2r;
-    a[25] = x0i + x2i;
-    a[26] = x0r - x2r;
-    a[27] = x0i - x2i;
-    a[28] = x1r - x3i;
-    a[29] = x1i + x3r;
-    a[30] = x1r + x3i;
-    a[31] = x1i - x3r;
-    x0r = y8r + y10r;
-    x0i = y8i + y10i;
-    x1r = y8r - y10r;
-    x1i = y8i - y10i;
-    x2r = y9r + y11r;
-    x2i = y9i + y11i;
-    x3r = y9r - y11r;
-    x3i = y9i - y11i;
-    a[16] = x0r + x2r;
-    a[17] = x0i + x2i;
-    a[18] = x0r - x2r;
-    a[19] = x0i - x2i;
-    a[20] = x1r - x3i;
-    a[21] = x1i + x3r;
-    a[22] = x1r + x3i;
-    a[23] = x1i - x3r;
-    x0r = y5r - y7i;
-    x0i = y5i + y7r;
-    x2r = wn4r * (x0r - x0i);
-    x2i = wn4r * (x0i + x0r);
-    x0r = y5r + y7i;
-    x0i = y5i - y7r;
-    x3r = wn4r * (x0r - x0i);
-    x3i = wn4r * (x0i + x0r);
-    x0r = y4r - y6i;
-    x0i = y4i + y6r;
-    x1r = y4r + y6i;
-    x1i = y4i - y6r;
-    a[8] = x0r + x2r;
-    a[9] = x0i + x2i;
-    a[10] = x0r - x2r;
-    a[11] = x0i - x2i;
-    a[12] = x1r - x3i;
-    a[13] = x1i + x3r;
-    a[14] = x1r + x3i;
-    a[15] = x1i - x3r;
-    x0r = y0r + y2r;
-    x0i = y0i + y2i;
-    x1r = y0r - y2r;
-    x1i = y0i - y2i;
-    x2r = y1r + y3r;
-    x2i = y1i + y3i;
-    x3r = y1r - y3r;
-    x3i = y1i - y3i;
-    a[0] = x0r + x2r;
-    a[1] = x0i + x2i;
-    a[2] = x0r - x2r;
-    a[3] = x0i - x2i;
-    a[4] = x1r - x3i;
-    a[5] = x1i + x3r;
-    a[6] = x1r + x3i;
-    a[7] = x1i - x3r;
-}
-
-
-void cftf162(double *a, double *w)
-{
-    double wn4r, wk1r, wk1i, wk2r, wk2i, wk3r, wk3i, 
-        x0r, x0i, x1r, x1i, x2r, x2i, 
-        y0r, y0i, y1r, y1i, y2r, y2i, y3r, y3i, 
-        y4r, y4i, y5r, y5i, y6r, y6i, y7r, y7i, 
-        y8r, y8i, y9r, y9i, y10r, y10i, y11r, y11i, 
-        y12r, y12i, y13r, y13i, y14r, y14i, y15r, y15i;
-    
-    wn4r = w[1];
-    wk1r = w[4];
-    wk1i = w[5];
-    wk3r = w[6];
-    wk3i = -w[7];
-    wk2r = w[8];
-    wk2i = w[9];
-    x1r = a[0] - a[17];
-    x1i = a[1] + a[16];
-    x0r = a[8] - a[25];
-    x0i = a[9] + a[24];
-    x2r = wn4r * (x0r - x0i);
-    x2i = wn4r * (x0i + x0r);
-    y0r = x1r + x2r;
-    y0i = x1i + x2i;
-    y4r = x1r - x2r;
-    y4i = x1i - x2i;
-    x1r = a[0] + a[17];
-    x1i = a[1] - a[16];
-    x0r = a[8] + a[25];
-    x0i = a[9] - a[24];
-    x2r = wn4r * (x0r - x0i);
-    x2i = wn4r * (x0i + x0r);
-    y8r = x1r - x2i;
-    y8i = x1i + x2r;
-    y12r = x1r + x2i;
-    y12i = x1i - x2r;
-    x0r = a[2] - a[19];
-    x0i = a[3] + a[18];
-    x1r = wk1r * x0r - wk1i * x0i;
-    x1i = wk1r * x0i + wk1i * x0r;
-    x0r = a[10] - a[27];
-    x0i = a[11] + a[26];
-    x2r = wk3i * x0r - wk3r * x0i;
-    x2i = wk3i * x0i + wk3r * x0r;
-    y1r = x1r + x2r;
-    y1i = x1i + x2i;
-    y5r = x1r - x2r;
-    y5i = x1i - x2i;
-    x0r = a[2] + a[19];
-    x0i = a[3] - a[18];
-    x1r = wk3r * x0r - wk3i * x0i;
-    x1i = wk3r * x0i + wk3i * x0r;
-    x0r = a[10] + a[27];
-    x0i = a[11] - a[26];
-    x2r = wk1r * x0r + wk1i * x0i;
-    x2i = wk1r * x0i - wk1i * x0r;
-    y9r = x1r - x2r;
-    y9i = x1i - x2i;
-    y13r = x1r + x2r;
-    y13i = x1i + x2i;
-    x0r = a[4] - a[21];
-    x0i = a[5] + a[20];
-    x1r = wk2r * x0r - wk2i * x0i;
-    x1i = wk2r * x0i + wk2i * x0r;
-    x0r = a[12] - a[29];
-    x0i = a[13] + a[28];
-    x2r = wk2i * x0r - wk2r * x0i;
-    x2i = wk2i * x0i + wk2r * x0r;
-    y2r = x1r + x2r;
-    y2i = x1i + x2i;
-    y6r = x1r - x2r;
-    y6i = x1i - x2i;
-    x0r = a[4] + a[21];
-    x0i = a[5] - a[20];
-    x1r = wk2i * x0r - wk2r * x0i;
-    x1i = wk2i * x0i + wk2r * x0r;
-    x0r = a[12] + a[29];
-    x0i = a[13] - a[28];
-    x2r = wk2r * x0r - wk2i * x0i;
-    x2i = wk2r * x0i + wk2i * x0r;
-    y10r = x1r - x2r;
-    y10i = x1i - x2i;
-    y14r = x1r + x2r;
-    y14i = x1i + x2i;
-    x0r = a[6] - a[23];
-    x0i = a[7] + a[22];
-    x1r = wk3r * x0r - wk3i * x0i;
-    x1i = wk3r * x0i + wk3i * x0r;
-    x0r = a[14] - a[31];
-    x0i = a[15] + a[30];
-    x2r = wk1i * x0r - wk1r * x0i;
-    x2i = wk1i * x0i + wk1r * x0r;
-    y3r = x1r + x2r;
-    y3i = x1i + x2i;
-    y7r = x1r - x2r;
-    y7i = x1i - x2i;
-    x0r = a[6] + a[23];
-    x0i = a[7] - a[22];
-    x1r = wk1i * x0r + wk1r * x0i;
-    x1i = wk1i * x0i - wk1r * x0r;
-    x0r = a[14] + a[31];
-    x0i = a[15] - a[30];
-    x2r = wk3i * x0r - wk3r * x0i;
-    x2i = wk3i * x0i + wk3r * x0r;
-    y11r = x1r + x2r;
-    y11i = x1i + x2i;
-    y15r = x1r - x2r;
-    y15i = x1i - x2i;
-    x1r = y0r + y2r;
-    x1i = y0i + y2i;
-    x2r = y1r + y3r;
-    x2i = y1i + y3i;
-    a[0] = x1r + x2r;
-    a[1] = x1i + x2i;
-    a[2] = x1r - x2r;
-    a[3] = x1i - x2i;
-    x1r = y0r - y2r;
-    x1i = y0i - y2i;
-    x2r = y1r - y3r;
-    x2i = y1i - y3i;
-    a[4] = x1r - x2i;
-    a[5] = x1i + x2r;
-    a[6] = x1r + x2i;
-    a[7] = x1i - x2r;
-    x1r = y4r - y6i;
-    x1i = y4i + y6r;
-    x0r = y5r - y7i;
-    x0i = y5i + y7r;
-    x2r = wn4r * (x0r - x0i);
-    x2i = wn4r * (x0i + x0r);
-    a[8] = x1r + x2r;
-    a[9] = x1i + x2i;
-    a[10] = x1r - x2r;
-    a[11] = x1i - x2i;
-    x1r = y4r + y6i;
-    x1i = y4i - y6r;
-    x0r = y5r + y7i;
-    x0i = y5i - y7r;
-    x2r = wn4r * (x0r - x0i);
-    x2i = wn4r * (x0i + x0r);
-    a[12] = x1r - x2i;
-    a[13] = x1i + x2r;
-    a[14] = x1r + x2i;
-    a[15] = x1i - x2r;
-    x1r = y8r + y10r;
-    x1i = y8i + y10i;
-    x2r = y9r - y11r;
-    x2i = y9i - y11i;
-    a[16] = x1r + x2r;
-    a[17] = x1i + x2i;
-    a[18] = x1r - x2r;
-    a[19] = x1i - x2i;
-    x1r = y8r - y10r;
-    x1i = y8i - y10i;
-    x2r = y9r + y11r;
-    x2i = y9i + y11i;
-    a[20] = x1r - x2i;
-    a[21] = x1i + x2r;
-    a[22] = x1r + x2i;
-    a[23] = x1i - x2r;
-    x1r = y12r - y14i;
-    x1i = y12i + y14r;
-    x0r = y13r + y15i;
-    x0i = y13i - y15r;
-    x2r = wn4r * (x0r - x0i);
-    x2i = wn4r * (x0i + x0r);
-    a[24] = x1r + x2r;
-    a[25] = x1i + x2i;
-    a[26] = x1r - x2r;
-    a[27] = x1i - x2i;
-    x1r = y12r + y14i;
-    x1i = y12i - y14r;
-    x0r = y13r - y15i;
-    x0i = y13i + y15r;
-    x2r = wn4r * (x0r - x0i);
-    x2i = wn4r * (x0i + x0r);
-    a[28] = x1r - x2i;
-    a[29] = x1i + x2r;
-    a[30] = x1r + x2i;
-    a[31] = x1i - x2r;
-}
-
-
-void cftf081(double *a, double *w)
-{
-    double wn4r, x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i, 
-        y0r, y0i, y1r, y1i, y2r, y2i, y3r, y3i, 
-        y4r, y4i, y5r, y5i, y6r, y6i, y7r, y7i;
-    
-    wn4r = w[1];
-    x0r = a[0] + a[8];
-    x0i = a[1] + a[9];
-    x1r = a[0] - a[8];
-    x1i = a[1] - a[9];
-    x2r = a[4] + a[12];
-    x2i = a[5] + a[13];
-    x3r = a[4] - a[12];
-    x3i = a[5] - a[13];
-    y0r = x0r + x2r;
-    y0i = x0i + x2i;
-    y2r = x0r - x2r;
-    y2i = x0i - x2i;
-    y1r = x1r - x3i;
-    y1i = x1i + x3r;
-    y3r = x1r + x3i;
-    y3i = x1i - x3r;
-    x0r = a[2] + a[10];
-    x0i = a[3] + a[11];
-    x1r = a[2] - a[10];
-    x1i = a[3] - a[11];
-    x2r = a[6] + a[14];
-    x2i = a[7] + a[15];
-    x3r = a[6] - a[14];
-    x3i = a[7] - a[15];
-    y4r = x0r + x2r;
-    y4i = x0i + x2i;
-    y6r = x0r - x2r;
-    y6i = x0i - x2i;
-    x0r = x1r - x3i;
-    x0i = x1i + x3r;
-    x2r = x1r + x3i;
-    x2i = x1i - x3r;
-    y5r = wn4r * (x0r - x0i);
-    y5i = wn4r * (x0r + x0i);
-    y7r = wn4r * (x2r - x2i);
-    y7i = wn4r * (x2r + x2i);
-    a[8] = y1r + y5r;
-    a[9] = y1i + y5i;
-    a[10] = y1r - y5r;
-    a[11] = y1i - y5i;
-    a[12] = y3r - y7i;
-    a[13] = y3i + y7r;
-    a[14] = y3r + y7i;
-    a[15] = y3i - y7r;
-    a[0] = y0r + y4r;
-    a[1] = y0i + y4i;
-    a[2] = y0r - y4r;
-    a[3] = y0i - y4i;
-    a[4] = y2r - y6i;
-    a[5] = y2i + y6r;
-    a[6] = y2r + y6i;
-    a[7] = y2i - y6r;
-}
-
-
-void cftf082(double *a, double *w)
-{
-    double wn4r, wk1r, wk1i, x0r, x0i, x1r, x1i, 
-        y0r, y0i, y1r, y1i, y2r, y2i, y3r, y3i, 
-        y4r, y4i, y5r, y5i, y6r, y6i, y7r, y7i;
-    
-    wn4r = w[1];
-    wk1r = w[2];
-    wk1i = w[3];
-    y0r = a[0] - a[9];
-    y0i = a[1] + a[8];
-    y1r = a[0] + a[9];
-    y1i = a[1] - a[8];
-    x0r = a[4] - a[13];
-    x0i = a[5] + a[12];
-    y2r = wn4r * (x0r - x0i);
-    y2i = wn4r * (x0i + x0r);
-    x0r = a[4] + a[13];
-    x0i = a[5] - a[12];
-    y3r = wn4r * (x0r - x0i);
-    y3i = wn4r * (x0i + x0r);
-    x0r = a[2] - a[11];
-    x0i = a[3] + a[10];
-    y4r = wk1r * x0r - wk1i * x0i;
-    y4i = wk1r * x0i + wk1i * x0r;
-    x0r = a[2] + a[11];
-    x0i = a[3] - a[10];
-    y5r = wk1i * x0r - wk1r * x0i;
-    y5i = wk1i * x0i + wk1r * x0r;
-    x0r = a[6] - a[15];
-    x0i = a[7] + a[14];
-    y6r = wk1i * x0r - wk1r * x0i;
-    y6i = wk1i * x0i + wk1r * x0r;
-    x0r = a[6] + a[15];
-    x0i = a[7] - a[14];
-    y7r = wk1r * x0r - wk1i * x0i;
-    y7i = wk1r * x0i + wk1i * x0r;
-    x0r = y0r + y2r;
-    x0i = y0i + y2i;
-    x1r = y4r + y6r;
-    x1i = y4i + y6i;
-    a[0] = x0r + x1r;
-    a[1] = x0i + x1i;
-    a[2] = x0r - x1r;
-    a[3] = x0i - x1i;
-    x0r = y0r - y2r;
-    x0i = y0i - y2i;
-    x1r = y4r - y6r;
-    x1i = y4i - y6i;
-    a[4] = x0r - x1i;
-    a[5] = x0i + x1r;
-    a[6] = x0r + x1i;
-    a[7] = x0i - x1r;
-    x0r = y1r - y3i;
-    x0i = y1i + y3r;
-    x1r = y5r - y7r;
-    x1i = y5i - y7i;
-    a[8] = x0r + x1r;
-    a[9] = x0i + x1i;
-    a[10] = x0r - x1r;
-    a[11] = x0i - x1i;
-    x0r = y1r + y3i;
-    x0i = y1i - y3r;
-    x1r = y5r + y7r;
-    x1i = y5i + y7i;
-    a[12] = x0r - x1i;
-    a[13] = x0i + x1r;
-    a[14] = x0r + x1i;
-    a[15] = x0i - x1r;
-}
-
-
-void cftf040(double *a)
-{
-    double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
-    
-    x0r = a[0] + a[4];
-    x0i = a[1] + a[5];
-    x1r = a[0] - a[4];
-    x1i = a[1] - a[5];
-    x2r = a[2] + a[6];
-    x2i = a[3] + a[7];
-    x3r = a[2] - a[6];
-    x3i = a[3] - a[7];
-    a[0] = x0r + x2r;
-    a[1] = x0i + x2i;
-    a[2] = x1r - x3i;
-    a[3] = x1i + x3r;
-    a[4] = x0r - x2r;
-    a[5] = x0i - x2i;
-    a[6] = x1r + x3i;
-    a[7] = x1i - x3r;
-}
-
-
-void cftb040(double *a)
-{
-    double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
-    
-    x0r = a[0] + a[4];
-    x0i = a[1] + a[5];
-    x1r = a[0] - a[4];
-    x1i = a[1] - a[5];
-    x2r = a[2] + a[6];
-    x2i = a[3] + a[7];
-    x3r = a[2] - a[6];
-    x3i = a[3] - a[7];
-    a[0] = x0r + x2r;
-    a[1] = x0i + x2i;
-    a[2] = x1r + x3i;
-    a[3] = x1i - x3r;
-    a[4] = x0r - x2r;
-    a[5] = x0i - x2i;
-    a[6] = x1r - x3i;
-    a[7] = x1i + x3r;
-}
-
-
-void cftx020(double *a)
-{
-    double x0r, x0i;
-    
-    x0r = a[0] - a[2];
-    x0i = a[1] - a[3];
-    a[0] += a[2];
-    a[1] += a[3];
-    a[2] = x0r;
-    a[3] = x0i;
-}
-
-
-void rftfsub(int n, double *a, int nc, double *c)
-{
-    int j, k, kk, ks, m;
-    double wkr, wki, xr, xi, yr, yi;
-    
-    m = n >> 1;
-    ks = 2 * nc / m;
-    kk = 0;
-    for (j = 2; j < m; j += 2) {
-        k = n - j;
-        kk += ks;
-        wkr = 0.5 - c[nc - kk];
-        wki = c[kk];
-        xr = a[j] - a[k];
-        xi = a[j + 1] + a[k + 1];
-        yr = wkr * xr - wki * xi;
-        yi = wkr * xi + wki * xr;
-        a[j] -= yr;
-        a[j + 1] -= yi;
-        a[k] += yr;
-        a[k + 1] -= yi;
-    }
-}
-
-
-void rftbsub(int n, double *a, int nc, double *c)
-{
-    int j, k, kk, ks, m;
-    double wkr, wki, xr, xi, yr, yi;
-    
-    m = n >> 1;
-    ks = 2 * nc / m;
-    kk = 0;
-    for (j = 2; j < m; j += 2) {
-        k = n - j;
-        kk += ks;
-        wkr = 0.5 - c[nc - kk];
-        wki = c[kk];
-        xr = a[j] - a[k];
-        xi = a[j + 1] + a[k + 1];
-        yr = wkr * xr + wki * xi;
-        yi = wkr * xi - wki * xr;
-        a[j] -= yr;
-        a[j + 1] -= yi;
-        a[k] += yr;
-        a[k + 1] -= yi;
-    }
-}
-
-
-void dctsub(int n, double *a, int nc, double *c)
-{
-    int j, k, kk, ks, m;
-    double wkr, wki, xr;
-    
-    m = n >> 1;
-    ks = nc / n;
-    kk = 0;
-    for (j = 1; j < m; j++) {
-        k = n - j;
-        kk += ks;
-        wkr = c[kk] - c[nc - kk];
-        wki = c[kk] + c[nc - kk];
-        xr = wki * a[j] - wkr * a[k];
-        a[j] = wkr * a[j] + wki * a[k];
-        a[k] = xr;
-    }
-    a[m] *= c[0];
-}
-
-
-void dstsub(int n, double *a, int nc, double *c)
-{
-    int j, k, kk, ks, m;
-    double wkr, wki, xr;
-    
-    m = n >> 1;
-    ks = nc / n;
-    kk = 0;
-    for (j = 1; j < m; j++) {
-        k = n - j;
-        kk += ks;
-        wkr = c[kk] - c[nc - kk];
-        wki = c[kk] + c[nc - kk];
-        xr = wki * a[k] - wkr * a[j];
-        a[k] = wkr * a[k] + wki * a[j];
-        a[j] = xr;
-    }
-    a[m] *= c[0];
-}
-
+/*
+Fast Fourier/Cosine/Sine Transform
+    dimension   :one
+    data length :power of 2
+    decimation  :frequency
+    radix       :split-radix
+    data        :inplace
+    table       :use
+functions
+    cdft: Complex Discrete Fourier Transform
+    rdft: Real Discrete Fourier Transform
+    ddct: Discrete Cosine Transform
+    ddst: Discrete Sine Transform
+    dfct: Cosine Transform of RDFT (Real Symmetric DFT)
+    dfst: Sine Transform of RDFT (Real Anti-symmetric DFT)
+function prototypes
+    void cdft(int, int, double *, int *, double *);
+    void rdft(int, int, double *, int *, double *);
+    void ddct(int, int, double *, int *, double *);
+    void ddst(int, int, double *, int *, double *);
+    void dfct(int, double *, double *, int *, double *);
+    void dfst(int, double *, double *, int *, double *);
+macro definitions
+    USE_CDFT_PTHREADS : default=not defined
+        CDFT_THREADS_BEGIN_N  : must be >= 512, default=8192
+        CDFT_4THREADS_BEGIN_N : must be >= 512, default=65536
+    USE_CDFT_WINTHREADS : default=not defined
+        CDFT_THREADS_BEGIN_N  : must be >= 512, default=32768
+        CDFT_4THREADS_BEGIN_N : must be >= 512, default=524288
+
+
+-------- Complex DFT (Discrete Fourier Transform) --------
+    [definition]
+        <case1>
+            X[k] = sum_j=0^n-1 x[j]*exp(2*pi*i*j*k/n), 0<=k<n
+        <case2>
+            X[k] = sum_j=0^n-1 x[j]*exp(-2*pi*i*j*k/n), 0<=k<n
+        (notes: sum_j=0^n-1 is a summation from j=0 to n-1)
+    [usage]
+        <case1>
+            ip[0] = 0; // first time only
+            cdft(2*n, 1, a, ip, w);
+        <case2>
+            ip[0] = 0; // first time only
+            cdft(2*n, -1, a, ip, w);
+    [parameters]
+        2*n            :data length (int)
+                        n >= 1, n = power of 2
+        a[0...2*n-1]   :input/output data (double *)
+                        input data
+                            a[2*j] = Re(x[j]), 
+                            a[2*j+1] = Im(x[j]), 0<=j<n
+                        output data
+                            a[2*k] = Re(X[k]), 
+                            a[2*k+1] = Im(X[k]), 0<=k<n
+        ip[0...*]      :work area for bit reversal (int *)
+                        length of ip >= 2+sqrt(n)
+                        strictly, 
+                        length of ip >= 
+                            2+(1<<(int)(log(n+0.5)/log(2))/2).
+                        ip[0],ip[1] are pointers of the cos/sin table.
+        w[0...n/2-1]   :cos/sin table (double *)
+                        w[],ip[] are initialized if ip[0] == 0.
+    [remark]
+        Inverse of 
+            cdft(2*n, -1, a, ip, w);
+        is 
+            cdft(2*n, 1, a, ip, w);
+            for (j = 0; j <= 2 * n - 1; j++) {
+                a[j] *= 1.0 / n;
+            }
+        .
+
+
+-------- Real DFT / Inverse of Real DFT --------
+    [definition]
+        <case1> RDFT
+            R[k] = sum_j=0^n-1 a[j]*cos(2*pi*j*k/n), 0<=k<=n/2
+            I[k] = sum_j=0^n-1 a[j]*sin(2*pi*j*k/n), 0<k<n/2
+        <case2> IRDFT (excluding scale)
+            a[k] = (R[0] + R[n/2]*cos(pi*k))/2 + 
+                   sum_j=1^n/2-1 R[j]*cos(2*pi*j*k/n) + 
+                   sum_j=1^n/2-1 I[j]*sin(2*pi*j*k/n), 0<=k<n
+    [usage]
+        <case1>
+            ip[0] = 0; // first time only
+            rdft(n, 1, a, ip, w);
+        <case2>
+            ip[0] = 0; // first time only
+            rdft(n, -1, a, ip, w);
+    [parameters]
+        n              :data length (int)
+                        n >= 2, n = power of 2
+        a[0...n-1]     :input/output data (double *)
+                        <case1>
+                            output data
+                                a[2*k] = R[k], 0<=k<n/2
+                                a[2*k+1] = I[k], 0<k<n/2
+                                a[1] = R[n/2]
+                        <case2>
+                            input data
+                                a[2*j] = R[j], 0<=j<n/2
+                                a[2*j+1] = I[j], 0<j<n/2
+                                a[1] = R[n/2]
+        ip[0...*]      :work area for bit reversal (int *)
+                        length of ip >= 2+sqrt(n/2)
+                        strictly, 
+                        length of ip >= 
+                            2+(1<<(int)(log(n/2+0.5)/log(2))/2).
+                        ip[0],ip[1] are pointers of the cos/sin table.
+        w[0...n/2-1]   :cos/sin table (double *)
+                        w[],ip[] are initialized if ip[0] == 0.
+    [remark]
+        Inverse of 
+            rdft(n, 1, a, ip, w);
+        is 
+            rdft(n, -1, a, ip, w);
+            for (j = 0; j <= n - 1; j++) {
+                a[j] *= 2.0 / n;
+            }
+        .
+
+
+-------- DCT (Discrete Cosine Transform) / Inverse of DCT --------
+    [definition]
+        <case1> IDCT (excluding scale)
+            C[k] = sum_j=0^n-1 a[j]*cos(pi*j*(k+1/2)/n), 0<=k<n
+        <case2> DCT
+            C[k] = sum_j=0^n-1 a[j]*cos(pi*(j+1/2)*k/n), 0<=k<n
+    [usage]
+        <case1>
+            ip[0] = 0; // first time only
+            ddct(n, 1, a, ip, w);
+        <case2>
+            ip[0] = 0; // first time only
+            ddct(n, -1, a, ip, w);
+    [parameters]
+        n              :data length (int)
+                        n >= 2, n = power of 2
+        a[0...n-1]     :input/output data (double *)
+                        output data
+                            a[k] = C[k], 0<=k<n
+        ip[0...*]      :work area for bit reversal (int *)
+                        length of ip >= 2+sqrt(n/2)
+                        strictly, 
+                        length of ip >= 
+                            2+(1<<(int)(log(n/2+0.5)/log(2))/2).
+                        ip[0],ip[1] are pointers of the cos/sin table.
+        w[0...n*5/4-1] :cos/sin table (double *)
+                        w[],ip[] are initialized if ip[0] == 0.
+    [remark]
+        Inverse of 
+            ddct(n, -1, a, ip, w);
+        is 
+            a[0] *= 0.5;
+            ddct(n, 1, a, ip, w);
+            for (j = 0; j <= n - 1; j++) {
+                a[j] *= 2.0 / n;
+            }
+        .
+
+
+-------- DST (Discrete Sine Transform) / Inverse of DST --------
+    [definition]
+        <case1> IDST (excluding scale)
+            S[k] = sum_j=1^n A[j]*sin(pi*j*(k+1/2)/n), 0<=k<n
+        <case2> DST
+            S[k] = sum_j=0^n-1 a[j]*sin(pi*(j+1/2)*k/n), 0<k<=n
+    [usage]
+        <case1>
+            ip[0] = 0; // first time only
+            ddst(n, 1, a, ip, w);
+        <case2>
+            ip[0] = 0; // first time only
+            ddst(n, -1, a, ip, w);
+    [parameters]
+        n              :data length (int)
+                        n >= 2, n = power of 2
+        a[0...n-1]     :input/output data (double *)
+                        <case1>
+                            input data
+                                a[j] = A[j], 0<j<n
+                                a[0] = A[n]
+                            output data
+                                a[k] = S[k], 0<=k<n
+                        <case2>
+                            output data
+                                a[k] = S[k], 0<k<n
+                                a[0] = S[n]
+        ip[0...*]      :work area for bit reversal (int *)
+                        length of ip >= 2+sqrt(n/2)
+                        strictly, 
+                        length of ip >= 
+                            2+(1<<(int)(log(n/2+0.5)/log(2))/2).
+                        ip[0],ip[1] are pointers of the cos/sin table.
+        w[0...n*5/4-1] :cos/sin table (double *)
+                        w[],ip[] are initialized if ip[0] == 0.
+    [remark]
+        Inverse of 
+            ddst(n, -1, a, ip, w);
+        is 
+            a[0] *= 0.5;
+            ddst(n, 1, a, ip, w);
+            for (j = 0; j <= n - 1; j++) {
+                a[j] *= 2.0 / n;
+            }
+        .
+
+
+-------- Cosine Transform of RDFT (Real Symmetric DFT) --------
+    [definition]
+        C[k] = sum_j=0^n a[j]*cos(pi*j*k/n), 0<=k<=n
+    [usage]
+        ip[0] = 0; // first time only
+        dfct(n, a, t, ip, w);
+    [parameters]
+        n              :data length - 1 (int)
+                        n >= 2, n = power of 2
+        a[0...n]       :input/output data (double *)
+                        output data
+                            a[k] = C[k], 0<=k<=n
+        t[0...n/2]     :work area (double *)
+        ip[0...*]      :work area for bit reversal (int *)
+                        length of ip >= 2+sqrt(n/4)
+                        strictly, 
+                        length of ip >= 
+                            2+(1<<(int)(log(n/4+0.5)/log(2))/2).
+                        ip[0],ip[1] are pointers of the cos/sin table.
+        w[0...n*5/8-1] :cos/sin table (double *)
+                        w[],ip[] are initialized if ip[0] == 0.
+    [remark]
+        Inverse of 
+            a[0] *= 0.5;
+            a[n] *= 0.5;
+            dfct(n, a, t, ip, w);
+        is 
+            a[0] *= 0.5;
+            a[n] *= 0.5;
+            dfct(n, a, t, ip, w);
+            for (j = 0; j <= n; j++) {
+                a[j] *= 2.0 / n;
+            }
+        .
+
+
+-------- Sine Transform of RDFT (Real Anti-symmetric DFT) --------
+    [definition]
+        S[k] = sum_j=1^n-1 a[j]*sin(pi*j*k/n), 0<k<n
+    [usage]
+        ip[0] = 0; // first time only
+        dfst(n, a, t, ip, w);
+    [parameters]
+        n              :data length + 1 (int)
+                        n >= 2, n = power of 2
+        a[0...n-1]     :input/output data (double *)
+                        output data
+                            a[k] = S[k], 0<k<n
+                        (a[0] is used for work area)
+        t[0...n/2-1]   :work area (double *)
+        ip[0...*]      :work area for bit reversal (int *)
+                        length of ip >= 2+sqrt(n/4)
+                        strictly, 
+                        length of ip >= 
+                            2+(1<<(int)(log(n/4+0.5)/log(2))/2).
+                        ip[0],ip[1] are pointers of the cos/sin table.
+        w[0...n*5/8-1] :cos/sin table (double *)
+                        w[],ip[] are initialized if ip[0] == 0.
+    [remark]
+        Inverse of 
+            dfst(n, a, t, ip, w);
+        is 
+            dfst(n, a, t, ip, w);
+            for (j = 1; j <= n - 1; j++) {
+                a[j] *= 2.0 / n;
+            }
+        .
+
+
+Appendix :
+    The cos/sin table is recalculated when the larger table required.
+    w[] and ip[] are compatible with all routines.
+*/
+
+
+void cdft(int n, int isgn, double *a, int *ip, double *w)
+{
+    void makewt(int nw, int *ip, double *w);
+    void cftfsub(int n, double *a, int *ip, int nw, double *w);
+    void cftbsub(int n, double *a, int *ip, int nw, double *w);
+    int nw;
+    
+    nw = ip[0];
+    if (n > (nw << 2)) {
+        nw = n >> 2;
+        makewt(nw, ip, w);
+    }
+    if (isgn >= 0) {
+        cftfsub(n, a, ip, nw, w);
+    } else {
+        cftbsub(n, a, ip, nw, w);
+    }
+}
+
+
+void rdft(int n, int isgn, double *a, int *ip, double *w)
+{
+    void makewt(int nw, int *ip, double *w);
+    void makect(int nc, int *ip, double *c);
+    void cftfsub(int n, double *a, int *ip, int nw, double *w);
+    void cftbsub(int n, double *a, int *ip, int nw, double *w);
+    void rftfsub(int n, double *a, int nc, double *c);
+    void rftbsub(int n, double *a, int nc, double *c);
+    int nw, nc;
+    double xi;
+    
+    nw = ip[0];
+    if (n > (nw << 2)) {
+        nw = n >> 2;
+        makewt(nw, ip, w);
+    }
+    nc = ip[1];
+    if (n > (nc << 2)) {
+        nc = n >> 2;
+        makect(nc, ip, w + nw);
+    }
+    if (isgn >= 0) {
+        if (n > 4) {
+            cftfsub(n, a, ip, nw, w);
+            rftfsub(n, a, nc, w + nw);
+        } else if (n == 4) {
+            cftfsub(n, a, ip, nw, w);
+        }
+        xi = a[0] - a[1];
+        a[0] += a[1];
+        a[1] = xi;
+    } else {
+        a[1] = 0.5 * (a[0] - a[1]);
+        a[0] -= a[1];
+        if (n > 4) {
+            rftbsub(n, a, nc, w + nw);
+            cftbsub(n, a, ip, nw, w);
+        } else if (n == 4) {
+            cftbsub(n, a, ip, nw, w);
+        }
+    }
+}
+
+
+void ddct(int n, int isgn, double *a, int *ip, double *w)
+{
+    void makewt(int nw, int *ip, double *w);
+    void makect(int nc, int *ip, double *c);
+    void cftfsub(int n, double *a, int *ip, int nw, double *w);
+    void cftbsub(int n, double *a, int *ip, int nw, double *w);
+    void rftfsub(int n, double *a, int nc, double *c);
+    void rftbsub(int n, double *a, int nc, double *c);
+    void dctsub(int n, double *a, int nc, double *c);
+    int j, nw, nc;
+    double xr;
+    
+    nw = ip[0];
+    if (n > (nw << 2)) {
+        nw = n >> 2;
+        makewt(nw, ip, w);
+    }
+    nc = ip[1];
+    if (n > nc) {
+        nc = n;
+        makect(nc, ip, w + nw);
+    }
+    if (isgn < 0) {
+        xr = a[n - 1];
+        for (j = n - 2; j >= 2; j -= 2) {
+            a[j + 1] = a[j] - a[j - 1];
+            a[j] += a[j - 1];
+        }
+        a[1] = a[0] - xr;
+        a[0] += xr;
+        if (n > 4) {
+            rftbsub(n, a, nc, w + nw);
+            cftbsub(n, a, ip, nw, w);
+        } else if (n == 4) {
+            cftbsub(n, a, ip, nw, w);
+        }
+    }
+    dctsub(n, a, nc, w + nw);
+    if (isgn >= 0) {
+        if (n > 4) {
+            cftfsub(n, a, ip, nw, w);
+            rftfsub(n, a, nc, w + nw);
+        } else if (n == 4) {
+            cftfsub(n, a, ip, nw, w);
+        }
+        xr = a[0] - a[1];
+        a[0] += a[1];
+        for (j = 2; j < n; j += 2) {
+            a[j - 1] = a[j] - a[j + 1];
+            a[j] += a[j + 1];
+        }
+        a[n - 1] = xr;
+    }
+}
+
+
+void ddst(int n, int isgn, double *a, int *ip, double *w)
+{
+    void makewt(int nw, int *ip, double *w);
+    void makect(int nc, int *ip, double *c);
+    void cftfsub(int n, double *a, int *ip, int nw, double *w);
+    void cftbsub(int n, double *a, int *ip, int nw, double *w);
+    void rftfsub(int n, double *a, int nc, double *c);
+    void rftbsub(int n, double *a, int nc, double *c);
+    void dstsub(int n, double *a, int nc, double *c);
+    int j, nw, nc;
+    double xr;
+    
+    nw = ip[0];
+    if (n > (nw << 2)) {
+        nw = n >> 2;
+        makewt(nw, ip, w);
+    }
+    nc = ip[1];
+    if (n > nc) {
+        nc = n;
+        makect(nc, ip, w + nw);
+    }
+    if (isgn < 0) {
+        xr = a[n - 1];
+        for (j = n - 2; j >= 2; j -= 2) {
+            a[j + 1] = -a[j] - a[j - 1];
+            a[j] -= a[j - 1];
+        }
+        a[1] = a[0] + xr;
+        a[0] -= xr;
+        if (n > 4) {
+            rftbsub(n, a, nc, w + nw);
+            cftbsub(n, a, ip, nw, w);
+        } else if (n == 4) {
+            cftbsub(n, a, ip, nw, w);
+        }
+    }
+    dstsub(n, a, nc, w + nw);
+    if (isgn >= 0) {
+        if (n > 4) {
+            cftfsub(n, a, ip, nw, w);
+            rftfsub(n, a, nc, w + nw);
+        } else if (n == 4) {
+            cftfsub(n, a, ip, nw, w);
+        }
+        xr = a[0] - a[1];
+        a[0] += a[1];
+        for (j = 2; j < n; j += 2) {
+            a[j - 1] = -a[j] - a[j + 1];
+            a[j] -= a[j + 1];
+        }
+        a[n - 1] = -xr;
+    }
+}
+
+
+void dfct(int n, double *a, double *t, int *ip, double *w)
+{
+    void makewt(int nw, int *ip, double *w);
+    void makect(int nc, int *ip, double *c);
+    void cftfsub(int n, double *a, int *ip, int nw, double *w);
+    void rftfsub(int n, double *a, int nc, double *c);
+    void dctsub(int n, double *a, int nc, double *c);
+    int j, k, l, m, mh, nw, nc;
+    double xr, xi, yr, yi;
+    
+    nw = ip[0];
+    if (n > (nw << 3)) {
+        nw = n >> 3;
+        makewt(nw, ip, w);
+    }
+    nc = ip[1];
+    if (n > (nc << 1)) {
+        nc = n >> 1;
+        makect(nc, ip, w + nw);
+    }
+    m = n >> 1;
+    yi = a[m];
+    xi = a[0] + a[n];
+    a[0] -= a[n];
+    t[0] = xi - yi;
+    t[m] = xi + yi;
+    if (n > 2) {
+        mh = m >> 1;
+        for (j = 1; j < mh; j++) {
+            k = m - j;
+            xr = a[j] - a[n - j];
+            xi = a[j] + a[n - j];
+            yr = a[k] - a[n - k];
+            yi = a[k] + a[n - k];
+            a[j] = xr;
+            a[k] = yr;
+            t[j] = xi - yi;
+            t[k] = xi + yi;
+        }
+        t[mh] = a[mh] + a[n - mh];
+        a[mh] -= a[n - mh];
+        dctsub(m, a, nc, w + nw);
+        if (m > 4) {
+            cftfsub(m, a, ip, nw, w);
+            rftfsub(m, a, nc, w + nw);
+        } else if (m == 4) {
+            cftfsub(m, a, ip, nw, w);
+        }
+        a[n - 1] = a[0] - a[1];
+        a[1] = a[0] + a[1];
+        for (j = m - 2; j >= 2; j -= 2) {
+            a[2 * j + 1] = a[j] + a[j + 1];
+            a[2 * j - 1] = a[j] - a[j + 1];
+        }
+        l = 2;
+        m = mh;
+        while (m >= 2) {
+            dctsub(m, t, nc, w + nw);
+            if (m > 4) {
+                cftfsub(m, t, ip, nw, w);
+                rftfsub(m, t, nc, w + nw);
+            } else if (m == 4) {
+                cftfsub(m, t, ip, nw, w);
+            }
+            a[n - l] = t[0] - t[1];
+            a[l] = t[0] + t[1];
+            k = 0;
+            for (j = 2; j < m; j += 2) {
+                k += l << 2;
+                a[k - l] = t[j] - t[j + 1];
+                a[k + l] = t[j] + t[j + 1];
+            }
+            l <<= 1;
+            mh = m >> 1;
+            for (j = 0; j < mh; j++) {
+                k = m - j;
+                t[j] = t[m + k] - t[m + j];
+                t[k] = t[m + k] + t[m + j];
+            }
+            t[mh] = t[m + mh];
+            m = mh;
+        }
+        a[l] = t[0];
+        a[n] = t[2] - t[1];
+        a[0] = t[2] + t[1];
+    } else {
+        a[1] = a[0];
+        a[2] = t[0];
+        a[0] = t[1];
+    }
+}
+
+
+void dfst(int n, double *a, double *t, int *ip, double *w)
+{
+    void makewt(int nw, int *ip, double *w);
+    void makect(int nc, int *ip, double *c);
+    void cftfsub(int n, double *a, int *ip, int nw, double *w);
+    void rftfsub(int n, double *a, int nc, double *c);
+    void dstsub(int n, double *a, int nc, double *c);
+    int j, k, l, m, mh, nw, nc;
+    double xr, xi, yr, yi;
+    
+    nw = ip[0];
+    if (n > (nw << 3)) {
+        nw = n >> 3;
+        makewt(nw, ip, w);
+    }
+    nc = ip[1];
+    if (n > (nc << 1)) {
+        nc = n >> 1;
+        makect(nc, ip, w + nw);
+    }
+    if (n > 2) {
+        m = n >> 1;
+        mh = m >> 1;
+        for (j = 1; j < mh; j++) {
+            k = m - j;
+            xr = a[j] + a[n - j];
+            xi = a[j] - a[n - j];
+            yr = a[k] + a[n - k];
+            yi = a[k] - a[n - k];
+            a[j] = xr;
+            a[k] = yr;
+            t[j] = xi + yi;
+            t[k] = xi - yi;
+        }
+        t[0] = a[mh] - a[n - mh];
+        a[mh] += a[n - mh];
+        a[0] = a[m];
+        dstsub(m, a, nc, w + nw);
+        if (m > 4) {
+            cftfsub(m, a, ip, nw, w);
+            rftfsub(m, a, nc, w + nw);
+        } else if (m == 4) {
+            cftfsub(m, a, ip, nw, w);
+        }
+        a[n - 1] = a[1] - a[0];
+        a[1] = a[0] + a[1];
+        for (j = m - 2; j >= 2; j -= 2) {
+            a[2 * j + 1] = a[j] - a[j + 1];
+            a[2 * j - 1] = -a[j] - a[j + 1];
+        }
+        l = 2;
+        m = mh;
+        while (m >= 2) {
+            dstsub(m, t, nc, w + nw);
+            if (m > 4) {
+                cftfsub(m, t, ip, nw, w);
+                rftfsub(m, t, nc, w + nw);
+            } else if (m == 4) {
+                cftfsub(m, t, ip, nw, w);
+            }
+            a[n - l] = t[1] - t[0];
+            a[l] = t[0] + t[1];
+            k = 0;
+            for (j = 2; j < m; j += 2) {
+                k += l << 2;
+                a[k - l] = -t[j] - t[j + 1];
+                a[k + l] = t[j] - t[j + 1];
+            }
+            l <<= 1;
+            mh = m >> 1;
+            for (j = 1; j < mh; j++) {
+                k = m - j;
+                t[j] = t[m + k] + t[m + j];
+                t[k] = t[m + k] - t[m + j];
+            }
+            t[0] = t[m + mh];
+            m = mh;
+        }
+        a[l] = t[0];
+    }
+    a[0] = 0;
+}
+
+
+/* -------- initializing routines -------- */
+
+
+#include <math.h>
+
+void makewt(int nw, int *ip, double *w)
+{
+    void makeipt(int nw, int *ip);
+    int j, nwh, nw0, nw1;
+    double delta, wn4r, wk1r, wk1i, wk3r, wk3i;
+    
+    ip[0] = nw;
+    ip[1] = 1;
+    if (nw > 2) {
+        nwh = nw >> 1;
+        delta = atan(1.0) / nwh;
+        wn4r = cos(delta * nwh);
+        w[0] = 1;
+        w[1] = wn4r;
+        if (nwh == 4) {
+            w[2] = cos(delta * 2);
+            w[3] = sin(delta * 2);
+        } else if (nwh > 4) {
+            makeipt(nw, ip);
+            w[2] = 0.5 / cos(delta * 2);
+            w[3] = 0.5 / cos(delta * 6);
+            for (j = 4; j < nwh; j += 4) {
+                w[j] = cos(delta * j);
+                w[j + 1] = sin(delta * j);
+                w[j + 2] = cos(3 * delta * j);
+                w[j + 3] = -sin(3 * delta * j);
+            }
+        }
+        nw0 = 0;
+        while (nwh > 2) {
+            nw1 = nw0 + nwh;
+            nwh >>= 1;
+            w[nw1] = 1;
+            w[nw1 + 1] = wn4r;
+            if (nwh == 4) {
+                wk1r = w[nw0 + 4];
+                wk1i = w[nw0 + 5];
+                w[nw1 + 2] = wk1r;
+                w[nw1 + 3] = wk1i;
+            } else if (nwh > 4) {
+                wk1r = w[nw0 + 4];
+                wk3r = w[nw0 + 6];
+                w[nw1 + 2] = 0.5 / wk1r;
+                w[nw1 + 3] = 0.5 / wk3r;
+                for (j = 4; j < nwh; j += 4) {
+                    wk1r = w[nw0 + 2 * j];
+                    wk1i = w[nw0 + 2 * j + 1];
+                    wk3r = w[nw0 + 2 * j + 2];
+                    wk3i = w[nw0 + 2 * j + 3];
+                    w[nw1 + j] = wk1r;
+                    w[nw1 + j + 1] = wk1i;
+                    w[nw1 + j + 2] = wk3r;
+                    w[nw1 + j + 3] = wk3i;
+                }
+            }
+            nw0 = nw1;
+        }
+    }
+}
+
+
+void makeipt(int nw, int *ip)
+{
+    int j, l, m, m2, p, q;
+    
+    ip[2] = 0;
+    ip[3] = 16;
+    m = 2;
+    for (l = nw; l > 32; l >>= 2) {
+        m2 = m << 1;
+        q = m2 << 3;
+        for (j = m; j < m2; j++) {
+            p = ip[j] << 2;
+            ip[m + j] = p;
+            ip[m2 + j] = p + q;
+        }
+        m = m2;
+    }
+}
+
+
+void makect(int nc, int *ip, double *c)
+{
+    int j, nch;
+    double delta;
+    
+    ip[1] = nc;
+    if (nc > 1) {
+        nch = nc >> 1;
+        delta = atan(1.0) / nch;
+        c[0] = cos(delta * nch);
+        c[nch] = 0.5 * c[0];
+        for (j = 1; j < nch; j++) {
+            c[j] = 0.5 * cos(delta * j);
+            c[nc - j] = 0.5 * sin(delta * j);
+        }
+    }
+}
+
+
+/* -------- child routines -------- */
+
+
+#ifdef USE_CDFT_PTHREADS
+#define USE_CDFT_THREADS
+#ifndef CDFT_THREADS_BEGIN_N
+#define CDFT_THREADS_BEGIN_N 8192
+#endif
+#ifndef CDFT_4THREADS_BEGIN_N
+#define CDFT_4THREADS_BEGIN_N 65536
+#endif
+#include <pthread.h>
+#include <stdio.h>
+#include <stdlib.h>
+#define cdft_thread_t pthread_t
+#define cdft_thread_create(thp,func,argp) { \
+    if (pthread_create(thp, NULL, func, (void *) argp) != 0) { \
+        fprintf(stderr, "cdft thread error\n"); \
+        exit(1); \
+    } \
+}
+#define cdft_thread_wait(th) { \
+    if (pthread_join(th, NULL) != 0) { \
+        fprintf(stderr, "cdft thread error\n"); \
+        exit(1); \
+    } \
+}
+#endif /* USE_CDFT_PTHREADS */
+
+
+#ifdef USE_CDFT_WINTHREADS
+#define USE_CDFT_THREADS
+#ifndef CDFT_THREADS_BEGIN_N
+#define CDFT_THREADS_BEGIN_N 32768
+#endif
+#ifndef CDFT_4THREADS_BEGIN_N
+#define CDFT_4THREADS_BEGIN_N 524288
+#endif
+#include <windows.h>
+#include <stdio.h>
+#include <stdlib.h>
+#define cdft_thread_t HANDLE
+#define cdft_thread_create(thp,func,argp) { \
+    DWORD thid; \
+    *(thp) = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) func, (LPVOID) argp, 0, &thid); \
+    if (*(thp) == 0) { \
+        fprintf(stderr, "cdft thread error\n"); \
+        exit(1); \
+    } \
+}
+#define cdft_thread_wait(th) { \
+    WaitForSingleObject(th, INFINITE); \
+    CloseHandle(th); \
+}
+#endif /* USE_CDFT_WINTHREADS */
+
+
+void cftfsub(int n, double *a, int *ip, int nw, double *w)
+{
+    void bitrv2(int n, int *ip, double *a);
+    void bitrv216(double *a);
+    void bitrv208(double *a);
+    void cftf1st(int n, double *a, double *w);
+    void cftrec4(int n, double *a, int nw, double *w);
+    void cftleaf(int n, int isplt, double *a, int nw, double *w);
+    void cftfx41(int n, double *a, int nw, double *w);
+    void cftf161(double *a, double *w);
+    void cftf081(double *a, double *w);
+    void cftf040(double *a);
+    void cftx020(double *a);
+#ifdef USE_CDFT_THREADS
+    void cftrec4_th(int n, double *a, int nw, double *w);
+#endif /* USE_CDFT_THREADS */
+    
+    if (n > 8) {
+        if (n > 32) {
+            cftf1st(n, a, &w[nw - (n >> 2)]);
+#ifdef USE_CDFT_THREADS
+            if (n > CDFT_THREADS_BEGIN_N) {
+                cftrec4_th(n, a, nw, w);
+            } else 
+#endif /* USE_CDFT_THREADS */
+            if (n > 512) {
+                cftrec4(n, a, nw, w);
+            } else if (n > 128) {
+                cftleaf(n, 1, a, nw, w);
+            } else {
+                cftfx41(n, a, nw, w);
+            }
+            bitrv2(n, ip, a);
+        } else if (n == 32) {
+            cftf161(a, &w[nw - 8]);
+            bitrv216(a);
+        } else {
+            cftf081(a, w);
+            bitrv208(a);
+        }
+    } else if (n == 8) {
+        cftf040(a);
+    } else if (n == 4) {
+        cftx020(a);
+    }
+}
+
+
+void cftbsub(int n, double *a, int *ip, int nw, double *w)
+{
+    void bitrv2conj(int n, int *ip, double *a);
+    void bitrv216neg(double *a);
+    void bitrv208neg(double *a);
+    void cftb1st(int n, double *a, double *w);
+    void cftrec4(int n, double *a, int nw, double *w);
+    void cftleaf(int n, int isplt, double *a, int nw, double *w);
+    void cftfx41(int n, double *a, int nw, double *w);
+    void cftf161(double *a, double *w);
+    void cftf081(double *a, double *w);
+    void cftb040(double *a);
+    void cftx020(double *a);
+#ifdef USE_CDFT_THREADS
+    void cftrec4_th(int n, double *a, int nw, double *w);
+#endif /* USE_CDFT_THREADS */
+    
+    if (n > 8) {
+        if (n > 32) {
+            cftb1st(n, a, &w[nw - (n >> 2)]);
+#ifdef USE_CDFT_THREADS
+            if (n > CDFT_THREADS_BEGIN_N) {
+                cftrec4_th(n, a, nw, w);
+            } else 
+#endif /* USE_CDFT_THREADS */
+            if (n > 512) {
+                cftrec4(n, a, nw, w);
+            } else if (n > 128) {
+                cftleaf(n, 1, a, nw, w);
+            } else {
+                cftfx41(n, a, nw, w);
+            }
+            bitrv2conj(n, ip, a);
+        } else if (n == 32) {
+            cftf161(a, &w[nw - 8]);
+            bitrv216neg(a);
+        } else {
+            cftf081(a, w);
+            bitrv208neg(a);
+        }
+    } else if (n == 8) {
+        cftb040(a);
+    } else if (n == 4) {
+        cftx020(a);
+    }
+}
+
+
+void bitrv2(int n, int *ip, double *a)
+{
+    int j, j1, k, k1, l, m, nh, nm;
+    double xr, xi, yr, yi;
+    
+    m = 1;
+    for (l = n >> 2; l > 8; l >>= 2) {
+        m <<= 1;
+    }
+    nh = n >> 1;
+    nm = 4 * m;
+    if (l == 8) {
+        for (k = 0; k < m; k++) {
+            for (j = 0; j < k; j++) {
+                j1 = 4 * j + 2 * ip[m + k];
+                k1 = 4 * k + 2 * ip[m + j];
+                xr = a[j1];
+                xi = a[j1 + 1];
+                yr = a[k1];
+                yi = a[k1 + 1];
+                a[j1] = yr;
+                a[j1 + 1] = yi;
+                a[k1] = xr;
+                a[k1 + 1] = xi;
+                j1 += nm;
+                k1 += 2 * nm;
+                xr = a[j1];
+                xi = a[j1 + 1];
+                yr = a[k1];
+                yi = a[k1 + 1];
+                a[j1] = yr;
+                a[j1 + 1] = yi;
+                a[k1] = xr;
+                a[k1 + 1] = xi;
+                j1 += nm;
+                k1 -= nm;
+                xr = a[j1];
+                xi = a[j1 + 1];
+                yr = a[k1];
+                yi = a[k1 + 1];
+                a[j1] = yr;
+                a[j1 + 1] = yi;
+                a[k1] = xr;
+                a[k1 + 1] = xi;
+                j1 += nm;
+                k1 += 2 * nm;
+                xr = a[j1];
+                xi = a[j1 + 1];
+                yr = a[k1];
+                yi = a[k1 + 1];
+                a[j1] = yr;
+                a[j1 + 1] = yi;
+                a[k1] = xr;
+                a[k1 + 1] = xi;
+                j1 += nh;
+                k1 += 2;
+                xr = a[j1];
+                xi = a[j1 + 1];
+                yr = a[k1];
+                yi = a[k1 + 1];
+                a[j1] = yr;
+                a[j1 + 1] = yi;
+                a[k1] = xr;
+                a[k1 + 1] = xi;
+                j1 -= nm;
+                k1 -= 2 * nm;
+                xr = a[j1];
+                xi = a[j1 + 1];
+                yr = a[k1];
+                yi = a[k1 + 1];
+                a[j1] = yr;
+                a[j1 + 1] = yi;
+                a[k1] = xr;
+                a[k1 + 1] = xi;
+                j1 -= nm;
+                k1 += nm;
+                xr = a[j1];
+                xi = a[j1 + 1];
+                yr = a[k1];
+                yi = a[k1 + 1];
+                a[j1] = yr;
+                a[j1 + 1] = yi;
+                a[k1] = xr;
+                a[k1 + 1] = xi;
+                j1 -= nm;
+                k1 -= 2 * nm;
+                xr = a[j1];
+                xi = a[j1 + 1];
+                yr = a[k1];
+                yi = a[k1 + 1];
+                a[j1] = yr;
+                a[j1 + 1] = yi;
+                a[k1] = xr;
+                a[k1 + 1] = xi;
+                j1 += 2;
+                k1 += nh;
+                xr = a[j1];
+                xi = a[j1 + 1];
+                yr = a[k1];
+                yi = a[k1 + 1];
+                a[j1] = yr;
+                a[j1 + 1] = yi;
+                a[k1] = xr;
+                a[k1 + 1] = xi;
+                j1 += nm;
+                k1 += 2 * nm;
+                xr = a[j1];
+                xi = a[j1 + 1];
+                yr = a[k1];
+                yi = a[k1 + 1];
+                a[j1] = yr;
+                a[j1 + 1] = yi;
+                a[k1] = xr;
+                a[k1 + 1] = xi;
+                j1 += nm;
+                k1 -= nm;
+                xr = a[j1];
+                xi = a[j1 + 1];
+                yr = a[k1];
+                yi = a[k1 + 1];
+                a[j1] = yr;
+                a[j1 + 1] = yi;
+                a[k1] = xr;
+                a[k1 + 1] = xi;
+                j1 += nm;
+                k1 += 2 * nm;
+                xr = a[j1];
+                xi = a[j1 + 1];
+                yr = a[k1];
+                yi = a[k1 + 1];
+                a[j1] = yr;
+                a[j1 + 1] = yi;
+                a[k1] = xr;
+                a[k1 + 1] = xi;
+                j1 -= nh;
+                k1 -= 2;
+                xr = a[j1];
+                xi = a[j1 + 1];
+                yr = a[k1];
+                yi = a[k1 + 1];
+                a[j1] = yr;
+                a[j1 + 1] = yi;
+                a[k1] = xr;
+                a[k1 + 1] = xi;
+                j1 -= nm;
+                k1 -= 2 * nm;
+                xr = a[j1];
+                xi = a[j1 + 1];
+                yr = a[k1];
+                yi = a[k1 + 1];
+                a[j1] = yr;
+                a[j1 + 1] = yi;
+                a[k1] = xr;
+                a[k1 + 1] = xi;
+                j1 -= nm;
+                k1 += nm;
+                xr = a[j1];
+                xi = a[j1 + 1];
+                yr = a[k1];
+                yi = a[k1 + 1];
+                a[j1] = yr;
+                a[j1 + 1] = yi;
+                a[k1] = xr;
+                a[k1 + 1] = xi;
+                j1 -= nm;
+                k1 -= 2 * nm;
+                xr = a[j1];
+                xi = a[j1 + 1];
+                yr = a[k1];
+                yi = a[k1 + 1];
+                a[j1] = yr;
+                a[j1 + 1] = yi;
+                a[k1] = xr;
+                a[k1 + 1] = xi;
+            }
+            k1 = 4 * k + 2 * ip[m + k];
+            j1 = k1 + 2;
+            k1 += nh;
+            xr = a[j1];
+            xi = a[j1 + 1];
+            yr = a[k1];
+            yi = a[k1 + 1];
+            a[j1] = yr;
+            a[j1 + 1] = yi;
+            a[k1] = xr;
+            a[k1 + 1] = xi;
+            j1 += nm;
+            k1 += 2 * nm;
+            xr = a[j1];
+            xi = a[j1 + 1];
+            yr = a[k1];
+            yi = a[k1 + 1];
+            a[j1] = yr;
+            a[j1 + 1] = yi;
+            a[k1] = xr;
+            a[k1 + 1] = xi;
+            j1 += nm;
+            k1 -= nm;
+            xr = a[j1];
+            xi = a[j1 + 1];
+            yr = a[k1];
+            yi = a[k1 + 1];
+            a[j1] = yr;
+            a[j1 + 1] = yi;
+            a[k1] = xr;
+            a[k1 + 1] = xi;
+            j1 -= 2;
+            k1 -= nh;
+            xr = a[j1];
+            xi = a[j1 + 1];
+            yr = a[k1];
+            yi = a[k1 + 1];
+            a[j1] = yr;
+            a[j1 + 1] = yi;
+            a[k1] = xr;
+            a[k1 + 1] = xi;
+            j1 += nh + 2;
+            k1 += nh + 2;
+            xr = a[j1];
+            xi = a[j1 + 1];
+            yr = a[k1];
+            yi = a[k1 + 1];
+            a[j1] = yr;
+            a[j1 + 1] = yi;
+            a[k1] = xr;
+            a[k1 + 1] = xi;
+            j1 -= nh - nm;
+            k1 += 2 * nm - 2;
+            xr = a[j1];
+            xi = a[j1 + 1];
+            yr = a[k1];
+            yi = a[k1 + 1];
+            a[j1] = yr;
+            a[j1 + 1] = yi;
+            a[k1] = xr;
+            a[k1 + 1] = xi;
+        }
+    } else {
+        for (k = 0; k < m; k++) {
+            for (j = 0; j < k; j++) {
+                j1 = 4 * j + ip[m + k];
+                k1 = 4 * k + ip[m + j];
+                xr = a[j1];
+                xi = a[j1 + 1];
+                yr = a[k1];
+                yi = a[k1 + 1];
+                a[j1] = yr;
+                a[j1 + 1] = yi;
+                a[k1] = xr;
+                a[k1 + 1] = xi;
+                j1 += nm;
+                k1 += nm;
+                xr = a[j1];
+                xi = a[j1 + 1];
+                yr = a[k1];
+                yi = a[k1 + 1];
+                a[j1] = yr;
+                a[j1 + 1] = yi;
+                a[k1] = xr;
+                a[k1 + 1] = xi;
+                j1 += nh;
+                k1 += 2;
+                xr = a[j1];
+                xi = a[j1 + 1];
+                yr = a[k1];
+                yi = a[k1 + 1];
+                a[j1] = yr;
+                a[j1 + 1] = yi;
+                a[k1] = xr;
+                a[k1 + 1] = xi;
+                j1 -= nm;
+                k1 -= nm;
+                xr = a[j1];
+                xi = a[j1 + 1];
+                yr = a[k1];
+                yi = a[k1 + 1];
+                a[j1] = yr;
+                a[j1 + 1] = yi;
+                a[k1] = xr;
+                a[k1 + 1] = xi;
+                j1 += 2;
+                k1 += nh;
+                xr = a[j1];
+                xi = a[j1 + 1];
+                yr = a[k1];
+                yi = a[k1 + 1];
+                a[j1] = yr;
+                a[j1 + 1] = yi;
+                a[k1] = xr;
+                a[k1 + 1] = xi;
+                j1 += nm;
+                k1 += nm;
+                xr = a[j1];
+                xi = a[j1 + 1];
+                yr = a[k1];
+                yi = a[k1 + 1];
+                a[j1] = yr;
+                a[j1 + 1] = yi;
+                a[k1] = xr;
+                a[k1 + 1] = xi;
+                j1 -= nh;
+                k1 -= 2;
+                xr = a[j1];
+                xi = a[j1 + 1];
+                yr = a[k1];
+                yi = a[k1 + 1];
+                a[j1] = yr;
+                a[j1 + 1] = yi;
+                a[k1] = xr;
+                a[k1 + 1] = xi;
+                j1 -= nm;
+                k1 -= nm;
+                xr = a[j1];
+                xi = a[j1 + 1];
+                yr = a[k1];
+                yi = a[k1 + 1];
+                a[j1] = yr;
+                a[j1 + 1] = yi;
+                a[k1] = xr;
+                a[k1 + 1] = xi;
+            }
+            k1 = 4 * k + ip[m + k];
+            j1 = k1 + 2;
+            k1 += nh;
+            xr = a[j1];
+            xi = a[j1 + 1];
+            yr = a[k1];
+            yi = a[k1 + 1];
+            a[j1] = yr;
+            a[j1 + 1] = yi;
+            a[k1] = xr;
+            a[k1 + 1] = xi;
+            j1 += nm;
+            k1 += nm;
+            xr = a[j1];
+            xi = a[j1 + 1];
+            yr = a[k1];
+            yi = a[k1 + 1];
+            a[j1] = yr;
+            a[j1 + 1] = yi;
+            a[k1] = xr;
+            a[k1 + 1] = xi;
+        }
+    }
+}
+
+
+void bitrv2conj(int n, int *ip, double *a)
+{
+    int j, j1, k, k1, l, m, nh, nm;
+    double xr, xi, yr, yi;
+    
+    m = 1;
+    for (l = n >> 2; l > 8; l >>= 2) {
+        m <<= 1;
+    }
+    nh = n >> 1;
+    nm = 4 * m;
+    if (l == 8) {
+        for (k = 0; k < m; k++) {
+            for (j = 0; j < k; j++) {
+                j1 = 4 * j + 2 * ip[m + k];
+                k1 = 4 * k + 2 * ip[m + j];
+                xr = a[j1];
+                xi = -a[j1 + 1];
+                yr = a[k1];
+                yi = -a[k1 + 1];
+                a[j1] = yr;
+                a[j1 + 1] = yi;
+                a[k1] = xr;
+                a[k1 + 1] = xi;
+                j1 += nm;
+                k1 += 2 * nm;
+                xr = a[j1];
+                xi = -a[j1 + 1];
+                yr = a[k1];
+                yi = -a[k1 + 1];
+                a[j1] = yr;
+                a[j1 + 1] = yi;
+                a[k1] = xr;
+                a[k1 + 1] = xi;
+                j1 += nm;
+                k1 -= nm;
+                xr = a[j1];
+                xi = -a[j1 + 1];
+                yr = a[k1];
+                yi = -a[k1 + 1];
+                a[j1] = yr;
+                a[j1 + 1] = yi;
+                a[k1] = xr;
+                a[k1 + 1] = xi;
+                j1 += nm;
+                k1 += 2 * nm;
+                xr = a[j1];
+                xi = -a[j1 + 1];
+                yr = a[k1];
+                yi = -a[k1 + 1];
+                a[j1] = yr;
+                a[j1 + 1] = yi;
+                a[k1] = xr;
+                a[k1 + 1] = xi;
+                j1 += nh;
+                k1 += 2;
+                xr = a[j1];
+                xi = -a[j1 + 1];
+                yr = a[k1];
+                yi = -a[k1 + 1];
+                a[j1] = yr;
+                a[j1 + 1] = yi;
+                a[k1] = xr;
+                a[k1 + 1] = xi;
+                j1 -= nm;
+                k1 -= 2 * nm;
+                xr = a[j1];
+                xi = -a[j1 + 1];
+                yr = a[k1];
+                yi = -a[k1 + 1];
+                a[j1] = yr;
+                a[j1 + 1] = yi;
+                a[k1] = xr;
+                a[k1 + 1] = xi;
+                j1 -= nm;
+                k1 += nm;
+                xr = a[j1];
+                xi = -a[j1 + 1];
+                yr = a[k1];
+                yi = -a[k1 + 1];
+                a[j1] = yr;
+                a[j1 + 1] = yi;
+                a[k1] = xr;
+                a[k1 + 1] = xi;
+                j1 -= nm;
+                k1 -= 2 * nm;
+                xr = a[j1];
+                xi = -a[j1 + 1];
+                yr = a[k1];
+                yi = -a[k1 + 1];
+                a[j1] = yr;
+                a[j1 + 1] = yi;
+                a[k1] = xr;
+                a[k1 + 1] = xi;
+                j1 += 2;
+                k1 += nh;
+                xr = a[j1];
+                xi = -a[j1 + 1];
+                yr = a[k1];
+                yi = -a[k1 + 1];
+                a[j1] = yr;
+                a[j1 + 1] = yi;
+                a[k1] = xr;
+                a[k1 + 1] = xi;
+                j1 += nm;
+                k1 += 2 * nm;
+                xr = a[j1];
+                xi = -a[j1 + 1];
+                yr = a[k1];
+                yi = -a[k1 + 1];
+                a[j1] = yr;
+                a[j1 + 1] = yi;
+                a[k1] = xr;
+                a[k1 + 1] = xi;
+                j1 += nm;
+                k1 -= nm;
+                xr = a[j1];
+                xi = -a[j1 + 1];
+                yr = a[k1];
+                yi = -a[k1 + 1];
+                a[j1] = yr;
+                a[j1 + 1] = yi;
+                a[k1] = xr;
+                a[k1 + 1] = xi;
+                j1 += nm;
+                k1 += 2 * nm;
+                xr = a[j1];
+                xi = -a[j1 + 1];
+                yr = a[k1];
+                yi = -a[k1 + 1];
+                a[j1] = yr;
+                a[j1 + 1] = yi;
+                a[k1] = xr;
+                a[k1 + 1] = xi;
+                j1 -= nh;
+                k1 -= 2;
+                xr = a[j1];
+                xi = -a[j1 + 1];
+                yr = a[k1];
+                yi = -a[k1 + 1];
+                a[j1] = yr;
+                a[j1 + 1] = yi;
+                a[k1] = xr;
+                a[k1 + 1] = xi;
+                j1 -= nm;
+                k1 -= 2 * nm;
+                xr = a[j1];
+                xi = -a[j1 + 1];
+                yr = a[k1];
+                yi = -a[k1 + 1];
+                a[j1] = yr;
+                a[j1 + 1] = yi;
+                a[k1] = xr;
+                a[k1 + 1] = xi;
+                j1 -= nm;
+                k1 += nm;
+                xr = a[j1];
+                xi = -a[j1 + 1];
+                yr = a[k1];
+                yi = -a[k1 + 1];
+                a[j1] = yr;
+                a[j1 + 1] = yi;
+                a[k1] = xr;
+                a[k1 + 1] = xi;
+                j1 -= nm;
+                k1 -= 2 * nm;
+                xr = a[j1];
+                xi = -a[j1 + 1];
+                yr = a[k1];
+                yi = -a[k1 + 1];
+                a[j1] = yr;
+                a[j1 + 1] = yi;
+                a[k1] = xr;
+                a[k1 + 1] = xi;
+            }
+            k1 = 4 * k + 2 * ip[m + k];
+            j1 = k1 + 2;
+            k1 += nh;
+            a[j1 - 1] = -a[j1 - 1];
+            xr = a[j1];
+            xi = -a[j1 + 1];
+            yr = a[k1];
+            yi = -a[k1 + 1];
+            a[j1] = yr;
+            a[j1 + 1] = yi;
+            a[k1] = xr;
+            a[k1 + 1] = xi;
+            a[k1 + 3] = -a[k1 + 3];
+            j1 += nm;
+            k1 += 2 * nm;
+            xr = a[j1];
+            xi = -a[j1 + 1];
+            yr = a[k1];
+            yi = -a[k1 + 1];
+            a[j1] = yr;
+            a[j1 + 1] = yi;
+            a[k1] = xr;
+            a[k1 + 1] = xi;
+            j1 += nm;
+            k1 -= nm;
+            xr = a[j1];
+            xi = -a[j1 + 1];
+            yr = a[k1];
+            yi = -a[k1 + 1];
+            a[j1] = yr;
+            a[j1 + 1] = yi;
+            a[k1] = xr;
+            a[k1 + 1] = xi;
+            j1 -= 2;
+            k1 -= nh;
+            xr = a[j1];
+            xi = -a[j1 + 1];
+            yr = a[k1];
+            yi = -a[k1 + 1];
+            a[j1] = yr;
+            a[j1 + 1] = yi;
+            a[k1] = xr;
+            a[k1 + 1] = xi;
+            j1 += nh + 2;
+            k1 += nh + 2;
+            xr = a[j1];
+            xi = -a[j1 + 1];
+            yr = a[k1];
+            yi = -a[k1 + 1];
+            a[j1] = yr;
+            a[j1 + 1] = yi;
+            a[k1] = xr;
+            a[k1 + 1] = xi;
+            j1 -= nh - nm;
+            k1 += 2 * nm - 2;
+            a[j1 - 1] = -a[j1 - 1];
+            xr = a[j1];
+            xi = -a[j1 + 1];
+            yr = a[k1];
+            yi = -a[k1 + 1];
+            a[j1] = yr;
+            a[j1 + 1] = yi;
+            a[k1] = xr;
+            a[k1 + 1] = xi;
+            a[k1 + 3] = -a[k1 + 3];
+        }
+    } else {
+        for (k = 0; k < m; k++) {
+            for (j = 0; j < k; j++) {
+                j1 = 4 * j + ip[m + k];
+                k1 = 4 * k + ip[m + j];
+                xr = a[j1];
+                xi = -a[j1 + 1];
+                yr = a[k1];
+                yi = -a[k1 + 1];
+                a[j1] = yr;
+                a[j1 + 1] = yi;
+                a[k1] = xr;
+                a[k1 + 1] = xi;
+                j1 += nm;
+                k1 += nm;
+                xr = a[j1];
+                xi = -a[j1 + 1];
+                yr = a[k1];
+                yi = -a[k1 + 1];
+                a[j1] = yr;
+                a[j1 + 1] = yi;
+                a[k1] = xr;
+                a[k1 + 1] = xi;
+                j1 += nh;
+                k1 += 2;
+                xr = a[j1];
+                xi = -a[j1 + 1];
+                yr = a[k1];
+                yi = -a[k1 + 1];
+                a[j1] = yr;
+                a[j1 + 1] = yi;
+                a[k1] = xr;
+                a[k1 + 1] = xi;
+                j1 -= nm;
+                k1 -= nm;
+                xr = a[j1];
+                xi = -a[j1 + 1];
+                yr = a[k1];
+                yi = -a[k1 + 1];
+                a[j1] = yr;
+                a[j1 + 1] = yi;
+                a[k1] = xr;
+                a[k1 + 1] = xi;
+                j1 += 2;
+                k1 += nh;
+                xr = a[j1];
+                xi = -a[j1 + 1];
+                yr = a[k1];
+                yi = -a[k1 + 1];
+                a[j1] = yr;
+                a[j1 + 1] = yi;
+                a[k1] = xr;
+                a[k1 + 1] = xi;
+                j1 += nm;
+                k1 += nm;
+                xr = a[j1];
+                xi = -a[j1 + 1];
+                yr = a[k1];
+                yi = -a[k1 + 1];
+                a[j1] = yr;
+                a[j1 + 1] = yi;
+                a[k1] = xr;
+                a[k1 + 1] = xi;
+                j1 -= nh;
+                k1 -= 2;
+                xr = a[j1];
+                xi = -a[j1 + 1];
+                yr = a[k1];
+                yi = -a[k1 + 1];
+                a[j1] = yr;
+                a[j1 + 1] = yi;
+                a[k1] = xr;
+                a[k1 + 1] = xi;
+                j1 -= nm;
+                k1 -= nm;
+                xr = a[j1];
+                xi = -a[j1 + 1];
+                yr = a[k1];
+                yi = -a[k1 + 1];
+                a[j1] = yr;
+                a[j1 + 1] = yi;
+                a[k1] = xr;
+                a[k1 + 1] = xi;
+            }
+            k1 = 4 * k + ip[m + k];
+            j1 = k1 + 2;
+            k1 += nh;
+            a[j1 - 1] = -a[j1 - 1];
+            xr = a[j1];
+            xi = -a[j1 + 1];
+            yr = a[k1];
+            yi = -a[k1 + 1];
+            a[j1] = yr;
+            a[j1 + 1] = yi;
+            a[k1] = xr;
+            a[k1 + 1] = xi;
+            a[k1 + 3] = -a[k1 + 3];
+            j1 += nm;
+            k1 += nm;
+            a[j1 - 1] = -a[j1 - 1];
+            xr = a[j1];
+            xi = -a[j1 + 1];
+            yr = a[k1];
+            yi = -a[k1 + 1];
+            a[j1] = yr;
+            a[j1 + 1] = yi;
+            a[k1] = xr;
+            a[k1 + 1] = xi;
+            a[k1 + 3] = -a[k1 + 3];
+        }
+    }
+}
+
+
+void bitrv216(double *a)
+{
+    double x1r, x1i, x2r, x2i, x3r, x3i, x4r, x4i, 
+        x5r, x5i, x7r, x7i, x8r, x8i, x10r, x10i, 
+        x11r, x11i, x12r, x12i, x13r, x13i, x14r, x14i;
+    
+    x1r = a[2];
+    x1i = a[3];
+    x2r = a[4];
+    x2i = a[5];
+    x3r = a[6];
+    x3i = a[7];
+    x4r = a[8];
+    x4i = a[9];
+    x5r = a[10];
+    x5i = a[11];
+    x7r = a[14];
+    x7i = a[15];
+    x8r = a[16];
+    x8i = a[17];
+    x10r = a[20];
+    x10i = a[21];
+    x11r = a[22];
+    x11i = a[23];
+    x12r = a[24];
+    x12i = a[25];
+    x13r = a[26];
+    x13i = a[27];
+    x14r = a[28];
+    x14i = a[29];
+    a[2] = x8r;
+    a[3] = x8i;
+    a[4] = x4r;
+    a[5] = x4i;
+    a[6] = x12r;
+    a[7] = x12i;
+    a[8] = x2r;
+    a[9] = x2i;
+    a[10] = x10r;
+    a[11] = x10i;
+    a[14] = x14r;
+    a[15] = x14i;
+    a[16] = x1r;
+    a[17] = x1i;
+    a[20] = x5r;
+    a[21] = x5i;
+    a[22] = x13r;
+    a[23] = x13i;
+    a[24] = x3r;
+    a[25] = x3i;
+    a[26] = x11r;
+    a[27] = x11i;
+    a[28] = x7r;
+    a[29] = x7i;
+}
+
+
+void bitrv216neg(double *a)
+{
+    double x1r, x1i, x2r, x2i, x3r, x3i, x4r, x4i, 
+        x5r, x5i, x6r, x6i, x7r, x7i, x8r, x8i, 
+        x9r, x9i, x10r, x10i, x11r, x11i, x12r, x12i, 
+        x13r, x13i, x14r, x14i, x15r, x15i;
+    
+    x1r = a[2];
+    x1i = a[3];
+    x2r = a[4];
+    x2i = a[5];
+    x3r = a[6];
+    x3i = a[7];
+    x4r = a[8];
+    x4i = a[9];
+    x5r = a[10];
+    x5i = a[11];
+    x6r = a[12];
+    x6i = a[13];
+    x7r = a[14];
+    x7i = a[15];
+    x8r = a[16];
+    x8i = a[17];
+    x9r = a[18];
+    x9i = a[19];
+    x10r = a[20];
+    x10i = a[21];
+    x11r = a[22];
+    x11i = a[23];
+    x12r = a[24];
+    x12i = a[25];
+    x13r = a[26];
+    x13i = a[27];
+    x14r = a[28];
+    x14i = a[29];
+    x15r = a[30];
+    x15i = a[31];
+    a[2] = x15r;
+    a[3] = x15i;
+    a[4] = x7r;
+    a[5] = x7i;
+    a[6] = x11r;
+    a[7] = x11i;
+    a[8] = x3r;
+    a[9] = x3i;
+    a[10] = x13r;
+    a[11] = x13i;
+    a[12] = x5r;
+    a[13] = x5i;
+    a[14] = x9r;
+    a[15] = x9i;
+    a[16] = x1r;
+    a[17] = x1i;
+    a[18] = x14r;
+    a[19] = x14i;
+    a[20] = x6r;
+    a[21] = x6i;
+    a[22] = x10r;
+    a[23] = x10i;
+    a[24] = x2r;
+    a[25] = x2i;
+    a[26] = x12r;
+    a[27] = x12i;
+    a[28] = x4r;
+    a[29] = x4i;
+    a[30] = x8r;
+    a[31] = x8i;
+}
+
+
+void bitrv208(double *a)
+{
+    double x1r, x1i, x3r, x3i, x4r, x4i, x6r, x6i;
+    
+    x1r = a[2];
+    x1i = a[3];
+    x3r = a[6];
+    x3i = a[7];
+    x4r = a[8];
+    x4i = a[9];
+    x6r = a[12];
+    x6i = a[13];
+    a[2] = x4r;
+    a[3] = x4i;
+    a[6] = x6r;
+    a[7] = x6i;
+    a[8] = x1r;
+    a[9] = x1i;
+    a[12] = x3r;
+    a[13] = x3i;
+}
+
+
+void bitrv208neg(double *a)
+{
+    double x1r, x1i, x2r, x2i, x3r, x3i, x4r, x4i, 
+        x5r, x5i, x6r, x6i, x7r, x7i;
+    
+    x1r = a[2];
+    x1i = a[3];
+    x2r = a[4];
+    x2i = a[5];
+    x3r = a[6];
+    x3i = a[7];
+    x4r = a[8];
+    x4i = a[9];
+    x5r = a[10];
+    x5i = a[11];
+    x6r = a[12];
+    x6i = a[13];
+    x7r = a[14];
+    x7i = a[15];
+    a[2] = x7r;
+    a[3] = x7i;
+    a[4] = x3r;
+    a[5] = x3i;
+    a[6] = x5r;
+    a[7] = x5i;
+    a[8] = x1r;
+    a[9] = x1i;
+    a[10] = x6r;
+    a[11] = x6i;
+    a[12] = x2r;
+    a[13] = x2i;
+    a[14] = x4r;
+    a[15] = x4i;
+}
+
+
+void cftf1st(int n, double *a, double *w)
+{
+    int j, j0, j1, j2, j3, k, m, mh;
+    double wn4r, csc1, csc3, wk1r, wk1i, wk3r, wk3i, 
+        wd1r, wd1i, wd3r, wd3i;
+    double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i, 
+        y0r, y0i, y1r, y1i, y2r, y2i, y3r, y3i;
+    
+    mh = n >> 3;
+    m = 2 * mh;
+    j1 = m;
+    j2 = j1 + m;
+    j3 = j2 + m;
+    x0r = a[0] + a[j2];
+    x0i = a[1] + a[j2 + 1];
+    x1r = a[0] - a[j2];
+    x1i = a[1] - a[j2 + 1];
+    x2r = a[j1] + a[j3];
+    x2i = a[j1 + 1] + a[j3 + 1];
+    x3r = a[j1] - a[j3];
+    x3i = a[j1 + 1] - a[j3 + 1];
+    a[0] = x0r + x2r;
+    a[1] = x0i + x2i;
+    a[j1] = x0r - x2r;
+    a[j1 + 1] = x0i - x2i;
+    a[j2] = x1r - x3i;
+    a[j2 + 1] = x1i + x3r;
+    a[j3] = x1r + x3i;
+    a[j3 + 1] = x1i - x3r;
+    wn4r = w[1];
+    csc1 = w[2];
+    csc3 = w[3];
+    wd1r = 1;
+    wd1i = 0;
+    wd3r = 1;
+    wd3i = 0;
+    k = 0;
+    for (j = 2; j < mh - 2; j += 4) {
+        k += 4;
+        wk1r = csc1 * (wd1r + w[k]);
+        wk1i = csc1 * (wd1i + w[k + 1]);
+        wk3r = csc3 * (wd3r + w[k + 2]);
+        wk3i = csc3 * (wd3i + w[k + 3]);
+        wd1r = w[k];
+        wd1i = w[k + 1];
+        wd3r = w[k + 2];
+        wd3i = w[k + 3];
+        j1 = j + m;
+        j2 = j1 + m;
+        j3 = j2 + m;
+        x0r = a[j] + a[j2];
+        x0i = a[j + 1] + a[j2 + 1];
+        x1r = a[j] - a[j2];
+        x1i = a[j + 1] - a[j2 + 1];
+        y0r = a[j + 2] + a[j2 + 2];
+        y0i = a[j + 3] + a[j2 + 3];
+        y1r = a[j + 2] - a[j2 + 2];
+        y1i = a[j + 3] - a[j2 + 3];
+        x2r = a[j1] + a[j3];
+        x2i = a[j1 + 1] + a[j3 + 1];
+        x3r = a[j1] - a[j3];
+        x3i = a[j1 + 1] - a[j3 + 1];
+        y2r = a[j1 + 2] + a[j3 + 2];
+        y2i = a[j1 + 3] + a[j3 + 3];
+        y3r = a[j1 + 2] - a[j3 + 2];
+        y3i = a[j1 + 3] - a[j3 + 3];
+        a[j] = x0r + x2r;
+        a[j + 1] = x0i + x2i;
+        a[j + 2] = y0r + y2r;
+        a[j + 3] = y0i + y2i;
+        a[j1] = x0r - x2r;
+        a[j1 + 1] = x0i - x2i;
+        a[j1 + 2] = y0r - y2r;
+        a[j1 + 3] = y0i - y2i;
+        x0r = x1r - x3i;
+        x0i = x1i + x3r;
+        a[j2] = wk1r * x0r - wk1i * x0i;
+        a[j2 + 1] = wk1r * x0i + wk1i * x0r;
+        x0r = y1r - y3i;
+        x0i = y1i + y3r;
+        a[j2 + 2] = wd1r * x0r - wd1i * x0i;
+        a[j2 + 3] = wd1r * x0i + wd1i * x0r;
+        x0r = x1r + x3i;
+        x0i = x1i - x3r;
+        a[j3] = wk3r * x0r + wk3i * x0i;
+        a[j3 + 1] = wk3r * x0i - wk3i * x0r;
+        x0r = y1r + y3i;
+        x0i = y1i - y3r;
+        a[j3 + 2] = wd3r * x0r + wd3i * x0i;
+        a[j3 + 3] = wd3r * x0i - wd3i * x0r;
+        j0 = m - j;
+        j1 = j0 + m;
+        j2 = j1 + m;
+        j3 = j2 + m;
+        x0r = a[j0] + a[j2];
+        x0i = a[j0 + 1] + a[j2 + 1];
+        x1r = a[j0] - a[j2];
+        x1i = a[j0 + 1] - a[j2 + 1];
+        y0r = a[j0 - 2] + a[j2 - 2];
+        y0i = a[j0 - 1] + a[j2 - 1];
+        y1r = a[j0 - 2] - a[j2 - 2];
+        y1i = a[j0 - 1] - a[j2 - 1];
+        x2r = a[j1] + a[j3];
+        x2i = a[j1 + 1] + a[j3 + 1];
+        x3r = a[j1] - a[j3];
+        x3i = a[j1 + 1] - a[j3 + 1];
+        y2r = a[j1 - 2] + a[j3 - 2];
+        y2i = a[j1 - 1] + a[j3 - 1];
+        y3r = a[j1 - 2] - a[j3 - 2];
+        y3i = a[j1 - 1] - a[j3 - 1];
+        a[j0] = x0r + x2r;
+        a[j0 + 1] = x0i + x2i;
+        a[j0 - 2] = y0r + y2r;
+        a[j0 - 1] = y0i + y2i;
+        a[j1] = x0r - x2r;
+        a[j1 + 1] = x0i - x2i;
+        a[j1 - 2] = y0r - y2r;
+        a[j1 - 1] = y0i - y2i;
+        x0r = x1r - x3i;
+        x0i = x1i + x3r;
+        a[j2] = wk1i * x0r - wk1r * x0i;
+        a[j2 + 1] = wk1i * x0i + wk1r * x0r;
+        x0r = y1r - y3i;
+        x0i = y1i + y3r;
+        a[j2 - 2] = wd1i * x0r - wd1r * x0i;
+        a[j2 - 1] = wd1i * x0i + wd1r * x0r;
+        x0r = x1r + x3i;
+        x0i = x1i - x3r;
+        a[j3] = wk3i * x0r + wk3r * x0i;
+        a[j3 + 1] = wk3i * x0i - wk3r * x0r;
+        x0r = y1r + y3i;
+        x0i = y1i - y3r;
+        a[j3 - 2] = wd3i * x0r + wd3r * x0i;
+        a[j3 - 1] = wd3i * x0i - wd3r * x0r;
+    }
+    wk1r = csc1 * (wd1r + wn4r);
+    wk1i = csc1 * (wd1i + wn4r);
+    wk3r = csc3 * (wd3r - wn4r);
+    wk3i = csc3 * (wd3i - wn4r);
+    j0 = mh;
+    j1 = j0 + m;
+    j2 = j1 + m;
+    j3 = j2 + m;
+    x0r = a[j0 - 2] + a[j2 - 2];
+    x0i = a[j0 - 1] + a[j2 - 1];
+    x1r = a[j0 - 2] - a[j2 - 2];
+    x1i = a[j0 - 1] - a[j2 - 1];
+    x2r = a[j1 - 2] + a[j3 - 2];
+    x2i = a[j1 - 1] + a[j3 - 1];
+    x3r = a[j1 - 2] - a[j3 - 2];
+    x3i = a[j1 - 1] - a[j3 - 1];
+    a[j0 - 2] = x0r + x2r;
+    a[j0 - 1] = x0i + x2i;
+    a[j1 - 2] = x0r - x2r;
+    a[j1 - 1] = x0i - x2i;
+    x0r = x1r - x3i;
+    x0i = x1i + x3r;
+    a[j2 - 2] = wk1r * x0r - wk1i * x0i;
+    a[j2 - 1] = wk1r * x0i + wk1i * x0r;
+    x0r = x1r + x3i;
+    x0i = x1i - x3r;
+    a[j3 - 2] = wk3r * x0r + wk3i * x0i;
+    a[j3 - 1] = wk3r * x0i - wk3i * x0r;
+    x0r = a[j0] + a[j2];
+    x0i = a[j0 + 1] + a[j2 + 1];
+    x1r = a[j0] - a[j2];
+    x1i = a[j0 + 1] - a[j2 + 1];
+    x2r = a[j1] + a[j3];
+    x2i = a[j1 + 1] + a[j3 + 1];
+    x3r = a[j1] - a[j3];
+    x3i = a[j1 + 1] - a[j3 + 1];
+    a[j0] = x0r + x2r;
+    a[j0 + 1] = x0i + x2i;
+    a[j1] = x0r - x2r;
+    a[j1 + 1] = x0i - x2i;
+    x0r = x1r - x3i;
+    x0i = x1i + x3r;
+    a[j2] = wn4r * (x0r - x0i);
+    a[j2 + 1] = wn4r * (x0i + x0r);
+    x0r = x1r + x3i;
+    x0i = x1i - x3r;
+    a[j3] = -wn4r * (x0r + x0i);
+    a[j3 + 1] = -wn4r * (x0i - x0r);
+    x0r = a[j0 + 2] + a[j2 + 2];
+    x0i = a[j0 + 3] + a[j2 + 3];
+    x1r = a[j0 + 2] - a[j2 + 2];
+    x1i = a[j0 + 3] - a[j2 + 3];
+    x2r = a[j1 + 2] + a[j3 + 2];
+    x2i = a[j1 + 3] + a[j3 + 3];
+    x3r = a[j1 + 2] - a[j3 + 2];
+    x3i = a[j1 + 3] - a[j3 + 3];
+    a[j0 + 2] = x0r + x2r;
+    a[j0 + 3] = x0i + x2i;
+    a[j1 + 2] = x0r - x2r;
+    a[j1 + 3] = x0i - x2i;
+    x0r = x1r - x3i;
+    x0i = x1i + x3r;
+    a[j2 + 2] = wk1i * x0r - wk1r * x0i;
+    a[j2 + 3] = wk1i * x0i + wk1r * x0r;
+    x0r = x1r + x3i;
+    x0i = x1i - x3r;
+    a[j3 + 2] = wk3i * x0r + wk3r * x0i;
+    a[j3 + 3] = wk3i * x0i - wk3r * x0r;
+}
+
+
+void cftb1st(int n, double *a, double *w)
+{
+    int j, j0, j1, j2, j3, k, m, mh;
+    double wn4r, csc1, csc3, wk1r, wk1i, wk3r, wk3i, 
+        wd1r, wd1i, wd3r, wd3i;
+    double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i, 
+        y0r, y0i, y1r, y1i, y2r, y2i, y3r, y3i;
+    
+    mh = n >> 3;
+    m = 2 * mh;
+    j1 = m;
+    j2 = j1 + m;
+    j3 = j2 + m;
+    x0r = a[0] + a[j2];
+    x0i = -a[1] - a[j2 + 1];
+    x1r = a[0] - a[j2];
+    x1i = -a[1] + a[j2 + 1];
+    x2r = a[j1] + a[j3];
+    x2i = a[j1 + 1] + a[j3 + 1];
+    x3r = a[j1] - a[j3];
+    x3i = a[j1 + 1] - a[j3 + 1];
+    a[0] = x0r + x2r;
+    a[1] = x0i - x2i;
+    a[j1] = x0r - x2r;
+    a[j1 + 1] = x0i + x2i;
+    a[j2] = x1r + x3i;
+    a[j2 + 1] = x1i + x3r;
+    a[j3] = x1r - x3i;
+    a[j3 + 1] = x1i - x3r;
+    wn4r = w[1];
+    csc1 = w[2];
+    csc3 = w[3];
+    wd1r = 1;
+    wd1i = 0;
+    wd3r = 1;
+    wd3i = 0;
+    k = 0;
+    for (j = 2; j < mh - 2; j += 4) {
+        k += 4;
+        wk1r = csc1 * (wd1r + w[k]);
+        wk1i = csc1 * (wd1i + w[k + 1]);
+        wk3r = csc3 * (wd3r + w[k + 2]);
+        wk3i = csc3 * (wd3i + w[k + 3]);
+        wd1r = w[k];
+        wd1i = w[k + 1];
+        wd3r = w[k + 2];
+        wd3i = w[k + 3];
+        j1 = j + m;
+        j2 = j1 + m;
+        j3 = j2 + m;
+        x0r = a[j] + a[j2];
+        x0i = -a[j + 1] - a[j2 + 1];
+        x1r = a[j] - a[j2];
+        x1i = -a[j + 1] + a[j2 + 1];
+        y0r = a[j + 2] + a[j2 + 2];
+        y0i = -a[j + 3] - a[j2 + 3];
+        y1r = a[j + 2] - a[j2 + 2];
+        y1i = -a[j + 3] + a[j2 + 3];
+        x2r = a[j1] + a[j3];
+        x2i = a[j1 + 1] + a[j3 + 1];
+        x3r = a[j1] - a[j3];
+        x3i = a[j1 + 1] - a[j3 + 1];
+        y2r = a[j1 + 2] + a[j3 + 2];
+        y2i = a[j1 + 3] + a[j3 + 3];
+        y3r = a[j1 + 2] - a[j3 + 2];
+        y3i = a[j1 + 3] - a[j3 + 3];
+        a[j] = x0r + x2r;
+        a[j + 1] = x0i - x2i;
+        a[j + 2] = y0r + y2r;
+        a[j + 3] = y0i - y2i;
+        a[j1] = x0r - x2r;
+        a[j1 + 1] = x0i + x2i;
+        a[j1 + 2] = y0r - y2r;
+        a[j1 + 3] = y0i + y2i;
+        x0r = x1r + x3i;
+        x0i = x1i + x3r;
+        a[j2] = wk1r * x0r - wk1i * x0i;
+        a[j2 + 1] = wk1r * x0i + wk1i * x0r;
+        x0r = y1r + y3i;
+        x0i = y1i + y3r;
+        a[j2 + 2] = wd1r * x0r - wd1i * x0i;
+        a[j2 + 3] = wd1r * x0i + wd1i * x0r;
+        x0r = x1r - x3i;
+        x0i = x1i - x3r;
+        a[j3] = wk3r * x0r + wk3i * x0i;
+        a[j3 + 1] = wk3r * x0i - wk3i * x0r;
+        x0r = y1r - y3i;
+        x0i = y1i - y3r;
+        a[j3 + 2] = wd3r * x0r + wd3i * x0i;
+        a[j3 + 3] = wd3r * x0i - wd3i * x0r;
+        j0 = m - j;
+        j1 = j0 + m;
+        j2 = j1 + m;
+        j3 = j2 + m;
+        x0r = a[j0] + a[j2];
+        x0i = -a[j0 + 1] - a[j2 + 1];
+        x1r = a[j0] - a[j2];
+        x1i = -a[j0 + 1] + a[j2 + 1];
+        y0r = a[j0 - 2] + a[j2 - 2];
+        y0i = -a[j0 - 1] - a[j2 - 1];
+        y1r = a[j0 - 2] - a[j2 - 2];
+        y1i = -a[j0 - 1] + a[j2 - 1];
+        x2r = a[j1] + a[j3];
+        x2i = a[j1 + 1] + a[j3 + 1];
+        x3r = a[j1] - a[j3];
+        x3i = a[j1 + 1] - a[j3 + 1];
+        y2r = a[j1 - 2] + a[j3 - 2];
+        y2i = a[j1 - 1] + a[j3 - 1];
+        y3r = a[j1 - 2] - a[j3 - 2];
+        y3i = a[j1 - 1] - a[j3 - 1];
+        a[j0] = x0r + x2r;
+        a[j0 + 1] = x0i - x2i;
+        a[j0 - 2] = y0r + y2r;
+        a[j0 - 1] = y0i - y2i;
+        a[j1] = x0r - x2r;
+        a[j1 + 1] = x0i + x2i;
+        a[j1 - 2] = y0r - y2r;
+        a[j1 - 1] = y0i + y2i;
+        x0r = x1r + x3i;
+        x0i = x1i + x3r;
+        a[j2] = wk1i * x0r - wk1r * x0i;
+        a[j2 + 1] = wk1i * x0i + wk1r * x0r;
+        x0r = y1r + y3i;
+        x0i = y1i + y3r;
+        a[j2 - 2] = wd1i * x0r - wd1r * x0i;
+        a[j2 - 1] = wd1i * x0i + wd1r * x0r;
+        x0r = x1r - x3i;
+        x0i = x1i - x3r;
+        a[j3] = wk3i * x0r + wk3r * x0i;
+        a[j3 + 1] = wk3i * x0i - wk3r * x0r;
+        x0r = y1r - y3i;
+        x0i = y1i - y3r;
+        a[j3 - 2] = wd3i * x0r + wd3r * x0i;
+        a[j3 - 1] = wd3i * x0i - wd3r * x0r;
+    }
+    wk1r = csc1 * (wd1r + wn4r);
+    wk1i = csc1 * (wd1i + wn4r);
+    wk3r = csc3 * (wd3r - wn4r);
+    wk3i = csc3 * (wd3i - wn4r);
+    j0 = mh;
+    j1 = j0 + m;
+    j2 = j1 + m;
+    j3 = j2 + m;
+    x0r = a[j0 - 2] + a[j2 - 2];
+    x0i = -a[j0 - 1] - a[j2 - 1];
+    x1r = a[j0 - 2] - a[j2 - 2];
+    x1i = -a[j0 - 1] + a[j2 - 1];
+    x2r = a[j1 - 2] + a[j3 - 2];
+    x2i = a[j1 - 1] + a[j3 - 1];
+    x3r = a[j1 - 2] - a[j3 - 2];
+    x3i = a[j1 - 1] - a[j3 - 1];
+    a[j0 - 2] = x0r + x2r;
+    a[j0 - 1] = x0i - x2i;
+    a[j1 - 2] = x0r - x2r;
+    a[j1 - 1] = x0i + x2i;
+    x0r = x1r + x3i;
+    x0i = x1i + x3r;
+    a[j2 - 2] = wk1r * x0r - wk1i * x0i;
+    a[j2 - 1] = wk1r * x0i + wk1i * x0r;
+    x0r = x1r - x3i;
+    x0i = x1i - x3r;
+    a[j3 - 2] = wk3r * x0r + wk3i * x0i;
+    a[j3 - 1] = wk3r * x0i - wk3i * x0r;
+    x0r = a[j0] + a[j2];
+    x0i = -a[j0 + 1] - a[j2 + 1];
+    x1r = a[j0] - a[j2];
+    x1i = -a[j0 + 1] + a[j2 + 1];
+    x2r = a[j1] + a[j3];
+    x2i = a[j1 + 1] + a[j3 + 1];
+    x3r = a[j1] - a[j3];
+    x3i = a[j1 + 1] - a[j3 + 1];
+    a[j0] = x0r + x2r;
+    a[j0 + 1] = x0i - x2i;
+    a[j1] = x0r - x2r;
+    a[j1 + 1] = x0i + x2i;
+    x0r = x1r + x3i;
+    x0i = x1i + x3r;
+    a[j2] = wn4r * (x0r - x0i);
+    a[j2 + 1] = wn4r * (x0i + x0r);
+    x0r = x1r - x3i;
+    x0i = x1i - x3r;
+    a[j3] = -wn4r * (x0r + x0i);
+    a[j3 + 1] = -wn4r * (x0i - x0r);
+    x0r = a[j0 + 2] + a[j2 + 2];
+    x0i = -a[j0 + 3] - a[j2 + 3];
+    x1r = a[j0 + 2] - a[j2 + 2];
+    x1i = -a[j0 + 3] + a[j2 + 3];
+    x2r = a[j1 + 2] + a[j3 + 2];
+    x2i = a[j1 + 3] + a[j3 + 3];
+    x3r = a[j1 + 2] - a[j3 + 2];
+    x3i = a[j1 + 3] - a[j3 + 3];
+    a[j0 + 2] = x0r + x2r;
+    a[j0 + 3] = x0i - x2i;
+    a[j1 + 2] = x0r - x2r;
+    a[j1 + 3] = x0i + x2i;
+    x0r = x1r + x3i;
+    x0i = x1i + x3r;
+    a[j2 + 2] = wk1i * x0r - wk1r * x0i;
+    a[j2 + 3] = wk1i * x0i + wk1r * x0r;
+    x0r = x1r - x3i;
+    x0i = x1i - x3r;
+    a[j3 + 2] = wk3i * x0r + wk3r * x0i;
+    a[j3 + 3] = wk3i * x0i - wk3r * x0r;
+}
+
+
+#ifdef USE_CDFT_THREADS
+struct cdft_arg_st {
+    int n0;
+    int n;
+    double *a;
+    int nw;
+    double *w;
+};
+typedef struct cdft_arg_st cdft_arg_t;
+
+
+void cftrec4_th(int n, double *a, int nw, double *w)
+{
+    void *cftrec1_th(void *p);
+    void *cftrec2_th(void *p);
+    int i, idiv4, m, nthread;
+    cdft_thread_t th[4];
+    cdft_arg_t ag[4];
+    
+    nthread = 2;
+    idiv4 = 0;
+    m = n >> 1;
+    if (n > CDFT_4THREADS_BEGIN_N) {
+        nthread = 4;
+        idiv4 = 1;
+        m >>= 1;
+    }
+    for (i = 0; i < nthread; i++) {
+        ag[i].n0 = n;
+        ag[i].n = m;
+        ag[i].a = &a[i * m];
+        ag[i].nw = nw;
+        ag[i].w = w;
+        if (i != idiv4) {
+            cdft_thread_create(&th[i], cftrec1_th, &ag[i]);
+        } else {
+            cdft_thread_create(&th[i], cftrec2_th, &ag[i]);
+        }
+    }
+    for (i = 0; i < nthread; i++) {
+        cdft_thread_wait(th[i]);
+    }
+}
+
+
+void *cftrec1_th(void *p)
+{
+    int cfttree(int n, int j, int k, double *a, int nw, double *w);
+    void cftleaf(int n, int isplt, double *a, int nw, double *w);
+    void cftmdl1(int n, double *a, double *w);
+    int isplt, j, k, m, n, n0, nw;
+    double *a, *w;
+    
+    n0 = ((cdft_arg_t *) p)->n0;
+    n = ((cdft_arg_t *) p)->n;
+    a = ((cdft_arg_t *) p)->a;
+    nw = ((cdft_arg_t *) p)->nw;
+    w = ((cdft_arg_t *) p)->w;
+    m = n0;
+    while (m > 512) {
+        m >>= 2;
+        cftmdl1(m, &a[n - m], &w[nw - (m >> 1)]);
+    }
+    cftleaf(m, 1, &a[n - m], nw, w);
+    k = 0;
+    for (j = n - m; j > 0; j -= m) {
+        k++;
+        isplt = cfttree(m, j, k, a, nw, w);
+        cftleaf(m, isplt, &a[j - m], nw, w);
+    }
+    return (void *) 0;
+}
+
+
+void *cftrec2_th(void *p)
+{
+    int cfttree(int n, int j, int k, double *a, int nw, double *w);
+    void cftleaf(int n, int isplt, double *a, int nw, double *w);
+    void cftmdl2(int n, double *a, double *w);
+    int isplt, j, k, m, n, n0, nw;
+    double *a, *w;
+    
+    n0 = ((cdft_arg_t *) p)->n0;
+    n = ((cdft_arg_t *) p)->n;
+    a = ((cdft_arg_t *) p)->a;
+    nw = ((cdft_arg_t *) p)->nw;
+    w = ((cdft_arg_t *) p)->w;
+    k = 1;
+    m = n0;
+    while (m > 512) {
+        m >>= 2;
+        k <<= 2;
+        cftmdl2(m, &a[n - m], &w[nw - m]);
+    }
+    cftleaf(m, 0, &a[n - m], nw, w);
+    k >>= 1;
+    for (j = n - m; j > 0; j -= m) {
+        k++;
+        isplt = cfttree(m, j, k, a, nw, w);
+        cftleaf(m, isplt, &a[j - m], nw, w);
+    }
+    return (void *) 0;
+}
+#endif /* USE_CDFT_THREADS */
+
+
+void cftrec4(int n, double *a, int nw, double *w)
+{
+    int cfttree(int n, int j, int k, double *a, int nw, double *w);
+    void cftleaf(int n, int isplt, double *a, int nw, double *w);
+    void cftmdl1(int n, double *a, double *w);
+    int isplt, j, k, m;
+    
+    m = n;
+    while (m > 512) {
+        m >>= 2;
+        cftmdl1(m, &a[n - m], &w[nw - (m >> 1)]);
+    }
+    cftleaf(m, 1, &a[n - m], nw, w);
+    k = 0;
+    for (j = n - m; j > 0; j -= m) {
+        k++;
+        isplt = cfttree(m, j, k, a, nw, w);
+        cftleaf(m, isplt, &a[j - m], nw, w);
+    }
+}
+
+
+int cfttree(int n, int j, int k, double *a, int nw, double *w)
+{
+    void cftmdl1(int n, double *a, double *w);
+    void cftmdl2(int n, double *a, double *w);
+    int i, isplt, m;
+    
+    if ((k & 3) != 0) {
+        isplt = k & 1;
+        if (isplt != 0) {
+            cftmdl1(n, &a[j - n], &w[nw - (n >> 1)]);
+        } else {
+            cftmdl2(n, &a[j - n], &w[nw - n]);
+        }
+    } else {
+        m = n;
+        for (i = k; (i & 3) == 0; i >>= 2) {
+            m <<= 2;
+        }
+        isplt = i & 1;
+        if (isplt != 0) {
+            while (m > 128) {
+                cftmdl1(m, &a[j - m], &w[nw - (m >> 1)]);
+                m >>= 2;
+            }
+        } else {
+            while (m > 128) {
+                cftmdl2(m, &a[j - m], &w[nw - m]);
+                m >>= 2;
+            }
+        }
+    }
+    return isplt;
+}
+
+
+void cftleaf(int n, int isplt, double *a, int nw, double *w)
+{
+    void cftmdl1(int n, double *a, double *w);
+    void cftmdl2(int n, double *a, double *w);
+    void cftf161(double *a, double *w);
+    void cftf162(double *a, double *w);
+    void cftf081(double *a, double *w);
+    void cftf082(double *a, double *w);
+    
+    if (n == 512) {
+        cftmdl1(128, a, &w[nw - 64]);
+        cftf161(a, &w[nw - 8]);
+        cftf162(&a[32], &w[nw - 32]);
+        cftf161(&a[64], &w[nw - 8]);
+        cftf161(&a[96], &w[nw - 8]);
+        cftmdl2(128, &a[128], &w[nw - 128]);
+        cftf161(&a[128], &w[nw - 8]);
+        cftf162(&a[160], &w[nw - 32]);
+        cftf161(&a[192], &w[nw - 8]);
+        cftf162(&a[224], &w[nw - 32]);
+        cftmdl1(128, &a[256], &w[nw - 64]);
+        cftf161(&a[256], &w[nw - 8]);
+        cftf162(&a[288], &w[nw - 32]);
+        cftf161(&a[320], &w[nw - 8]);
+        cftf161(&a[352], &w[nw - 8]);
+        if (isplt != 0) {
+            cftmdl1(128, &a[384], &w[nw - 64]);
+            cftf161(&a[480], &w[nw - 8]);
+        } else {
+            cftmdl2(128, &a[384], &w[nw - 128]);
+            cftf162(&a[480], &w[nw - 32]);
+        }
+        cftf161(&a[384], &w[nw - 8]);
+        cftf162(&a[416], &w[nw - 32]);
+        cftf161(&a[448], &w[nw - 8]);
+    } else {
+        cftmdl1(64, a, &w[nw - 32]);
+        cftf081(a, &w[nw - 8]);
+        cftf082(&a[16], &w[nw - 8]);
+        cftf081(&a[32], &w[nw - 8]);
+        cftf081(&a[48], &w[nw - 8]);
+        cftmdl2(64, &a[64], &w[nw - 64]);
+        cftf081(&a[64], &w[nw - 8]);
+        cftf082(&a[80], &w[nw - 8]);
+        cftf081(&a[96], &w[nw - 8]);
+        cftf082(&a[112], &w[nw - 8]);
+        cftmdl1(64, &a[128], &w[nw - 32]);
+        cftf081(&a[128], &w[nw - 8]);
+        cftf082(&a[144], &w[nw - 8]);
+        cftf081(&a[160], &w[nw - 8]);
+        cftf081(&a[176], &w[nw - 8]);
+        if (isplt != 0) {
+            cftmdl1(64, &a[192], &w[nw - 32]);
+            cftf081(&a[240], &w[nw - 8]);
+        } else {
+            cftmdl2(64, &a[192], &w[nw - 64]);
+            cftf082(&a[240], &w[nw - 8]);
+        }
+        cftf081(&a[192], &w[nw - 8]);
+        cftf082(&a[208], &w[nw - 8]);
+        cftf081(&a[224], &w[nw - 8]);
+    }
+}
+
+
+void cftmdl1(int n, double *a, double *w)
+{
+    int j, j0, j1, j2, j3, k, m, mh;
+    double wn4r, wk1r, wk1i, wk3r, wk3i;
+    double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
+    
+    mh = n >> 3;
+    m = 2 * mh;
+    j1 = m;
+    j2 = j1 + m;
+    j3 = j2 + m;
+    x0r = a[0] + a[j2];
+    x0i = a[1] + a[j2 + 1];
+    x1r = a[0] - a[j2];
+    x1i = a[1] - a[j2 + 1];
+    x2r = a[j1] + a[j3];
+    x2i = a[j1 + 1] + a[j3 + 1];
+    x3r = a[j1] - a[j3];
+    x3i = a[j1 + 1] - a[j3 + 1];
+    a[0] = x0r + x2r;
+    a[1] = x0i + x2i;
+    a[j1] = x0r - x2r;
+    a[j1 + 1] = x0i - x2i;
+    a[j2] = x1r - x3i;
+    a[j2 + 1] = x1i + x3r;
+    a[j3] = x1r + x3i;
+    a[j3 + 1] = x1i - x3r;
+    wn4r = w[1];
+    k = 0;
+    for (j = 2; j < mh; j += 2) {
+        k += 4;
+        wk1r = w[k];
+        wk1i = w[k + 1];
+        wk3r = w[k + 2];
+        wk3i = w[k + 3];
+        j1 = j + m;
+        j2 = j1 + m;
+        j3 = j2 + m;
+        x0r = a[j] + a[j2];
+        x0i = a[j + 1] + a[j2 + 1];
+        x1r = a[j] - a[j2];
+        x1i = a[j + 1] - a[j2 + 1];
+        x2r = a[j1] + a[j3];
+        x2i = a[j1 + 1] + a[j3 + 1];
+        x3r = a[j1] - a[j3];
+        x3i = a[j1 + 1] - a[j3 + 1];
+        a[j] = x0r + x2r;
+        a[j + 1] = x0i + x2i;
+        a[j1] = x0r - x2r;
+        a[j1 + 1] = x0i - x2i;
+        x0r = x1r - x3i;
+        x0i = x1i + x3r;
+        a[j2] = wk1r * x0r - wk1i * x0i;
+        a[j2 + 1] = wk1r * x0i + wk1i * x0r;
+        x0r = x1r + x3i;
+        x0i = x1i - x3r;
+        a[j3] = wk3r * x0r + wk3i * x0i;
+        a[j3 + 1] = wk3r * x0i - wk3i * x0r;
+        j0 = m - j;
+        j1 = j0 + m;
+        j2 = j1 + m;
+        j3 = j2 + m;
+        x0r = a[j0] + a[j2];
+        x0i = a[j0 + 1] + a[j2 + 1];
+        x1r = a[j0] - a[j2];
+        x1i = a[j0 + 1] - a[j2 + 1];
+        x2r = a[j1] + a[j3];
+        x2i = a[j1 + 1] + a[j3 + 1];
+        x3r = a[j1] - a[j3];
+        x3i = a[j1 + 1] - a[j3 + 1];
+        a[j0] = x0r + x2r;
+        a[j0 + 1] = x0i + x2i;
+        a[j1] = x0r - x2r;
+        a[j1 + 1] = x0i - x2i;
+        x0r = x1r - x3i;
+        x0i = x1i + x3r;
+        a[j2] = wk1i * x0r - wk1r * x0i;
+        a[j2 + 1] = wk1i * x0i + wk1r * x0r;
+        x0r = x1r + x3i;
+        x0i = x1i - x3r;
+        a[j3] = wk3i * x0r + wk3r * x0i;
+        a[j3 + 1] = wk3i * x0i - wk3r * x0r;
+    }
+    j0 = mh;
+    j1 = j0 + m;
+    j2 = j1 + m;
+    j3 = j2 + m;
+    x0r = a[j0] + a[j2];
+    x0i = a[j0 + 1] + a[j2 + 1];
+    x1r = a[j0] - a[j2];
+    x1i = a[j0 + 1] - a[j2 + 1];
+    x2r = a[j1] + a[j3];
+    x2i = a[j1 + 1] + a[j3 + 1];
+    x3r = a[j1] - a[j3];
+    x3i = a[j1 + 1] - a[j3 + 1];
+    a[j0] = x0r + x2r;
+    a[j0 + 1] = x0i + x2i;
+    a[j1] = x0r - x2r;
+    a[j1 + 1] = x0i - x2i;
+    x0r = x1r - x3i;
+    x0i = x1i + x3r;
+    a[j2] = wn4r * (x0r - x0i);
+    a[j2 + 1] = wn4r * (x0i + x0r);
+    x0r = x1r + x3i;
+    x0i = x1i - x3r;
+    a[j3] = -wn4r * (x0r + x0i);
+    a[j3 + 1] = -wn4r * (x0i - x0r);
+}
+
+
+void cftmdl2(int n, double *a, double *w)
+{
+    int j, j0, j1, j2, j3, k, kr, m, mh;
+    double wn4r, wk1r, wk1i, wk3r, wk3i, wd1r, wd1i, wd3r, wd3i;
+    double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i, y0r, y0i, y2r, y2i;
+    
+    mh = n >> 3;
+    m = 2 * mh;
+    wn4r = w[1];
+    j1 = m;
+    j2 = j1 + m;
+    j3 = j2 + m;
+    x0r = a[0] - a[j2 + 1];
+    x0i = a[1] + a[j2];
+    x1r = a[0] + a[j2 + 1];
+    x1i = a[1] - a[j2];
+    x2r = a[j1] - a[j3 + 1];
+    x2i = a[j1 + 1] + a[j3];
+    x3r = a[j1] + a[j3 + 1];
+    x3i = a[j1 + 1] - a[j3];
+    y0r = wn4r * (x2r - x2i);
+    y0i = wn4r * (x2i + x2r);
+    a[0] = x0r + y0r;
+    a[1] = x0i + y0i;
+    a[j1] = x0r - y0r;
+    a[j1 + 1] = x0i - y0i;
+    y0r = wn4r * (x3r - x3i);
+    y0i = wn4r * (x3i + x3r);
+    a[j2] = x1r - y0i;
+    a[j2 + 1] = x1i + y0r;
+    a[j3] = x1r + y0i;
+    a[j3 + 1] = x1i - y0r;
+    k = 0;
+    kr = 2 * m;
+    for (j = 2; j < mh; j += 2) {
+        k += 4;
+        wk1r = w[k];
+        wk1i = w[k + 1];
+        wk3r = w[k + 2];
+        wk3i = w[k + 3];
+        kr -= 4;
+        wd1i = w[kr];
+        wd1r = w[kr + 1];
+        wd3i = w[kr + 2];
+        wd3r = w[kr + 3];
+        j1 = j + m;
+        j2 = j1 + m;
+        j3 = j2 + m;
+        x0r = a[j] - a[j2 + 1];
+        x0i = a[j + 1] + a[j2];
+        x1r = a[j] + a[j2 + 1];
+        x1i = a[j + 1] - a[j2];
+        x2r = a[j1] - a[j3 + 1];
+        x2i = a[j1 + 1] + a[j3];
+        x3r = a[j1] + a[j3 + 1];
+        x3i = a[j1 + 1] - a[j3];
+        y0r = wk1r * x0r - wk1i * x0i;
+        y0i = wk1r * x0i + wk1i * x0r;
+        y2r = wd1r * x2r - wd1i * x2i;
+        y2i = wd1r * x2i + wd1i * x2r;
+        a[j] = y0r + y2r;
+        a[j + 1] = y0i + y2i;
+        a[j1] = y0r - y2r;
+        a[j1 + 1] = y0i - y2i;
+        y0r = wk3r * x1r + wk3i * x1i;
+        y0i = wk3r * x1i - wk3i * x1r;
+        y2r = wd3r * x3r + wd3i * x3i;
+        y2i = wd3r * x3i - wd3i * x3r;
+        a[j2] = y0r + y2r;
+        a[j2 + 1] = y0i + y2i;
+        a[j3] = y0r - y2r;
+        a[j3 + 1] = y0i - y2i;
+        j0 = m - j;
+        j1 = j0 + m;
+        j2 = j1 + m;
+        j3 = j2 + m;
+        x0r = a[j0] - a[j2 + 1];
+        x0i = a[j0 + 1] + a[j2];
+        x1r = a[j0] + a[j2 + 1];
+        x1i = a[j0 + 1] - a[j2];
+        x2r = a[j1] - a[j3 + 1];
+        x2i = a[j1 + 1] + a[j3];
+        x3r = a[j1] + a[j3 + 1];
+        x3i = a[j1 + 1] - a[j3];
+        y0r = wd1i * x0r - wd1r * x0i;
+        y0i = wd1i * x0i + wd1r * x0r;
+        y2r = wk1i * x2r - wk1r * x2i;
+        y2i = wk1i * x2i + wk1r * x2r;
+        a[j0] = y0r + y2r;
+        a[j0 + 1] = y0i + y2i;
+        a[j1] = y0r - y2r;
+        a[j1 + 1] = y0i - y2i;
+        y0r = wd3i * x1r + wd3r * x1i;
+        y0i = wd3i * x1i - wd3r * x1r;
+        y2r = wk3i * x3r + wk3r * x3i;
+        y2i = wk3i * x3i - wk3r * x3r;
+        a[j2] = y0r + y2r;
+        a[j2 + 1] = y0i + y2i;
+        a[j3] = y0r - y2r;
+        a[j3 + 1] = y0i - y2i;
+    }
+    wk1r = w[m];
+    wk1i = w[m + 1];
+    j0 = mh;
+    j1 = j0 + m;
+    j2 = j1 + m;
+    j3 = j2 + m;
+    x0r = a[j0] - a[j2 + 1];
+    x0i = a[j0 + 1] + a[j2];
+    x1r = a[j0] + a[j2 + 1];
+    x1i = a[j0 + 1] - a[j2];
+    x2r = a[j1] - a[j3 + 1];
+    x2i = a[j1 + 1] + a[j3];
+    x3r = a[j1] + a[j3 + 1];
+    x3i = a[j1 + 1] - a[j3];
+    y0r = wk1r * x0r - wk1i * x0i;
+    y0i = wk1r * x0i + wk1i * x0r;
+    y2r = wk1i * x2r - wk1r * x2i;
+    y2i = wk1i * x2i + wk1r * x2r;
+    a[j0] = y0r + y2r;
+    a[j0 + 1] = y0i + y2i;
+    a[j1] = y0r - y2r;
+    a[j1 + 1] = y0i - y2i;
+    y0r = wk1i * x1r - wk1r * x1i;
+    y0i = wk1i * x1i + wk1r * x1r;
+    y2r = wk1r * x3r - wk1i * x3i;
+    y2i = wk1r * x3i + wk1i * x3r;
+    a[j2] = y0r - y2r;
+    a[j2 + 1] = y0i - y2i;
+    a[j3] = y0r + y2r;
+    a[j3 + 1] = y0i + y2i;
+}
+
+
+void cftfx41(int n, double *a, int nw, double *w)
+{
+    void cftf161(double *a, double *w);
+    void cftf162(double *a, double *w);
+    void cftf081(double *a, double *w);
+    void cftf082(double *a, double *w);
+    
+    if (n == 128) {
+        cftf161(a, &w[nw - 8]);
+        cftf162(&a[32], &w[nw - 32]);
+        cftf161(&a[64], &w[nw - 8]);
+        cftf161(&a[96], &w[nw - 8]);
+    } else {
+        cftf081(a, &w[nw - 8]);
+        cftf082(&a[16], &w[nw - 8]);
+        cftf081(&a[32], &w[nw - 8]);
+        cftf081(&a[48], &w[nw - 8]);
+    }
+}
+
+
+void cftf161(double *a, double *w)
+{
+    double wn4r, wk1r, wk1i, 
+        x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i, 
+        y0r, y0i, y1r, y1i, y2r, y2i, y3r, y3i, 
+        y4r, y4i, y5r, y5i, y6r, y6i, y7r, y7i, 
+        y8r, y8i, y9r, y9i, y10r, y10i, y11r, y11i, 
+        y12r, y12i, y13r, y13i, y14r, y14i, y15r, y15i;
+    
+    wn4r = w[1];
+    wk1r = w[2];
+    wk1i = w[3];
+    x0r = a[0] + a[16];
+    x0i = a[1] + a[17];
+    x1r = a[0] - a[16];
+    x1i = a[1] - a[17];
+    x2r = a[8] + a[24];
+    x2i = a[9] + a[25];
+    x3r = a[8] - a[24];
+    x3i = a[9] - a[25];
+    y0r = x0r + x2r;
+    y0i = x0i + x2i;
+    y4r = x0r - x2r;
+    y4i = x0i - x2i;
+    y8r = x1r - x3i;
+    y8i = x1i + x3r;
+    y12r = x1r + x3i;
+    y12i = x1i - x3r;
+    x0r = a[2] + a[18];
+    x0i = a[3] + a[19];
+    x1r = a[2] - a[18];
+    x1i = a[3] - a[19];
+    x2r = a[10] + a[26];
+    x2i = a[11] + a[27];
+    x3r = a[10] - a[26];
+    x3i = a[11] - a[27];
+    y1r = x0r + x2r;
+    y1i = x0i + x2i;
+    y5r = x0r - x2r;
+    y5i = x0i - x2i;
+    x0r = x1r - x3i;
+    x0i = x1i + x3r;
+    y9r = wk1r * x0r - wk1i * x0i;
+    y9i = wk1r * x0i + wk1i * x0r;
+    x0r = x1r + x3i;
+    x0i = x1i - x3r;
+    y13r = wk1i * x0r - wk1r * x0i;
+    y13i = wk1i * x0i + wk1r * x0r;
+    x0r = a[4] + a[20];
+    x0i = a[5] + a[21];
+    x1r = a[4] - a[20];
+    x1i = a[5] - a[21];
+    x2r = a[12] + a[28];
+    x2i = a[13] + a[29];
+    x3r = a[12] - a[28];
+    x3i = a[13] - a[29];
+    y2r = x0r + x2r;
+    y2i = x0i + x2i;
+    y6r = x0r - x2r;
+    y6i = x0i - x2i;
+    x0r = x1r - x3i;
+    x0i = x1i + x3r;
+    y10r = wn4r * (x0r - x0i);
+    y10i = wn4r * (x0i + x0r);
+    x0r = x1r + x3i;
+    x0i = x1i - x3r;
+    y14r = wn4r * (x0r + x0i);
+    y14i = wn4r * (x0i - x0r);
+    x0r = a[6] + a[22];
+    x0i = a[7] + a[23];
+    x1r = a[6] - a[22];
+    x1i = a[7] - a[23];
+    x2r = a[14] + a[30];
+    x2i = a[15] + a[31];
+    x3r = a[14] - a[30];
+    x3i = a[15] - a[31];
+    y3r = x0r + x2r;
+    y3i = x0i + x2i;
+    y7r = x0r - x2r;
+    y7i = x0i - x2i;
+    x0r = x1r - x3i;
+    x0i = x1i + x3r;
+    y11r = wk1i * x0r - wk1r * x0i;
+    y11i = wk1i * x0i + wk1r * x0r;
+    x0r = x1r + x3i;
+    x0i = x1i - x3r;
+    y15r = wk1r * x0r - wk1i * x0i;
+    y15i = wk1r * x0i + wk1i * x0r;
+    x0r = y12r - y14r;
+    x0i = y12i - y14i;
+    x1r = y12r + y14r;
+    x1i = y12i + y14i;
+    x2r = y13r - y15r;
+    x2i = y13i - y15i;
+    x3r = y13r + y15r;
+    x3i = y13i + y15i;
+    a[24] = x0r + x2r;
+    a[25] = x0i + x2i;
+    a[26] = x0r - x2r;
+    a[27] = x0i - x2i;
+    a[28] = x1r - x3i;
+    a[29] = x1i + x3r;
+    a[30] = x1r + x3i;
+    a[31] = x1i - x3r;
+    x0r = y8r + y10r;
+    x0i = y8i + y10i;
+    x1r = y8r - y10r;
+    x1i = y8i - y10i;
+    x2r = y9r + y11r;
+    x2i = y9i + y11i;
+    x3r = y9r - y11r;
+    x3i = y9i - y11i;
+    a[16] = x0r + x2r;
+    a[17] = x0i + x2i;
+    a[18] = x0r - x2r;
+    a[19] = x0i - x2i;
+    a[20] = x1r - x3i;
+    a[21] = x1i + x3r;
+    a[22] = x1r + x3i;
+    a[23] = x1i - x3r;
+    x0r = y5r - y7i;
+    x0i = y5i + y7r;
+    x2r = wn4r * (x0r - x0i);
+    x2i = wn4r * (x0i + x0r);
+    x0r = y5r + y7i;
+    x0i = y5i - y7r;
+    x3r = wn4r * (x0r - x0i);
+    x3i = wn4r * (x0i + x0r);
+    x0r = y4r - y6i;
+    x0i = y4i + y6r;
+    x1r = y4r + y6i;
+    x1i = y4i - y6r;
+    a[8] = x0r + x2r;
+    a[9] = x0i + x2i;
+    a[10] = x0r - x2r;
+    a[11] = x0i - x2i;
+    a[12] = x1r - x3i;
+    a[13] = x1i + x3r;
+    a[14] = x1r + x3i;
+    a[15] = x1i - x3r;
+    x0r = y0r + y2r;
+    x0i = y0i + y2i;
+    x1r = y0r - y2r;
+    x1i = y0i - y2i;
+    x2r = y1r + y3r;
+    x2i = y1i + y3i;
+    x3r = y1r - y3r;
+    x3i = y1i - y3i;
+    a[0] = x0r + x2r;
+    a[1] = x0i + x2i;
+    a[2] = x0r - x2r;
+    a[3] = x0i - x2i;
+    a[4] = x1r - x3i;
+    a[5] = x1i + x3r;
+    a[6] = x1r + x3i;
+    a[7] = x1i - x3r;
+}
+
+
+void cftf162(double *a, double *w)
+{
+    double wn4r, wk1r, wk1i, wk2r, wk2i, wk3r, wk3i, 
+        x0r, x0i, x1r, x1i, x2r, x2i, 
+        y0r, y0i, y1r, y1i, y2r, y2i, y3r, y3i, 
+        y4r, y4i, y5r, y5i, y6r, y6i, y7r, y7i, 
+        y8r, y8i, y9r, y9i, y10r, y10i, y11r, y11i, 
+        y12r, y12i, y13r, y13i, y14r, y14i, y15r, y15i;
+    
+    wn4r = w[1];
+    wk1r = w[4];
+    wk1i = w[5];
+    wk3r = w[6];
+    wk3i = -w[7];
+    wk2r = w[8];
+    wk2i = w[9];
+    x1r = a[0] - a[17];
+    x1i = a[1] + a[16];
+    x0r = a[8] - a[25];
+    x0i = a[9] + a[24];
+    x2r = wn4r * (x0r - x0i);
+    x2i = wn4r * (x0i + x0r);
+    y0r = x1r + x2r;
+    y0i = x1i + x2i;
+    y4r = x1r - x2r;
+    y4i = x1i - x2i;
+    x1r = a[0] + a[17];
+    x1i = a[1] - a[16];
+    x0r = a[8] + a[25];
+    x0i = a[9] - a[24];
+    x2r = wn4r * (x0r - x0i);
+    x2i = wn4r * (x0i + x0r);
+    y8r = x1r - x2i;
+    y8i = x1i + x2r;
+    y12r = x1r + x2i;
+    y12i = x1i - x2r;
+    x0r = a[2] - a[19];
+    x0i = a[3] + a[18];
+    x1r = wk1r * x0r - wk1i * x0i;
+    x1i = wk1r * x0i + wk1i * x0r;
+    x0r = a[10] - a[27];
+    x0i = a[11] + a[26];
+    x2r = wk3i * x0r - wk3r * x0i;
+    x2i = wk3i * x0i + wk3r * x0r;
+    y1r = x1r + x2r;
+    y1i = x1i + x2i;
+    y5r = x1r - x2r;
+    y5i = x1i - x2i;
+    x0r = a[2] + a[19];
+    x0i = a[3] - a[18];
+    x1r = wk3r * x0r - wk3i * x0i;
+    x1i = wk3r * x0i + wk3i * x0r;
+    x0r = a[10] + a[27];
+    x0i = a[11] - a[26];
+    x2r = wk1r * x0r + wk1i * x0i;
+    x2i = wk1r * x0i - wk1i * x0r;
+    y9r = x1r - x2r;
+    y9i = x1i - x2i;
+    y13r = x1r + x2r;
+    y13i = x1i + x2i;
+    x0r = a[4] - a[21];
+    x0i = a[5] + a[20];
+    x1r = wk2r * x0r - wk2i * x0i;
+    x1i = wk2r * x0i + wk2i * x0r;
+    x0r = a[12] - a[29];
+    x0i = a[13] + a[28];
+    x2r = wk2i * x0r - wk2r * x0i;
+    x2i = wk2i * x0i + wk2r * x0r;
+    y2r = x1r + x2r;
+    y2i = x1i + x2i;
+    y6r = x1r - x2r;
+    y6i = x1i - x2i;
+    x0r = a[4] + a[21];
+    x0i = a[5] - a[20];
+    x1r = wk2i * x0r - wk2r * x0i;
+    x1i = wk2i * x0i + wk2r * x0r;
+    x0r = a[12] + a[29];
+    x0i = a[13] - a[28];
+    x2r = wk2r * x0r - wk2i * x0i;
+    x2i = wk2r * x0i + wk2i * x0r;
+    y10r = x1r - x2r;
+    y10i = x1i - x2i;
+    y14r = x1r + x2r;
+    y14i = x1i + x2i;
+    x0r = a[6] - a[23];
+    x0i = a[7] + a[22];
+    x1r = wk3r * x0r - wk3i * x0i;
+    x1i = wk3r * x0i + wk3i * x0r;
+    x0r = a[14] - a[31];
+    x0i = a[15] + a[30];
+    x2r = wk1i * x0r - wk1r * x0i;
+    x2i = wk1i * x0i + wk1r * x0r;
+    y3r = x1r + x2r;
+    y3i = x1i + x2i;
+    y7r = x1r - x2r;
+    y7i = x1i - x2i;
+    x0r = a[6] + a[23];
+    x0i = a[7] - a[22];
+    x1r = wk1i * x0r + wk1r * x0i;
+    x1i = wk1i * x0i - wk1r * x0r;
+    x0r = a[14] + a[31];
+    x0i = a[15] - a[30];
+    x2r = wk3i * x0r - wk3r * x0i;
+    x2i = wk3i * x0i + wk3r * x0r;
+    y11r = x1r + x2r;
+    y11i = x1i + x2i;
+    y15r = x1r - x2r;
+    y15i = x1i - x2i;
+    x1r = y0r + y2r;
+    x1i = y0i + y2i;
+    x2r = y1r + y3r;
+    x2i = y1i + y3i;
+    a[0] = x1r + x2r;
+    a[1] = x1i + x2i;
+    a[2] = x1r - x2r;
+    a[3] = x1i - x2i;
+    x1r = y0r - y2r;
+    x1i = y0i - y2i;
+    x2r = y1r - y3r;
+    x2i = y1i - y3i;
+    a[4] = x1r - x2i;
+    a[5] = x1i + x2r;
+    a[6] = x1r + x2i;
+    a[7] = x1i - x2r;
+    x1r = y4r - y6i;
+    x1i = y4i + y6r;
+    x0r = y5r - y7i;
+    x0i = y5i + y7r;
+    x2r = wn4r * (x0r - x0i);
+    x2i = wn4r * (x0i + x0r);
+    a[8] = x1r + x2r;
+    a[9] = x1i + x2i;
+    a[10] = x1r - x2r;
+    a[11] = x1i - x2i;
+    x1r = y4r + y6i;
+    x1i = y4i - y6r;
+    x0r = y5r + y7i;
+    x0i = y5i - y7r;
+    x2r = wn4r * (x0r - x0i);
+    x2i = wn4r * (x0i + x0r);
+    a[12] = x1r - x2i;
+    a[13] = x1i + x2r;
+    a[14] = x1r + x2i;
+    a[15] = x1i - x2r;
+    x1r = y8r + y10r;
+    x1i = y8i + y10i;
+    x2r = y9r - y11r;
+    x2i = y9i - y11i;
+    a[16] = x1r + x2r;
+    a[17] = x1i + x2i;
+    a[18] = x1r - x2r;
+    a[19] = x1i - x2i;
+    x1r = y8r - y10r;
+    x1i = y8i - y10i;
+    x2r = y9r + y11r;
+    x2i = y9i + y11i;
+    a[20] = x1r - x2i;
+    a[21] = x1i + x2r;
+    a[22] = x1r + x2i;
+    a[23] = x1i - x2r;
+    x1r = y12r - y14i;
+    x1i = y12i + y14r;
+    x0r = y13r + y15i;
+    x0i = y13i - y15r;
+    x2r = wn4r * (x0r - x0i);
+    x2i = wn4r * (x0i + x0r);
+    a[24] = x1r + x2r;
+    a[25] = x1i + x2i;
+    a[26] = x1r - x2r;
+    a[27] = x1i - x2i;
+    x1r = y12r + y14i;
+    x1i = y12i - y14r;
+    x0r = y13r - y15i;
+    x0i = y13i + y15r;
+    x2r = wn4r * (x0r - x0i);
+    x2i = wn4r * (x0i + x0r);
+    a[28] = x1r - x2i;
+    a[29] = x1i + x2r;
+    a[30] = x1r + x2i;
+    a[31] = x1i - x2r;
+}
+
+
+void cftf081(double *a, double *w)
+{
+    double wn4r, x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i, 
+        y0r, y0i, y1r, y1i, y2r, y2i, y3r, y3i, 
+        y4r, y4i, y5r, y5i, y6r, y6i, y7r, y7i;
+    
+    wn4r = w[1];
+    x0r = a[0] + a[8];
+    x0i = a[1] + a[9];
+    x1r = a[0] - a[8];
+    x1i = a[1] - a[9];
+    x2r = a[4] + a[12];
+    x2i = a[5] + a[13];
+    x3r = a[4] - a[12];
+    x3i = a[5] - a[13];
+    y0r = x0r + x2r;
+    y0i = x0i + x2i;
+    y2r = x0r - x2r;
+    y2i = x0i - x2i;
+    y1r = x1r - x3i;
+    y1i = x1i + x3r;
+    y3r = x1r + x3i;
+    y3i = x1i - x3r;
+    x0r = a[2] + a[10];
+    x0i = a[3] + a[11];
+    x1r = a[2] - a[10];
+    x1i = a[3] - a[11];
+    x2r = a[6] + a[14];
+    x2i = a[7] + a[15];
+    x3r = a[6] - a[14];
+    x3i = a[7] - a[15];
+    y4r = x0r + x2r;
+    y4i = x0i + x2i;
+    y6r = x0r - x2r;
+    y6i = x0i - x2i;
+    x0r = x1r - x3i;
+    x0i = x1i + x3r;
+    x2r = x1r + x3i;
+    x2i = x1i - x3r;
+    y5r = wn4r * (x0r - x0i);
+    y5i = wn4r * (x0r + x0i);
+    y7r = wn4r * (x2r - x2i);
+    y7i = wn4r * (x2r + x2i);
+    a[8] = y1r + y5r;
+    a[9] = y1i + y5i;
+    a[10] = y1r - y5r;
+    a[11] = y1i - y5i;
+    a[12] = y3r - y7i;
+    a[13] = y3i + y7r;
+    a[14] = y3r + y7i;
+    a[15] = y3i - y7r;
+    a[0] = y0r + y4r;
+    a[1] = y0i + y4i;
+    a[2] = y0r - y4r;
+    a[3] = y0i - y4i;
+    a[4] = y2r - y6i;
+    a[5] = y2i + y6r;
+    a[6] = y2r + y6i;
+    a[7] = y2i - y6r;
+}
+
+
+void cftf082(double *a, double *w)
+{
+    double wn4r, wk1r, wk1i, x0r, x0i, x1r, x1i, 
+        y0r, y0i, y1r, y1i, y2r, y2i, y3r, y3i, 
+        y4r, y4i, y5r, y5i, y6r, y6i, y7r, y7i;
+    
+    wn4r = w[1];
+    wk1r = w[2];
+    wk1i = w[3];
+    y0r = a[0] - a[9];
+    y0i = a[1] + a[8];
+    y1r = a[0] + a[9];
+    y1i = a[1] - a[8];
+    x0r = a[4] - a[13];
+    x0i = a[5] + a[12];
+    y2r = wn4r * (x0r - x0i);
+    y2i = wn4r * (x0i + x0r);
+    x0r = a[4] + a[13];
+    x0i = a[5] - a[12];
+    y3r = wn4r * (x0r - x0i);
+    y3i = wn4r * (x0i + x0r);
+    x0r = a[2] - a[11];
+    x0i = a[3] + a[10];
+    y4r = wk1r * x0r - wk1i * x0i;
+    y4i = wk1r * x0i + wk1i * x0r;
+    x0r = a[2] + a[11];
+    x0i = a[3] - a[10];
+    y5r = wk1i * x0r - wk1r * x0i;
+    y5i = wk1i * x0i + wk1r * x0r;
+    x0r = a[6] - a[15];
+    x0i = a[7] + a[14];
+    y6r = wk1i * x0r - wk1r * x0i;
+    y6i = wk1i * x0i + wk1r * x0r;
+    x0r = a[6] + a[15];
+    x0i = a[7] - a[14];
+    y7r = wk1r * x0r - wk1i * x0i;
+    y7i = wk1r * x0i + wk1i * x0r;
+    x0r = y0r + y2r;
+    x0i = y0i + y2i;
+    x1r = y4r + y6r;
+    x1i = y4i + y6i;
+    a[0] = x0r + x1r;
+    a[1] = x0i + x1i;
+    a[2] = x0r - x1r;
+    a[3] = x0i - x1i;
+    x0r = y0r - y2r;
+    x0i = y0i - y2i;
+    x1r = y4r - y6r;
+    x1i = y4i - y6i;
+    a[4] = x0r - x1i;
+    a[5] = x0i + x1r;
+    a[6] = x0r + x1i;
+    a[7] = x0i - x1r;
+    x0r = y1r - y3i;
+    x0i = y1i + y3r;
+    x1r = y5r - y7r;
+    x1i = y5i - y7i;
+    a[8] = x0r + x1r;
+    a[9] = x0i + x1i;
+    a[10] = x0r - x1r;
+    a[11] = x0i - x1i;
+    x0r = y1r + y3i;
+    x0i = y1i - y3r;
+    x1r = y5r + y7r;
+    x1i = y5i + y7i;
+    a[12] = x0r - x1i;
+    a[13] = x0i + x1r;
+    a[14] = x0r + x1i;
+    a[15] = x0i - x1r;
+}
+
+
+void cftf040(double *a)
+{
+    double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
+    
+    x0r = a[0] + a[4];
+    x0i = a[1] + a[5];
+    x1r = a[0] - a[4];
+    x1i = a[1] - a[5];
+    x2r = a[2] + a[6];
+    x2i = a[3] + a[7];
+    x3r = a[2] - a[6];
+    x3i = a[3] - a[7];
+    a[0] = x0r + x2r;
+    a[1] = x0i + x2i;
+    a[2] = x1r - x3i;
+    a[3] = x1i + x3r;
+    a[4] = x0r - x2r;
+    a[5] = x0i - x2i;
+    a[6] = x1r + x3i;
+    a[7] = x1i - x3r;
+}
+
+
+void cftb040(double *a)
+{
+    double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
+    
+    x0r = a[0] + a[4];
+    x0i = a[1] + a[5];
+    x1r = a[0] - a[4];
+    x1i = a[1] - a[5];
+    x2r = a[2] + a[6];
+    x2i = a[3] + a[7];
+    x3r = a[2] - a[6];
+    x3i = a[3] - a[7];
+    a[0] = x0r + x2r;
+    a[1] = x0i + x2i;
+    a[2] = x1r + x3i;
+    a[3] = x1i - x3r;
+    a[4] = x0r - x2r;
+    a[5] = x0i - x2i;
+    a[6] = x1r - x3i;
+    a[7] = x1i + x3r;
+}
+
+
+void cftx020(double *a)
+{
+    double x0r, x0i;
+    
+    x0r = a[0] - a[2];
+    x0i = a[1] - a[3];
+    a[0] += a[2];
+    a[1] += a[3];
+    a[2] = x0r;
+    a[3] = x0i;
+}
+
+
+void rftfsub(int n, double *a, int nc, double *c)
+{
+    int j, k, kk, ks, m;
+    double wkr, wki, xr, xi, yr, yi;
+    
+    m = n >> 1;
+    ks = 2 * nc / m;
+    kk = 0;
+    for (j = 2; j < m; j += 2) {
+        k = n - j;
+        kk += ks;
+        wkr = 0.5 - c[nc - kk];
+        wki = c[kk];
+        xr = a[j] - a[k];
+        xi = a[j + 1] + a[k + 1];
+        yr = wkr * xr - wki * xi;
+        yi = wkr * xi + wki * xr;
+        a[j] -= yr;
+        a[j + 1] -= yi;
+        a[k] += yr;
+        a[k + 1] -= yi;
+    }
+}
+
+
+void rftbsub(int n, double *a, int nc, double *c)
+{
+    int j, k, kk, ks, m;
+    double wkr, wki, xr, xi, yr, yi;
+    
+    m = n >> 1;
+    ks = 2 * nc / m;
+    kk = 0;
+    for (j = 2; j < m; j += 2) {
+        k = n - j;
+        kk += ks;
+        wkr = 0.5 - c[nc - kk];
+        wki = c[kk];
+        xr = a[j] - a[k];
+        xi = a[j + 1] + a[k + 1];
+        yr = wkr * xr + wki * xi;
+        yi = wkr * xi - wki * xr;
+        a[j] -= yr;
+        a[j + 1] -= yi;
+        a[k] += yr;
+        a[k + 1] -= yi;
+    }
+}
+
+
+void dctsub(int n, double *a, int nc, double *c)
+{
+    int j, k, kk, ks, m;
+    double wkr, wki, xr;
+    
+    m = n >> 1;
+    ks = nc / n;
+    kk = 0;
+    for (j = 1; j < m; j++) {
+        k = n - j;
+        kk += ks;
+        wkr = c[kk] - c[nc - kk];
+        wki = c[kk] + c[nc - kk];
+        xr = wki * a[j] - wkr * a[k];
+        a[j] = wkr * a[j] + wki * a[k];
+        a[k] = xr;
+    }
+    a[m] *= c[0];
+}
+
+
+void dstsub(int n, double *a, int nc, double *c)
+{
+    int j, k, kk, ks, m;
+    double wkr, wki, xr;
+    
+    m = n >> 1;
+    ks = nc / n;
+    kk = 0;
+    for (j = 1; j < m; j++) {
+        k = n - j;
+        kk += ks;
+        wkr = c[kk] - c[nc - kk];
+        wki = c[kk] + c[nc - kk];
+        xr = wki * a[k] - wkr * a[j];
+        a[k] = wkr * a[k] + wki * a[j];
+        a[j] = xr;
+    }
+    a[m] *= c[0];
+}
diff --git a/src/libprojectM/fftsg.h b/src/libprojectM/fftsg.h
index ff9da6e..59b87b3 100644
--- a/src/libprojectM/fftsg.h
+++ b/src/libprojectM/fftsg.h
@@ -1,35 +1,36 @@
-/**
- * projectM -- Milkdrop-esque visualisation SDK
- * Copyright (C)2003-2007 projectM Team
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- * See 'LICENSE.txt' included within this release
- *
- */
-/**
- * $Id: fftsg.h,v 1.1.1.1 2005/12/23 18:05:00 psperl Exp $
- *
- * Wrapper for rdft() and friends
- *
- * $Log$
- */
-
-#ifndef _FFTSG_H
-#define _FFTSG_H
-
-extern void rdft(int n, int isgn, double *a, int *ip, double *w);
-
-#endif /** !_FFTSG_H */
-
+/**
+ * projectM -- Milkdrop-esque visualisation SDK
+ * Copyright (C)2003-2007 projectM Team
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ * See 'LICENSE.txt' included within this release
+ *
+ */
+/**
+ * $Id: fftsg.h,v 1.1.1.1 2005/12/23 18:05:00 psperl Exp $
+ *
+ * Wrapper for rdft() and friends
+ *
+ * $Log$
+ */
+
+#ifndef _FFTSG_H
+#define _FFTSG_H
+
+
+extern void rdft (int n, int isgn, double *a, int *ip, double *w);
+
+
+#endif /** !_FFTSG_H */
diff --git a/src/libprojectM/glError.h b/src/libprojectM/glError.h
index a6d0940..3127306 100644
--- a/src/libprojectM/glError.h
+++ b/src/libprojectM/glError.h
@@ -6,7 +6,7 @@
 //
 
 #ifndef _GLERROR_H
-#define	_GLERROR_H
+#define _GLERROR_H
 
 // no need to include GL in here, 
 // if someone wants GL errors they probably already included it.
@@ -20,12 +20,11 @@
 #define glError()
 #else
 #define glError() { \
-	GLenum err; \
-	while ((err = glGetError()) != GL_NO_ERROR) \
-		fprintf(stderr, "glError: %s at %s:%u\n", \
-			(char *)gluErrorString(err), __FILE__, __LINE__); \
+  GLenum err; \
+  while ((err = glGetError()) != GL_NO_ERROR) \
+    fprintf(stderr, "glError: %s at %s:%u\n", \
+      (char *)gluErrorString(err), __FILE__, __LINE__); \
 }
-#endif	/* glError */
+#endif  /* glError */
 
-#endif	/* _GLERROR_H */
-
+#endif  /* _GLERROR_H */
diff --git a/src/libprojectM/lvtoprojectM.h b/src/libprojectM/lvtoprojectM.h
index 4215b8a..f4c1cc6 100644
--- a/src/libprojectM/lvtoprojectM.h
+++ b/src/libprojectM/lvtoprojectM.h
@@ -31,126 +31,130 @@
  * Imported
  *
  */
-
 #include <libvisual/libvisual.h>
 
-projectMEvent lv2pmEvent( VisEventType event ) { 
-							
-    switch ( event ) { 
-        case VISUAL_EVENT_RESIZE:
-            return PROJECTM_VIDEORESIZE; 
-        case VISUAL_EVENT_KEYUP: 
-            return PROJECTM_KEYUP; 
-        case VISUAL_EVENT_KEYDOWN: 
-            return PROJECTM_KEYDOWN;
-        default:
-            return PROJECTM_KEYUP; 
-      } 
-  } 
-projectMKeycode lv2pmKeycode( VisKey keysym ) 
-{ 
-  switch ( keysym ) 
-    { 
-    case VKEY_F1: 
-      return PROJECTM_K_F1; 
-    case VKEY_F2: 
-      return PROJECTM_K_F2; 
-    case VKEY_F3:
-      return PROJECTM_K_F3; 
-    case VKEY_F4: 
-      return PROJECTM_K_F4; 
-    case VKEY_F5: 
-      return PROJECTM_K_F5; 
-    case VKEY_F6: 
-      return PROJECTM_K_F6; 
-    case VKEY_F7: 
-      return PROJECTM_K_F7; 
-    case VKEY_F8: 
-      return PROJECTM_K_F8; 
-    case VKEY_F9: 
-      return PROJECTM_K_F9; 
-    case VKEY_F10: 
-      return PROJECTM_K_F10; 
-    case VKEY_F11:
-      return PROJECTM_K_F11; 
-    case VKEY_F12: 
-      return PROJECTM_K_F12; 
-    case VKEY_ESCAPE: 
-      return PROJECTM_K_ESCAPE; 
-    case VKEY_a:
-      return PROJECTM_K_a;
-    case VKEY_b:
-      return PROJECTM_K_b;
-    case VKEY_c:  
-      return PROJECTM_K_c;
-    case VKEY_d: 
-      return PROJECTM_K_d; 
-    case VKEY_e:
-      return PROJECTM_K_e; 
-    case VKEY_f: 
-      return PROJECTM_K_f; 
-    case VKEY_g: 
-      return PROJECTM_K_g; 
-    case VKEY_h: 
-      return PROJECTM_K_h; 
-    case VKEY_i: 
-      return PROJECTM_K_i; 
-    case VKEY_j:
-      return PROJECTM_K_j;
-    case VKEY_k:
-      return PROJECTM_K_k;
-    case VKEY_l:  
-      return PROJECTM_K_l;
-    case VKEY_m: 
-      return PROJECTM_K_m; 
-    case VKEY_n:
-      return PROJECTM_K_n; 
-    case VKEY_o: 
-      return PROJECTM_K_o; 
-    case VKEY_p: 
-      return PROJECTM_K_p; 
-    case VKEY_q: 
-      return PROJECTM_K_q; 
-    case VKEY_r: 
-      return PROJECTM_K_r; 
-    case VKEY_s: 
-      return PROJECTM_K_s; 
-    case VKEY_t:
-      return PROJECTM_K_t; 
-    case VKEY_u: 
-      return PROJECTM_K_u; 
-    case VKEY_v: 
-      return PROJECTM_K_v; 
-    case VKEY_w: 
-      return PROJECTM_K_w; 
-    case VKEY_x: 
-      return PROJECTM_K_x; 
-    case VKEY_y: 
-      return PROJECTM_K_y; 
-    case VKEY_z: 
-      return PROJECTM_K_z; 
-    case VKEY_UP:
-      return PROJECTM_K_UP;
-    case VKEY_RETURN:
-      return PROJECTM_K_RETURN;
-    case VKEY_RIGHT:
-      return PROJECTM_K_RIGHT;
-    case VKEY_LEFT:
-      return PROJECTM_K_LEFT;
-    case VKEY_DOWN:
-      return PROJECTM_K_DOWN;
-    case VKEY_PAGEUP:
-      return PROJECTM_K_PAGEUP;
-    case VKEY_PAGEDOWN:
-      return PROJECTM_K_PAGEDOWN;
-   
 
-    default:  
-      return PROJECTM_K_NONE;
-      break;
-    } 
-  } 
-
-projectMModifier lv2pmModifier( int mod ) { 
-    return mod && VKMOD_LSHIFT; 
+projectMEvent
+lv2pmEvent (VisEventType event)
+{
+  switch (event) {
+  case VISUAL_EVENT_RESIZE:
+    return PROJECTM_VIDEORESIZE;
+  case VISUAL_EVENT_KEYUP:
+    return PROJECTM_KEYUP;
+  case VISUAL_EVENT_KEYDOWN:
+    return PROJECTM_KEYDOWN;
+  default:
+    return PROJECTM_KEYUP;
   }
+}
+
+projectMKeycode
+lv2pmKeycode (VisKey keysym)
+{
+  switch (keysym) {
+  case VKEY_F1:
+    return PROJECTM_K_F1;
+  case VKEY_F2:
+    return PROJECTM_K_F2;
+  case VKEY_F3:
+    return PROJECTM_K_F3;
+  case VKEY_F4:
+    return PROJECTM_K_F4;
+  case VKEY_F5:
+    return PROJECTM_K_F5;
+  case VKEY_F6:
+    return PROJECTM_K_F6;
+  case VKEY_F7:
+    return PROJECTM_K_F7;
+  case VKEY_F8:
+    return PROJECTM_K_F8;
+  case VKEY_F9:
+    return PROJECTM_K_F9;
+  case VKEY_F10:
+    return PROJECTM_K_F10;
+  case VKEY_F11:
+    return PROJECTM_K_F11;
+  case VKEY_F12:
+    return PROJECTM_K_F12;
+  case VKEY_ESCAPE:
+    return PROJECTM_K_ESCAPE;
+  case VKEY_a:
+    return PROJECTM_K_a;
+  case VKEY_b:
+    return PROJECTM_K_b;
+  case VKEY_c:
+    return PROJECTM_K_c;
+  case VKEY_d:
+    return PROJECTM_K_d;
+  case VKEY_e:
+    return PROJECTM_K_e;
+  case VKEY_f:
+    return PROJECTM_K_f;
+  case VKEY_g:
+    return PROJECTM_K_g;
+  case VKEY_h:
+    return PROJECTM_K_h;
+  case VKEY_i:
+    return PROJECTM_K_i;
+  case VKEY_j:
+    return PROJECTM_K_j;
+  case VKEY_k:
+    return PROJECTM_K_k;
+  case VKEY_l:
+    return PROJECTM_K_l;
+  case VKEY_m:
+    return PROJECTM_K_m;
+  case VKEY_n:
+    return PROJECTM_K_n;
+  case VKEY_o:
+    return PROJECTM_K_o;
+  case VKEY_p:
+    return PROJECTM_K_p;
+  case VKEY_q:
+    return PROJECTM_K_q;
+  case VKEY_r:
+    return PROJECTM_K_r;
+  case VKEY_s:
+    return PROJECTM_K_s;
+  case VKEY_t:
+    return PROJECTM_K_t;
+  case VKEY_u:
+    return PROJECTM_K_u;
+  case VKEY_v:
+    return PROJECTM_K_v;
+  case VKEY_w:
+    return PROJECTM_K_w;
+  case VKEY_x:
+    return PROJECTM_K_x;
+  case VKEY_y:
+    return PROJECTM_K_y;
+  case VKEY_z:
+    return PROJECTM_K_z;
+  case VKEY_UP:
+    return PROJECTM_K_UP;
+  case VKEY_RETURN:
+    return PROJECTM_K_RETURN;
+  case VKEY_RIGHT:
+    return PROJECTM_K_RIGHT;
+  case VKEY_LEFT:
+    return PROJECTM_K_LEFT;
+  case VKEY_DOWN:
+    return PROJECTM_K_DOWN;
+  case VKEY_PAGEUP:
+    return PROJECTM_K_PAGEUP;
+  case VKEY_PAGEDOWN:
+    return PROJECTM_K_PAGEDOWN;
+
+
+  default:
+    return PROJECTM_K_NONE;
+    break;
+  }
+}
+
+projectMModifier
+lv2pmModifier (int mod)
+{
+  return mod  &&  VKMOD_LSHIFT;
+}
diff --git a/src/libprojectM/projectM.cpp b/src/libprojectM/projectM.cpp
index 5e23005..147e078 100644
--- a/src/libprojectM/projectM.cpp
+++ b/src/libprojectM/projectM.cpp
@@ -18,7 +18,6 @@
 * See 'LICENSE.txt' included within this release
 *
 */
-
 #include "RenderItemMatcher.hpp"
 #include "RenderItemMergeFunction.hpp"
 #include "fatal.h"
@@ -59,872 +58,931 @@
 
 pthread_mutex_t mutex;
 pthread_cond_t  condition;
-pthread_t thread;
+pthread_t       thread;
 
 #ifdef SYNC_PRESET_SWITCHES
 pthread_mutex_t preset_mutex;
 #endif
 #endif
 
+
 projectM::~projectM()
 {
+#ifdef USE_THREADS
+  std::cout << "[projectM] thread ";
+  printf ("c");
+  running = false;
+  printf ("l");
+  pthread_cond_signal (&condition);
+  printf ("e");
+  pthread_mutex_unlock (&mutex);
+  printf ("a");
+  pthread_detach (thread);
+  printf ("n");
+  pthread_cond_destroy (&condition);
+  printf ("u");
+  pthread_mutex_destroy (&mutex);
+#ifdef SYNC_PRESET_SWITCHES
+  pthread_mutex_destroy (&preset_mutex);
+#endif
 
-    #ifdef USE_THREADS
-    std::cout << "[projectM] thread ";
-    printf("c");
-    running = false;
-    printf("l");
-    pthread_cond_signal(&condition);
-    printf("e");
-    pthread_mutex_unlock( &mutex );
-    printf("a");
-    pthread_detach(thread);
-    printf("n");
-    pthread_cond_destroy(&condition);
-    printf("u");
-    pthread_mutex_destroy( &mutex );
-    #ifdef SYNC_PRESET_SWITCHES
-    pthread_mutex_destroy( &preset_mutex );
-    #endif
+  printf ("p");
+  std::cout << std::endl;
+#endif
+  destroyPresetTools();
 
-    printf("p");
-    std::cout << std::endl;
-    #endif
-    destroyPresetTools();
+  if (renderer)
+    delete (renderer);
+  if (beatDetect)
+    delete (beatDetect);
+  if (_pcm) {
+    delete (_pcm);
+    _pcm = 0;
+  }
 
-    if ( renderer )
-        delete ( renderer );
-    if ( beatDetect )
-        delete ( beatDetect );
-    if ( _pcm ) {
-        delete ( _pcm );
-        _pcm = 0;
-    }
-
-    delete(_pipelineContext);
-    delete(_pipelineContext2);
+  delete (_pipelineContext);
+  delete (_pipelineContext2);
 }
 
-unsigned projectM::initRenderToTexture()
+unsigned
+projectM::initRenderToTexture()
 {
-    return renderer->initRenderToTexture();
+  return renderer->initRenderToTexture();
 }
 
-void projectM::projectM_resetTextures()
+void
+projectM::projectM_resetTextures()
 {
-    renderer->ResetTextures();
+  renderer->ResetTextures();
 }
 
 
-projectM::projectM ( std::string config_file, int flags) :
-beatDetect ( 0 ), renderer ( 0 ),  _pcm(0), m_presetPos(0), m_flags(flags), _pipelineContext(new PipelineContext()), _pipelineContext2(new PipelineContext())
+projectM::projectM (std::string config_file, int flags)
+  : beatDetect (0),
+    renderer (0),
+    _pcm (0),
+    m_presetPos (0),
+    m_flags (flags),
+    _pipelineContext (new PipelineContext()),
+    _pipelineContext2 (new PipelineContext())
 {
-    readConfig(config_file);
-    projectM_reset();
-    projectM_resetGL(_settings.windowWidth, _settings.windowHeight);
-
+  readConfig (config_file);
+  projectM_reset();
+  projectM_resetGL (_settings.windowWidth, _settings.windowHeight);
 }
 
-projectM::projectM(Settings settings, int flags):
-beatDetect ( 0 ), renderer ( 0 ),  _pcm(0), m_presetPos(0), m_flags(flags), _pipelineContext(new PipelineContext()), _pipelineContext2(new PipelineContext())
+projectM::projectM (Settings settings, int flags)
+  : beatDetect (0),
+    renderer (0),
+    _pcm (0),
+    m_presetPos (0),
+    m_flags (flags),
+    _pipelineContext (new PipelineContext()),
+    _pipelineContext2 (new PipelineContext())
 {
-    readSettings(settings);
-    projectM_reset();
-    projectM_resetGL(_settings.windowWidth, _settings.windowHeight);
+  readSettings (settings);
+  projectM_reset();
+  projectM_resetGL (_settings.windowWidth, _settings.windowHeight);
 }
 
 
-bool projectM::writeConfig(const std::string & configFile, const Settings & settings) {
-
-    ConfigFile config ( configFile );
-
-    config.add("Mesh X", settings.meshX);
-    config.add("Mesh Y", settings.meshY);
-    config.add("Texture Size", settings.textureSize);
-    config.add("FPS", settings.fps);
-    config.add("Window Width", settings.windowWidth);
-    config.add("Window Height", settings.windowHeight);
-    config.add("Smooth Preset Duration", settings.smoothPresetDuration);
-    config.add("Preset Duration", settings.presetDuration);
-    config.add("Preset Path", settings.presetURL);
-    config.add("Title Font", settings.titleFontURL);
-    config.add("Menu Font", settings.menuFontURL);
-    config.add("Hard Cut Sensitivity", settings.beatSensitivity);
-    config.add("Aspect Correction", settings.aspectCorrection);
-    config.add("Easter Egg Parameter", settings.easterEgg);
-    config.add("Shuffle Enabled", settings.shuffleEnabled);
-    config.add("Soft Cut Ratings Enabled", settings.softCutRatingsEnabled);
-    std::fstream file(configFile.c_str());
-    if (file) {
-        file << config;
-        return true;
-    } else
-        return false;
-}
-
-
-
-void projectM::readConfig (const std::string & configFile )
+bool
+projectM::writeConfig (
+const std::string & configFile,
+const Settings    & settings)
 {
-    std::cout << "[projectM] config file: " << configFile << std::endl;
 
-    ConfigFile config ( configFile );
-    _settings.meshX = config.read<int> ( "Mesh X", 32 );
-    _settings.meshY = config.read<int> ( "Mesh Y", 24 );
-    _settings.textureSize = config.read<int> ( "Texture Size", 512 );
-    _settings.fps = config.read<int> ( "FPS", 35 );
-    _settings.windowWidth  = config.read<int> ( "Window Width", 512 );
-    _settings.windowHeight = config.read<int> ( "Window Height", 512 );
-    _settings.smoothPresetDuration =  config.read<int>
-    ( "Smooth Preset Duration", config.read<int>("Smooth Transition Duration", 10));
-    _settings.presetDuration = config.read<int> ( "Preset Duration", 15 );
+  ConfigFile config (configFile);
 
-    #ifdef LINUX
-    _settings.presetURL = config.read<string> ( "Preset Path", CMAKE_INSTALL_PREFIX "/share/projectM/presets" );
-    #endif
+  config.add ("Mesh X", settings.meshX);
+  config.add ("Mesh Y", settings.meshY);
+  config.add ("Texture Size", settings.textureSize);
+  config.add ("FPS", settings.fps);
+  config.add ("Window Width", settings.windowWidth);
+  config.add ("Window Height", settings.windowHeight);
+  config.add ("Smooth Preset Duration", settings.smoothPresetDuration);
+  config.add ("Preset Duration", settings.presetDuration);
+  config.add ("Preset Path", settings.presetURL);
+  config.add ("Title Font", settings.titleFontURL);
+  config.add ("Menu Font", settings.menuFontURL);
+  config.add ("Hard Cut Sensitivity", settings.beatSensitivity);
+  config.add ("Aspect Correction", settings.aspectCorrection);
+  config.add ("Easter Egg Parameter", settings.easterEgg);
+  config.add ("Shuffle Enabled", settings.shuffleEnabled);
+  config.add ("Soft Cut Ratings Enabled", settings.softCutRatingsEnabled);
+  std::fstream file (configFile.c_str());
 
-    #ifdef __APPLE__
-    /// @bug awful hardcoded hack- need to add intelligence to cmake wrt bundling - carm
-    _settings.presetURL = config.read<string> ( "Preset Path", "../Resources/presets" );
-    #endif
-
-    #ifdef WIN32
-    _settings.presetURL = config.read<string> ( "Preset Path", CMAKE_INSTALL_PREFIX "/share/projectM/presets" );
-    #endif
-
-    #ifdef __APPLE__
-    _settings.titleFontURL = config.read<string>
-    ( "Title Font",  "../Resources/fonts/Vera.tff");
-    _settings.menuFontURL = config.read<string>
-    ( "Menu Font", "../Resources/fonts/VeraMono.ttf");
-    #endif
-
-    #ifdef LINUX
-    _settings.titleFontURL = config.read<string>
-    ( "Title Font", CMAKE_INSTALL_PREFIX  "/share/projectM/fonts/Vera.ttf" );
-    _settings.menuFontURL = config.read<string>
-    ( "Menu Font", CMAKE_INSTALL_PREFIX  "/share/projectM/fonts/VeraMono.ttf" );
-    #endif
-
-    #ifdef WIN32
-    _settings.titleFontURL = config.read<string>
-    ( "Title Font", CMAKE_INSTALL_PREFIX  "/share/projectM/fonts/Vera.ttf" );
-    _settings.menuFontURL = config.read<string>
-    ( "Menu Font", CMAKE_INSTALL_PREFIX  "/share/projectM/fonts/VeraMono.ttf" );
-    #endif
-
-
-    _settings.shuffleEnabled = config.read<bool> ( "Shuffle Enabled", true);
-
-    _settings.easterEgg = config.read<float> ( "Easter Egg Parameter", 0.0);
-    _settings.softCutRatingsEnabled =
-	config.read<float> ( "Soft Cut Ratings Enabled", false);
-
-    projectM_init ( _settings.meshX, _settings.meshY, _settings.fps,
-                    _settings.textureSize, _settings.windowWidth,_settings.windowHeight);
-
-                    _settings.beatSensitivity = beatDetect->beat_sensitivity = config.read<float> ( "Hard Cut Sensitivity", 10.0 );
-
-
-	if ( config.read ( "Aspect Correction", true ) )
-	{
-	    _settings.aspectCorrection = true;
-	    renderer->correction = true;
-	}
-	else
-	{
-	    _settings.aspectCorrection = false;
-	    renderer->correction = false;
-	}
-
-
+  if (file) {
+    file << config;
+    return true;
+  } else
+    return false;
 }
 
 
-void projectM::readSettings (const Settings & settings )
+
+void
+projectM::readConfig (const std::string & configFile)
 {
-    _settings.meshX = settings.meshX;
-    _settings.meshY = settings.meshY;
-    _settings.textureSize = settings.textureSize;
-    _settings.fps = settings.fps;
-    _settings.windowWidth  = settings.windowWidth;
-    _settings.windowHeight = settings.windowHeight;
-    _settings.smoothPresetDuration = settings.smoothPresetDuration;
-    _settings.presetDuration = settings.presetDuration;
-    _settings.softCutRatingsEnabled = settings.softCutRatingsEnabled;
+  std::cout << "[projectM] config file: " << configFile << std::endl;
 
-    _settings.presetURL = settings.presetURL;
-    _settings.titleFontURL = settings.titleFontURL;
-    _settings.menuFontURL =  settings.menuFontURL;
-    _settings.shuffleEnabled = settings.shuffleEnabled;
+  ConfigFile config (configFile);
+  _settings.meshX                 = config.read<int> ("Mesh X", 32);
+  _settings.meshY                 = config.read<int> ("Mesh Y", 24);
+  _settings.textureSize           = config.read<int> ("Texture Size", 512);
+  _settings.fps                   = config.read<int> ("FPS", 35);
+  _settings.windowWidth           = config.read<int> ("Window Width", 512);
+  _settings.windowHeight          = config.read<int> ("Window Height", 512);
+  _settings.smoothPresetDuration  =
+      config.read<int> ("Smooth Preset Duration",
+                        config.read<int> ("Smooth Transition Duration", 10));
+  _settings.presetDuration        = config.read<int> ("Preset Duration", 15);
 
-    _settings.easterEgg = settings.easterEgg;
+#ifdef LINUX
+  _settings.presetURL = config.read<string> ("Preset Path", CMAKE_INSTALL_PREFIX "/share/projectM/presets");
+#endif
 
-    projectM_init ( _settings.meshX, _settings.meshY, _settings.fps,
-                    _settings.textureSize, _settings.windowWidth,_settings.windowHeight);
+#ifdef __APPLE__
+  /// @bug awful hardcoded hack- need to add intelligence to cmake wrt bundling - carm
+  _settings.presetURL = config.read<string> ("Preset Path", "../Resources/presets");
+#endif
+
+#ifdef WIN32
+  _settings.presetURL = config.read<string> ("Preset Path", CMAKE_INSTALL_PREFIX "/share/projectM/presets");
+#endif
+
+#ifdef __APPLE__
+  _settings.titleFontURL = config.read<string>
+      ("Title Font",  "../Resources/fonts/Vera.tff");
+  _settings.menuFontURL = config.read<string>
+      ("Menu Font", "../Resources/fonts/VeraMono.ttf");
+#endif
+
+#ifdef LINUX
+  _settings.titleFontURL = config.read<string>
+      ("Title Font", CMAKE_INSTALL_PREFIX  "/share/projectM/fonts/Vera.ttf");
+  _settings.menuFontURL = config.read<string>
+      ("Menu Font", CMAKE_INSTALL_PREFIX  "/share/projectM/fonts/VeraMono.ttf");
+#endif
+
+#ifdef WIN32
+  _settings.titleFontURL = config.read<string>
+      ("Title Font", CMAKE_INSTALL_PREFIX  "/share/projectM/fonts/Vera.ttf");
+  _settings.menuFontURL = config.read<string>
+      ("Menu Font", CMAKE_INSTALL_PREFIX  "/share/projectM/fonts/VeraMono.ttf");
+#endif
 
 
-                    _settings.beatSensitivity = settings.beatSensitivity;
-                    _settings.aspectCorrection = settings.aspectCorrection;
+  _settings.shuffleEnabled        = config.read<bool> ("Shuffle Enabled", true);
+  _settings.easterEgg             = config.read<float> ("Easter Egg Parameter", 0.0);
+  _settings.softCutRatingsEnabled = config.read<float> ("Soft Cut Ratings Enabled", false);
 
+  projectM_init (_settings.meshX, _settings.meshY,
+                 _settings.fps,
+                 _settings.textureSize,
+                 _settings.windowWidth, _settings.windowHeight);
+
+  _settings.beatSensitivity =
+  beatDetect->beat_sensitivity = config.read<float> ("Hard Cut Sensitivity", 10.0);
+
+
+  if (config.read ("Aspect Correction", true))
+  {
+    _settings.aspectCorrection = true;
+    renderer->correction = true;
+  }
+  else
+  {
+    _settings.aspectCorrection = false;
+    renderer->correction = false;
+  }
+}
+
+
+void
+projectM::readSettings (const Settings & settings)
+{
+  _settings.meshX                 = settings.meshX;
+  _settings.meshY                 = settings.meshY;
+  _settings.textureSize           = settings.textureSize;
+  _settings.fps                   = settings.fps;
+  _settings.windowWidth           = settings.windowWidth;
+  _settings.windowHeight          = settings.windowHeight;
+  _settings.smoothPresetDuration  = settings.smoothPresetDuration;
+  _settings.presetDuration        = settings.presetDuration;
+  _settings.softCutRatingsEnabled = settings.softCutRatingsEnabled;
+
+  _settings.presetURL             = settings.presetURL;
+  _settings.titleFontURL          = settings.titleFontURL;
+  _settings.menuFontURL           = settings.menuFontURL;
+  _settings.shuffleEnabled        = settings.shuffleEnabled;
+
+  _settings.easterEgg             = settings.easterEgg;
+
+  projectM_init (_settings.meshX, _settings.meshY,
+                 _settings.fps,
+                 _settings.textureSize,
+                 _settings.windowWidth, _settings.windowHeight);
+
+  _settings.beatSensitivity       = settings.beatSensitivity;
+  _settings.aspectCorrection      = settings.aspectCorrection;
 }
 
 #ifdef USE_THREADS
-static void *thread_callback(void *prjm) {
-    projectM *p = (projectM *)prjm;
+static void
+*thread_callback (void *prjm)
+{
+  projectM *p = (projectM *)prjm;
 
-    p->thread_func(prjm);
-    return NULL;}
+  p->thread_func (prjm);
+  return NULL;
+}
 
 
-    void *projectM::thread_func(void *vptr_args)
+void *
+projectM::thread_func (void *vptr_args)
+{
+  pthread_mutex_lock (&mutex);
+  //  printf ("in thread: %f\n", timeKeeper->PresetProgressB());
+  while (true)
+  {
+    pthread_cond_wait (&condition, &mutex);
+    if (!running)
     {
-        pthread_mutex_lock( &mutex );
-        //  printf("in thread: %f\n", timeKeeper->PresetProgressB());
-        while (true)
-        {
-            pthread_cond_wait( &condition, &mutex );
-            if(!running)
-            {
-                pthread_mutex_unlock( &mutex );
-                return NULL;
-            }
-            evaluateSecondPreset();
-        }
+      pthread_mutex_unlock (&mutex);
+      return NULL;
     }
-    #endif
+    evaluateSecondPreset();
+  }
+}
+#endif  /*  USE_THREADS  */
 
-    void projectM::evaluateSecondPreset()
+void
+projectM::evaluateSecondPreset()
+{
+  pipelineContext2().time     = timeKeeper->GetRunningTime();
+  pipelineContext2().frame    = timeKeeper->PresetFrameB();
+  pipelineContext2().progress = timeKeeper->PresetProgressB();
+
+  m_activePreset2->Render (*beatDetect, pipelineContext2());
+}
+
+void
+projectM::renderFrame()
+{
+#ifdef SYNC_PRESET_SWITCHES
+  pthread_mutex_lock (&preset_mutex);
+#endif
+
+#ifdef DEBUG
+  char  fname[1024];
+  FILE  *f = NULL;
+  int   index = 0;
+  int   x, y;
+#endif
+
+  timeKeeper->UpdateTimers();
+  /*
+  if (timeKeeper->IsSmoothing())
+  {
+    printf ("Smoothing A:%f, B:%f, S:%f\n",
+            timeKeeper->PresetProgressA(),
+            timeKeeper->PresetProgressB(),
+            timeKeeper->SmoothRatio());
+  }
+  else
+  {
+    printf ("          A:%f\n", timeKeeper->PresetProgressA());
+  }*/
+
+  mspf = (int) (1000.0 / (float) settings().fps); //milliseconds per frame
+
+  /// @bug who is responsible for updating this now?"
+  pipelineContext().time      = timeKeeper->GetRunningTime();
+  pipelineContext().frame     = timeKeeper->PresetFrameA();
+  pipelineContext().progress  = timeKeeper->PresetProgressA();
+
+  //m_activePreset->Render (*beatDetect, pipelineContext());
+
+  beatDetect->detectFromSamples();
+
+  //m_activePreset->evaluateFrame();
+
+  //if the preset isn't locked and there are more presets
+  if (renderer->noSwitch == false  &&  !m_presetChooser->empty())
+  {
+    //if preset is done and we're not already switching
+    if (timeKeeper->PresetProgressA() >= 1.0  &&  !timeKeeper->IsSmoothing())
     {
-        pipelineContext2().time = timeKeeper->GetRunningTime();
-        pipelineContext2().frame = timeKeeper->PresetFrameB();
-        pipelineContext2().progress = timeKeeper->PresetProgressB();
-
-        m_activePreset2->Render(*beatDetect, pipelineContext2());
+      if (settings().shuffleEnabled)
+        selectRandom (false);
+      else
+        selectNext (false);
     }
-
-    void projectM::renderFrame()
+    else if (    beatDetect->vol-beatDetect->vol_old>beatDetect->beat_sensitivity
+             &&  timeKeeper->CanHardCut())
     {
-        #ifdef SYNC_PRESET_SWITCHES
-        pthread_mutex_lock(&preset_mutex);
-        #endif
-
-        #ifdef DEBUG
-        char fname[1024];
-        FILE *f = NULL;
-        int index = 0;
-        int x, y;
-        #endif
-
-        timeKeeper->UpdateTimers();
-/*
-        if (timeKeeper->IsSmoothing())
-        {
-            printf("Smoothing A:%f, B:%f, S:%f\n", timeKeeper->PresetProgressA(), timeKeeper->PresetProgressB(), timeKeeper->SmoothRatio());
-        }
-        else
-        {
-            printf("          A:%f\n", timeKeeper->PresetProgressA());
-        }*/
-
-        mspf= ( int ) ( 1000.0/ ( float ) settings().fps ); //milliseconds per frame
-
-        /// @bug who is responsible for updating this now?"
-        pipelineContext().time = timeKeeper->GetRunningTime();
-        pipelineContext().frame = timeKeeper->PresetFrameA();
-        pipelineContext().progress = timeKeeper->PresetProgressA();
-
-        //m_activePreset->Render(*beatDetect, pipelineContext());
-
-        beatDetect->detectFromSamples();
-
-        //m_activePreset->evaluateFrame();
-
-        //if the preset isn't locked and there are more presets
-        if ( renderer->noSwitch==false && !m_presetChooser->empty() )
-        {
-            //if preset is done and we're not already switching
-            if ( timeKeeper->PresetProgressA()>=1.0 && !timeKeeper->IsSmoothing())
-            {
-
-		if (settings().shuffleEnabled)
-			selectRandom(false);
-		else
-			selectNext(false);
-
-           }
-
-            else if ((beatDetect->vol-beatDetect->vol_old>beatDetect->beat_sensitivity ) &&
-                timeKeeper->CanHardCut())
-            {
-                // printf("Hard Cut\n");
-		if (settings().shuffleEnabled)
-			selectRandom(true);
-		else
-			selectNext(true);
-            }
-        }
-
-
-        if ( timeKeeper->IsSmoothing() && timeKeeper->SmoothRatio() <= 1.0 && !m_presetChooser->empty() )
-        {
-
-
-            //	 printf("start thread\n");
-            assert ( m_activePreset2.get() );
-
-            #ifdef USE_THREADS
-
-            pthread_cond_signal(&condition);
-            pthread_mutex_unlock( &mutex );
-            #endif
-            m_activePreset->Render(*beatDetect, pipelineContext());
-
-            #ifdef USE_THREADS
-            pthread_mutex_lock( &mutex );
-            #else
-            evaluateSecondPreset();
-            #endif
-
-            Pipeline pipeline;
-
-            pipeline.setStaticPerPixel(settings().meshX, settings().meshY);
-
-            assert(_matcher);
-            PipelineMerger::mergePipelines( m_activePreset->pipeline(),
-                                            m_activePreset2->pipeline(), pipeline,
-					    _matcher->matchResults(),
-                                            *_merger, timeKeeper->SmoothRatio());
-
-            renderer->RenderFrame(pipeline, pipelineContext());
-
-	    pipeline.drawables.clear();
-
-	    /*
-	    while (!pipeline.drawables.empty()) {
-		delete(pipeline.drawables.back());
-		pipeline.drawables.pop_back();
-	    } */
-
-        }
-        else
-        {
-
-
-            if ( timeKeeper->IsSmoothing() && timeKeeper->SmoothRatio() > 1.0 )
-            {
-                //printf("End Smooth\n");
-                m_activePreset = m_activePreset2;
-                timeKeeper->EndSmoothing();
-            }
-            //printf("Normal\n");
-
-            m_activePreset->Render(*beatDetect, pipelineContext());
-            renderer->RenderFrame (m_activePreset->pipeline(), pipelineContext());
-
-
-        }
-
-        //	std::cout<< m_activePreset->absoluteFilePath()<<std::endl;
-        //	renderer->presetName = m_activePreset->absoluteFilePath();
-
-
-
-        count++;
-        #ifndef WIN32
-        /** Frame-rate limiter */
-        /** Compute once per preset */
-        if ( this->count%100==0 )
-        {
-            this->renderer->realfps=100.0/ ( ( getTicks ( &timeKeeper->startTime )-this->fpsstart ) /1000 );
-            this->fpsstart=getTicks ( &timeKeeper->startTime );
-        }
-
-        int timediff = getTicks ( &timeKeeper->startTime )-this->timestart;
-
-        if ( timediff < this->mspf )
-        {
-            // printf("%s:",this->mspf-timediff);
-            int sleepTime = ( unsigned int ) ( this->mspf-timediff ) * 1000;
-            //		DWRITE ( "usleep: %d\n", sleepTime );
-            if ( sleepTime > 0 && sleepTime < 100000 )
-            {
-                if ( usleep ( sleepTime ) != 0 ) {}}
-        }
-        this->timestart=getTicks ( &timeKeeper->startTime );
-        #endif /** !WIN32 */
-
-	#ifdef SYNC_PRESET_SWITCHES
-        pthread_mutex_unlock(&preset_mutex);
-        #endif
-
+      // printf ("Hard Cut\n");
+      if (settings().shuffleEnabled)
+        selectRandom (true);
+      else
+        selectNext (true);
     }
+  }
 
-    void projectM::projectM_reset()
+
+  if (    timeKeeper->IsSmoothing()
+      &&  timeKeeper->SmoothRatio() <= 1.0
+      &&  !m_presetChooser->empty())
+  {
+    //   printf ("start thread\n");
+    assert (m_activePreset2.get());
+
+#ifdef USE_THREADS
+    pthread_cond_signal (&condition);
+    pthread_mutex_unlock (&mutex);
+#endif
+    m_activePreset->Render (*beatDetect, pipelineContext());
+
+#ifdef USE_THREADS
+    pthread_mutex_lock (&mutex);
+#else
+    evaluateSecondPreset();
+#endif
+
+    Pipeline pipeline;
+
+    pipeline.setStaticPerPixel (settings().meshX, settings().meshY);
+
+    assert (_matcher);
+    PipelineMerger::mergePipelines (m_activePreset->pipeline(),
+                                    m_activePreset2->pipeline(),
+                                    pipeline,
+                                    _matcher->matchResults(),
+                                    *_merger,
+                                    timeKeeper->SmoothRatio());
+
+    renderer->RenderFrame (pipeline, pipelineContext());
+
+    pipeline.drawables.clear();
+
+    /*
+    while (!pipeline.drawables.empty()) {
+      delete (pipeline.drawables.back());
+      pipeline.drawables.pop_back();
+    } */
+  }
+  else
+  {
+    if (timeKeeper->IsSmoothing()  &&  timeKeeper->SmoothRatio() > 1.0)
     {
-        this->mspf = 0;
-        this->timed = 0;
-        this->timestart = 0;
-        this->count = 0;
-
-        this->fpsstart = 0;
-
-        setlocale(LC_NUMERIC, "C");
-
-        projectM_resetengine();
+      //printf ("End Smooth\n");
+      m_activePreset = m_activePreset2;
+      timeKeeper->EndSmoothing();
     }
+    //printf ("Normal\n");
 
-    void projectM::projectM_init ( int gx, int gy, int fps, int texsize, int width, int height )
+    m_activePreset->Render (*beatDetect, pipelineContext());
+    renderer->RenderFrame (m_activePreset->pipeline(), pipelineContext());
+  }
+
+  //  std::cout<< m_activePreset->absoluteFilePath()<<std::endl;
+  //  renderer->presetName = m_activePreset->absoluteFilePath();
+
+  count++;
+
+#ifndef WIN32
+  /** Frame-rate limiter */
+  /** Compute once per preset */
+  if (this->count % 100 == 0)
+  {
+    this->renderer->realfps = 100.0
+                            / ((getTicks (&timeKeeper->startTime)
+                                - this->fpsstart) / 1000);
+    this->fpsstart = getTicks (&timeKeeper->startTime);
+  }
+
+  int timediff = getTicks (&timeKeeper->startTime) - this->timestart;
+
+  if (timediff < this->mspf)
+  {
+    // printf ("%s:",this->mspf-timediff);
+    int sleepTime = (unsigned int) (this->mspf - timediff) * 1000;
+    //    DWRITE ("usleep: %d\n", sleepTime);
+    if (sleepTime > 0  &&  sleepTime < 100000)
     {
-        setlocale(LC_NUMERIC, "C");
-
-        /** Initialise start time */
-        timeKeeper = new TimeKeeper(_settings.presetDuration,_settings.smoothPresetDuration, _settings.easterEgg);
-
-        /** Nullify frame stash */
-
-        /** Initialise per-pixel matrix calculations */
-        /** We need to initialise this before the builtin param db otherwise bass/mid etc won't bind correctly */
-        assert ( !beatDetect );
-
-        if (!_pcm)
-            _pcm = new PCM();
-        assert(pcm());
-        beatDetect = new BeatDetect ( _pcm );
-
-        if ( _settings.fps > 0 )
-            mspf= ( int ) ( 1000.0/ ( float ) _settings.fps );
-        else mspf = 0;
-
-        this->renderer = new Renderer ( width, height, gx, gy, texsize,  beatDetect, settings().presetURL, settings().titleFontURL, settings().menuFontURL );
-
-        running = true;
-
-        initPresetTools(gx, gy);
-
-
-        #ifdef USE_THREADS
-        pthread_mutex_init(&mutex, NULL);
-
-	#ifdef SYNC_PRESET_SWITCHES
-        pthread_mutex_init(&preset_mutex, NULL);
-	#endif
-
-        pthread_cond_init(&condition, NULL);
-        if (pthread_create(&thread, NULL, thread_callback, this) != 0)
-        {
-
-            std::cerr << "[projectM] failed to allocate a thread! try building with option USE_THREADS turned off" << std::endl;;
-            exit(EXIT_FAILURE);
-        }
-        pthread_mutex_lock( &mutex );
-        #endif
-
-        /// @bug order of operatoins here is busted
-        //renderer->setPresetName ( m_activePreset->name() );
-        timeKeeper->StartPreset();
-        assert(pcm());
-
-       pipelineContext().fps = fps;
-       pipelineContext2().fps = fps;
-
+      if (usleep (sleepTime) != 0)  {}
     }
+  }
+  this->timestart = getTicks (&timeKeeper->startTime);
+#endif /** !WIN32 */
+
+#ifdef SYNC_PRESET_SWITCHES
+  pthread_mutex_unlock (&preset_mutex);
+#endif
+}
+
+void
+projectM::projectM_reset()
+{
+  this->mspf      = 0;
+  this->timed     = 0;
+  this->timestart = 0;
+  this->count     = 0;
+
+  this->fpsstart  = 0;
+
+  setlocale (LC_NUMERIC, "C");
+
+  projectM_resetengine();
+}
+
+void
+projectM::projectM_init (
+int gx,
+int gy,
+int fps,
+int texsize,
+int width,
+int height
+)
+{
+  setlocale (LC_NUMERIC, "C");
+
+  /** Initialise start time */
+  timeKeeper = new TimeKeeper (_settings.presetDuration,
+                               _settings.smoothPresetDuration,
+                               _settings.easterEgg);
+
+  /** Nullify frame stash */
+
+  /** Initialise per-pixel matrix calculations */
+  /** We need to initialise this before the builtin param db otherwise bass/mid etc won't bind correctly */
+  assert (!beatDetect);
+
+  if (!_pcm)
+    _pcm = new PCM();
+  assert (pcm());
+  beatDetect = new BeatDetect (_pcm);
+
+  if (_settings.fps > 0)
+    mspf = (int) (1000.0 / (float) _settings.fps);
+  else
+    mspf = 0;
+
+  this->renderer = new Renderer (width, height,
+                                 gx, gy,
+                                 texsize,
+                                 beatDetect,
+                                 settings().presetURL,
+                                 settings().titleFontURL,
+                                 settings().menuFontURL);
+
+  running = true;
+
+  initPresetTools (gx, gy);
+
+
+#ifdef USE_THREADS
+  pthread_mutex_init (&mutex, NULL);
+
+#ifdef SYNC_PRESET_SWITCHES
+  pthread_mutex_init (&preset_mutex, NULL);
+#endif
+
+  pthread_cond_init (&condition, NULL);
+  if (pthread_create (&thread, NULL, thread_callback, this) != 0)
+  {
+
+    std::cerr << "[projectM] failed to allocate a thread! try building with option USE_THREADS turned off" << std::endl;;
+    exit (EXIT_FAILURE);
+  }
+  pthread_mutex_lock (&mutex);
+#endif  /*  USE_THREADS  */
+
+  /// @bug order of operatoins here is busted
+  //renderer->setPresetName (m_activePreset->name());
+  timeKeeper->StartPreset();
+  assert (pcm());
+
+  pipelineContext().fps = fps;
+  pipelineContext2().fps = fps;
+}
 
     /* Reinitializes the engine variables to a default (conservative and sane) value */
-    void projectM::projectM_resetengine()
-    {
-
-        if ( beatDetect != NULL )
-        {
-            beatDetect->reset();
-        }
-
-    }
+void
+projectM::projectM_resetengine()
+{
+  if (beatDetect != NULL)
+  {
+    beatDetect->reset();
+  }
+}
 
     /** Resets OpenGL state */
-    void projectM::projectM_resetGL ( int w, int h )
-    {
-
-        /** Stash the new dimensions */
-
-        renderer->reset ( w,h );
-    }
+void
+projectM::projectM_resetGL (int w, int h)
+{
+  /** Stash the new dimensions */
+  renderer->reset (w,h);
+}
 
     /** Sets the title to display */
-    void projectM::projectM_setTitle ( std::string title ) {
-
-        if ( title != renderer->title )
-        {
-            renderer->title=title;
-            renderer->drawtitle=1;
-        }
-    }
+void
+projectM::projectM_setTitle (std::string title)
+{
+  if (title != renderer->title)
+  {
+    renderer->title=title;
+    renderer->drawtitle=1;
+  }
+}
 
 
-    int projectM::initPresetTools(int gx, int gy)
-    {
+    int projectM::initPresetTools (int gx, int gy)
+{
+  /* Set the seed to the current time in seconds */
+  srand (time (NULL));
 
-        /* Set the seed to the current time in seconds */
-        srand ( time ( NULL ) );
+  std::string url = (m_flags & FLAG_DISABLE_PLAYLIST_LOAD)
+                    ? std::string()
+                    : settings().presetURL;
 
-        std::string url = (m_flags & FLAG_DISABLE_PLAYLIST_LOAD) ? std::string() : settings().presetURL;
+  if ((m_presetLoader = new PresetLoader (gx, gy, url)) == 0)
+  {
+    m_presetLoader = 0;
+    std::cerr << "[projectM] error allocating preset loader" << std::endl;
+    return PROJECTM_FAILURE;
+  }
 
-        if ( ( m_presetLoader = new PresetLoader ( gx, gy, url) ) == 0 )
-        {
-            m_presetLoader = 0;
-            std::cerr << "[projectM] error allocating preset loader" << std::endl;
-            return PROJECTM_FAILURE;
-        }
+  if ((m_presetChooser = new PresetChooser (*m_presetLoader, settings().softCutRatingsEnabled)) == 0)
+  {
+    delete (m_presetLoader);
 
-        if ( ( m_presetChooser = new PresetChooser ( *m_presetLoader, settings().softCutRatingsEnabled ) ) == 0 )
-        {
-            delete ( m_presetLoader );
+    m_presetChooser = 0;
+    m_presetLoader = 0;
 
-            m_presetChooser = 0;
-            m_presetLoader = 0;
+    std::cerr << "[projectM] error allocating preset chooser" << std::endl;
+    return PROJECTM_FAILURE;
+  }
 
-            std::cerr << "[projectM] error allocating preset chooser" << std::endl;
-            return PROJECTM_FAILURE;
-        }
+  // Start the iterator
+  if (!m_presetPos)
+    m_presetPos = new PresetIterator();
 
-        // Start the iterator
-        if (!m_presetPos)
-            m_presetPos = new PresetIterator();
+  // Initialize a preset queue position as well
+  //  m_presetQueuePos = new PresetIterator();
 
-        // Initialize a preset queue position as well
-        //	m_presetQueuePos = new PresetIterator();
+  // Start at end ptr- this allows next/previous to easily be done from this position.
+  *m_presetPos = m_presetChooser->end();
 
-        // Start at end ptr- this allows next/previous to easily be done from this position.
-        *m_presetPos = m_presetChooser->end();
+  // Load idle preset
+  std::cerr << "[projectM] Allocating idle preset..." << std::endl;
+  m_activePreset = m_presetLoader->loadPreset
+                    ("idle://Geiss & Sperl - Feedback (projectM idle HDR mix).milk");
 
-        // Load idle preset
-        std::cerr << "[projectM] Allocating idle preset..." << std::endl;
-        m_activePreset = m_presetLoader->loadPreset
-        ("idle://Geiss & Sperl - Feedback (projectM idle HDR mix).milk");
+  renderer->SetPipeline (m_activePreset->pipeline());
 
-        renderer->SetPipeline(m_activePreset->pipeline());
+  // Case where no valid presets exist in directory. Could also mean
+  // playlist initialization was deferred
+  if (m_presetChooser->empty())
+  {
+    //std::cerr << "[projectM] warning: no valid files found in preset directory \""
+    //<< m_presetLoader->directoryName() << "\"" << std::endl;
+  }
 
-        // Case where no valid presets exist in directory. Could also mean
-        // playlist initialization was deferred
-        if (m_presetChooser->empty())
-        {
-            //std::cerr << "[projectM] warning: no valid files found in preset directory \""
-            //<< m_presetLoader->directoryName() << "\"" << std::endl;
-        }
+  _matcher = new RenderItemMatcher();
+  _merger = new MasterRenderItemMerge();
+  //_merger->add (new WaveFormMergeFunction());
+  _merger->add (new ShapeMerge());
+  _merger->add (new BorderMerge());
+  //_merger->add (new BorderMergeFunction());
 
-        _matcher = new RenderItemMatcher();
-        _merger = new MasterRenderItemMerge();
-        //_merger->add(new WaveFormMergeFunction());
-        _merger->add(new ShapeMerge());
-        _merger->add(new BorderMerge());
-        //_merger->add(new BorderMergeFunction());
+  /// @bug These should be requested by the preset factories.
+  _matcher->distanceFunction().addMetric (new ShapeXYDistance());
 
-        /// @bug These should be requested by the preset factories.
-        _matcher->distanceFunction().addMetric(new ShapeXYDistance());
+  //std::cerr << "[projectM] Idle preset allocated." << std::endl;
 
-        //std::cerr << "[projectM] Idle preset allocated." << std::endl;
+  projectM_resetengine();
 
-        projectM_resetengine();
+  //std::cerr << "[projectM] engine has been reset." << std::endl;
+  return PROJECTM_SUCCESS;
+}
 
-        //std::cerr << "[projectM] engine has been reset." << std::endl;
-        return PROJECTM_SUCCESS;
-    }
+void
+projectM::destroyPresetTools()
+{
+  if (m_presetPos)
+    delete (m_presetPos);
 
-    void projectM::destroyPresetTools()
-    {
+  m_presetPos = 0;
 
-        if ( m_presetPos )
-            delete ( m_presetPos );
+  if (m_presetChooser)
+    delete (m_presetChooser);
 
-        m_presetPos = 0;
+  m_presetChooser = 0;
 
-        if ( m_presetChooser )
-            delete ( m_presetChooser );
+  if (m_presetLoader)
+    delete (m_presetLoader);
 
-        m_presetChooser = 0;
-
-        if ( m_presetLoader )
-            delete ( m_presetLoader );
-
-        m_presetLoader = 0;
-
-    }
+  m_presetLoader = 0;
+}
 
     /// @bug queuePreset case isn't handled
-    void projectM::removePreset(unsigned int index) {
+void
+projectM::removePreset (unsigned int index)
+{
+  unsigned int chooserIndex = **m_presetPos;
 
-        unsigned int chooserIndex = **m_presetPos;
+  m_presetLoader->removePreset (index);
 
-        m_presetLoader->removePreset(index);
+  // Case: no more presets, set iterator to end
+  if (m_presetChooser->empty())
+    *m_presetPos = m_presetChooser->end();
 
+  // Case: chooser index has become one less due to removal of an index below it
+  else if (chooserIndex > index) {
+    chooserIndex--;
+    *m_presetPos = m_presetChooser->begin (chooserIndex);
+  }
 
-        // Case: no more presets, set iterator to end
-        if (m_presetChooser->empty())
-            *m_presetPos = m_presetChooser->end();
+  // Case: we have deleted the active preset position
+  // Set iterator to end of chooser
+  else if (chooserIndex == index) {
+    *m_presetPos = m_presetChooser->end();
+  }
+}
 
-        // Case: chooser index has become one less due to removal of an index below it
-        else if (chooserIndex > index) {
-            chooserIndex--;
-            *m_presetPos = m_presetChooser->begin(chooserIndex);
-        }
+unsigned int
+projectM::addPresetURL (
+const std::string & presetURL,
+const std::string & presetName,
+const RatingList  & ratings
+)
+{
+  bool restorePosition = false;
 
-        // Case: we have deleted the active preset position
-        // Set iterator to end of chooser
-        else if (chooserIndex == index) {
-            *m_presetPos = m_presetChooser->end();
-        }
+  if (*m_presetPos == m_presetChooser->end())
+    restorePosition = true;
 
+  int index = m_presetLoader->addPresetURL (presetURL, presetName, ratings);
 
+  if (restorePosition)
+    *m_presetPos = m_presetChooser->end();
 
-    }
+  return index;
+}
 
-    unsigned int projectM::addPresetURL ( const std::string & presetURL, const std::string & presetName, const RatingList & ratings)
-    {
-        bool restorePosition = false;
+void
+projectM::selectPreset (unsigned int index, bool hardCut)
+{
+  if (m_presetChooser->empty())
+    return;
 
-        if (*m_presetPos == m_presetChooser->end())
-            restorePosition = true;
+  if (!hardCut) {
+    timeKeeper->StartSmoothing();
+  }
 
-        int index = m_presetLoader->addPresetURL ( presetURL, presetName, ratings);
+  *m_presetPos = m_presetChooser->begin (index);
 
-        if (restorePosition)
-            *m_presetPos = m_presetChooser->end();
+  if (!hardCut) {
+    switchPreset (m_activePreset2);
+  } else {
+    switchPreset (m_activePreset);
+    timeKeeper->StartPreset();
+  }
 
-        return index;
-    }
-
-    void projectM::selectPreset ( unsigned int index, bool hardCut)
-    {
-
-		if (m_presetChooser->empty())
-			return;
-
-		if (!hardCut) {
-                	timeKeeper->StartSmoothing();
-		}
-
-		*m_presetPos = m_presetChooser->begin(index);
-
-		if (!hardCut) {
-			switchPreset(m_activePreset2);
-		} else {
-			switchPreset(m_activePreset);
-			timeKeeper->StartPreset();
-		}
-
-	presetSwitchedEvent(hardCut, **m_presetPos);
-
+  presetSwitchedEvent (hardCut, **m_presetPos);
 }
 
 
-void projectM::selectRandom(const bool hardCut) {
+void
+projectM::selectRandom (const bool hardCut)
+{
+  if (m_presetChooser->empty())
+    return;
 
-		if (m_presetChooser->empty())
-			return;
+  if (!hardCut) {
+    timeKeeper->StartSmoothing();
+  }
 
-		if (!hardCut) {
-                	timeKeeper->StartSmoothing();
-		}
+  *m_presetPos = m_presetChooser->weightedRandom (hardCut);
 
-		*m_presetPos = m_presetChooser->weightedRandom(hardCut);
+  if (!hardCut) {
+    switchPreset (m_activePreset2);
+  } else {
+    switchPreset (m_activePreset);
+    timeKeeper->StartPreset();
+  }
 
-		if (!hardCut) {
-			switchPreset(m_activePreset2);
-		} else {
-			switchPreset(m_activePreset);
-			timeKeeper->StartPreset();
-		}
-
-		presetSwitchedEvent(hardCut, **m_presetPos);
-
+  presetSwitchedEvent (hardCut, **m_presetPos);
 }
 
-void projectM::selectPrevious(const bool hardCut) {
+void
+projectM::selectPrevious (const bool hardCut)
+{
+  if (m_presetChooser->empty())
+    return;
 
-		if (m_presetChooser->empty())
-			return;
+  if (!hardCut) {
+    timeKeeper->StartSmoothing();
+  }
 
-		if (!hardCut) {
-                	timeKeeper->StartSmoothing();
-		}
+  m_presetChooser->previousPreset (*m_presetPos);
 
-		m_presetChooser->previousPreset(*m_presetPos);
+  if (!hardCut) {
+    switchPreset (m_activePreset2);
+  } else {
+    switchPreset (m_activePreset);
+    timeKeeper->StartPreset();
+  }
 
-		if (!hardCut) {
-			switchPreset(m_activePreset2);
-		} else {
-			switchPreset(m_activePreset);
-			timeKeeper->StartPreset();
-		}
+  presetSwitchedEvent (hardCut, **m_presetPos);
 
-		presetSwitchedEvent(hardCut, **m_presetPos);
+  //    m_activePreset =  m_presetPos->allocate();
+  //    renderer->SetPipeline (m_activePreset->pipeline());
+  //    renderer->setPresetName (m_activePreset->name());
 
-//		m_activePreset =  m_presetPos->allocate();
-//		renderer->SetPipeline(m_activePreset->pipeline());
-//		renderer->setPresetName(m_activePreset->name());
-
-	       	//timeKeeper->StartPreset();
-
+  //timeKeeper->StartPreset();
 }
 
-void projectM::selectNext(const bool hardCut) {
+void
+projectM::selectNext (const bool hardCut)
+{
+  if (m_presetChooser->empty())
+    return;
 
-		if (m_presetChooser->empty())
-			return;
+  if (!hardCut) {
+    timeKeeper->StartSmoothing();
+    std::cout << "start smoothing" << std::endl;
+  }
 
-		if (!hardCut) {
-                	timeKeeper->StartSmoothing();
-			std::cout << "start smoothing" << std::endl;
-		}
+  m_presetChooser->nextPreset (*m_presetPos);
 
-		m_presetChooser->nextPreset(*m_presetPos);
-
-		if (!hardCut) {
-			switchPreset(m_activePreset2);
-		} else {
-			switchPreset(m_activePreset);
-			timeKeeper->StartPreset();
-		}
-		presetSwitchedEvent(hardCut, **m_presetPos);
-
-
+  if (!hardCut) {
+    switchPreset (m_activePreset2);
+  } else {
+    switchPreset (m_activePreset);
+    timeKeeper->StartPreset();
+  }
+  presetSwitchedEvent (hardCut, **m_presetPos);
 }
 
 /**
  *
  * @param targetPreset
  */
-void projectM::switchPreset(std::auto_ptr<Preset> & targetPreset) {
+void
+projectM::switchPreset (std::auto_ptr<Preset> & targetPreset)
+{
 
-	#ifdef SYNC_PRESET_SWITCHES
-	pthread_mutex_lock(&preset_mutex);
-	#endif
+#ifdef SYNC_PRESET_SWITCHES
+  pthread_mutex_lock (&preset_mutex);
+#endif
 
-        targetPreset = m_presetPos->allocate();
+  targetPreset = m_presetPos->allocate();
 
-        // Set preset name here- event is not done because at the moment this function is oblivious to smooth/hard switches
-        renderer->setPresetName(targetPreset->name());
-        renderer->SetPipeline(targetPreset->pipeline());
+  // Set preset name here- event is not done because at the moment this function is oblivious to smooth/hard switches
+  renderer->setPresetName (targetPreset->name());
+  renderer->SetPipeline (targetPreset->pipeline());
 
-	#ifdef SYNC_PRESET_SWITCHES
-	pthread_mutex_unlock(&preset_mutex);
-	#endif
-    }
+#ifdef SYNC_PRESET_SWITCHES
+  pthread_mutex_unlock (&preset_mutex);
+#endif
+}
 
-    void projectM::setPresetLock ( bool isLocked )
-    {
-        renderer->noSwitch = isLocked;
-    }
+void
+projectM::setPresetLock (bool isLocked)
+{
+  renderer->noSwitch = isLocked;
+}
 
-    bool projectM::isPresetLocked() const
-    {
-        return renderer->noSwitch;
-    }
+bool
+projectM::isPresetLocked() const
+{
+  return renderer->noSwitch;
+}
 
-    std::string projectM::getPresetURL ( unsigned int index ) const
-    {
-        return m_presetLoader->getPresetURL(index);
-    }
+std::string
+projectM::getPresetURL (unsigned int index) const
+{
+  return m_presetLoader->getPresetURL (index);
+}
 
-    int projectM::getPresetRating ( unsigned int index, const PresetRatingType ratingType) const
-    {
-        return m_presetLoader->getPresetRating(index, ratingType);
-    }
+int
+projectM::getPresetRating (unsigned int index, const PresetRatingType ratingType) const
+{
+  return m_presetLoader->getPresetRating (index, ratingType);
+}
 
-    std::string projectM::getPresetName ( unsigned int index ) const
-    {
-        return m_presetLoader->getPresetName(index);
-    }
+std::string
+projectM::getPresetName (unsigned int index) const
+{
+  return m_presetLoader->getPresetName (index);
+}
 
-    void projectM::clearPlaylist ( )
-    {
-        m_presetLoader->clear();
-        *m_presetPos = m_presetChooser->end();
-    }
+void
+projectM::clearPlaylist()
+{
+  m_presetLoader->clear();
+  *m_presetPos = m_presetChooser->end();
+}
 
-    void projectM::selectPresetPosition(unsigned int index) {
-        *m_presetPos = m_presetChooser->begin(index);
-    }
+void
+projectM::selectPresetPosition (unsigned int index)
+{
+  *m_presetPos = m_presetChooser->begin (index);
+}
 
-    bool projectM::selectedPresetIndex(unsigned int & index) const {
+bool
+projectM::selectedPresetIndex (unsigned int & index) const
+{
+  if (*m_presetPos == m_presetChooser->end())
+    return false;
 
-        if (*m_presetPos == m_presetChooser->end())
-            return false;
-
-        index = **m_presetPos;
-        return true;
-    }
-
-
-    bool projectM::presetPositionValid() const {
-
-        return (*m_presetPos != m_presetChooser->end());
-    }
-
-    unsigned int projectM::getPlaylistSize() const
-    {
-        return m_presetLoader->size();
-    }
-
-    void projectM::changePresetRating (unsigned int index, int rating, const PresetRatingType ratingType) {
-        m_presetLoader->setRating(index, rating, ratingType);
-        presetRatingChanged(index, rating, ratingType);
-    }
-
-    void projectM::insertPresetURL(unsigned int index, const std::string & presetURL, const std::string & presetName, const RatingList & ratings)
-    {
-        bool atEndPosition = false;
-
-        int newSelectedIndex;
-
-
-        if (*m_presetPos == m_presetChooser->end()) // Case: preset not selected
-        {
-            atEndPosition = true;
-        }
-
-        else if (**m_presetPos < index) // Case: inserting before selected preset
-        {
-            newSelectedIndex = **m_presetPos;
-        }
-
-        else if (**m_presetPos > index) // Case: inserting after selected preset
-        {
-            newSelectedIndex++;
-        }
-
-        else  // Case: inserting at selected preset
-        {
-            newSelectedIndex++;
-        }
-
-        m_presetLoader->insertPresetURL (index, presetURL, presetName, ratings);
-
-        if (atEndPosition)
-            *m_presetPos = m_presetChooser->end();
-        else
-            *m_presetPos = m_presetChooser->begin(newSelectedIndex);
-
-
-    }
-
-void projectM::changePresetName ( unsigned int index, std::string name ) {
-	m_presetLoader->setPresetName(index, name);
+  index = **m_presetPos;
+  return true;
 }
 
 
-void projectM::changeTextureSize(int size) {
+bool
+projectM::presetPositionValid() const
+{
+  return (*m_presetPos != m_presetChooser->end());
+}
+
+unsigned int
+projectM::getPlaylistSize() const
+{
+  return m_presetLoader->size();
+}
+
+void
+projectM::changePresetRating (unsigned int index, int rating, const PresetRatingType ratingType)
+{
+  m_presetLoader->setRating (index, rating, ratingType);
+  presetRatingChanged (index, rating, ratingType);
+}
+
+void
+projectM::insertPresetURL (
+unsigned int      index,
+const std::string & presetURL,
+const std::string & presetName,
+const RatingList  & ratings)
+{
+  bool atEndPosition = false;
+  int newSelectedIndex;
+
+  if (*m_presetPos == m_presetChooser->end()) // Case: preset not selected
+  {
+    atEndPosition = true;
+  }
+  else if (**m_presetPos < index) // Case: inserting before selected preset
+  {
+    newSelectedIndex = **m_presetPos;
+  }
+  else if (**m_presetPos > index) // Case: inserting after selected preset
+  {
+    newSelectedIndex++;
+  }
+  else  // Case: inserting at selected preset
+  {
+    newSelectedIndex++;
+  }
+
+  m_presetLoader->insertPresetURL (index, presetURL, presetName, ratings);
+
+  if (atEndPosition)
+    *m_presetPos = m_presetChooser->end();
+  else
+    *m_presetPos = m_presetChooser->begin (newSelectedIndex);
+}
+
+void
+projectM::changePresetName (unsigned int index, std::string name)
+{
+  m_presetLoader->setPresetName (index, name);
+}
+
+
+void
+projectM::changeTextureSize (int size)
+{
   _settings.textureSize = size;
 
   delete renderer;
-  renderer = new Renderer(_settings.windowWidth, _settings.windowHeight,
-                          _settings.meshX, _settings.meshY,
-                          _settings.textureSize, beatDetect, _settings.presetURL,
-                          _settings.titleFontURL, _settings.menuFontURL);
+  renderer = new Renderer (_settings.windowWidth, _settings.windowHeight,
+                           _settings.meshX, _settings.meshY,
+                           _settings.textureSize,
+                           beatDetect,
+                           _settings.presetURL,
+                           _settings.titleFontURL,
+                           _settings.menuFontURL);
 }
 
-void projectM::changePresetDuration(int seconds) {
-  timeKeeper->ChangePresetDuration(seconds);
+void
+projectM::changePresetDuration (int seconds)
+{
+  timeKeeper->ChangePresetDuration (seconds);
 }
-
-
diff --git a/src/libprojectM/projectM.hpp b/src/libprojectM/projectM.hpp
index 5fa38d3..d2b6bdd 100644
--- a/src/libprojectM/projectM.hpp
+++ b/src/libprojectM/projectM.hpp
@@ -89,53 +89,55 @@
 #endif
 
 /** KEEP THIS UP TO DATE! */
-#define PROJECTM_VERSION "2.0.00"
-#define PROJECTM_TITLE "projectM 2.0.00"
+#define PROJECTM_VERSION  "2.0.00"
+#define PROJECTM_TITLE    "projectM 2.0.00"
+
 
 /** Interface types */
 typedef enum {
-    MENU_INTERFACE,
-    SHELL_INTERFACE,
-    EDITOR_INTERFACE,
-    DEFAULT_INTERFACE,
-    BROWSER_INTERFACE
-  } interface_t;
+  MENU_INTERFACE,
+  SHELL_INTERFACE,
+  EDITOR_INTERFACE,
+  DEFAULT_INTERFACE,
+  BROWSER_INTERFACE
+} interface_t;
+
 
 /// A functor class that allows users of this library to specify random preset behavior
 class RandomizerFunctor {
+public:
+  RandomizerFunctor(PresetChooser & chooser) ;
+  virtual ~RandomizerFunctor();
+  virtual double operator() (int index);
 
-   public:
-	RandomizerFunctor(PresetChooser & chooser) ;
-	virtual ~RandomizerFunctor();
-   	virtual double operator() (int index);
-   private:
-	const PresetChooser & m_chooser;
+private:
+  const PresetChooser & m_chooser;
 };
 
 class DLLEXPORT projectM
 {
 public:
-	static const int FLAG_NONE = 0;
-	static const int FLAG_DISABLE_PLAYLIST_LOAD = 1 << 0;
+  static const int FLAG_NONE = 0;
+  static const int FLAG_DISABLE_PLAYLIST_LOAD = 1 << 0;
 
-    struct Settings {
-        int meshX;
-        int meshY;
-        int fps;
-        int textureSize;
-        int windowWidth;
-        int windowHeight;
-        std::string presetURL;
-        std::string titleFontURL;
-        std::string menuFontURL;
-        int smoothPresetDuration;
-        int presetDuration;
-        float beatSensitivity;
-        bool aspectCorrection;
-        float easterEgg;
-        bool shuffleEnabled;
-	bool softCutRatingsEnabled;
-    };
+  struct Settings {
+    int         meshX;
+    int         meshY;
+    int         fps;
+    int         textureSize;
+    int         windowWidth;
+    int         windowHeight;
+    std::string presetURL;
+    std::string titleFontURL;
+    std::string menuFontURL;
+    int         smoothPresetDuration;
+    int         presetDuration;
+    float       beatSensitivity;
+    bool        aspectCorrection;
+    float       easterEgg;
+    bool        shuffleEnabled;
+    bool        softCutRatingsEnabled;
+  };
 
   projectM(std::string config_file, int flags = FLAG_NONE);
   projectM(Settings settings, int flags = FLAG_NONE);
@@ -147,8 +149,9 @@
   void projectM_setTitle( std::string title );
   void renderFrame();
   unsigned initRenderToTexture();
-  void key_handler( projectMEvent event,
-		    projectMKeycode keycode, projectMModifier modifier );
+  void key_handler (projectMEvent event,
+                    projectMKeycode keycode,
+                    projectMModifier modifier);
 
   virtual ~projectM();
 
@@ -156,7 +159,7 @@
   void changePresetDuration(int seconds);
 
   const Settings & settings() const {
-		return _settings;
+    return _settings;
   }
 
   /// Writes a settings configuration to the specified file
@@ -199,11 +202,15 @@
   bool selectedPresetIndex(unsigned int & index) const;
 
   /// Add a preset url to the play list. Appended to bottom. Returns index of preset
-  unsigned int addPresetURL(const std::string & presetURL, const std::string & presetName, const RatingList & ratingList);
+  unsigned int addPresetURL (const std::string & presetURL,
+                             const std::string & presetName,
+                             const RatingList & ratingList);
 
   /// Insert a preset url to the play list at the suggested index.
-  void insertPresetURL(unsigned int index,
-			       const std::string & presetURL, const std::string & presetName, const RatingList & ratingList);
+  void insertPresetURL (unsigned int index,
+                        const std::string & presetURL,
+                        const std::string & presetName,
+                        const RatingList & ratingList);
 
   /// Returns true if the selected preset position points to an actual preset in the
   /// currently loaded playlist
@@ -214,7 +221,7 @@
 
   /// Returns the preset name associated with a preset index
   std::string getPresetName ( unsigned int index ) const;
- 
+
   void changePresetName ( unsigned int index, std::string name );
 
   /// Returns the rating associated with a preset index
@@ -229,15 +236,15 @@
 
   inline void setShuffleEnabled(bool value)
   {
-	  _settings.shuffleEnabled = value;
+    _settings.shuffleEnabled = value;
 
-	/// idea@ call a virtualfunction shuffleChanged()
+    /// idea@ call a virtualfunction shuffleChanged()
   }
 
 
   inline bool isShuffleEnabled() const
   {
-	return _settings.shuffleEnabled;
+    return _settings.shuffleEnabled;
   }
 
   /// Occurs when active preset has switched. Switched to index is returned
@@ -249,7 +256,7 @@
 
 
   inline PCM * pcm() {
-	  return _pcm;
+    return _pcm;
   }
   void *thread_func(void *vptr_args);
   PipelineContext & pipelineContext() { return *_pipelineContext; }
@@ -259,25 +266,26 @@
   void selectPrevious(const bool);
   void selectNext(const bool);
   void selectRandom(const bool);
+
 private:
-  PCM * _pcm;
+  PCM             * _pcm;
   double sampledPresetDuration();
-  BeatDetect * beatDetect;
-  Renderer *renderer;
+  BeatDetect      * beatDetect;
+  Renderer        *renderer;
   PipelineContext * _pipelineContext;
   PipelineContext * _pipelineContext2;
-  Settings _settings;
+  Settings        _settings;
 
 
-  int wvw;      //windowed dimensions
-  int wvh;
+  int             wvw;      //windowed dimensions
+  int             wvh;
 
   /** Timing information */
-  int mspf;
-  int timed;
-  int timestart;
-  int count;
-  float fpsstart;
+  int             mspf;
+  int             timed;
+  int             timestart;
+  int             count;
+  float           fpsstart;
 
   void readConfig(const std::string &configFile);
   void readSettings(const Settings &settings);
@@ -320,8 +328,7 @@
 
   Pipeline* currentPipe;
 
-void switchPreset(std::auto_ptr<Preset> & targetPreset);
-
-
+  void switchPreset(std::auto_ptr<Preset> & targetPreset);
 };
+
 #endif
diff --git a/src/libprojectM/sdltoprojectM.h b/src/libprojectM/sdltoprojectM.h
index d2a974d..b38fed5 100644
--- a/src/libprojectM/sdltoprojectM.h
+++ b/src/libprojectM/sdltoprojectM.h
@@ -44,122 +44,128 @@
 #include <SDL/SDL.h>
 #endif
 
-inline projectMEvent sdl2pmEvent( SDL_Event event ) { \
-							
-    switch ( event.type ) { \
-        case SDL_VIDEORESIZE:
-            return PROJECTM_VIDEORESIZE; \
-        case SDL_KEYUP: \
-            return PROJECTM_KEYUP; \
-        case SDL_KEYDOWN: \
-            return PROJECTM_KEYDOWN; \
-        default:
-            return PROJECTM_KEYUP; \
-      } \
-  } \
 
-inline projectMKeycode sdl2pmKeycode( SDLKey keysym ) { \
-    switch ( keysym ) { \
-        case SDLK_F1: \
-            return PROJECTM_K_F1; \
-        case SDLK_F2: \
-            return PROJECTM_K_F2; \
-        case SDLK_F3: \
-            return PROJECTM_K_F3; \
-        case SDLK_F4: \
-            return PROJECTM_K_F4; \
-        case SDLK_F5: \
-            return PROJECTM_K_F5; \
-        case SDLK_F6: \
-            return PROJECTM_K_F6; \
-        case SDLK_F7: \
-            return PROJECTM_K_F7; \
-        case SDLK_F8: \
-            return PROJECTM_K_F8; \
-        case SDLK_F9: \
-            return PROJECTM_K_F9; \
-        case SDLK_F10: \
-            return PROJECTM_K_F10; \
-        case SDLK_F11: \
-            return PROJECTM_K_F11; \
-        case SDLK_F12: \
-            return PROJECTM_K_F12; \
-	  case SDLK_ESCAPE: \
-	    return PROJECTM_K_ESCAPE; 
-    case SDLK_a:
-      return PROJECTM_K_a;
-    case SDLK_b:
-      return PROJECTM_K_b;
-    case SDLK_c:  
-      return PROJECTM_K_c;
-    case SDLK_d: 
-      return PROJECTM_K_d; 
-    case SDLK_e:
-      return PROJECTM_K_e; 
-    case SDLK_f: 
-      return PROJECTM_K_f; 
-    case SDLK_g: 
-      return PROJECTM_K_g; 
-    case SDLK_h: 
-      return PROJECTM_K_h; 
-    case SDLK_i: 
-      return PROJECTM_K_i; 
-    case SDLK_j:
-      return PROJECTM_K_j;
-    case SDLK_k:
-      return PROJECTM_K_k;
-    case SDLK_l:  
-      return PROJECTM_K_l;
-    case SDLK_m: 
-      return PROJECTM_K_m; 
-    case SDLK_n:
-      return PROJECTM_K_n; 
-    case SDLK_o: 
-      return PROJECTM_K_o; 
-    case SDLK_p: 
-      return PROJECTM_K_p; 
-    case SDLK_q: 
-      return PROJECTM_K_q; 
-    case SDLK_r: 
-      return PROJECTM_K_r; 
-    case SDLK_s: 
-      return PROJECTM_K_s; 
-    case SDLK_t:
-      return PROJECTM_K_t; 
-    case SDLK_u: 
-      return PROJECTM_K_u; 
-    case SDLK_v: 
-      return PROJECTM_K_v; 
-    case SDLK_w: 
-      return PROJECTM_K_w; 
-    case SDLK_x: 
-      return PROJECTM_K_x; 
-    case SDLK_y: 
-      return PROJECTM_K_y; 
-    case SDLK_z: 
-      return PROJECTM_K_z; 
-    case SDLK_UP:
-      return PROJECTM_K_UP;
-    case SDLK_RETURN:
-      return PROJECTM_K_RETURN;
-    case SDLK_RIGHT:
-      return PROJECTM_K_RIGHT;
-    case SDLK_LEFT:
-      return PROJECTM_K_LEFT;
-    case SDLK_DOWN:
-      return PROJECTM_K_DOWN;
-    case SDLK_PAGEUP:
-      return PROJECTM_K_PAGEUP;
-    case SDLK_PAGEDOWN:
-      return PROJECTM_K_PAGEDOWN;
-   
-        default: \
-            return PROJECTM_K_NONE; \
-      } \
-  } \
+inline projectMEvent
+sdl2pmEvent (SDL_Event event)
+{
+  switch (event.type) {
+  case SDL_VIDEORESIZE:
+    return PROJECTM_VIDEORESIZE;
+  case SDL_KEYUP:
+    return PROJECTM_KEYUP;
+  case SDL_KEYDOWN:
+    return PROJECTM_KEYDOWN;
+  default:
+    return PROJECTM_KEYUP;
+  }
+}
 
-inline projectMModifier sdl2pmModifier( SDLMod mod ) { \
-    return PROJECTM_KMOD_LSHIFT; \
-  } \
+inline projectMKeycode
+sdl2pmKeycode (SDLKey keysym)
+{
+  switch (keysym) {
+  case SDLK_F1:
+    return PROJECTM_K_F1;
+  case SDLK_F2:
+    return PROJECTM_K_F2;
+  case SDLK_F3:
+    return PROJECTM_K_F3;
+  case SDLK_F4:
+    return PROJECTM_K_F4;
+  case SDLK_F5:
+    return PROJECTM_K_F5;
+  case SDLK_F6:
+    return PROJECTM_K_F6;
+  case SDLK_F7:
+    return PROJECTM_K_F7;
+  case SDLK_F8:
+    return PROJECTM_K_F8;
+  case SDLK_F9:
+    return PROJECTM_K_F9;
+  case SDLK_F10:
+    return PROJECTM_K_F10;
+  case SDLK_F11:
+    return PROJECTM_K_F11;
+  case SDLK_F12:
+    return PROJECTM_K_F12;
+  case SDLK_ESCAPE:
+    return PROJECTM_K_ESCAPE;
+  case SDLK_a:
+    return PROJECTM_K_a;
+  case SDLK_b:
+    return PROJECTM_K_b;
+  case SDLK_c:
+    return PROJECTM_K_c;
+  case SDLK_d:
+    return PROJECTM_K_d;
+  case SDLK_e:
+    return PROJECTM_K_e;
+  case SDLK_f:
+    return PROJECTM_K_f;
+  case SDLK_g:
+    return PROJECTM_K_g;
+  case SDLK_h:
+    return PROJECTM_K_h;
+  case SDLK_i:
+    return PROJECTM_K_i;
+  case SDLK_j:
+    return PROJECTM_K_j;
+  case SDLK_k:
+    return PROJECTM_K_k;
+  case SDLK_l:
+    return PROJECTM_K_l;
+  case SDLK_m:
+    return PROJECTM_K_m;
+  case SDLK_n:
+    return PROJECTM_K_n;
+  case SDLK_o:
+    return PROJECTM_K_o;
+  case SDLK_p:
+    return PROJECTM_K_p;
+  case SDLK_q:
+    return PROJECTM_K_q;
+  case SDLK_r:
+    return PROJECTM_K_r;
+  case SDLK_s:
+    return PROJECTM_K_s;
+  case SDLK_t:
+    return PROJECTM_K_t;
+  case SDLK_u:
+    return PROJECTM_K_u;
+  case SDLK_v:
+    return PROJECTM_K_v;
+  case SDLK_w:
+    return PROJECTM_K_w;
+  case SDLK_x:
+    return PROJECTM_K_x;
+  case SDLK_y:
+    return PROJECTM_K_y;
+  case SDLK_z:
+    return PROJECTM_K_z;
+  case SDLK_UP:
+    return PROJECTM_K_UP;
+  case SDLK_RETURN:
+    return PROJECTM_K_RETURN;
+  case SDLK_RIGHT:
+    return PROJECTM_K_RIGHT;
+  case SDLK_LEFT:
+    return PROJECTM_K_LEFT;
+  case SDLK_DOWN:
+    return PROJECTM_K_DOWN;
+  case SDLK_PAGEUP:
+    return PROJECTM_K_PAGEUP;
+  case SDLK_PAGEDOWN:
+    return PROJECTM_K_PAGEDOWN;
+
+  default:
+    return PROJECTM_K_NONE;
+  }
+}
+
+inline projectMModifier
+sdl2pmModifier (SDLMod mod)
+{
+  return PROJECTM_KMOD_LSHIFT;
+}
 
 #endif /** _SDLTOPROJECTM_H */
diff --git a/src/libprojectM/timer.cpp b/src/libprojectM/timer.cpp
index c347e1e..2dd8282 100644
--- a/src/libprojectM/timer.cpp
+++ b/src/libprojectM/timer.cpp
@@ -27,23 +27,26 @@
 #include "timer.h"
 #include <stdlib.h>
 
+
 #ifndef WIN32
 /** Get number of ticks since the given timestamp */
-unsigned int getTicks( struct timeval *start ) {
-    struct timeval now;
-    unsigned int ticks;
+unsigned int
+getTicks (struct timeval *start)
+{
+  struct timeval  now;
+  unsigned int    ticks;
 
-    gettimeofday(&now, NULL);
-    ticks=(now.tv_sec-start->tv_sec)*1000+(now.tv_usec-start->tv_usec)/1000;
-    return(ticks);
-  }
+  gettimeofday (&now, NULL);
+  ticks = (now.tv_sec - start->tv_sec) * 1000
+        + (now.tv_usec - start->tv_usec) / 1000;
+  return (ticks);
+}
 
 #else
-unsigned int getTicks( long start ) {
-    return GetTickCount() - start;
-  }
+unsigned int
+getTicks (long start)
+{
+  return GetTickCount() - start;
+}
 
 #endif /** !WIN32 */
-
-
-  
diff --git a/src/libprojectM/wipemalloc.cpp b/src/libprojectM/wipemalloc.cpp
index 14bcf78..f1b38be 100644
--- a/src/libprojectM/wipemalloc.cpp
+++ b/src/libprojectM/wipemalloc.cpp
@@ -23,22 +23,28 @@
  *
  * Clean memory allocator
  */
-
 #include "wipemalloc.h"
 
- void *wipemalloc( size_t count ) {
-    void *mem = malloc( count );
-    if ( mem != NULL ) {
-        memset( mem, 0, count );
-      } else {
-        printf( "wipemalloc() failed to allocate %d bytes\n", (int)count );
-      }
-    return mem;
+
+/*  FIXME: Is there some reason calloc() can't be used?  */
+void *
+wipemalloc (size_t count)
+{
+  void *mem = malloc (count);
+
+  if (mem != NULL) {
+    memset (mem, 0, count);
+  } else {
+    printf ("wipemalloc() failed to allocate %d bytes\n", (int) count);
   }
+  return mem;
+}
 
 /** Safe memory deallocator */
- void wipefree( void *ptr ) {
-    if ( ptr != NULL ) {
-        free( ptr );
-      }
+void
+wipefree (void *ptr)
+{
+  if (ptr != NULL) {
+    free (ptr);
   }
+}
