Grant independence to SkBaseMutex on Windows.

Under POSIX, class SkMutex inherits from struct SkBaseMutex.
Since we can't have a POD mutex on Windows, we used to just
typedef SkMutex SkBaseMutex there. However, that makes it
impossible to forward-declare SkBaseMutex consistently across
platforms. With this CL we declare an empty struct SkBaseMutex
on Windows, which should have 0 cost but make the compiler happy.

R=bungeman@google.com, mtklein@google.com, tomhudson@google.com, bungeman, mtklein
BUG=skia:

Author: tomhudson@chromium.org

Review URL: https://codereview.chromium.org/364473002
diff --git a/src/ports/SkMutex_win.h b/src/ports/SkMutex_win.h
index d12fd03..d84b0e4 100644
--- a/src/ports/SkMutex_win.h
+++ b/src/ports/SkMutex_win.h
@@ -31,15 +31,17 @@
 #endif
 
 // On Windows, SkBaseMutex and SkMutex are the same thing,
-// we can't easily get rid of static initializers.
-class SkMutex {
+// we can't easily get rid of static initializers. However,
+// we preserve the same inheritance pattern as other platforms
+// so that we can forward-declare cleanly.
+struct SkBaseMutex {
 public:
-    SkMutex() {
+    SkBaseMutex() {
         InitializeCriticalSection(&fStorage);
         SkDEBUGCODE(fOwner = 0;)
     }
 
-    ~SkMutex() {
+    ~SkBaseMutex() {
         SkASSERT(0 == fOwner);
         DeleteCriticalSection(&fStorage);
     }
@@ -59,15 +61,16 @@
         SkASSERT(GetCurrentThreadId() == fOwner);
     }
 
-private:
-    SkMutex(const SkMutex&);
-    SkMutex& operator=(const SkMutex&);
-
+protected:
     CRITICAL_SECTION fStorage;
     SkDEBUGCODE(DWORD fOwner;)
+
+private:
+    SkBaseMutex(const SkBaseMutex&);
+    SkBaseMutex& operator=(const SkBaseMutex&);
 };
 
-typedef SkMutex SkBaseMutex;
+class SkMutex : public SkBaseMutex { };
 
 // Windows currently provides no documented means of POD initializing a CRITICAL_SECTION.
 #define SK_DECLARE_STATIC_MUTEX(name) static SkBaseMutex name