瀏覽代碼

Improvements related to SkFontManager.Local and SVG text rendering

Marcin Ziąbek 1 年之前
父節點
當前提交
025d4d9d38

+ 3 - 3
Source/QuestPDF.Examples/ChartExamples.cs

@@ -79,7 +79,7 @@ namespace QuestPDF.Examples
                                         LabelOrientation = Orientation.Horizontal,
                                         LabelOrientation = Orientation.Horizontal,
                                         ValueLabelOrientation = Orientation.Horizontal,
                                         ValueLabelOrientation = Orientation.Horizontal,
                                         
                                         
-                                        IsAnimated = false,
+                                        IsAnimated = false
                                     };
                                     };
                                     
                                     
                                     chart.DrawContent(canvas, (int)size.Width, (int)size.Height);
                                     chart.DrawContent(canvas, (int)size.Width, (int)size.Height);
@@ -101,7 +101,7 @@ namespace QuestPDF.Examples
                     container
                     container
                         .Background(Colors.White)
                         .Background(Colors.White)
                         .Padding(25)
                         .Padding(25)
-                        .Canvas((canvas, availableSpace) =>
+                        .SkiaSharpCanvas((canvas, availableSpace) =>
                         {
                         {
                             var points = Enumerable
                             var points = Enumerable
                                 .Range(0, 100)
                                 .Range(0, 100)
@@ -109,7 +109,7 @@ namespace QuestPDF.Examples
                                 .ToArray();
                                 .ToArray();
                             
                             
                             using var plot = new Plot();
                             using var plot = new Plot();
-                            plot.Add.Scatter(points, Color.FromHex(Colors.Teal.Medium));
+                            plot.Add.Scatter(points, ScottPlot.Color.FromHex(Colors.Teal.Medium));
                             
                             
                             canvas.ClipRect(new SKRect(0, 0, availableSpace.Width, availableSpace.Height));
                             canvas.ClipRect(new SKRect(0, 0, availableSpace.Width, availableSpace.Height));
                             plot.Render(canvas, (int)availableSpace.Width, (int)availableSpace.Height);
                             plot.Render(canvas, (int)availableSpace.Width, (int)availableSpace.Height);

+ 1 - 0
Source/QuestPDF.Examples/QuestPDF.Examples.csproj

@@ -12,6 +12,7 @@
         <PackageReference Include="nunit" Version="4.0.1" />
         <PackageReference Include="nunit" Version="4.0.1" />
         <PackageReference Include="NUnit3TestAdapter" Version="4.5.0" />
         <PackageReference Include="NUnit3TestAdapter" Version="4.5.0" />
         <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.9.0" />
         <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.9.0" />
+        <PackageReference Include="ScottPlot" Version="5.0.25" />
         <PackageReference Include="SkiaSharp" Version="2.88.7" />
         <PackageReference Include="SkiaSharp" Version="2.88.7" />
         <PackageReference Include="Svg.Skia" Version="1.0.0.16" />
         <PackageReference Include="Svg.Skia" Version="1.0.0.16" />
     </ItemGroup>
     </ItemGroup>

+ 6 - 27
Source/QuestPDF/Drawing/FontManager.cs

@@ -16,15 +16,17 @@ namespace QuestPDF.Drawing
     /// </summary>
     /// </summary>
     public static class FontManager
     public static class FontManager
     {
     {
-        internal static SkTypefaceProvider TypefaceProvider { get; } = new();
+        private static SkTypefaceProvider TypefaceProvider { get; } = new();
         
         
-        internal static SkFontCollection LocalFontCollection { get; } = SkFontCollection.Create(TypefaceProvider, SkFontManager.Empty);
-        internal static SkFontCollection GlobalFontCollection { get; } = SkFontCollection.Create(TypefaceProvider, SkFontManager.Global);
+        private static SkFontCollection LocalFontCollection { get; } = SkFontCollection.Create(TypefaceProvider, SkFontManager.Local);
+        private static SkFontCollection GlobalFontCollection { get; } = SkFontCollection.Create(TypefaceProvider, SkFontManager.Global);
+        
+        internal static SkFontCollection CurrentFontCollection => Settings.UseEnvironmentFonts ? GlobalFontCollection : LocalFontCollection;
+        internal static SkFontManager CurrentFontManager => Settings.UseEnvironmentFonts ? SkFontManager.Global : SkFontManager.Local;
 
 
         static FontManager()
         static FontManager()
         {
         {
             NativeDependencyCompatibilityChecker.Test();
             NativeDependencyCompatibilityChecker.Test();
-            RegisterLibraryDefaultFonts();
         }
         }
         
         
         [Obsolete("Since version 2022.8 this method has been renamed. Please use the RegisterFontWithCustomName method.")]
         [Obsolete("Since version 2022.8 this method has been renamed. Please use the RegisterFontWithCustomName method.")]
@@ -69,28 +71,5 @@ namespace QuestPDF.Drawing
             
             
             RegisterFont(stream);
             RegisterFont(stream);
         }
         }
-        
-        private static void RegisterLibraryDefaultFonts()
-        {
-            var supportedFontExtensions = new[] { "*.ttf", "*.otf", "*.ttc", "*.pfb" };
-
-            var executionPath = AppDomain.CurrentDomain.RelativeSearchPath ?? AppDomain.CurrentDomain.BaseDirectory;
-            
-            var fontFilePaths = supportedFontExtensions
-                .SelectMany(extension => Directory.GetFiles(executionPath, extension, SearchOption.AllDirectories));
-            
-            foreach (var fileName in fontFilePaths)
-            {
-                try
-                {
-                    using var fontFileStream = File.OpenRead(fileName);
-                    RegisterFont(fontFileStream);
-                }
-                catch
-                {
-                    
-                }
-            }
-        }
     }
     }
 }
 }

+ 2 - 2
Source/QuestPDF/Elements/DynamicSvgImage.cs

@@ -23,8 +23,8 @@ internal class DynamicSvgImage : Element
      
      
         if (svg == null)
         if (svg == null)
             return;
             return;
-        
-        using var svgImage = new SkSvgImage(svg);
+
+        using var svgImage = new SkSvgImage(svg, FontManager.CurrentFontManager);
         Canvas.DrawSvg(svgImage, availableSpace);
         Canvas.DrawSvg(svgImage, availableSpace);
     }
     }
 }
 }

+ 3 - 8
Source/QuestPDF/Elements/Text/SkParagraphBuilderPoolManager.cs

@@ -7,7 +7,7 @@ namespace QuestPDF.Elements.Text;
 
 
 internal static class SkParagraphBuilderPoolManager
 internal static class SkParagraphBuilderPoolManager
 {
 {
-    private static ConcurrentDictionary<(ParagraphStyleConfiguration, bool useEnvironmentFonts), ConcurrentBag<SkParagraphBuilder>> ObjectPool { get; } = new();
+    private static ConcurrentDictionary<ParagraphStyleConfiguration, ConcurrentBag<SkParagraphBuilder>> ObjectPool { get; } = new();
 
 
     public static SkParagraphBuilder Get(ParagraphStyleConfiguration configuration)
     public static SkParagraphBuilder Get(ParagraphStyleConfiguration configuration)
     {
     {
@@ -15,12 +15,8 @@ internal static class SkParagraphBuilderPoolManager
         
         
         if (specificPool.TryTake(out var builder))
         if (specificPool.TryTake(out var builder))
             return builder;
             return builder;
-
-        var fontCollection = Settings.UseEnvironmentFonts
-            ? FontManager.GlobalFontCollection
-            : FontManager.LocalFontCollection;
         
         
-        return SkParagraphBuilder.Create(configuration, fontCollection);
+        return SkParagraphBuilder.Create(configuration, FontManager.CurrentFontCollection);
     }
     }
 
 
     public static void Return(SkParagraphBuilder builder)
     public static void Return(SkParagraphBuilder builder)
@@ -33,7 +29,6 @@ internal static class SkParagraphBuilderPoolManager
 
 
     private static ConcurrentBag<SkParagraphBuilder> GetPool(ParagraphStyleConfiguration configuration)
     private static ConcurrentBag<SkParagraphBuilder> GetPool(ParagraphStyleConfiguration configuration)
     {
     {
-        var key = (configuration, Settings.UseEnvironmentFonts);
-        return ObjectPool.GetOrAdd(key, _ => new ConcurrentBag<SkParagraphBuilder>());
+        return ObjectPool.GetOrAdd(configuration, _ => new ConcurrentBag<SkParagraphBuilder>());
     }
     }
 }
 }

+ 2 - 1
Source/QuestPDF/Infrastructure/SvgImage.cs

@@ -1,5 +1,6 @@
 using System;
 using System;
 using System.IO;
 using System.IO;
+using QuestPDF.Drawing;
 using QuestPDF.Drawing.Exceptions;
 using QuestPDF.Drawing.Exceptions;
 using QuestPDF.Skia;
 using QuestPDF.Skia;
 
 
@@ -17,7 +18,7 @@ public class SvgImage
     
     
     private SvgImage(string content)
     private SvgImage(string content)
     {
     {
-        SkSvgImage = new SkSvgImage(content);    
+        SkSvgImage = new SkSvgImage(content, FontManager.CurrentFontManager);    
     }
     }
 
 
     ~SvgImage()
     ~SvgImage()

二進制
Source/QuestPDF/Runtimes/osx-arm64/native/libQuestPdfSkia.dylib


+ 4 - 3
Source/QuestPDF/Skia/SkSvgImage.cs

@@ -1,5 +1,6 @@
 using System;
 using System;
 using System.Runtime.InteropServices;
 using System.Runtime.InteropServices;
+using QuestPDF.Skia.Text;
 
 
 namespace QuestPDF.Skia;
 namespace QuestPDF.Skia;
 
 
@@ -8,11 +9,11 @@ internal sealed class SkSvgImage : IDisposable
     public IntPtr Instance { get; private set; }
     public IntPtr Instance { get; private set; }
     public SkRect ViewBox;
     public SkRect ViewBox;
     
     
-    public SkSvgImage(string svgString)
+    public SkSvgImage(string svgString, SkFontManager fontManager)
     {
     {
         using var data = SkData.FromBinary(System.Text.Encoding.UTF8.GetBytes(svgString));
         using var data = SkData.FromBinary(System.Text.Encoding.UTF8.GetBytes(svgString));
 
 
-        Instance = API.svg_create(data.Instance);
+        Instance = API.svg_create(data.Instance, fontManager.Instance);
         
         
         if (Instance == IntPtr.Zero)
         if (Instance == IntPtr.Zero)
             throw new Exception("Cannot decode the provided SVG image.");
             throw new Exception("Cannot decode the provided SVG image.");
@@ -37,7 +38,7 @@ internal sealed class SkSvgImage : IDisposable
     private static class API
     private static class API
     {
     {
         [DllImport(SkiaAPI.LibraryName)]
         [DllImport(SkiaAPI.LibraryName)]
-        public static extern IntPtr svg_create(IntPtr data);
+        public static extern IntPtr svg_create(IntPtr data, IntPtr fontManager);
         
         
         [DllImport(SkiaAPI.LibraryName)]
         [DllImport(SkiaAPI.LibraryName)]
         public static extern void svg_unref(IntPtr svg);
         public static extern void svg_unref(IntPtr svg);

+ 2 - 15
Source/QuestPDF/Skia/Text/SkFontCollection.cs

@@ -13,22 +13,9 @@ internal sealed class SkFontCollection : IDisposable
         SkiaAPI.EnsureNotNull(Instance);
         SkiaAPI.EnsureNotNull(Instance);
     }
     }
 
 
-    [StructLayout(LayoutKind.Sequential)]
-    private struct CreateCommand
-    {
-        public IntPtr FontManager;
-        public IntPtr TypefaceProvider;
-    }
-
     public static SkFontCollection Create(SkTypefaceProvider typefaceProvider, SkFontManager fontManager)
     public static SkFontCollection Create(SkTypefaceProvider typefaceProvider, SkFontManager fontManager)
     {
     {
-        var command = new CreateCommand
-        {
-            FontManager = fontManager.Instance,
-            TypefaceProvider = typefaceProvider.Instance
-        };
-        
-        var instance = API.font_collection_create(command);
+        var instance = API.font_collection_create(fontManager.Instance, typefaceProvider.Instance);
         return new SkFontCollection(instance);
         return new SkFontCollection(instance);
     }
     }
     
     
@@ -49,7 +36,7 @@ internal sealed class SkFontCollection : IDisposable
     private static class API
     private static class API
     {
     {
         [DllImport(SkiaAPI.LibraryName)]
         [DllImport(SkiaAPI.LibraryName)]
-        public static extern IntPtr font_collection_create(CreateCommand command);
+        public static extern IntPtr font_collection_create(IntPtr fontManager, IntPtr typefaceProvider);
         
         
         [DllImport(SkiaAPI.LibraryName)]
         [DllImport(SkiaAPI.LibraryName)]
         public static extern void font_collection_unref(IntPtr fontCollection);
         public static extern void font_collection_unref(IntPtr fontCollection);

+ 4 - 4
Source/QuestPDF/Skia/Text/SkFontManager.cs

@@ -7,8 +7,8 @@ internal sealed class SkFontManager
 {
 {
     public IntPtr Instance { get; }
     public IntPtr Instance { get; }
     
     
-    public static SkFontManager Empty { get; } = new(API.font_manager_get_empty());
-    public static SkFontManager Global { get; } = new(API.font_manager_create_default());
+    public static SkFontManager Local { get; } = new(API.font_manager_create_local(AppDomain.CurrentDomain.RelativeSearchPath ?? AppDomain.CurrentDomain.BaseDirectory));
+    public static SkFontManager Global { get; } = new(API.font_manager_create_global());
 
 
     private SkFontManager(IntPtr instance)
     private SkFontManager(IntPtr instance)
     {
     {
@@ -25,10 +25,10 @@ internal sealed class SkFontManager
     private static class API
     private static class API
     {
     {
         [DllImport(SkiaAPI.LibraryName)]
         [DllImport(SkiaAPI.LibraryName)]
-        public static extern IntPtr font_manager_get_empty();
+        public static extern IntPtr font_manager_create_local(string path);
         
         
         [DllImport(SkiaAPI.LibraryName)]
         [DllImport(SkiaAPI.LibraryName)]
-        public static extern IntPtr font_manager_create_default();
+        public static extern IntPtr font_manager_create_global();
         
         
         [DllImport(SkiaAPI.LibraryName)]
         [DllImport(SkiaAPI.LibraryName)]
         public static extern IntPtr font_manager_create_typeface(IntPtr fontManager, IntPtr fontData);
         public static extern IntPtr font_manager_create_typeface(IntPtr fontManager, IntPtr fontData);