rm SkPreConfig.h and SkPostConfig.h

We treat them as part of SkTypes.h, so let's just merge them in?

Change-Id: Icd6db3913a679ceb9de09027d17eb9361754b016
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/268769
Commit-Queue: Mike Klein <mtklein@google.com>
Reviewed-by: Mike Reed <reed@google.com>
diff --git a/gn/core.gni b/gn/core.gni
index fe3a2cf..923890e 100644
--- a/gn/core.gni
+++ b/gn/core.gni
@@ -65,8 +65,6 @@
   "$_include/core/SkPngChunkReader.h",
   "$_include/core/SkPoint.h",
   "$_include/core/SkPoint3.h",
-  "$_include/core/SkPostConfig.h",
-  "$_include/core/SkPreConfig.h",
   "$_include/core/SkPromiseImageTexture.h",
   "$_include/core/SkRRect.h",
   "$_include/core/SkRSXform.h",
diff --git a/gn/gn_to_bp.py b/gn/gn_to_bp.py
index e649b4b..2d6e38d 100755
--- a/gn/gn_to_bp.py
+++ b/gn/gn_to_bp.py
@@ -464,7 +464,7 @@
   gn_to_bp_utils.WriteUserConfig(config_path, defines)
   append_to_file(config_path, '''
 // Correct SK_BUILD_FOR flags that may have been set by
-// SkPreConfig.h/Android.bp
+// SkTypes.h/Android.bp
 #ifndef SK_BUILD_FOR_%s
     #define SK_BUILD_FOR_%s
 #endif
diff --git a/include/config/SkUserConfig.h b/include/config/SkUserConfig.h
index 928a49a..b06ac33 100644
--- a/include/config/SkUserConfig.h
+++ b/include/config/SkUserConfig.h
@@ -10,19 +10,9 @@
 #ifndef SkUserConfig_DEFINED
 #define SkUserConfig_DEFINED
 
-/*  SkTypes.h, the root of the public header files, includes SkPreConfig.h,
-    then SkUserConfig.h, then SkPostConfig.h.
-
-    SkPreConfig.h runs first, and it is responsible for initializing certain
-    skia defines.
-
-    SkPostConfig.h runs last, and its job is to just check that the final
-    defines are consistent (i.e. that we don't have mutually conflicting
-    defines).
-
-    SkUserConfig.h (this file) runs in the middle. It gets to change or augment
-    the list of flags initially set in preconfig, and then postconfig checks
-    that everything still makes sense.
+/*  SkTypes.h, the root of the public header files, includes this file
+    SkUserConfig.h after first initializing certain Skia defines, letting
+    this file change or augment those flags.
 
     Below are optional defines that add, subtract, or change default behavior
     in Skia. Your port can locally edit this file to enable/disable flags as
@@ -39,7 +29,7 @@
     each 32bit pixel is in premultiplied form). This code can be very useful
     during development, but will slow things down in a shipping product.
 
-    By default, these mutually exclusive flags are defined in SkPreConfig.h,
+    By default, these mutually exclusive flags are defined in SkTypes.h,
     based on the presence or absence of NDEBUG, but that decision can be changed
     here.
  */
diff --git a/include/core/SkPostConfig.h b/include/core/SkPostConfig.h
deleted file mode 100644
index d9d57a9..0000000
--- a/include/core/SkPostConfig.h
+++ /dev/null
@@ -1,261 +0,0 @@
-/*
- * Copyright 2006 The Android Open Source Project
- *
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-// IWYU pragma: private, include "SkTypes.h"
-
-#ifndef SkPostConfig_DEFINED
-#define SkPostConfig_DEFINED
-
-#if !defined(SK_DEBUG) && !defined(SK_RELEASE)
-    #ifdef NDEBUG
-        #define SK_RELEASE
-    #else
-        #define SK_DEBUG
-    #endif
-#endif
-
-#if defined(SK_DEBUG) && defined(SK_RELEASE)
-#  error "cannot define both SK_DEBUG and SK_RELEASE"
-#elif !defined(SK_DEBUG) && !defined(SK_RELEASE)
-#  error "must define either SK_DEBUG or SK_RELEASE"
-#endif
-
-#if defined(SK_CPU_LENDIAN) && defined(SK_CPU_BENDIAN)
-#  error "cannot define both SK_CPU_LENDIAN and SK_CPU_BENDIAN"
-#elif !defined(SK_CPU_LENDIAN) && !defined(SK_CPU_BENDIAN)
-#  error "must define either SK_CPU_LENDIAN or SK_CPU_BENDIAN"
-#endif
-
-#if defined(SK_CPU_BENDIAN) && !defined(I_ACKNOWLEDGE_SKIA_DOES_NOT_SUPPORT_BIG_ENDIAN)
-    #error "The Skia team is not endian-savvy enough to support big-endian CPUs."
-    #error "If you still want to use Skia,"
-    #error "please define I_ACKNOWLEDGE_SKIA_DOES_NOT_SUPPORT_BIG_ENDIAN."
-#endif
-
-#if !defined(SK_ATTRIBUTE)
-#  if defined(__clang__) || defined(__GNUC__)
-#    define SK_ATTRIBUTE(attr) __attribute__((attr))
-#  else
-#    define SK_ATTRIBUTE(attr)
-#  endif
-#endif
-
-#if !defined(SK_SUPPORT_GPU)
-#  define SK_SUPPORT_GPU 1
-#endif
-
-/**
- * If GPU is enabled but no GPU backends are enabled then enable GL by default.
- * Traditionally clients have relied on Skia always building with the GL backend
- * and opting in to additional backends. TODO: Require explicit opt in for GL.
- */
-#if SK_SUPPORT_GPU
-#  if !defined(SK_GL) && !defined(SK_VULKAN) && !defined(SK_METAL)
-#    define SK_GL
-#  endif
-#endif
-
-#if !defined(SK_SUPPORT_ATLAS_TEXT)
-#  define SK_SUPPORT_ATLAS_TEXT 0
-#elif SK_SUPPORT_ATLAS_TEXT && !SK_SUPPORT_GPU
-#  error "SK_SUPPORT_ATLAS_TEXT requires SK_SUPPORT_GPU"
-#endif
-
-#if !defined(SkUNREACHABLE)
-#  if defined(_MSC_VER) && !defined(__clang__)
-#    define SkUNREACHABLE __assume(false)
-#  else
-#    define SkUNREACHABLE __builtin_unreachable()
-#  endif
-#endif
-
-///////////////////////////////////////////////////////////////////////////////
-
-#if defined(SK_BUILD_FOR_GOOGLE3)
-    void SkDebugfForDumpStackTrace(const char* data, void* unused);
-    void DumpStackTrace(int skip_count, void w(const char*, void*), void* arg);
-#  define SK_DUMP_GOOGLE3_STACK() DumpStackTrace(0, SkDebugfForDumpStackTrace, nullptr)
-#else
-#  define SK_DUMP_GOOGLE3_STACK()
-#endif
-
-#ifdef SK_BUILD_FOR_WIN
-// permits visual studio to follow error back to source
-#define SK_DUMP_LINE_FORMAT(message) \
-    SkDebugf("%s(%d): fatal error: \"%s\"\n", __FILE__, __LINE__, message)
-#else
-#define SK_DUMP_LINE_FORMAT(message) \
-    SkDebugf("%s:%d: fatal error: \"%s\"\n", __FILE__, __LINE__, message)
-#endif
-
-#ifndef SK_ABORT
-#  define SK_ABORT(message) \
-    do { \
-       SK_DUMP_LINE_FORMAT(message); \
-       SK_DUMP_GOOGLE3_STACK(); \
-       sk_abort_no_print(); \
-       SkUNREACHABLE; \
-    } while (false)
-#endif
-
-// If SK_R32_SHIFT is set, we'll use that to choose RGBA or BGRA.
-// If not, we'll default to RGBA everywhere except BGRA on Windows.
-#if defined(SK_R32_SHIFT)
-    static_assert(SK_R32_SHIFT == 0 || SK_R32_SHIFT == 16, "");
-#elif defined(SK_BUILD_FOR_WIN)
-    #define SK_R32_SHIFT 16
-#else
-    #define SK_R32_SHIFT 0
-#endif
-
-#if defined(SK_B32_SHIFT)
-    static_assert(SK_B32_SHIFT == (16-SK_R32_SHIFT), "");
-#else
-    #define SK_B32_SHIFT (16-SK_R32_SHIFT)
-#endif
-
-#define SK_G32_SHIFT 8
-#define SK_A32_SHIFT 24
-
-
-/**
- * SK_PMCOLOR_BYTE_ORDER can be used to query the byte order of SkPMColor at compile time. The
- * relationship between the byte order and shift values depends on machine endianness. If the shift
- * order is R=0, G=8, B=16, A=24 then ((char*)&pmcolor)[0] will produce the R channel on a little
- * endian machine and the A channel on a big endian machine. Thus, given those shifts values,
- * SK_PMCOLOR_BYTE_ORDER(R,G,B,A) will be true on a little endian machine and
- * SK_PMCOLOR_BYTE_ORDER(A,B,G,R) will be true on a big endian machine.
- */
-#ifdef SK_CPU_BENDIAN
-#  define SK_PMCOLOR_BYTE_ORDER(C0, C1, C2, C3)     \
-        (SK_ ## C3 ## 32_SHIFT == 0  &&             \
-         SK_ ## C2 ## 32_SHIFT == 8  &&             \
-         SK_ ## C1 ## 32_SHIFT == 16 &&             \
-         SK_ ## C0 ## 32_SHIFT == 24)
-#else
-#  define SK_PMCOLOR_BYTE_ORDER(C0, C1, C2, C3)     \
-        (SK_ ## C0 ## 32_SHIFT == 0  &&             \
-         SK_ ## C1 ## 32_SHIFT == 8  &&             \
-         SK_ ## C2 ## 32_SHIFT == 16 &&             \
-         SK_ ## C3 ## 32_SHIFT == 24)
-#endif
-
-//////////////////////////////////////////////////////////////////////////////////////////////
-
-#if defined SK_DEBUG && defined SK_BUILD_FOR_WIN
-    #ifdef free
-        #undef free
-    #endif
-    #include <crtdbg.h>
-    #undef free
-#endif
-
-//////////////////////////////////////////////////////////////////////
-
-#if !defined(SK_UNUSED)
-#  if !defined(__clang__) && defined(_MSC_VER)
-#    define SK_UNUSED __pragma(warning(suppress:4189))
-#  else
-#    define SK_UNUSED SK_ATTRIBUTE(unused)
-#  endif
-#endif
-
-/**
- * If your judgment is better than the compiler's (i.e. you've profiled it),
- * you can use SK_ALWAYS_INLINE to force inlining. E.g.
- *     inline void someMethod() { ... }             // may not be inlined
- *     SK_ALWAYS_INLINE void someMethod() { ... }   // should always be inlined
- */
-#if !defined(SK_ALWAYS_INLINE)
-#  if defined(SK_BUILD_FOR_WIN)
-#    define SK_ALWAYS_INLINE __forceinline
-#  else
-#    define SK_ALWAYS_INLINE SK_ATTRIBUTE(always_inline) inline
-#  endif
-#endif
-
-/**
- * If your judgment is better than the compiler's (i.e. you've profiled it),
- * you can use SK_NEVER_INLINE to prevent inlining.
- */
-#if !defined(SK_NEVER_INLINE)
-#  if defined(SK_BUILD_FOR_WIN)
-#    define SK_NEVER_INLINE __declspec(noinline)
-#  else
-#    define SK_NEVER_INLINE SK_ATTRIBUTE(noinline)
-#  endif
-#endif
-
-//////////////////////////////////////////////////////////////////////
-
-#if SK_CPU_SSE_LEVEL >= SK_CPU_SSE_LEVEL_SSE1
-    #define SK_PREFETCH(ptr) _mm_prefetch(reinterpret_cast<const char*>(ptr), _MM_HINT_T0)
-#elif defined(__GNUC__)
-    #define SK_PREFETCH(ptr) __builtin_prefetch(ptr)
-#else
-    #define SK_PREFETCH(ptr)
-#endif
-
-//////////////////////////////////////////////////////////////////////
-
-#ifndef SK_PRINTF_LIKE
-#  if defined(__clang__) || defined(__GNUC__)
-#    define SK_PRINTF_LIKE(A, B) __attribute__((format(printf, (A), (B))))
-#  else
-#    define SK_PRINTF_LIKE(A, B)
-#  endif
-#endif
-
-//////////////////////////////////////////////////////////////////////
-
-#ifndef SK_SIZE_T_SPECIFIER
-#  if defined(_MSC_VER) && !defined(__clang__)
-#    define SK_SIZE_T_SPECIFIER "%Iu"
-#  else
-#    define SK_SIZE_T_SPECIFIER "%zu"
-#  endif
-#endif
-
-//////////////////////////////////////////////////////////////////////
-
-#ifndef SK_ALLOW_STATIC_GLOBAL_INITIALIZERS
-    #define SK_ALLOW_STATIC_GLOBAL_INITIALIZERS 0
-#endif
-
-//////////////////////////////////////////////////////////////////////
-
-#if !defined(SK_GAMMA_EXPONENT)
-    #define SK_GAMMA_EXPONENT (0.0f)  // SRGB
-#endif
-
-//////////////////////////////////////////////////////////////////////
-
-#ifndef GR_TEST_UTILS
-#  define GR_TEST_UTILS 0
-#endif
-
-//////////////////////////////////////////////////////////////////////
-
-#if defined(SK_HISTOGRAM_ENUMERATION) && defined(SK_HISTOGRAM_BOOLEAN)
-#  define SK_HISTOGRAMS_ENABLED 1
-#else
-#  define SK_HISTOGRAMS_ENABLED 0
-#endif
-
-#ifndef SK_HISTOGRAM_BOOLEAN
-#  define SK_HISTOGRAM_BOOLEAN(name, value)
-#endif
-
-#ifndef SK_HISTOGRAM_ENUMERATION
-#  define SK_HISTOGRAM_ENUMERATION(name, value, boundary_value)
-#endif
-
-#ifndef SK_DISABLE_LEGACY_SHADERCONTEXT
-#define SK_ENABLE_LEGACY_SHADERCONTEXT
-#endif
-
-#endif // SkPostConfig_DEFINED
diff --git a/include/core/SkPreConfig.h b/include/core/SkPreConfig.h
deleted file mode 100644
index d9c96ac..0000000
--- a/include/core/SkPreConfig.h
+++ /dev/null
@@ -1,205 +0,0 @@
-/*
- * Copyright 2006 The Android Open Source Project
- *
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-// IWYU pragma: private, include "SkTypes.h"
-
-#ifndef SkPreConfig_DEFINED
-#define SkPreConfig_DEFINED
-
-// Allows embedders that want to disable macros that take arguments to just
-// define that symbol to be one of these
-#define SK_NOTHING_ARG1(arg1)
-#define SK_NOTHING_ARG2(arg1, arg2)
-#define SK_NOTHING_ARG3(arg1, arg2, arg3)
-
-//////////////////////////////////////////////////////////////////////
-
-#if !defined(SK_BUILD_FOR_ANDROID) && !defined(SK_BUILD_FOR_IOS) && !defined(SK_BUILD_FOR_WIN) && \
-    !defined(SK_BUILD_FOR_UNIX) && !defined(SK_BUILD_FOR_MAC)
-
-    #ifdef __APPLE__
-        #include "TargetConditionals.h"
-    #endif
-
-    #if defined(_WIN32) || defined(__SYMBIAN32__)
-        #define SK_BUILD_FOR_WIN
-    #elif defined(ANDROID) || defined(__ANDROID__)
-        #define SK_BUILD_FOR_ANDROID
-    #elif defined(linux) || defined(__linux) || defined(__FreeBSD__) || \
-          defined(__OpenBSD__) || defined(__sun) || defined(__NetBSD__) || \
-          defined(__DragonFly__) || defined(__Fuchsia__) || \
-          defined(__GLIBC__) || defined(__GNU__) || defined(__unix__)
-        #define SK_BUILD_FOR_UNIX
-    #elif TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR
-        #define SK_BUILD_FOR_IOS
-    #else
-        #define SK_BUILD_FOR_MAC
-    #endif
-
-#endif
-
-//////////////////////////////////////////////////////////////////////
-
-#if defined(SK_BUILD_FOR_WIN) && !defined(__clang__)
-    #if !defined(SK_RESTRICT)
-        #define SK_RESTRICT __restrict
-    #endif
-    #if !defined(SK_WARN_UNUSED_RESULT)
-        #define SK_WARN_UNUSED_RESULT
-    #endif
-#endif
-
-#if !defined(SK_RESTRICT)
-    #define SK_RESTRICT __restrict__
-#endif
-
-#if !defined(SK_WARN_UNUSED_RESULT)
-    #define SK_WARN_UNUSED_RESULT __attribute__((warn_unused_result))
-#endif
-
-//////////////////////////////////////////////////////////////////////
-
-#if !defined(SK_CPU_BENDIAN) && !defined(SK_CPU_LENDIAN)
-    #if defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
-        #define SK_CPU_BENDIAN
-    #elif defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
-        #define SK_CPU_LENDIAN
-    #elif defined(__sparc) || defined(__sparc__) || \
-      defined(_POWER) || defined(__powerpc__) || \
-      defined(__ppc__) || defined(__hppa) || \
-      defined(__PPC__) || defined(__PPC64__) || \
-      defined(_MIPSEB) || defined(__ARMEB__) || \
-      defined(__s390__) || \
-      (defined(__sh__) && defined(__BIG_ENDIAN__)) || \
-      (defined(__ia64) && defined(__BIG_ENDIAN__))
-         #define SK_CPU_BENDIAN
-    #else
-        #define SK_CPU_LENDIAN
-    #endif
-#endif
-
-//////////////////////////////////////////////////////////////////////
-
-#if defined(__i386) || defined(_M_IX86) ||  defined(__x86_64__) || defined(_M_X64)
-  #define SK_CPU_X86 1
-#endif
-
-/**
- *  SK_CPU_SSE_LEVEL
- *
- *  If defined, SK_CPU_SSE_LEVEL should be set to the highest supported level.
- *  On non-intel CPU this should be undefined.
- */
-
-#define SK_CPU_SSE_LEVEL_SSE1     10
-#define SK_CPU_SSE_LEVEL_SSE2     20
-#define SK_CPU_SSE_LEVEL_SSE3     30
-#define SK_CPU_SSE_LEVEL_SSSE3    31
-#define SK_CPU_SSE_LEVEL_SSE41    41
-#define SK_CPU_SSE_LEVEL_SSE42    42
-#define SK_CPU_SSE_LEVEL_AVX      51
-#define SK_CPU_SSE_LEVEL_AVX2     52
-#define SK_CPU_SSE_LEVEL_AVX512   60
-
-// When targetting iOS and using gyp to generate the build files, it is not
-// possible to select files to build depending on the architecture (i.e. it
-// is not possible to use hand optimized assembly implementation). In that
-// configuration SK_BUILD_NO_OPTS is defined. Remove optimisation then.
-#ifdef SK_BUILD_NO_OPTS
-    #define SK_CPU_SSE_LEVEL 0
-#endif
-
-// Are we in GCC/Clang?
-#ifndef SK_CPU_SSE_LEVEL
-    // These checks must be done in descending order to ensure we set the highest
-    // available SSE level.
-    #if defined(__AVX512F__)
-        #define SK_CPU_SSE_LEVEL    SK_CPU_SSE_LEVEL_AVX512
-    #elif defined(__AVX2__)
-        #define SK_CPU_SSE_LEVEL    SK_CPU_SSE_LEVEL_AVX2
-    #elif defined(__AVX__)
-        #define SK_CPU_SSE_LEVEL    SK_CPU_SSE_LEVEL_AVX
-    #elif defined(__SSE4_2__)
-        #define SK_CPU_SSE_LEVEL    SK_CPU_SSE_LEVEL_SSE42
-    #elif defined(__SSE4_1__)
-        #define SK_CPU_SSE_LEVEL    SK_CPU_SSE_LEVEL_SSE41
-    #elif defined(__SSSE3__)
-        #define SK_CPU_SSE_LEVEL    SK_CPU_SSE_LEVEL_SSSE3
-    #elif defined(__SSE3__)
-        #define SK_CPU_SSE_LEVEL    SK_CPU_SSE_LEVEL_SSE3
-    #elif defined(__SSE2__)
-        #define SK_CPU_SSE_LEVEL    SK_CPU_SSE_LEVEL_SSE2
-    #endif
-#endif
-
-// Are we in VisualStudio?
-#ifndef SK_CPU_SSE_LEVEL
-    // These checks must be done in descending order to ensure we set the highest
-    // available SSE level. 64-bit intel guarantees at least SSE2 support.
-    #if defined(__AVX2__)
-        #define SK_CPU_SSE_LEVEL        SK_CPU_SSE_LEVEL_AVX2
-    #elif defined(__AVX__)
-        #define SK_CPU_SSE_LEVEL        SK_CPU_SSE_LEVEL_AVX
-    #elif defined(_M_X64) || defined(_M_AMD64)
-        #define SK_CPU_SSE_LEVEL        SK_CPU_SSE_LEVEL_SSE2
-    #elif defined(_M_IX86_FP)
-        #if _M_IX86_FP >= 2
-            #define SK_CPU_SSE_LEVEL    SK_CPU_SSE_LEVEL_SSE2
-        #elif _M_IX86_FP == 1
-            #define SK_CPU_SSE_LEVEL    SK_CPU_SSE_LEVEL_SSE1
-        #endif
-    #endif
-#endif
-
-//////////////////////////////////////////////////////////////////////
-// ARM defines
-
-#if defined(__arm__) && (!defined(__APPLE__) || !TARGET_IPHONE_SIMULATOR)
-    #define SK_CPU_ARM32
-#elif defined(__aarch64__) && !defined(SK_BUILD_NO_OPTS)
-    #define SK_CPU_ARM64
-#endif
-
-// All 64-bit ARM chips have NEON.  Many 32-bit ARM chips do too.
-#if !defined(SK_ARM_HAS_NEON) && !defined(SK_BUILD_NO_OPTS) && defined(__ARM_NEON)
-    #define SK_ARM_HAS_NEON
-#endif
-
-// Really this __APPLE__ check shouldn't be necessary, but it seems that Apple's Clang defines
-// __ARM_FEATURE_CRC32 for -arch arm64, even though their chips don't support those instructions!
-#if defined(__ARM_FEATURE_CRC32) && !defined(__APPLE__)
-    #define SK_ARM_HAS_CRC32
-#endif
-
-//////////////////////////////////////////////////////////////////////
-
-#if !defined(SKIA_IMPLEMENTATION)
-    #define SKIA_IMPLEMENTATION 0
-#endif
-
-#if !defined(SK_API)
-    #if defined(SKIA_DLL)
-        #if defined(_MSC_VER)
-            #if SKIA_IMPLEMENTATION
-                #define SK_API __declspec(dllexport)
-            #else
-                #define SK_API __declspec(dllimport)
-            #endif
-        #else
-            #define SK_API __attribute__((visibility("default")))
-        #endif
-    #else
-        #define SK_API
-    #endif
-#endif
-
-// SK_SPI is functionally identical to SK_API, but used within src to clarify that it's less stable
-#if !defined(SK_SPI)
-    #define SK_SPI SK_API
-#endif
-
-#endif
diff --git a/include/core/SkTypes.h b/include/core/SkTypes.h
index 676277a..13863d5 100644
--- a/include/core/SkTypes.h
+++ b/include/core/SkTypes.h
@@ -8,20 +8,429 @@
 #ifndef SkTypes_DEFINED
 #define SkTypes_DEFINED
 
+/** \file SkTypes.h
+*/
+
+// Pre-SkUserConfig.h setup.
+
+// Allows embedders that want to disable macros that take arguments to just
+// define that symbol to be one of these
+#define SK_NOTHING_ARG1(arg1)
+#define SK_NOTHING_ARG2(arg1, arg2)
+#define SK_NOTHING_ARG3(arg1, arg2, arg3)
+
+#if !defined(SK_BUILD_FOR_ANDROID) && !defined(SK_BUILD_FOR_IOS) && !defined(SK_BUILD_FOR_WIN) && \
+    !defined(SK_BUILD_FOR_UNIX) && !defined(SK_BUILD_FOR_MAC)
+
+    #ifdef __APPLE__
+        #include "TargetConditionals.h"
+    #endif
+
+    #if defined(_WIN32) || defined(__SYMBIAN32__)
+        #define SK_BUILD_FOR_WIN
+    #elif defined(ANDROID) || defined(__ANDROID__)
+        #define SK_BUILD_FOR_ANDROID
+    #elif defined(linux) || defined(__linux) || defined(__FreeBSD__) || \
+          defined(__OpenBSD__) || defined(__sun) || defined(__NetBSD__) || \
+          defined(__DragonFly__) || defined(__Fuchsia__) || \
+          defined(__GLIBC__) || defined(__GNU__) || defined(__unix__)
+        #define SK_BUILD_FOR_UNIX
+    #elif TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR
+        #define SK_BUILD_FOR_IOS
+    #else
+        #define SK_BUILD_FOR_MAC
+    #endif
+
+#endif
+
+#if defined(SK_BUILD_FOR_WIN) && !defined(__clang__)
+    #if !defined(SK_RESTRICT)
+        #define SK_RESTRICT __restrict
+    #endif
+    #if !defined(SK_WARN_UNUSED_RESULT)
+        #define SK_WARN_UNUSED_RESULT
+    #endif
+#endif
+
+#if !defined(SK_RESTRICT)
+    #define SK_RESTRICT __restrict__
+#endif
+
+#if !defined(SK_WARN_UNUSED_RESULT)
+    #define SK_WARN_UNUSED_RESULT __attribute__((warn_unused_result))
+#endif
+
+#if !defined(SK_CPU_BENDIAN) && !defined(SK_CPU_LENDIAN)
+    #if defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
+        #define SK_CPU_BENDIAN
+    #elif defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
+        #define SK_CPU_LENDIAN
+    #elif defined(__sparc) || defined(__sparc__) || \
+      defined(_POWER) || defined(__powerpc__) || \
+      defined(__ppc__) || defined(__hppa) || \
+      defined(__PPC__) || defined(__PPC64__) || \
+      defined(_MIPSEB) || defined(__ARMEB__) || \
+      defined(__s390__) || \
+      (defined(__sh__) && defined(__BIG_ENDIAN__)) || \
+      (defined(__ia64) && defined(__BIG_ENDIAN__))
+         #define SK_CPU_BENDIAN
+    #else
+        #define SK_CPU_LENDIAN
+    #endif
+#endif
+
+#if defined(__i386) || defined(_M_IX86) ||  defined(__x86_64__) || defined(_M_X64)
+  #define SK_CPU_X86 1
+#endif
+
+/**
+ *  SK_CPU_SSE_LEVEL
+ *
+ *  If defined, SK_CPU_SSE_LEVEL should be set to the highest supported level.
+ *  On non-intel CPU this should be undefined.
+ */
+#define SK_CPU_SSE_LEVEL_SSE1     10
+#define SK_CPU_SSE_LEVEL_SSE2     20
+#define SK_CPU_SSE_LEVEL_SSE3     30
+#define SK_CPU_SSE_LEVEL_SSSE3    31
+#define SK_CPU_SSE_LEVEL_SSE41    41
+#define SK_CPU_SSE_LEVEL_SSE42    42
+#define SK_CPU_SSE_LEVEL_AVX      51
+#define SK_CPU_SSE_LEVEL_AVX2     52
+#define SK_CPU_SSE_LEVEL_AVX512   60
+
+// When targetting iOS and using gyp to generate the build files, it is not
+// possible to select files to build depending on the architecture (i.e. it
+// is not possible to use hand optimized assembly implementation). In that
+// configuration SK_BUILD_NO_OPTS is defined. Remove optimisation then.
+#ifdef SK_BUILD_NO_OPTS
+    #define SK_CPU_SSE_LEVEL 0
+#endif
+
+// Are we in GCC/Clang?
+#ifndef SK_CPU_SSE_LEVEL
+    // These checks must be done in descending order to ensure we set the highest
+    // available SSE level.
+    #if defined(__AVX512F__)
+        #define SK_CPU_SSE_LEVEL    SK_CPU_SSE_LEVEL_AVX512
+    #elif defined(__AVX2__)
+        #define SK_CPU_SSE_LEVEL    SK_CPU_SSE_LEVEL_AVX2
+    #elif defined(__AVX__)
+        #define SK_CPU_SSE_LEVEL    SK_CPU_SSE_LEVEL_AVX
+    #elif defined(__SSE4_2__)
+        #define SK_CPU_SSE_LEVEL    SK_CPU_SSE_LEVEL_SSE42
+    #elif defined(__SSE4_1__)
+        #define SK_CPU_SSE_LEVEL    SK_CPU_SSE_LEVEL_SSE41
+    #elif defined(__SSSE3__)
+        #define SK_CPU_SSE_LEVEL    SK_CPU_SSE_LEVEL_SSSE3
+    #elif defined(__SSE3__)
+        #define SK_CPU_SSE_LEVEL    SK_CPU_SSE_LEVEL_SSE3
+    #elif defined(__SSE2__)
+        #define SK_CPU_SSE_LEVEL    SK_CPU_SSE_LEVEL_SSE2
+    #endif
+#endif
+
+// Are we in VisualStudio?
+#ifndef SK_CPU_SSE_LEVEL
+    // These checks must be done in descending order to ensure we set the highest
+    // available SSE level. 64-bit intel guarantees at least SSE2 support.
+    #if defined(__AVX2__)
+        #define SK_CPU_SSE_LEVEL        SK_CPU_SSE_LEVEL_AVX2
+    #elif defined(__AVX__)
+        #define SK_CPU_SSE_LEVEL        SK_CPU_SSE_LEVEL_AVX
+    #elif defined(_M_X64) || defined(_M_AMD64)
+        #define SK_CPU_SSE_LEVEL        SK_CPU_SSE_LEVEL_SSE2
+    #elif defined(_M_IX86_FP)
+        #if _M_IX86_FP >= 2
+            #define SK_CPU_SSE_LEVEL    SK_CPU_SSE_LEVEL_SSE2
+        #elif _M_IX86_FP == 1
+            #define SK_CPU_SSE_LEVEL    SK_CPU_SSE_LEVEL_SSE1
+        #endif
+    #endif
+#endif
+
+// ARM defines
+#if defined(__arm__) && (!defined(__APPLE__) || !TARGET_IPHONE_SIMULATOR)
+    #define SK_CPU_ARM32
+#elif defined(__aarch64__) && !defined(SK_BUILD_NO_OPTS)
+    #define SK_CPU_ARM64
+#endif
+
+// All 64-bit ARM chips have NEON.  Many 32-bit ARM chips do too.
+#if !defined(SK_ARM_HAS_NEON) && !defined(SK_BUILD_NO_OPTS) && defined(__ARM_NEON)
+    #define SK_ARM_HAS_NEON
+#endif
+
+// Really this __APPLE__ check shouldn't be necessary, but it seems that Apple's Clang defines
+// __ARM_FEATURE_CRC32 for -arch arm64, even though their chips don't support those instructions!
+#if defined(__ARM_FEATURE_CRC32) && !defined(__APPLE__)
+    #define SK_ARM_HAS_CRC32
+#endif
+
+
+// DLL/.so exports.
+#if !defined(SKIA_IMPLEMENTATION)
+    #define SKIA_IMPLEMENTATION 0
+#endif
+#if !defined(SK_API)
+    #if defined(SKIA_DLL)
+        #if defined(_MSC_VER)
+            #if SKIA_IMPLEMENTATION
+                #define SK_API __declspec(dllexport)
+            #else
+                #define SK_API __declspec(dllimport)
+            #endif
+        #else
+            #define SK_API __attribute__((visibility("default")))
+        #endif
+    #else
+        #define SK_API
+    #endif
+#endif
+
+// SK_SPI is functionally identical to SK_API, but used within src to clarify that it's less stable
+#if !defined(SK_SPI)
+    #define SK_SPI SK_API
+#endif
+
 // IWYU pragma: begin_exports
-#include "include/core/SkPreConfig.h"
 #if defined (SK_USER_CONFIG_HEADER)
     #include SK_USER_CONFIG_HEADER
 #else
     #include "include/config/SkUserConfig.h"
 #endif
-#include "include/core/SkPostConfig.h"
 #include <stddef.h>
 #include <stdint.h>
 // IWYU pragma: end_exports
 
-/** \file SkTypes.h
-*/
+// Post SkUserConfig.h checks and such.
+#if !defined(SK_DEBUG) && !defined(SK_RELEASE)
+    #ifdef NDEBUG
+        #define SK_RELEASE
+    #else
+        #define SK_DEBUG
+    #endif
+#endif
+
+#if defined(SK_DEBUG) && defined(SK_RELEASE)
+#  error "cannot define both SK_DEBUG and SK_RELEASE"
+#elif !defined(SK_DEBUG) && !defined(SK_RELEASE)
+#  error "must define either SK_DEBUG or SK_RELEASE"
+#endif
+
+#if defined(SK_CPU_LENDIAN) && defined(SK_CPU_BENDIAN)
+#  error "cannot define both SK_CPU_LENDIAN and SK_CPU_BENDIAN"
+#elif !defined(SK_CPU_LENDIAN) && !defined(SK_CPU_BENDIAN)
+#  error "must define either SK_CPU_LENDIAN or SK_CPU_BENDIAN"
+#endif
+
+#if defined(SK_CPU_BENDIAN) && !defined(I_ACKNOWLEDGE_SKIA_DOES_NOT_SUPPORT_BIG_ENDIAN)
+    #error "The Skia team is not endian-savvy enough to support big-endian CPUs."
+    #error "If you still want to use Skia,"
+    #error "please define I_ACKNOWLEDGE_SKIA_DOES_NOT_SUPPORT_BIG_ENDIAN."
+#endif
+
+#if !defined(SK_ATTRIBUTE)
+#  if defined(__clang__) || defined(__GNUC__)
+#    define SK_ATTRIBUTE(attr) __attribute__((attr))
+#  else
+#    define SK_ATTRIBUTE(attr)
+#  endif
+#endif
+
+#if !defined(SK_SUPPORT_GPU)
+#  define SK_SUPPORT_GPU 1
+#endif
+
+/**
+ * If GPU is enabled but no GPU backends are enabled then enable GL by default.
+ * Traditionally clients have relied on Skia always building with the GL backend
+ * and opting in to additional backends. TODO: Require explicit opt in for GL.
+ */
+#if SK_SUPPORT_GPU
+#  if !defined(SK_GL) && !defined(SK_VULKAN) && !defined(SK_METAL)
+#    define SK_GL
+#  endif
+#endif
+
+#if !defined(SK_SUPPORT_ATLAS_TEXT)
+#  define SK_SUPPORT_ATLAS_TEXT 0
+#elif SK_SUPPORT_ATLAS_TEXT && !SK_SUPPORT_GPU
+#  error "SK_SUPPORT_ATLAS_TEXT requires SK_SUPPORT_GPU"
+#endif
+
+#if !defined(SkUNREACHABLE)
+#  if defined(_MSC_VER) && !defined(__clang__)
+#    define SkUNREACHABLE __assume(false)
+#  else
+#    define SkUNREACHABLE __builtin_unreachable()
+#  endif
+#endif
+
+#if defined(SK_BUILD_FOR_GOOGLE3)
+    void SkDebugfForDumpStackTrace(const char* data, void* unused);
+    void DumpStackTrace(int skip_count, void w(const char*, void*), void* arg);
+#  define SK_DUMP_GOOGLE3_STACK() DumpStackTrace(0, SkDebugfForDumpStackTrace, nullptr)
+#else
+#  define SK_DUMP_GOOGLE3_STACK()
+#endif
+
+#ifdef SK_BUILD_FOR_WIN
+    // Lets visual studio follow error back to source
+    #define SK_DUMP_LINE_FORMAT(message) \
+        SkDebugf("%s(%d): fatal error: \"%s\"\n", __FILE__, __LINE__, message)
+#else
+    #define SK_DUMP_LINE_FORMAT(message) \
+        SkDebugf("%s:%d: fatal error: \"%s\"\n", __FILE__, __LINE__, message)
+#endif
+
+#ifndef SK_ABORT
+#  define SK_ABORT(message) \
+    do { \
+       SK_DUMP_LINE_FORMAT(message); \
+       SK_DUMP_GOOGLE3_STACK(); \
+       sk_abort_no_print(); \
+       SkUNREACHABLE; \
+    } while (false)
+#endif
+
+// If SK_R32_SHIFT is set, we'll use that to choose RGBA or BGRA.
+// If not, we'll default to RGBA everywhere except BGRA on Windows.
+#if defined(SK_R32_SHIFT)
+    static_assert(SK_R32_SHIFT == 0 || SK_R32_SHIFT == 16, "");
+#elif defined(SK_BUILD_FOR_WIN)
+    #define SK_R32_SHIFT 16
+#else
+    #define SK_R32_SHIFT 0
+#endif
+
+#if defined(SK_B32_SHIFT)
+    static_assert(SK_B32_SHIFT == (16-SK_R32_SHIFT), "");
+#else
+    #define SK_B32_SHIFT (16-SK_R32_SHIFT)
+#endif
+
+#define SK_G32_SHIFT 8
+#define SK_A32_SHIFT 24
+
+
+/**
+ * SK_PMCOLOR_BYTE_ORDER can be used to query the byte order of SkPMColor at compile time. The
+ * relationship between the byte order and shift values depends on machine endianness. If the shift
+ * order is R=0, G=8, B=16, A=24 then ((char*)&pmcolor)[0] will produce the R channel on a little
+ * endian machine and the A channel on a big endian machine. Thus, given those shifts values,
+ * SK_PMCOLOR_BYTE_ORDER(R,G,B,A) will be true on a little endian machine and
+ * SK_PMCOLOR_BYTE_ORDER(A,B,G,R) will be true on a big endian machine.
+ */
+#ifdef SK_CPU_BENDIAN
+#  define SK_PMCOLOR_BYTE_ORDER(C0, C1, C2, C3)     \
+        (SK_ ## C3 ## 32_SHIFT == 0  &&             \
+         SK_ ## C2 ## 32_SHIFT == 8  &&             \
+         SK_ ## C1 ## 32_SHIFT == 16 &&             \
+         SK_ ## C0 ## 32_SHIFT == 24)
+#else
+#  define SK_PMCOLOR_BYTE_ORDER(C0, C1, C2, C3)     \
+        (SK_ ## C0 ## 32_SHIFT == 0  &&             \
+         SK_ ## C1 ## 32_SHIFT == 8  &&             \
+         SK_ ## C2 ## 32_SHIFT == 16 &&             \
+         SK_ ## C3 ## 32_SHIFT == 24)
+#endif
+
+#if defined SK_DEBUG && defined SK_BUILD_FOR_WIN
+    #ifdef free
+        #undef free
+    #endif
+    #include <crtdbg.h>
+    #undef free
+#endif
+
+#if !defined(SK_UNUSED)
+#  if !defined(__clang__) && defined(_MSC_VER)
+#    define SK_UNUSED __pragma(warning(suppress:4189))
+#  else
+#    define SK_UNUSED SK_ATTRIBUTE(unused)
+#  endif
+#endif
+
+/**
+ * If your judgment is better than the compiler's (i.e. you've profiled it),
+ * you can use SK_ALWAYS_INLINE to force inlining. E.g.
+ *     inline void someMethod() { ... }             // may not be inlined
+ *     SK_ALWAYS_INLINE void someMethod() { ... }   // should always be inlined
+ */
+#if !defined(SK_ALWAYS_INLINE)
+#  if defined(SK_BUILD_FOR_WIN)
+#    define SK_ALWAYS_INLINE __forceinline
+#  else
+#    define SK_ALWAYS_INLINE SK_ATTRIBUTE(always_inline) inline
+#  endif
+#endif
+
+/**
+ * If your judgment is better than the compiler's (i.e. you've profiled it),
+ * you can use SK_NEVER_INLINE to prevent inlining.
+ */
+#if !defined(SK_NEVER_INLINE)
+#  if defined(SK_BUILD_FOR_WIN)
+#    define SK_NEVER_INLINE __declspec(noinline)
+#  else
+#    define SK_NEVER_INLINE SK_ATTRIBUTE(noinline)
+#  endif
+#endif
+
+#if SK_CPU_SSE_LEVEL >= SK_CPU_SSE_LEVEL_SSE1
+    #define SK_PREFETCH(ptr) _mm_prefetch(reinterpret_cast<const char*>(ptr), _MM_HINT_T0)
+#elif defined(__GNUC__)
+    #define SK_PREFETCH(ptr) __builtin_prefetch(ptr)
+#else
+    #define SK_PREFETCH(ptr)
+#endif
+
+#ifndef SK_PRINTF_LIKE
+#  if defined(__clang__) || defined(__GNUC__)
+#    define SK_PRINTF_LIKE(A, B) __attribute__((format(printf, (A), (B))))
+#  else
+#    define SK_PRINTF_LIKE(A, B)
+#  endif
+#endif
+
+#ifndef SK_SIZE_T_SPECIFIER
+#  if defined(_MSC_VER) && !defined(__clang__)
+#    define SK_SIZE_T_SPECIFIER "%Iu"
+#  else
+#    define SK_SIZE_T_SPECIFIER "%zu"
+#  endif
+#endif
+
+#ifndef SK_ALLOW_STATIC_GLOBAL_INITIALIZERS
+    #define SK_ALLOW_STATIC_GLOBAL_INITIALIZERS 0
+#endif
+
+#if !defined(SK_GAMMA_EXPONENT)
+    #define SK_GAMMA_EXPONENT (0.0f)  // SRGB
+#endif
+
+#ifndef GR_TEST_UTILS
+#  define GR_TEST_UTILS 0
+#endif
+
+#if defined(SK_HISTOGRAM_ENUMERATION) && defined(SK_HISTOGRAM_BOOLEAN)
+#  define SK_HISTOGRAMS_ENABLED 1
+#else
+#  define SK_HISTOGRAMS_ENABLED 0
+#endif
+
+#ifndef SK_HISTOGRAM_BOOLEAN
+#  define SK_HISTOGRAM_BOOLEAN(name, value)
+#endif
+
+#ifndef SK_HISTOGRAM_ENUMERATION
+#  define SK_HISTOGRAM_ENUMERATION(name, value, boundary_value)
+#endif
+
+#ifndef SK_DISABLE_LEGACY_SHADERCONTEXT
+#define SK_ENABLE_LEGACY_SHADERCONTEXT
+#endif
 
 /** Called internally if we hit an unrecoverable error.
     The platform implementation must not return, but should either throw
diff --git a/include/pathops/SkPathOps.h b/include/pathops/SkPathOps.h
index 2c799d9..7565332 100644
--- a/include/pathops/SkPathOps.h
+++ b/include/pathops/SkPathOps.h
@@ -7,7 +7,7 @@
 #ifndef SkPathOps_DEFINED
 #define SkPathOps_DEFINED
 
-#include "include/core/SkPreConfig.h"
+#include "include/core/SkTypes.h"
 #include "include/private/SkTArray.h"
 #include "include/private/SkTDArray.h"
 
diff --git a/include/private/SkThreadAnnotations.h b/include/private/SkThreadAnnotations.h
index 29e07c4..7864fd7 100644
--- a/include/private/SkThreadAnnotations.h
+++ b/include/private/SkThreadAnnotations.h
@@ -47,7 +47,7 @@
 #define SK_ACQUIRE_SHARED(...) \
   SK_THREAD_ANNOTATION_ATTRIBUTE(acquire_shared_capability(__VA_ARGS__))
 
-// Would be SK_RELEASE, but that is already in use by SkPostConfig.
+// Would be SK_RELEASE, but that is already in use as SK_DEBUG vs. SK_RELEASE.
 #define SK_RELEASE_CAPABILITY(...) \
   SK_THREAD_ANNOTATION_ATTRIBUTE(release_capability(__VA_ARGS__))
 
diff --git a/tools/check-headers-self-sufficient b/tools/check-headers-self-sufficient
index 8ecb76b..ae4f020 100755
--- a/tools/check-headers-self-sufficient
+++ b/tools/check-headers-self-sufficient
@@ -23,7 +23,6 @@
     r'example/.*',
     r'experimental/.*',
     r'include/config/.*',
-    r'include/core/SkPostConfig\.h',
     r'include/gpu/mtl/.*',
     r'include/gpu/vk/.*',
     r'include/ports/SkFontMgr_android\.h',