Browse Source

SVG: added support for local and embedded images

Marcin Ziąbek 1 year ago
parent
commit
a2bda91c8e

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

@@ -35,7 +35,7 @@ internal class DynamicSvgImage : Element, IStateResettable
         if (svg == null)
         if (svg == null)
             return;
             return;
 
 
-        using var svgImage = new SkSvgImage(svg, FontManager.CurrentFontManager);
+        using var svgImage = new SkSvgImage(svg, SkResourceProvider.CurrentResourceProvider, FontManager.CurrentFontManager);
         Canvas.DrawSvg(svgImage, availableSpace);
         Canvas.DrawSvg(svgImage, availableSpace);
         
         
         IsRendered = true;
         IsRendered = true;

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

@@ -18,7 +18,7 @@ public class SvgImage
     
     
     private SvgImage(string content)
     private SvgImage(string content)
     {
     {
-        SkSvgImage = new SkSvgImage(content, FontManager.CurrentFontManager);    
+        SkSvgImage = new SkSvgImage(content, SkResourceProvider.CurrentResourceProvider, FontManager.CurrentFontManager);    
     }
     }
 
 
     ~SvgImage()
     ~SvgImage()

+ 29 - 0
Source/QuestPDF/Skia/SkResourceProvider.cs

@@ -0,0 +1,29 @@
+using System;
+using System.Runtime.InteropServices;
+using QuestPDF.Skia.Text;
+
+namespace QuestPDF.Skia;
+
+internal sealed class SkResourceProvider
+{
+    public IntPtr Instance { get; private set; }
+    
+    public static SkResourceProvider Local { get; } = new(SkFontManager.Local);
+    public static SkResourceProvider Global { get; } = new(SkFontManager.Global);
+    
+    internal static SkResourceProvider CurrentResourceProvider => Settings.UseEnvironmentFonts ? Global : Local;
+
+    private SkResourceProvider(SkFontManager fontManager)
+    {
+        var resourcesPath = AppDomain.CurrentDomain.RelativeSearchPath ?? AppDomain.CurrentDomain.BaseDirectory;
+        
+        Instance = API.resource_provider_create(resourcesPath, fontManager.Instance);
+        SkiaAPI.EnsureNotNull(Instance);
+    }
+    
+    private static class API
+    {
+        [DllImport(SkiaAPI.LibraryName, CallingConvention = CallingConvention.Cdecl)]
+        public static extern IntPtr resource_provider_create(string resourcesPath, IntPtr fontManager);
+    }
+}

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

@@ -33,11 +33,11 @@ internal sealed class SkSvgImage : IDisposable
     public SkSvgImageSize Size;
     public SkSvgImageSize Size;
     public SkRect ViewBox;
     public SkRect ViewBox;
     
     
-    public SkSvgImage(string svgString, SkFontManager fontManager)
+    public SkSvgImage(string svgString, SkResourceProvider resourceProvider, 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, fontManager.Instance);
+        Instance = API.svg_create(data.Instance, resourceProvider.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.");
@@ -73,7 +73,7 @@ internal sealed class SkSvgImage : IDisposable
     private static class API
     private static class API
     {
     {
         [DllImport(SkiaAPI.LibraryName, CallingConvention = CallingConvention.Cdecl)]
         [DllImport(SkiaAPI.LibraryName, CallingConvention = CallingConvention.Cdecl)]
-        public static extern IntPtr svg_create(IntPtr data, IntPtr fontManager);
+        public static extern IntPtr svg_create(IntPtr data, IntPtr resourceProvider, IntPtr fontManager);
         
         
         [DllImport(SkiaAPI.LibraryName, CallingConvention = CallingConvention.Cdecl)]
         [DllImport(SkiaAPI.LibraryName, CallingConvention = CallingConvention.Cdecl)]
         public static extern void svg_unref(IntPtr svg);
         public static extern void svg_unref(IntPtr svg);