Skip to content

Commit fb80765

Browse files
committed
[sk4d] Improve backward compatibility for svg and lottie rendering texts
See skia4delphi/skia4delphi#415
1 parent 4c14e4c commit fb80765

File tree

4 files changed

+25
-4
lines changed

4 files changed

+25
-4
lines changed

sk4d/modules/skottie/src/sk4d_skottie.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,12 @@
88

99
#include <utility>
1010

11+
#include "src/sk4d_comp.h"
1112
#include "src/utils/SkOSPath.h"
1213
#include "modules/skottie/include/sk4d_skottie.h"
1314
#include "modules/skottie/src/sk4d_skottie_mapping.h"
1415
#include "modules/skresources/src/sk4d_resources_mapping.h"
16+
#include "modules/skshaper/utils/FactoryHelpers.h"
1517

1618
double sk4d_skottieanimation_get_duration(const sk_skottieanimation_t* self) {
1719
return AsSkottieAnimation(self)->duration();
@@ -42,12 +44,14 @@ sk_skottieanimation_t* sk4d_skottieanimation_make_from_file(const char file_name
4244
if (!stream)
4345
return nullptr;
4446
auto rp = skresources::DataURIResourceProviderProxy::Make(skresources::FileResourceProvider::Make(SkOSPath::Dirname(file_name), skresources::ImageDecodeStrategy::kPreDecode), skresources::ImageDecodeStrategy::kPreDecode);
45-
return ToSkottieAnimation(skottie::Animation::Builder().setResourceProvider(std::move(rp)).setFontManager(sk_ref_sp(AsFontMgr(font_provider))).make(stream.get()).release());
47+
return ToSkottieAnimation(skottie::Animation::Builder().setResourceProvider(std::move(rp)).setFontManager(Sk4DComp::CustomFontMgrWithSystemFonts(sk_ref_sp(AsFontMgr(font_provider))))
48+
.setTextShapingFactory(SkShapers::BestAvailable()).make(stream.get()).release());
4649
}
4750

4851
sk_skottieanimation_t* sk4d_skottieanimation_make_from_stream(sk_stream_t* stream, sk_resourceprovider_t* resource_provider, sk_fontmgr_t* font_provider) {
4952
auto rp = skresources::DataURIResourceProviderProxy::Make(sk_ref_sp(AsResourceProvider(resource_provider)), skresources::ImageDecodeStrategy::kPreDecode);
50-
return ToSkottieAnimation(skottie::Animation::Builder().setResourceProvider(std::move(rp)).setFontManager(sk_ref_sp(AsFontMgr(font_provider))).make(AsStream(stream)).release());
53+
return ToSkottieAnimation(skottie::Animation::Builder().setResourceProvider(std::move(rp)).setFontManager(Sk4DComp::CustomFontMgrWithSystemFonts(sk_ref_sp(AsFontMgr(font_provider))))
54+
.setTextShapingFactory(SkShapers::BestAvailable()).make(AsStream(stream)).release());
5155
}
5256

5357
void sk4d_skottieanimation_ref(const sk_skottieanimation_t* self) {

sk4d/modules/svg/src/sk4d_svgdom.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,10 @@
99
#include <utility>
1010

1111
#include "src/utils/SkOSPath.h"
12+
#include "src/sk4d_comp.h"
1213
#include "modules/svg/include/sk4d_svgdom.h"
1314
#include "modules/skresources/src/sk4d_resources_mapping.h"
15+
#include "modules/skshaper/utils/FactoryHelpers.h"
1416
#include "modules/svg/src/sk4d_svg_mapping.h"
1517

1618
sk_svgnode_t* sk4d_svgdom_find_node_by_id(sk_svgdom_t* self, const char id[]) {
@@ -27,12 +29,14 @@ sk_svgdom_t* sk4d_svgdom_make_from_file(const char file_name[], sk_fontmgr_t* fo
2729
if (!stream)
2830
return nullptr;
2931
auto rp = skresources::DataURIResourceProviderProxy::Make(skresources::FileResourceProvider::Make(SkOSPath::Dirname(file_name), skresources::ImageDecodeStrategy::kPreDecode), skresources::ImageDecodeStrategy::kPreDecode);
30-
return ToSVGDOM(SkSVGDOM::Builder().setResourceProvider(std::move(rp)).setFontManager(sk_ref_sp(AsFontMgr(font_provider))).make(*stream).release());
32+
return ToSVGDOM(SkSVGDOM::Builder().setResourceProvider(std::move(rp)).setFontManager(Sk4DComp::CustomFontMgrWithSystemFonts(sk_ref_sp(AsFontMgr(font_provider))))
33+
.setTextShapingFactory(SkShapers::BestAvailable()).make(*stream).release());
3134
}
3235

3336
sk_svgdom_t* sk4d_svgdom_make_from_stream(sk_stream_t* stream, sk_resourceprovider_t* resource_provider, sk_fontmgr_t* font_provider) {
3437
auto rp = skresources::DataURIResourceProviderProxy::Make(sk_ref_sp(AsResourceProvider(resource_provider)), skresources::ImageDecodeStrategy::kPreDecode);
35-
return ToSVGDOM(SkSVGDOM::Builder().setResourceProvider(std::move(rp)).setFontManager(sk_ref_sp(AsFontMgr(font_provider))).make(AsStream(*stream)).release());
38+
return ToSVGDOM(SkSVGDOM::Builder().setResourceProvider(std::move(rp)).setFontManager(Sk4DComp::CustomFontMgrWithSystemFonts(sk_ref_sp(AsFontMgr(font_provider))))
39+
.setTextShapingFactory(SkShapers::BestAvailable()).make(AsStream(*stream)).release());
3640
}
3741

3842
void sk4d_svgdom_render(const sk_svgdom_t* self, sk_canvas_t* canvas) {

sk4d/src/sk4d_comp.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
#include <mutex>
44
#include "include/core/SkFontStyle.h"
5+
#include "include/utils/SkOrderedFontMgr.h"
56

67
#if defined(SK_BUILD_FOR_WIN) && (defined(SK_FONTMGR_GDI_AVAILABLE) || \
78
defined(SK_FONTMGR_DIRECTWRITE_AVAILABLE))
@@ -52,6 +53,17 @@
5253
#include "modules/skunicode/include/SkUnicode_icu4x.h"
5354
#endif
5455

56+
sk_sp<SkFontMgr>
57+
Sk4DComp::CustomFontMgrWithSystemFonts(sk_sp<SkFontMgr> customFontManager) {
58+
if (customFontManager) {
59+
sk_sp<SkOrderedFontMgr> result(new SkOrderedFontMgr);
60+
result->append(Sk4DComp::FontMgrRefDefault());
61+
result->append(customFontManager);
62+
return result;
63+
}
64+
return Sk4DComp::FontMgrRefDefault();
65+
}
66+
5567
sk_sp<SkFontMgr> Sk4DComp::FontMgrRefDefault() {
5668
static std::once_flag once;
5769
static sk_sp<SkFontMgr> singleton;

sk4d/src/sk4d_comp.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515

1616
namespace Sk4DComp {
1717

18+
sk_sp<SkFontMgr> CustomFontMgrWithSystemFonts(sk_sp<SkFontMgr> customFontManager);
1819
sk_sp<SkFontMgr> FontMgrRefDefault();
1920
sk_sp<SkTypeface> MakeDefaultTypeface();
2021
sk_sp<SkUnicode> UnicodeMake();

0 commit comments

Comments
 (0)