--- ./src/hb-atomic.hh~0	2019-04-04 16:12:19.000000000 +0300
+++ ./src/hb-atomic.hh	2019-05-10 11:35:03.529125000 +0300
@@ -106,7 +106,9 @@ _hb_atomic_ptr_impl_cmplexch (const void
 
 static inline void _hb_memory_barrier ()
 {
-#if !defined(MemoryBarrier)
+  // mingw.org's MinGW defines MemoryBarrier as an inline function,
+  // not a macro.
+#if !defined(MemoryBarrier) && !defined(__MINGW32_VERSION)
   /* MinGW has a convoluted history of supporting MemoryBarrier. */
   LONG dummy = 0;
   InterlockedExchange (&dummy, 1);
--- ./src/hb-dsalgs.hh~0	2019-04-04 16:12:19.000000000 +0300
+++ ./src/hb-dsalgs.hh	2019-05-10 11:42:29.419750000 +0300
@@ -99,7 +99,8 @@ hb_bit_storage (T v)
     return sizeof (unsigned long long) * 8 - __builtin_clzll (v);
 #endif
 
-#if (defined(_MSC_VER) && _MSC_VER >= 1500) || defined(__MINGW32__)
+#if (defined(_MSC_VER) && _MSC_VER >= 1500) \
+  || (defined(__MINGW32__) && (__GNUC__ < 4))
   if (sizeof (T) <= sizeof (unsigned int))
   {
     unsigned long where;
@@ -173,7 +174,8 @@ hb_ctz (T v)
     return __builtin_ctzll (v);
 #endif
 
-#if (defined(_MSC_VER) && _MSC_VER >= 1500) || defined(__MINGW32__)
+#if (defined(_MSC_VER) && _MSC_VER >= 1500) \
+  || (defined(__MINGW32__) && (__GNUC__ < 4))
   if (sizeof (T) <= sizeof (unsigned int))
   {
     unsigned long where;
--- ./src/hb-uniscribe.cc~0	2019-04-04 16:12:19.000000000 +0300
+++ ./src/hb-uniscribe.cc	2019-05-10 11:36:40.982250000 +0300
@@ -31,6 +31,9 @@
 #include <usp10.h>
 #include <rpc.h>
 
+#ifndef E_NOT_SUFFICIENT_BUFFER
+#define E_NOT_SUFFICIENT_BUFFER HRESULT_FROM_WIN32 (ERROR_INSUFFICIENT_BUFFER)
+#endif
 #include "hb-uniscribe.h"
 
 #include "hb-open-file.hh"
--- ./src/hb.hh~0	2019-04-04 16:12:19.000000000 +0300
+++ ./src/hb.hh	2019-05-10 11:28:01.872875000 +0300
@@ -178,7 +178,14 @@
 #include <stdarg.h>
 
 #if (defined(_MSC_VER) && _MSC_VER >= 1500) || defined(__MINGW32__)
-#include <intrin.h>
+# ifdef __MINGW32_VERSION	// mingw.org's MinGW
+#  ifndef WIN32_LEAN_AND_MEAN
+#   define WIN32_LEAN_AND_MEAN 1
+#  endif
+#  include <windows.h>
+# else	// !mingw.org's MinGW || !__MINGW32__
+#  include <intrin.h>
+# endif	 // !mingw.org's MinGW || !__MINGW32__
 #endif
 
 #define HB_PASTE1(a,b) a##b
