Reland "Fix skshaper in component builds"

Change-Id: Ic7e233216f7d1031cf2c0f97003140b3e09f5491
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/267760
Reviewed-by: Mike Klein <mtklein@google.com>
Commit-Queue: Brian Osman <brianosman@google.com>
diff --git a/modules/skshaper/BUILD.gn b/modules/skshaper/BUILD.gn
index 9e97ce6..cc09c20 100644
--- a/modules/skshaper/BUILD.gn
+++ b/modules/skshaper/BUILD.gn
@@ -13,6 +13,9 @@
   config("public_config") {
     include_dirs = [ "include" ]
     defines = []
+    if (is_component_build) {
+      defines += [ "SKSHAPER_DLL" ]
+    }
     if (skia_use_icu) {
       defines += [ "SK_SHAPER_HARFBUZZ_AVAILABLE" ]
     }
@@ -26,6 +29,7 @@
     deps = [
       "../..:skia",
     ]
+    defines = [ "SKSHAPER_IMPLEMENTATION=1" ]
     sources = skia_shaper_primitive_sources
     if (skia_use_icu && skia_use_harfbuzz) {
       sources += skia_shaper_harfbuzz_sources
diff --git a/modules/skshaper/include/SkShaper.h b/modules/skshaper/include/SkShaper.h
index 550921e..104872c 100644
--- a/modules/skshaper/include/SkShaper.h
+++ b/modules/skshaper/include/SkShaper.h
@@ -17,6 +17,26 @@
 
 #include <memory>
 
+#if !defined(SKSHAPER_IMPLEMENTATION)
+    #define SKSHAPER_IMPLEMENTATION 0
+#endif
+
+#if !defined(SKSHAPER_API)
+    #if defined(SKSHAPER_DLL)
+        #if defined(_MSC_VER)
+            #if SKSHAPER_IMPLEMENTATION
+                #define SKSHAPER_API __declspec(dllexport)
+            #else
+                #define SKSHAPER_API __declspec(dllimport)
+            #endif
+        #else
+            #define SKSHAPER_API __attribute__((visibility("default")))
+        #endif
+    #else
+        #define SKSHAPER_API
+    #endif
+#endif
+
 class SkFont;
 class SkFontMgr;
 
@@ -26,7 +46,7 @@
 
    If compiled without HarfBuzz, fall back on SkPaint::textToGlyphs.
  */
-class SkShaper {
+class SKSHAPER_API SkShaper {
 public:
     static std::unique_ptr<SkShaper> MakePrimitive();
     #ifdef SK_SHAPER_HARFBUZZ_AVAILABLE
@@ -232,7 +252,7 @@
 /**
  * Helper for shaping text directly into a SkTextBlob.
  */
-class SkTextBlobBuilderRunHandler final : public SkShaper::RunHandler {
+class SKSHAPER_API SkTextBlobBuilderRunHandler final : public SkShaper::RunHandler {
 public:
     SkTextBlobBuilderRunHandler(const char* utf8Text, SkPoint offset)
         : fUtf8Text(utf8Text)