Always build harfbuzz in viewer

this allows us to always have text content available for testing (since it is independent of renderer backend)

This also abstracts a factory for building RenderFonts (in ViewerContent) -- again, since that decision is independent of renderer.

Diffs=
4802c650a Always build harfbuzz in viewer
diff --git a/.rive_head b/.rive_head
index 13d8aaf..285d534 100644
--- a/.rive_head
+++ b/.rive_head
@@ -1 +1 @@
-b4eb6b315ba31c8608b98799ac7f5b480a1045d4
+4802c650a88b7120ab5ce13cfc2c45e9584f590b
diff --git a/skia/renderer/src/renderfont_hb.cpp b/skia/renderer/src/renderfont_hb.cpp
index 3b2cd1c..7cd7306 100644
--- a/skia/renderer/src/renderfont_hb.cpp
+++ b/skia/renderer/src/renderfont_hb.cpp
@@ -1,11 +1,13 @@
 /*
  * Copyright 2022 Rive
  */
+
+#include "rive/render_text.hpp"
+
 #ifdef RIVE_TEXT
 #include "renderfont_hb.hpp"
 
 #include "rive/factory.hpp"
-#include "rive/render_text.hpp"
 #include "renderer_utils.hpp"
 
 #include "hb.h"
@@ -291,4 +293,5 @@
     }
     return gruns;
 }
+
 #endif
\ No newline at end of file
diff --git a/viewer/build/premake5_viewer.lua b/viewer/build/premake5_viewer.lua
index 6dac5fe..cac71d0 100644
--- a/viewer/build/premake5_viewer.lua
+++ b/viewer/build/premake5_viewer.lua
@@ -7,6 +7,7 @@
 dependencies = os.getenv('DEPENDENCIES')
 
 rive = '../../'
+rive_thirdparty = '../../../../third_party'
 rive_tess = '../../tess'
 rive_skia = '../../skia'
 skia = dependencies .. '/skia'
@@ -27,25 +28,35 @@
     toolset 'clang'
     targetdir('%{cfg.system}/bin/%{cfg.buildcfg}/' .. _OPTIONS.renderer .. '/' .. _OPTIONS.graphics)
     objdir('%{cfg.system}/obj/%{cfg.buildcfg}/' .. _OPTIONS.renderer .. '/' .. _OPTIONS.graphics)
+
+    defines { "RIVE_TEXT" }
+
     includedirs {
         '../include',
         rive .. '/include',
+        rive .. '/skia/renderer/include',  -- for renderfont backends
+        rive_thirdparty .. '/externals/harfbuzz/src',
         dependencies,
         dependencies .. '/sokol',
         dependencies .. '/imgui'
     }
 
     links {
-        'rive'
+        'rive',
+        'rive_harfbuzz',
     }
 
     libdirs {
-        rive .. '/build/%{cfg.system}/bin/%{cfg.buildcfg}'
+        rive .. '/build/%{cfg.system}/bin/%{cfg.buildcfg}',
+        rive_thirdparty .. '/harfbuzz/build/%{cfg.buildcfg}/bin',
     }
 
     files {
         '../src/**.cpp',
         '../../utils/rive_utf.cpp',
+        rive .. '/skia/renderer/src/renderfont_coretext.cpp',
+        rive .. '/skia/renderer/src/renderfont_hb.cpp',
+        rive .. '/utils/rive_utf.cpp',
         dependencies .. '/imgui/imgui.cpp',
         dependencies .. '/imgui/imgui_widgets.cpp',
         dependencies .. '/imgui/imgui_tables.cpp',
@@ -202,19 +213,17 @@
             skia .. '/include/effects',
             skia .. '/include/gpu',
             skia .. '/include/config',
-            rive_skia .. '/renderer/include'
         }
         defines {
             'RIVE_RENDERER_SKIA'
         }
         libdirs {
             rive_skia .. '/renderer/build/%{cfg.system}/bin/%{cfg.buildcfg}',
-            '../../../../third_party/harfbuzz/build/%{cfg.buildcfg}/bin'
+            rive_thirdparty .. '/harfbuzz/build/%{cfg.buildcfg}/bin'
         }
         links {
             'skia',
             'rive_skia_renderer',
-            'rive_harfbuzz'
         }
     end
 
diff --git a/viewer/include/viewer/viewer_content.hpp b/viewer/include/viewer/viewer_content.hpp
index e78b39f..980f4ff 100644
--- a/viewer/include/viewer/viewer_content.hpp
+++ b/viewer/include/viewer/viewer_content.hpp
@@ -6,11 +6,14 @@
 #define _RIVE_VIEWER_CONTENT_HPP_
 
 #include "rive/span.hpp"
+#include "rive/refcnt.hpp"
+
 #include "imgui.h"
 
 namespace rive {
     class Renderer;
     class Factory;
+    class RenderFont;
 } // namespace rive
 
 class ViewerContent {
@@ -55,6 +58,9 @@
 
     // Abstracts which rive Factory is currently used.
     static rive::Factory* RiveFactory();
+
+    // Abstracts which font backend is currently used.
+    static rive::rcp<rive::RenderFont> DecodeFont(rive::Span<const uint8_t>);
 };
 
 #endif
diff --git a/viewer/include/viewer/viewer_host.hpp b/viewer/include/viewer/viewer_host.hpp
index 43a5ce5..cbf0ddc 100644
--- a/viewer/include/viewer/viewer_host.hpp
+++ b/viewer/include/viewer/viewer_host.hpp
@@ -7,6 +7,7 @@
 
 #include "rive/factory.hpp"
 #include "rive/renderer.hpp"
+#include "rive/render_text.hpp"
 
 #include "sokol_gfx.h"
 
diff --git a/viewer/src/viewer_content/text_content.cpp b/viewer/src/viewer_content/text_content.cpp
index 9676056..24a9fe2 100644
--- a/viewer/src/viewer_content/text_content.cpp
+++ b/viewer/src/viewer_content/text_content.cpp
@@ -5,7 +5,6 @@
 #include "viewer/viewer_content.hpp"
 #include "utils/rive_utf.hpp"
 
-#ifdef RIVE_RENDERER_SKIA
 #include "rive/factory.hpp"
 #include "rive/refcnt.hpp"
 #include "rive/render_text.hpp"
@@ -15,15 +14,6 @@
 using RenderFontGlyphRuns = std::vector<rive::RenderGlyphRun>;
 using RenderFontFactory = rive::rcp<rive::RenderFont> (*)(const rive::Span<const uint8_t>);
 
-#ifdef RIVE_RENDERER_SKIA
-#include "renderfont_coretext.hpp"
-static RenderFontFactory gFontFactory = CoreTextRenderFont::Decode;
-#else
-#include "renderfont_hb.hpp"
-static RenderFontFactory gFontFactory = HBRenderFont::Decode;
-#define RIVE_USING_HAFBUZZ_FONTS
-#endif
-
 static bool ws(rive::Unichar c) { return c <= ' '; }
 
 std::vector<int> compute_word_breaks(rive::Span<rive::Unichar> chars) {
@@ -193,11 +183,7 @@
 
 public:
     TextContent() {
-#ifdef RIVE_USING_HAFBUZZ_FONTS
-        HBRenderFont::gFallbackProc = load_fallback_font;
-#endif
-
-        auto truns = this->make_truns(gFontFactory);
+        auto truns = this->make_truns(ViewerContent::DecodeFont);
         m_gruns.push_back(truns[0].font->shapeText(rive::toSpan(m_unichars), rive::toSpan(truns)));
 
         m_xform = rive::Mat2D::fromTranslate(10, 0) * rive::Mat2D::fromScale(3, 3);
@@ -251,6 +237,3 @@
     }
     return nullptr;
 }
-#else
-std::unique_ptr<ViewerContent> ViewerContent::Text(const char filename[]) { return nullptr; }
-#endif
\ No newline at end of file
diff --git a/viewer/src/viewer_content/textpath_content.cpp b/viewer/src/viewer_content/textpath_content.cpp
index f8b1bb4..4ae3a53 100644
--- a/viewer/src/viewer_content/textpath_content.cpp
+++ b/viewer/src/viewer_content/textpath_content.cpp
@@ -5,8 +5,8 @@
 #include "viewer/viewer_content.hpp"
 #include "utils/rive_utf.hpp"
 
-#ifdef RIVE_RENDERER_SKIA
 #include "rive/refcnt.hpp"
+#include "rive/factory.hpp"
 #include "rive/render_text.hpp"
 #include "rive/math/contour_measure.hpp"
 #include "rive/text/line_breaker.hpp"
@@ -17,14 +17,6 @@
 using RenderFontGlyphRuns = std::vector<RenderGlyphRun>;
 using RenderFontFactory = rcp<RenderFont> (*)(const Span<const uint8_t>);
 
-#ifdef RIVE_RENDERER_SKIA
-#include "renderfont_coretext.hpp"
-static RenderFontFactory gFontFactory = CoreTextRenderFont::Decode;
-#else
-#include "renderfont_hb.hpp"
-static RenderFontFactory gFontFactory = HBRenderFont::Decode;
-#endif
-
 template <typename Handler>
 void visit(const std::vector<RenderGlyphRun>& gruns, Vec2D origin, Handler proc) {
     for (const auto& gr : gruns) {
@@ -168,7 +160,7 @@
             return bounds;
         };
 
-        auto truns = this->make_truns(gFontFactory);
+        auto truns = this->make_truns(ViewerContent::DecodeFont);
 
         m_gruns = truns[0].font->shapeText(toSpan(m_unichars), toSpan(truns));
 
@@ -362,6 +354,3 @@
 std::unique_ptr<ViewerContent> ViewerContent::TextPath(const char filename[]) {
     return std::make_unique<TextPathContent>();
 }
-#else
-std::unique_ptr<ViewerContent> ViewerContent::TextPath(const char filename[]) { return nullptr; }
-#endif
\ No newline at end of file
diff --git a/viewer/src/viewer_content/viewer_content.cpp b/viewer/src/viewer_content/viewer_content.cpp
index cf545ab..3ecc6fb 100644
--- a/viewer/src/viewer_content/viewer_content.cpp
+++ b/viewer/src/viewer_content/viewer_content.cpp
@@ -1,9 +1,6 @@
-#ifdef RIVE_RENDERER_TESS
-#include "viewer/tess/viewer_sokol_factory.hpp"
-#endif
-#ifdef RIVE_RENDERER_SKIA
-#include "skia_factory.hpp"
-#endif
+/*
+ * Copyright 2022 Rive
+ */
 
 #include "viewer/viewer_content.hpp"
 #include "rive/rive_counter.hpp"
@@ -63,3 +60,16 @@
 #include "viewer/viewer_host.hpp"
 
 rive::Factory* ViewerContent::RiveFactory() { return ViewerHost::Factory(); }
+
+#ifdef RIVE_BUILD_FOR_APPLE
+// note: we can use harfbuzz even on apple ... (if we want)
+#include "renderfont_coretext.hpp"
+rive::rcp<rive::RenderFont> ViewerContent::DecodeFont(rive::Span<const uint8_t> span) {
+    return CoreTextRenderFont::Decode(span);
+}
+#else
+#include "renderfont_hb.hpp"
+rive::rcp<rive::RenderFont> ViewerContent::DecodeFont(rive::Span<const uint8_t> span) {
+    return HBRenderFont::Decode(span);
+}
+#endif