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