Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
50 changes: 44 additions & 6 deletions src/Svg.Skia/SkiaModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -354,11 +354,14 @@ private void TrimTypefaceCachesIfNeeded()
return null;
}

var weight = (SkiaSharp.SKFontStyleWeight)style.Weight;
var width = (SkiaSharp.SKFontStyleWidth)style.Width;
var slant = (SkiaSharp.SKFontStyleSlant)style.Slant;
var cacheKey = new TypefaceKey(
candidate,
(SkiaSharp.SKFontStyleWeight)style.Weight,
(SkiaSharp.SKFontStyleWidth)style.Width,
(SkiaSharp.SKFontStyleSlant)style.Slant);
weight,
width,
slant);
if (_resolvedTypefaceCache.TryGetValue(cacheKey, out var cached))
{
if (cached is not null && cached.Handle != IntPtr.Zero)
Expand All @@ -369,6 +372,17 @@ private void TrimTypefaceCachesIfNeeded()
_resolvedTypefaceCache.TryRemove(cacheKey, out _);
}

if (SharedTypefaceCache.TryGetResolvedTypeface(candidate, weight, width, slant, out var sharedCached))
{
if (sharedCached is not null)
{
_resolvedTypefaceCache.TryAdd(cacheKey, sharedCached);
TrimTypefaceCachesIfNeeded();
}

return sharedCached;
}

var fontManager = SkiaSharp.SKFontManager.Default;
var resolved = default(SkiaSharp.SKTypeface);

Expand Down Expand Up @@ -406,9 +420,33 @@ private void TrimTypefaceCachesIfNeeded()
_resolvedTypefaceCache.TryAdd(cacheKey, resolved);
TrimTypefaceCachesIfNeeded();
}

SharedTypefaceCache.AddResolvedTypeface(candidate, weight, width, slant, resolved);
return resolved;
}

private static SkiaSharp.SKTypeface? ResolveProviderTypeface(
ITypefaceProvider typefaceProvider,
string candidate,
SkiaSharp.SKFontStyleWeight fontWeight,
SkiaSharp.SKFontStyleWidth fontWidth,
SkiaSharp.SKFontStyleSlant fontStyle)
{
var typeface = SharedTypefaceCache.TryGetOrAddProviderTypeface(
typefaceProvider,
candidate,
fontWeight,
fontWidth,
fontStyle,
out var cached)
? cached
: typefaceProvider.FromFamilyName(candidate, fontWeight, fontWidth, fontStyle);

return typeface is { } && typeface.Handle == IntPtr.Zero
? null
: typeface;
}

public SkiaSharp.SKTypeface? ToSKTypeface(SKTypeface? typeface)
{
var fontFamily = typeface?.FamilyName;
Expand Down Expand Up @@ -437,7 +475,7 @@ private void TrimTypefaceCachesIfNeeded()
{
foreach (var typefaceProvider in Settings.TypefaceProviders)
{
var providerTypeface = typefaceProvider.FromFamilyName(candidate, fontWeight, fontWidth, fontStyle);
var providerTypeface = ResolveProviderTypeface(typefaceProvider, candidate, fontWeight, fontWidth, fontStyle);
if (providerTypeface is { } && providerTypeface.Handle != IntPtr.Zero)
{
_typefaceCache.TryAdd(cacheKey, providerTypeface);
Expand All @@ -464,7 +502,7 @@ private void TrimTypefaceCachesIfNeeded()
{
foreach (var typefaceProvider in Settings.TypefaceProviders)
{
var providerTypeface = typefaceProvider.FromFamilyName(candidate, fontWeight, fontWidth, fontStyle);
var providerTypeface = ResolveProviderTypeface(typefaceProvider, candidate, fontWeight, fontWidth, fontStyle);
if (providerTypeface is { } && providerTypeface.Handle != IntPtr.Zero)
{
_typefaceCache.TryAdd(cacheKey, providerTypeface);
Expand All @@ -488,7 +526,7 @@ private void TrimTypefaceCachesIfNeeded()
{
foreach (var typefaceProvider in Settings.TypefaceProviders)
{
var providerTypeface = typefaceProvider.FromFamilyName(SkiaSharp.SKTypeface.Default.FamilyName, fontWeight, fontWidth, fontStyle);
var providerTypeface = ResolveProviderTypeface(typefaceProvider, SkiaSharp.SKTypeface.Default.FamilyName, fontWeight, fontWidth, fontStyle);
if (providerTypeface is { } && providerTypeface.Handle != IntPtr.Zero)
{
_typefaceCache.TryAdd(cacheKey, providerTypeface);
Expand Down
36 changes: 32 additions & 4 deletions src/Svg.Skia/SkiaSvgAssetLoader.cs
Original file line number Diff line number Diff line change
Expand Up @@ -405,7 +405,35 @@ private void TrimCachesIfNeeded()
}

var typeface = TryMatchCharacterFromCustomProviders(normalizedFamily, weight, width, slant, codepoint);
if (typeface is null && normalizedFamily is not null)
if (typeface is null)
{
if (!SharedTypefaceCache.TryGetMatchedCharacter(normalizedFamily, weight, width, slant, codepoint, out typeface))
{
typeface = MatchPlatformCharacter(normalizedFamily, weight, width, slant, codepoint);
SharedTypefaceCache.AddMatchedCharacter(normalizedFamily, weight, width, slant, codepoint, typeface);
}
}

if (typeface is { } && typeface.Handle == IntPtr.Zero)
{
typeface = null;
}

_matchCharacterCache.TryAdd(key, typeface);
TrimCachesIfNeeded();
return typeface;
}

private static SkiaSharp.SKTypeface? MatchPlatformCharacter(
string? normalizedFamily,
SkiaSharp.SKFontStyleWeight weight,
SkiaSharp.SKFontStyleWidth width,
SkiaSharp.SKFontStyleSlant slant,
int codepoint)
{
var typeface = default(SkiaSharp.SKTypeface);

if (normalizedFamily is not null)
{
foreach (var candidate in SkiaModel.EnumerateFontFamilyCandidates(normalizedFamily, browserCompatible: true))
{
Expand Down Expand Up @@ -491,8 +519,6 @@ private void TrimCachesIfNeeded()
typeface = null;
}

_matchCharacterCache.TryAdd(key, typeface);
TrimCachesIfNeeded();
return typeface;
}

Expand Down Expand Up @@ -593,7 +619,9 @@ private static bool CanRenderAllCodepoints(SkiaSharp.SKTypeface? typeface, IRead
_providerTypefaceCache.TryRemove(key, out _);
}

var typeface = provider.FromFamilyName(familyName, weight, width, slant);
var typeface = SharedTypefaceCache.TryGetOrAddProviderTypeface(provider, familyName, weight, width, slant, out var sharedCached)
? sharedCached
: provider.FromFamilyName(familyName, weight, width, slant);
if (typeface is { } && typeface.Handle == IntPtr.Zero)
{
typeface = null;
Expand Down
Loading
Loading