diff -Naur GraphicsMagick-1.3.20-orig/magick/blob.c GraphicsMagick-1.3.20/magick/blob.c
--- GraphicsMagick-1.3.20-orig/magick/blob.c	2014-08-17 00:33:24.000000000 +0400
+++ GraphicsMagick-1.3.20/magick/blob.c	2014-10-06 23:47:05.015200000 +0400
@@ -56,6 +56,7 @@
 #include "magick/semaphore.h"
 #include "magick/tempfile.h"
 #include "magick/utility.h"
+#include "magick/pathtools.h"
 #if defined(HasZLIB) && !defined(DISABLE_COMPRESSED_FILES)
 #  include "zlib.h"
 #endif
@@ -1854,7 +1855,7 @@
 %
 */
 
-#if !defined(UseInstalledMagick) && defined(POSIX)
+#if !defined(UseInstalledMagick) && (defined(POSIX) || defined(__MINGW32__))
 static void ChopPathComponents(char *path,const unsigned long components)
 {
   long
@@ -1968,11 +1969,13 @@
 #if defined(UseInstalledMagick)
 
 # if defined(MagickShareConfigPath)
-  AddConfigurePath(path_map,&path_index,MagickShareConfigPath,exception);
+  char * path_share = single_path_relocation(MagickBinPath, MagickShareConfigPath);
+  AddConfigurePath(path_map,&path_index,path_share,exception);
 # endif /* defined(MagickShareConfigPath) */
 
 # if defined(MagickLibConfigPath)
-  AddConfigurePath(path_map,&path_index,MagickLibConfigPath,exception);
+  char * path_lib = single_path_relocation(MagickBinPath, MagickLibConfigPath);
+  AddConfigurePath(path_map,&path_index,path_lib,exception);
 # endif /* defined(MagickLibConfigPath) */
 
 # if defined(MSWINDOWS) && !(defined(MagickLibConfigPath) || defined(MagickShareConfigPath))
@@ -2039,7 +2040,7 @@
 
   if (*SetClientPath((char *) NULL) != '\0')
     {
-#if defined(POSIX)
+#if defined(POSIX) || defined(__MINGW32__)
       char
         prefix[MaxTextExtent];
 
@@ -2050,10 +2053,12 @@
       ChopPathComponents(prefix,1);
 
       FormatString(path,"%.1024s/lib/%s/",prefix,MagickLibConfigSubDir);
-      AddConfigurePath(path_map,&path_index,path,exception);
+      char * path_sub_lib = single_path_relocation(MagickBinPath, path);
+      AddConfigurePath(path_map,&path_index,path_sub_lib,exception);
 
       FormatString(path,"%.1024s/share/%s/",prefix,MagickShareConfigSubDir);
-      AddConfigurePath(path_map,&path_index,path,exception);
+      char * path_sub_share = single_path_relocation(MagickBinPath, path);
+      AddConfigurePath(path_map,&path_index,path_sub_share,exception);
 #else /* defined(POSIX) */
       FormatString(path,"%.1024s%s",SetClientPath((char *) NULL),
         DirectorySeparator);
diff -Naur GraphicsMagick-1.3.20-orig/magick/delegate.c GraphicsMagick-1.3.20/magick/delegate.c
--- GraphicsMagick-1.3.20-orig/magick/delegate.c	2013-12-31 23:55:54.000000000 +0400
+++ GraphicsMagick-1.3.20/magick/delegate.c	2014-10-06 23:22:29.072600000 +0400
@@ -1307,7 +1307,17 @@
 
 # if defined(UseInstalledMagick)
 #  if defined(MagickBinPath)
+#    ifdef __MINGW32__
+                    char exe_path[PATH_MAX];
+                    get_executable_path (NULL, &exe_path[0], sizeof(exe_path)/sizeof(exe_path[0]));
+                    if (strrchr (exe_path, '/') != NULL)
+                    {
+                       strrchr (exe_path, '/')[1] = '\0';
+                    }
+                    strcpy(BinPath,exe_path);
+#    else
                     strlcpy(BinPath,MagickBinPath,sizeof(BinPath));
+#    endif
 #  else
                     {
                       char
diff -Naur GraphicsMagick-1.3.20-orig/magick/Makefile.am GraphicsMagick-1.3.20/magick/Makefile.am
--- GraphicsMagick-1.3.20-orig/magick/Makefile.am	2014-08-17 00:33:24.000000000 +0400
+++ GraphicsMagick-1.3.20/magick/Makefile.am	2014-10-06 22:14:01.834200000 +0400
@@ -154,6 +154,8 @@
 	magick/operator.h \
 	magick/paint.c \
 	magick/paint.h \
+	magick/pathtools.c \
+	magick/pathtools.h \
 	magick/pixel_cache.h \
 	magick/pixel_cache.c \
 	magick/pixel_iterator.c \
diff -Naur GraphicsMagick-1.3.20-orig/magick/module.c GraphicsMagick-1.3.20/magick/module.c
--- GraphicsMagick-1.3.20-orig/magick/module.c	2013-03-10 03:19:32.000000000 +0400
+++ GraphicsMagick-1.3.20/magick/module.c	2014-10-06 23:53:04.763200000 +0400
@@ -47,6 +47,7 @@
 #include "magick/map.h"
 #include "magick/module.h"
 #include "magick/utility.h"
+#include "magick/pathtools.h"
 #if defined(HasLTDL)
 #  include "ltdl.h"
    typedef lt_dlhandle ModuleHandle;
@@ -969,7 +970,7 @@
   (*path_index)++;
 }
 
-#if !defined(UseInstalledMagick) && defined(POSIX)
+#if !defined(UseInstalledMagick) && (defined(POSIX) || defined(__MINGW32__))
 static void
 ChopPathComponents(char *path,const unsigned long components)
 {
@@ -1099,10 +1100,10 @@
       {
       case MagickCoderModule:
       default:
-        module_directory=MagickCoderModulesPath;
+        module_directory = single_path_relocation(MagickBinPath, MagickCoderModulesPath);
         break;
       case MagickFilterModule:
-        module_directory=MagickFilterModulesPath;
+        module_directory = single_path_relocation(MagickBinPath, MagickFilterModulesPath);
         break;
       }
 
@@ -1152,7 +1153,7 @@
       /*
         Search MAGICK_HOME.
       */
-# if defined(POSIX)
+# if defined(POSIX) || defined(__MINGW32__)
       char
         *subdir=NULL;
 
@@ -1168,18 +1169,20 @@
         }
 
       FormatString(path,"%.512s/lib/%s/",getenv("MAGICK_HOME"),subdir);
+      char * path_home_dirs = single_path_relocation(MagickBinPath, path);
+      AddModulePath(path_map,&path_index,path_home_dirs,exception);
 # else
       FormatString(path,"%.512s%s",getenv("MAGICK_HOME"),
         DirectorySeparator);
-# endif /* !POSIX */
       AddModulePath(path_map,&path_index,path,exception);
+# endif /* !POSIX */
     }
   if (*SetClientPath((char *) NULL) != '\0')
     {
       /*
         Search based on executable directory if directory is known.
       */
-# if defined(POSIX)
+# if defined(POSIX) || defined(__MINGW32__)
       char
         *module_subdir=NULL,
         prefix[MaxTextExtent];
@@ -1199,11 +1202,13 @@
       ChopPathComponents(prefix,1);
       FormatString(path,"%.512s/lib/%s/modules-Q%d/%s/",prefix,
         MagickLibSubdir,QuantumDepth,module_subdir);
+      char * path_home_modules = single_path_relocation(MagickBinPath, path);
+      AddModulePath(path_map,&path_index,path_home_modules,exception);
 # else /* end defined(POSIX) */
       FormatString(path,"%.512s%s",SetClientPath((char *) NULL),
         DirectorySeparator);
-# endif /* !POSIX */
       AddModulePath(path_map,&path_index,path,exception);
+# endif /* !POSIX */
     }
   if (getenv("HOME") != (char *) NULL)
     {
diff -Naur GraphicsMagick-1.3.20-orig/magick/pathtools.c GraphicsMagick-1.3.20/magick/pathtools.c
--- GraphicsMagick-1.3.20-orig/magick/pathtools.c	1970-01-01 03:00:00.000000000 +0300
+++ GraphicsMagick-1.3.20/magick/pathtools.c	1970-01-01 03:00:00.000000000 +0300
@@ -0,0 +1,538 @@
+/*
+      .Some useful path tools.
+        .ASCII only for now.
+   .Written by Ray Donnelly in 2014.
+   .Licensed under CC0 (and anything.
+  .else you need to license it under).
+      .No warranties whatsoever.
+  .email: <mingw.android@gmail.com>.
+ */
+
+#if defined(__APPLE__)
+#include <stdlib.h>
+#else
+#include <malloc.h>
+#endif
+#include <limits.h>
+#include <stdio.h>
+#include <string.h>
+#if defined(__linux__) || defined(__CYGWIN__) || defined(__MSYS__)
+#include <alloca.h>
+#endif
+#include <unistd.h>
+
+/* If you don't define this, then get_executable_path()
+   can only use argv[0] which will often not work well */
+#define IMPLEMENT_SYS_GET_EXECUTABLE_PATH
+
+#if defined(IMPLEMENT_SYS_GET_EXECUTABLE_PATH)
+#if defined(__linux__) || defined(__CYGWIN__) || defined(__MSYS__)
+/* Nothing needed, unistd.h is enough. */
+#elif defined(__APPLE__)
+#include <mach-o/dyld.h>
+#elif defined(_WIN32)
+#define WIN32_MEAN_AND_LEAN
+#include <windows.h>
+#include <psapi.h>
+#endif
+#endif /* defined(IMPLEMENT_SYS_GET_EXECUTABLE_PATH) */
+
+#include "pathtools.h"
+
+char *
+malloc_copy_string(char const * original)
+{
+  char * result = (char *) malloc (sizeof (char*) * strlen (original)+1);
+  if (result != NULL)
+  {
+    strcpy (result, original);
+  }
+  return result;
+}
+
+void
+sanitise_path(char * path)
+{
+  size_t path_size = strlen (path);
+
+  /* Replace any '\' with '/' */
+  char * path_p = path;
+  while ((path_p = strchr (path_p, '\\')) != NULL)
+  {
+    *path_p = '/';
+  }
+  /* Replace any '//' with '/' */
+  path_p = path;
+  while ((path_p = strstr (path_p, "//")) != NULL)
+  {
+    memmove (path_p, path_p + 1, path_size--);
+  }
+  return;
+}
+
+char *
+get_relative_path(char const * from_in, char const * to_in)
+{
+  size_t from_size = (from_in == NULL) ? 0 : strlen (from_in);
+  size_t to_size = (to_in == NULL) ? 0 : strlen (to_in);
+  size_t max_size = (from_size + to_size) * 2 + 4;
+  char * scratch_space = (char *) alloca (from_size + 1 + to_size + 1 + max_size + max_size);
+  char * from;
+  char * to;
+  char * common_part;
+  char * result;
+  size_t count;
+
+  /* No to, return "./" */
+  if (to_in == NULL)
+  {
+    return malloc_copy_string ("./");
+  }
+
+  /* If alloca failed or no from was given return a copy of to */
+  if (   from_in == NULL
+      || scratch_space == NULL )
+  {
+    return malloc_copy_string (to_in);
+  }
+
+  from = scratch_space;
+  strcpy (from, from_in);
+  to = from + from_size + 1;
+  strcpy (to, to_in);
+  common_part = to + to_size + 1;
+  result = common_part + max_size;
+  simplify_path (from);
+  simplify_path (to);
+
+  result[0] = '\0';
+
+  size_t match_size_dirsep = 0;  /* The match size up to the last /. Always wind back to this - 1 */
+  size_t match_size = 0;         /* The running (and final) match size. */
+  size_t largest_size = (from_size > to_size) ? from_size : to_size;
+  int to_final_is_slash = (to[to_size-1] == '/') ? 1 : 0;
+  char from_c;
+  char to_c;
+  for (match_size = 0; match_size < largest_size; ++match_size)
+  {
+    /* To simplify the logic, always pretend the strings end with '/' */
+    from_c = (match_size < from_size) ? from[match_size] : '/';
+    to_c =   (match_size <   to_size) ?   to[match_size] : '/';
+
+    if (from_c != to_c)
+    {
+      if (from_c != '\0' || to_c != '\0')
+      {
+        match_size = match_size_dirsep;
+      }
+      break;
+    }
+    else if (from_c == '/')
+    {
+      match_size_dirsep = match_size;
+    }
+  }
+  strncpy (common_part, from, match_size);
+  common_part[match_size] = '\0';
+  from += match_size;
+  to += match_size;
+  size_t ndotdots = 0;
+  char const* from_last = from + strlen(from) - 1;
+  while ((from = strchr (from, '/')) && from != from_last)
+  {
+    ++ndotdots;
+    ++from;
+  }
+  for (count = 0; count < ndotdots; ++count)
+  {
+    strcat(result, "../");
+  }
+  if (strlen(to) > 0)
+  {
+    strcat(result, to+1);
+  }
+  /* Make sure that if to ends with '/' result does the same, and
+     vice-versa. */
+  size_t size_result = strlen(result);
+  if ((to_final_is_slash == 1)
+      && (!size_result || result[size_result-1] != '/'))
+  {
+    strcat (result, "/");
+  }
+  else if (!to_final_is_slash
+           && size_result && result[size_result-1] == '/')
+  {
+    result[size_result-1] = '\0';
+  }
+
+  return malloc_copy_string (result);
+}
+
+void
+simplify_path(char * path)
+{
+  ssize_t n_toks = 1; /* in-case we need an empty initial token. */
+  ssize_t i, j;
+  size_t tok_size;
+  size_t in_size = strlen (path);
+  int it_ended_with_a_slash = (path[in_size - 1] == '/') ? 1 : 0;
+  char * result = path;
+  sanitise_path(result);
+  char * result_p = result;
+
+  do
+  {
+    ++n_toks;
+    ++result_p;
+  } while ((result_p = strchr (result_p, '/')) != NULL);
+
+  result_p = result;
+  char const ** toks = (char const **) alloca (sizeof (char const*) * n_toks);
+  n_toks = 0;
+  do
+  {
+    if (result_p > result)
+    {
+      *result_p++ = '\0';
+    }
+    else if (*result_p == '/')
+    {
+      /* A leading / creates an empty initial token. */
+      toks[n_toks++] = result_p;
+      *result_p++ = '\0';
+    }
+    toks[n_toks++] = result_p;
+  } while ((result_p = strchr (result_p, '/')) != NULL);
+
+  /* Remove all non-leading '.' and any '..' we can match
+     with an earlier forward path (i.e. neither '.' nor '..') */
+  for (i = 1; i < n_toks; ++i)
+  {
+    int removals[2] = { -1, -1 };
+    if ( strcmp (toks[i], "." ) == 0)
+    {
+      removals[0] = i;
+    }
+    else if ( strcmp (toks[i], ".." ) == 0)
+    {
+      /* Search backwards for a forward path to collapse.
+         If none are found then the .. also stays. */
+      for (j = i - 1; j > -1; --j)
+      {
+        if ( strcmp (toks[j], "." )
+          && strcmp (toks[j], ".." ) )
+        {
+          removals[0] = j;
+          removals[1] = i;
+          break;
+        }
+      }
+    }
+    for (j = 0; j < 2; ++j)
+    {
+      if (removals[j] >= 0) /* Can become -2 */
+      {
+        --n_toks;
+        memmove (&toks[removals[j]], &toks[removals[j]+1], (n_toks - removals[j])*sizeof (char*));
+        --i;
+        if (!j)
+        {
+          --removals[1];
+        }
+      }
+    }
+  }
+  result_p = result;
+  for (i = 0; i < n_toks; ++i)
+  {
+    tok_size = strlen(toks[i]);
+    memmove (result_p, toks[i], tok_size);
+    result_p += tok_size;
+    if ((!i || tok_size) && ((i < n_toks - 1) || it_ended_with_a_slash == 1))
+    {
+      *result_p = '/';
+      ++result_p;
+    }
+  }
+  *result_p = '\0';
+}
+
+/* Returns actual_to by calculating the relative path from -> to and
+   applying that to actual_from. An assumption that actual_from is a
+   dir is made, and it may or may not end with a '/' */
+char const *
+get_relocated_path (char const * from, char const * to, char const * actual_from)
+{
+  char const * relative_from_to = get_relative_path (from, to);
+  char * actual_to = (char *) malloc (strlen(actual_from) + 2 + strlen(relative_from_to));
+  return actual_to;
+}
+
+int
+get_executable_path(char const * argv0, char * result, ssize_t max_size)
+{
+  char * system_result = (char *) alloca (max_size);
+  ssize_t system_result_size = -1;
+  ssize_t result_size = -1;
+
+  if (system_result != NULL)
+  {
+#if defined(IMPLEMENT_SYS_GET_EXECUTABLE_PATH)
+#if defined(__linux__) || defined(__CYGWIN__) || defined(__MSYS__)
+    system_result_size = readlink("/proc/self/exe", system_result, max_size);
+#elif defined(__APPLE__)
+    uint32_t bufsize = (uint32_t)max_size;
+    if (_NSGetExecutablePath(system_result, &bufsize) == 0)
+    {
+      system_result_size = (ssize_t)bufsize;
+    }
+#elif defined(_WIN32)
+    unsigned long bufsize = (unsigned long)max_size;
+    system_result_size = GetModuleFileNameA(NULL, system_result, bufsize);
+    if (system_result_size == 0 || system_result_size == (ssize_t)bufsize)
+    {
+      /* Error, possibly not enough space. */
+      system_result_size = -1;
+    }
+    else
+    {
+      /* Early conversion to unix slashes instead of more changes
+         everywhere else .. */
+      char * winslash;
+      system_result[system_result_size] = '\0';
+      while ((winslash = strchr (system_result, '\\')) != NULL)
+      {
+        *winslash = '/';
+      }
+    }
+#else
+#warning "Don't know how to get executable path on this system"
+#endif
+#endif /* defined(IMPLEMENT_SYS_GET_EXECUTABLE_PATH) */
+  }
+  /* Use argv0 as a default in-case of failure */
+  if (system_result_size != -1)
+  {
+    strncpy (result, system_result, system_result_size);
+    result[system_result_size] = '\0';
+  }
+  else
+  {
+    if (argv0 != NULL)
+    {
+      strncpy (result, argv0, max_size);
+      result[max_size-1] = '\0';
+    }
+    else
+    {
+      result[0] = '\0';
+    }
+  }
+  result_size = strlen (result);
+  return result_size;
+}
+
+char const *
+strip_n_prefix_folders(char const * path, size_t n)
+{
+  if (path == NULL)
+  {
+    return NULL;
+  }
+
+  if (path[0] != '/')
+  {
+    return path;
+  }
+
+  char const * last = path;
+  while (n-- && path != NULL)
+  {
+    last = path;
+    path = strchr (path + 1, '/');
+  }
+  return (path == NULL) ? last : path;
+}
+
+void
+strip_n_suffix_folders(char * path, size_t n)
+{
+  if (path == NULL)
+  {
+    return;
+  }
+  while (n--)
+  {
+    if (strrchr (path + 1, '/'))
+    {
+      *strrchr (path + 1, '/') = '\0';
+    }
+    else
+    {
+      return;
+    }
+  }
+  return;
+}
+
+size_t
+split_path_list(char const * path_list, char split_char, char *** arr)
+{
+  size_t path_count;
+  size_t path_list_size;
+  char const * path_list_p;
+
+  path_list_p = path_list;
+  if (path_list == NULL || path_list[0] == '\0')
+  {
+    return 0;
+  }
+  path_list_size = strlen (path_list);
+
+  path_count = 0;
+  do
+  {
+    ++path_count;
+    ++path_list_p;
+  }
+  while ((path_list_p = strchr (path_list_p, split_char)) != NULL);
+
+  /* allocate everything in one go. */
+  char * all_memory = (char *) malloc (sizeof (char *) * path_count + strlen(path_list) + 1);
+  if (all_memory == NULL)
+    return 0;
+  *arr = (char **)all_memory;
+  all_memory += sizeof (char *) * path_count;
+
+  path_count = 0;
+  path_list_p = path_list;
+  char const * next_path_list_p = 0;
+  do
+  {
+    next_path_list_p = strchr (path_list_p, split_char);
+    if (next_path_list_p != NULL)
+    {
+      ++next_path_list_p;
+    }
+    size_t this_size = (next_path_list_p != NULL)
+                       ? next_path_list_p - path_list_p - 1
+                       : &path_list[path_list_size] - path_list_p;
+    memcpy (all_memory, path_list_p, this_size);
+    all_memory[this_size] = '\0';
+    (*arr)[path_count++] = all_memory;
+    all_memory += this_size + 1;
+  } while ((path_list_p = next_path_list_p) != NULL);
+
+  return path_count;
+}
+
+char *
+get_relocated_path_list(char const * from, char const * to_path_list)
+{
+  char exe_path[MAX_PATH];
+  char * temp;
+  get_executable_path (NULL, &exe_path[0], sizeof (exe_path) / sizeof (exe_path[0]));
+  if ((temp = strrchr (exe_path, '/')) != NULL)
+  {
+    temp[1] = '\0';
+  }
+
+  char **arr = NULL;
+  /* Ask Alexey why he added this. Are we not 100% sure
+     that we're dealing with unix paths here? */
+  char split_char = ':';
+  if (strchr (to_path_list, ';'))
+  {
+    split_char = ';';
+  }
+  size_t count = split_path_list (to_path_list, split_char, &arr);
+  int result_size = 1 + (count - 1); /* count - 1 is for ; delim. */
+  size_t exe_path_size = strlen (exe_path);
+  size_t i;
+  /* Space required is:
+     count * (exe_path_size + strlen (rel_to_datadir))
+     rel_to_datadir upper bound is:
+     (count * strlen (from)) + (3 * num_slashes (from))
+     + strlen(arr[i]) + 1.
+     .. pathalogically num_slashes (from) is strlen (from)
+     (from = ////////) */
+  size_t space_required = (count * (exe_path_size + 4 * strlen (from))) + count - 1;
+  for (i = 0; i < count; ++i)
+  {
+    space_required += strlen (arr[i]);
+  }
+  char * scratch = (char *) alloca (space_required);
+  if (scratch == NULL)
+    return NULL;
+  for (i = 0; i < count; ++i)
+  {
+    char * rel_to_datadir = get_relative_path (from, arr[i]);
+    scratch[0] = '\0';
+    arr[i] = scratch;
+    strcat (scratch, exe_path);
+    strcat (scratch, rel_to_datadir);
+    simplify_path (arr[i]);
+    size_t arr_i_size = strlen (arr[i]);
+    result_size += arr_i_size;
+    scratch = arr[i] + arr_i_size + 1;
+  }
+  char * result = (char *) malloc (result_size);
+  if (result == NULL)
+  {
+    return NULL;
+  }
+  result[0] = '\0';
+  for (i = 0; i < count; ++i)
+  {
+    strcat (result, arr[i]);
+    if (i != count-1)
+    {
+#if defined(_WIN32)
+      strcat (result, ";");
+#else
+      strcat (result, ":");
+#endif
+    }
+  }
+  free ((void*)arr);
+  return result;
+}
+
+char *
+single_path_relocation(const char *from, const char *to)
+{
+#if defined(__MINGW32__)
+  char exe_path[PATH_MAX];
+  get_executable_path (NULL, &exe_path[0], sizeof(exe_path)/sizeof(exe_path[0]));
+  if (strrchr (exe_path, '/') != NULL)
+  {
+     strrchr (exe_path, '/')[1] = '\0';
+  }
+  char * rel_to_datadir = get_relative_path (from, to);
+  strcat (exe_path, rel_to_datadir);
+  simplify_path (&exe_path[0]);
+  return malloc_copy_string(exe_path);
+#else
+  return malloc_copy_string(to);
+#endif
+}
+
+char *
+pathlist_relocation(const char *from_path, const char *to_path_list)
+{
+#if defined(__MINGW32__)
+  static char stored_path[PATH_MAX];
+  static int stored = 0;
+  if (stored == 0)
+  {
+    char const * relocated = get_relocated_path_list(from_path, to_path_list);
+    strncpy (stored_path, relocated, PATH_MAX);
+    stored_path[PATH_MAX-1] = '\0';
+    free ((void *)relocated);
+    stored = 1;
+  }
+  return stored_path;
+#else
+  return (to_path_list);
+#endif
+}
diff -Naur GraphicsMagick-1.3.20-orig/magick/pathtools.h GraphicsMagick-1.3.20/magick/pathtools.h
--- GraphicsMagick-1.3.20-orig/magick/pathtools.h	1970-01-01 03:00:00.000000000 +0300
+++ GraphicsMagick-1.3.20/magick/pathtools.h	1970-01-01 03:00:00.000000000 +0300
@@ -0,0 +1,52 @@
+/*
+      .Some useful path tools.
+        .ASCII only for now.
+   .Written by Ray Donnelly in 2014.
+   .Licensed under CC0 (and anything.
+  .else you need to license it under).
+      .No warranties whatsoever.
+  .email: <mingw.android@gmail.com>.
+ */
+
+#ifndef PATHTOOLS_H
+#define PATHTOOLS_H
+
+#include <unistd.h>
+#if defined(__APPLE__)
+#include <stdlib.h>
+#else
+#include <malloc.h>
+#endif
+#include <stdio.h>
+
+char * malloc_copy_string(char const * original);
+
+/* In-place replaces any '\' with '/' and any '//' with '/' */
+void sanitise_path(char * path);
+
+/* Uses a host OS specific function to determine the path of the executable,
+   if IMPLEMENT_SYS_GET_EXECUTABLE_PATH is defined, otherwise uses argv0. */
+int get_executable_path(char const * argv0, char * result, ssize_t max_size);
+
+/* Where possible, in-place removes occourances of '.' and 'path/..' */
+void simplify_path(char * path);
+
+/* Allocates (via malloc) and returns the path to get from from to to. */
+char * get_relative_path(char const * from, char const * to);
+
+size_t split_path_list(char const * path_list, char split_char, char *** arr);
+
+/* Advances path along by the amount that removes n prefix folders. */
+char const *
+strip_n_prefix_folders(char const * path, size_t n);
+
+/* NULL terminates path to remove n suffix folders. */
+void
+strip_n_suffix_folders(char * path, size_t n);
+
+char * get_relocated_path_list(char const * from, char const * to_path_list);
+
+char * single_path_relocation(const char *from, const char *to);
+char * pathlist_relocation(const char *from_path, const char *to_path_list);
+
+#endif /* PATHTOOLS_H */
diff -Naur GraphicsMagick-1.3.20-orig/magick/studio.h GraphicsMagick-1.3.20/magick/studio.h
--- GraphicsMagick-1.3.20-orig/magick/studio.h	2014-08-17 00:33:24.000000000 +0400
+++ GraphicsMagick-1.3.20/magick/studio.h	2014-10-06 22:31:24.655800000 +0400
@@ -316,7 +316,11 @@
 #endif
 
 #if defined(MSWINDOWS)
-#  define DirectorySeparator  "\\"
+#  if defined (__MINGW32__)
+#    define DirectorySeparator  "/"
+#  else
+#    define DirectorySeparator  "\\"
+#  endif
 #  define DirectoryListSeparator  ';'
 #  define EditorOptions ""
 #  define IsBasenameSeparator(c)  (((c) == '/') || ((c) == '\\'))
diff -Naur GraphicsMagick-1.3.20-orig/winpath.sh GraphicsMagick-1.3.20/winpath.sh
--- GraphicsMagick-1.3.20-orig/winpath.sh	2013-03-10 03:19:10.000000000 +0400
+++ GraphicsMagick-1.3.20/winpath.sh	2014-10-06 22:09:43.153600000 +0400
@@ -15,56 +15,4 @@
 #
 # Written by Bob Friesenhahn <bfriesen@simple.dallas.tx.us> June 2002
 #
-arg="$1"
-escapes=0
-if test -n "$2"
-then
-  escapes="$2"
-fi
-if test $escapes -gt 3
-then
-  echo "$0: escape level must in range 0 - 3"
-  exit 1
-fi
-result=''
-length=0
-max_length=0
-mount | sed -e 's:\\:/:g'  | (
-  IFS="\n"
-  while read mount_entry
-  do
-    win_mount_path=`echo "$mount_entry" | sed -e 's: .*::g'`
-    unix_mount_path=`echo "$mount_entry" | sed -e 's:.* on ::;s: type .*::'`
-    temp=`echo "$arg" | sed -e "s!^$unix_mount_path!$win_mount_path!"`
-    if test "$temp" != "$arg"
-    then
-      candidate="$temp"
-      length=${#unix_mount_path}
-      if test $length -gt $max_length
-      then
-        result=$candidate
-        max_length=$length
-      fi
-    fi
-  done
-  if test -z "$result"
-  then
-    echo "$0: path \"$arg\" is not mounted"
-    exit 1
-  fi
-  case $escapes in
-    0)
-     echo "$result" | sed -e 's:/:\\:g'
-     ;;
-    1)
-     echo "$result" | sed -e 's:/:\\\\:g'
-     ;;
-    2)
-     echo "$result" | sed -e 's:/:\\\\\\\\:g'
-     ;;
-    3)
-     echo "$result" | sed -e 's:/:\\\\\\\\\\\\\\\\:g'
-     ;;
-  esac
-  exit 0;
- )
+echo "$1"
