diff --git a/src/MediaConverters/MediaConverters.Lib/Imaging/Optimizations/ImageFileOptimization.cs b/src/MediaConverters/MediaConverters.Lib/Imaging/Optimizations/ImageFileOptimization.cs index 6129f80..1a8c18f 100644 --- a/src/MediaConverters/MediaConverters.Lib/Imaging/Optimizations/ImageFileOptimization.cs +++ b/src/MediaConverters/MediaConverters.Lib/Imaging/Optimizations/ImageFileOptimization.cs @@ -10,10 +10,6 @@ using SixLabors.ImageSharp.PixelFormats; using SixLabors.ImageSharp.Processing; -using SkiaSharp; - -using Svg.Skia; - namespace DotNetCampus.MediaConverters.Imaging.Optimizations; public static class ImageFileOptimization @@ -64,50 +60,12 @@ public static async Task OptimizeImageFileAsync(Ima if (IsExtension(".svg")) { - // 如果是 svg 那就直接转换了,因为后续叠加特效等逻辑都不能支持 SVG 格式 - try - { - var outputFilePath = ConvertSvgToPngFile(context); - if (outputFilePath is null) - { - return new ImageFileOptimizationResult() - { - OptimizedImageFile = null, - FailureReason = ImageFileOptimizationFailureReason.NotSupported - }; - } - else - { - context.LogMessage($"Success ConvertSvgToPngFile. Update current image file to '{outputFilePath.FullName}'"); - context = context with - { - ImageFile = outputFilePath - }; - } - } - catch (Exception e) - { - context.LogMessage($"Convert SVG to PNG failed: {e}"); - - return ImageFileOptimizationResult.FailException(e); - } + return ImageFileOptimizationResult.NotSupported(); } else if (IsExtension(".wmf") || IsExtension(".emf")) { - var result = EnhancedGraphicsMetafileOptimization.ConvertWmfOrEmfToPngFile(context); - if (result.OptimizedImageFile is not null) - { - context.LogMessage($"Success ConvertWmfOrEmfToPngFile. Update current image file to '{result.OptimizedImageFile}'"); - context = context with - { - ImageFile = result.OptimizedImageFile - }; - } - else - { - return result; - } + return ImageFileOptimizationResult.NotSupported(); } context.LogMessage($"Start optimize image with ImageSharp. ImageFile: '{context.ImageFile.FullName}'"); @@ -167,13 +125,17 @@ public static async Task OptimizeImageFileAsync(Ima OptimizeImage(image, maxImageWidth, maxImageHeight, useAreaSizeLimit); - // 重新保存即可 var outputImageFilePath = Path.Join(workingFolder.FullName, $"{Path.GetRandomFileName()}.png"); - await image.SaveAsPngAsync(outputImageFilePath, new PngEncoder() + if (context.ShouldSaveToPngFile) { - ColorType = PngColorType.RgbWithAlpha, - BitDepth = PngBitDepth.Bit8, - }); + // 重新保存即可,保存就等于解决了各种格式问题,输出为标准的格式 + await image.SaveAsPngAsync(outputImageFilePath, new PngEncoder() + { + ColorType = PngColorType.RgbWithAlpha, + BitDepth = PngBitDepth.Bit8, + CompressionLevel = ((PngCompressionLevel?) context.PngCompressionLevel) ?? PngCompressionLevel.DefaultCompression + }); + } return new ImageFileOptimizationResult() { @@ -303,96 +265,4 @@ public static void LimitImageSize(Image image, int? maxImageWidth, int? /// 图片压缩的最大高度 /// private const int MaxHeight = 2160; - - /// - /// 转换 svg 文件为 png 文件 - /// - /// - public static FileInfo? ConvertSvgToPngFile(ImageFileOptimizationContext context) - { - var imageFile = context.ImageFile; - var workingFolder = context.WorkingFolder; - - using var skSvg = new SKSvg(); - using var skPicture = skSvg.Load(imageFile.FullName); - var outputFile = Path.Join(workingFolder.FullName, - $"SVG_{Path.GetRandomFileName()}.png"); - var canSave = skSvg.Save(outputFile, SKColors.Transparent); - if (canSave && File.Exists(outputFile)) - { - return new FileInfo(outputFile); - } - - // 转换失败 - return null; - } - - public static async Task FixSvgInvalidCharacterAsync(FileInfo svgFile, - DirectoryInfo workingFolder) - { - using var fileStream = svgFile.OpenRead(); - using var streamReader = new StreamReader(fileStream); - - var xDocument = await XDocument.LoadAsync(streamReader, LoadOptions.SetLineInfo, CancellationToken.None); - bool anyUpdate = false; - - foreach (var xElement in xDocument.Descendants("text")) - { - var value = xElement.Value; - if (!string.IsNullOrEmpty(value) && value.Length > 0 && value[0] is var c && c == 0xFFFD) - { - // 0xFFFFD 是 utf8 特殊字符 - // 画出来就是�符号,不如删掉 - xElement.Value = string.Empty; - - anyUpdate = true; - } - } - - if (anyUpdate) - { - var convertedFile = Path.Join(workingFolder.FullName, $"FixSVG_{Path.GetRandomFileName()}.svg"); - using var stream = File.Create(convertedFile); - await xDocument.SaveAsync(stream, SaveOptions.None, CancellationToken.None); - return new FileInfo(convertedFile); - } - - // 啥都不用改,返回原图 - return svgFile; - } - - public static FileInfo FixSvgInvalidCharacter(ImageFileOptimizationContext context) - { - FileInfo svgFile = context.ImageFile; - DirectoryInfo workingFolder = context.WorkingFolder; - - using var fileStream = svgFile.OpenRead(); - using var streamReader = new StreamReader(fileStream); - - var xDocument = XDocument.Load(streamReader, LoadOptions.SetLineInfo); - bool anyUpdate = false; - - foreach (var xElement in xDocument.Descendants("text")) - { - var value = xElement.Value; - if (!string.IsNullOrEmpty(value) && value.Length > 0 && value[0] is var c && c == 0xFFFD) - { - // 0xFFFFD 是 utf8 特殊字符 - // 画出来就是�符号,不如删掉 - xElement.Value = string.Empty; - - anyUpdate = true; - } - } - - if (anyUpdate) - { - var convertedFile = Path.Join(workingFolder.FullName, $"FixSVG_{Path.GetRandomFileName()}.svg"); - xDocument.Save(convertedFile); - return new FileInfo(convertedFile); - } - - // 啥都不用改,返回原图 - return svgFile; - } } \ No newline at end of file diff --git a/src/MediaConverters/MediaConverters.Lib/Imaging/Optimizations/ImageFileOptimizationContext.cs b/src/MediaConverters/MediaConverters.Lib/Imaging/Optimizations/ImageFileOptimizationContext.cs index ef34a4e..21036ff 100644 --- a/src/MediaConverters/MediaConverters.Lib/Imaging/Optimizations/ImageFileOptimizationContext.cs +++ b/src/MediaConverters/MediaConverters.Lib/Imaging/Optimizations/ImageFileOptimizationContext.cs @@ -19,7 +19,13 @@ public readonly record struct ImageFileOptimizationContext(FileInfo ImageFile, public bool ShouldLogToFile { get; init; } = false; + /// + /// 是否应该保存为 PNG 文件。为 false 则只存放到内存,不存放到文件 + /// + public bool ShouldSaveToPngFile { get; init; } = true; + public string? LogFileName { get; init; } + public int? PngCompressionLevel { get; init; } public void LogMessage(string message) { diff --git a/src/MediaConverters/MediaConverters.Lib/Imaging/Optimizations/ImageFileOptimizationResult.cs b/src/MediaConverters/MediaConverters.Lib/Imaging/Optimizations/ImageFileOptimizationResult.cs index aa30cf1..6d155e9 100644 --- a/src/MediaConverters/MediaConverters.Lib/Imaging/Optimizations/ImageFileOptimizationResult.cs +++ b/src/MediaConverters/MediaConverters.Lib/Imaging/Optimizations/ImageFileOptimizationResult.cs @@ -20,8 +20,7 @@ public readonly record struct ImageFileOptimizationResult() : IDisposable public Exception? Exception { get; init; } public ImageFileOptimizationFailureReason FailureReason { get; init; } = ImageFileOptimizationFailureReason.Ok; - [MemberNotNullWhen(true, nameof(OptimizedImageFile))] - public bool IsSuccess => OptimizedImageFile is not null; + public bool IsSuccess => OptimizedImageFile is not null || Image is not null; public Image? Image { get; init; } @@ -39,4 +38,13 @@ public static ImageFileOptimizationResult FailException(Exception e) FailureReason = ImageFileOptimizationFailureReason.Exception }; } + + public static ImageFileOptimizationResult NotSupported() + { + return new ImageFileOptimizationResult() + { + OptimizedImageFile = null, + FailureReason = ImageFileOptimizationFailureReason.NotSupported + }; + } } \ No newline at end of file diff --git a/src/MediaConverters/MediaConverters.Lib/MediaConverters.Lib.csproj b/src/MediaConverters/MediaConverters.Lib/MediaConverters.Lib.csproj index ac5814b..3de5b18 100644 --- a/src/MediaConverters/MediaConverters.Lib/MediaConverters.Lib.csproj +++ b/src/MediaConverters/MediaConverters.Lib/MediaConverters.Lib.csproj @@ -11,14 +11,6 @@ - - - - - - - - diff --git a/src/MediaConverters/MediaConverters.Tests/Imaging/Optimizations/ImageFileOptimizationTests.cs b/src/MediaConverters/MediaConverters.Tests/Imaging/Optimizations/ImageFileOptimizationTests.cs index 5c8df2c..d11e547 100644 --- a/src/MediaConverters/MediaConverters.Tests/Imaging/Optimizations/ImageFileOptimizationTests.cs +++ b/src/MediaConverters/MediaConverters.Tests/Imaging/Optimizations/ImageFileOptimizationTests.cs @@ -89,14 +89,14 @@ public async Task OptimizeImageFileAsyncTest_FormatTga() TestHelper.OpenFileInExplorer(imageFileOptimizationResult.OptimizedImageFile!); } - [TestMethod()] - public async Task OptimizeImageFileAsyncTest_FormatWmf() - { - var file = TestFileProvider.GetTestFile("sample.wmf"); - var imageFileOptimizationResult = await ImageFileOptimization.OptimizeImageFileAsync(new ImageFileOptimizationContext(file, TestHelper.WorkingDirectory)); - Assert.AreEqual(true, imageFileOptimizationResult.IsSuccess); - Assert.AreEqual(ImageFileOptimizationFailureReason.Ok, imageFileOptimizationResult.FailureReason); - } + //[TestMethod()] + //public async Task OptimizeImageFileAsyncTest_FormatWmf() + //{ + // var file = TestFileProvider.GetTestFile("sample.wmf"); + // var imageFileOptimizationResult = await ImageFileOptimization.OptimizeImageFileAsync(new ImageFileOptimizationContext(file, TestHelper.WorkingDirectory)); + // Assert.AreEqual(true, imageFileOptimizationResult.IsSuccess); + // Assert.AreEqual(ImageFileOptimizationFailureReason.Ok, imageFileOptimizationResult.FailureReason); + //} [TestMethod()] public async Task OptimizeImageFileAsyncTest_Orientation() diff --git a/src/MediaConverters/MediaConverters.Tests/Tool/MediaConverterIpcTests.cs b/src/MediaConverters/MediaConverters.Tests/Tool/MediaConverterIpcTests.cs index 8eb9080..daeb5be 100644 --- a/src/MediaConverters/MediaConverters.Tests/Tool/MediaConverterIpcTests.cs +++ b/src/MediaConverters/MediaConverters.Tests/Tool/MediaConverterIpcTests.cs @@ -1,5 +1,6 @@ using System.Text.Json; using System.Text.Json.Serialization; +using dotnetCampus.Ipc.Context; using dotnetCampus.Ipc.IpcRouteds.DirectRouteds; using DotNetCampus.MediaConverters.CommandLineHandlers; using DotNetCampus.MediaConverters.Contexts; @@ -26,7 +27,8 @@ public async Task TestBatchImage() var task = Task.Run(async () => { - var provider = new JsonIpcDirectRoutedProvider(); + var provider = new JsonIpcDirectRoutedProvider(ipcConfiguration: new IpcConfiguration() + .UseSystemTextJsonIpcObjectSerializer(MediaConverterJsonSerializerSourceGenerationContext.Default)); var clientProxy = await provider.GetAndConnectClientAsync(ipcHandler.IpcName); var response = await clientProxy.GetResponseAsync(IpcPaths.RequestConvertImage, new IpcConvertImageRequest() @@ -95,9 +97,9 @@ public async Task TestBatchImage() Assert.AreEqual(MediaConverterErrorCode.Success.Code, response.Code); }); - await ipcHandler.RunAsync(); + await ipcHandler.RunAsync().WaitAsync(TimeSpan.FromMinutes(15)); - await task; + await task.WaitAsync(TimeSpan.FromMinutes(15)); } private static string ToConfigurationFile(ImageConvertContext imageConvertContext,string testFolder) diff --git a/src/MediaConverters/MediaConverters.Tool/CommandLineHandlers/IpcHandlers/IpcHandler.cs b/src/MediaConverters/MediaConverters.Tool/CommandLineHandlers/IpcHandlers/IpcHandler.cs index ef49a5b..9f75cb3 100644 --- a/src/MediaConverters/MediaConverters.Tool/CommandLineHandlers/IpcHandlers/IpcHandler.cs +++ b/src/MediaConverters/MediaConverters.Tool/CommandLineHandlers/IpcHandlers/IpcHandler.cs @@ -45,7 +45,7 @@ public async Task RunAsync() SharedArrayPool = new SharedArrayPool(ArrayPool.Shared), IpcTaskScheduling = IpcTaskScheduling.GlobalConcurrent, }; - ipcConfiguration.UseSystemJsonIpcObjectSerializer(MediaConverterJsonSerializerSourceGenerationContext.Default); + ipcConfiguration.UseSystemTextJsonIpcObjectSerializer(MediaConverterJsonSerializerSourceGenerationContext.Default); var ipcProvider = new IpcProvider(IpcName, ipcConfiguration); diff --git a/src/MediaConverters/MediaConverters.Tool/MediaConverters.Tool.csproj b/src/MediaConverters/MediaConverters.Tool/MediaConverters.Tool.csproj index de94b8b..173132c 100644 --- a/src/MediaConverters/MediaConverters.Tool/MediaConverters.Tool.csproj +++ b/src/MediaConverters/MediaConverters.Tool/MediaConverters.Tool.csproj @@ -10,18 +10,14 @@ true true false + true + true false - - - - - - - - + + diff --git a/src/MediaConverters/MediaConverters.Tool/Program.cs b/src/MediaConverters/MediaConverters.Tool/Program.cs index 2d74107..c7ea23f 100644 --- a/src/MediaConverters/MediaConverters.Tool/Program.cs +++ b/src/MediaConverters/MediaConverters.Tool/Program.cs @@ -24,7 +24,7 @@ static async Task Main(string[] args) if (args.Length == 0 || args.Length == 1) { // 调试模式 - var inputFile = "image.wmf"; + var inputFile = "image.png"; if (args.Length == 1) { inputFile = args[0]; @@ -55,7 +55,7 @@ static async Task Main(string[] args) }); } - return await DotNetCampus.Cli.CommandLine.Parse(args) + return await DotNetCampus.Cli.CommandLine.Parse(args, CommandLineParsingOptions.PowerShell) .AddHandler() .AddHandler() .RunAsync() @@ -87,8 +87,14 @@ internal static async Task RunAsync(ConvertHandler convertHandler) var context = new ImageFileOptimizationContext(inputFile, workingFolder, imageConvertContext.MaxImageWidth, imageConvertContext.MaxImageHeight) { + // 由于不准备在此步骤保存为文件,所以不需要设置保存等级 + //PngCompressionLevel = imageConvertContext.PngCompressionLevel, + ShouldLogToConsole = convertHandler.ShouldLogToConsole ?? false, ShouldLogToFile = convertHandler.ShouldLogToFile ?? false, + + // 不要在优化图片步骤时保存为文件,因为后续可能还会进行转换任务。统一一个逻辑执行保存即可 + ShouldSaveToPngFile = false, }; context.LogMessage($"[Performance] FromJsonText cost {stepStopwatch.ElapsedMilliseconds}ms Total {totalStopwatch.ElapsedMilliseconds}ms"); @@ -99,7 +105,9 @@ internal static async Task RunAsync(ConvertHandler convertHandler) context.LogMessage($"[Performance] OptimizeImageFileAsync cost {stepStopwatch.ElapsedMilliseconds}ms Total {totalStopwatch.ElapsedMilliseconds}ms"); stepStopwatch.Restart(); - if (!imageFileOptimizationResult.IsSuccess) + var image = imageFileOptimizationResult.Image; + + if (!imageFileOptimizationResult.IsSuccess || image is null) { var errorMessage = $"Failed to convert image file '{inputFile.FullName}'. Reason: {imageFileOptimizationResult.FailureReason}"; if (imageFileOptimizationResult.Exception is { } exception) @@ -133,10 +141,7 @@ internal static async Task RunAsync(ConvertHandler convertHandler) return ErrorCode.UnknownError; } - FileInfo optimizedImageFile = imageFileOptimizationResult.OptimizedImageFile; - var image = imageFileOptimizationResult.Image; - - if (image is not null && imageConvertContext.ImageConvertTaskList is { } list) + if (imageConvertContext.ImageConvertTaskList is { } list) { var workerProvider = new WorkerProvider(); @@ -147,27 +152,25 @@ internal static async Task RunAsync(ConvertHandler convertHandler) context.LogMessage($"[Performance] RunWorkerProvider cost {stepStopwatch.ElapsedMilliseconds}ms Total {totalStopwatch.ElapsedMilliseconds}ms"); stepStopwatch.Restart(); - - await image.SaveAsPngAsync(convertHandler.OutputFile, new PngEncoder() - { - ColorType = PngColorType.RgbWithAlpha, - BitDepth = PngBitDepth.Bit8, - // 压缩等级 1-9,数值越大压缩率越高但速度越慢,默认值为 6。在 1-9 范围外的值会被视为默认值 - CompressionLevel = imageConvertContext.PngCompressionLevel is >= 1 and <= 9 - ? (PngCompressionLevel)imageConvertContext.PngCompressionLevel - // 范围外,使用默认值 - : PngCompressionLevel.DefaultCompression - }); - - context.LogMessage($"[Performance] SaveAsPngAsync cost {stepStopwatch.ElapsedMilliseconds}ms Total {totalStopwatch.ElapsedMilliseconds}ms"); } else { - optimizedImageFile.CopyTo(convertHandler.OutputFile, overwrite: true); - - context.LogMessage($"[Performance] CopyTo cost {stepStopwatch.ElapsedMilliseconds}ms Total {totalStopwatch.ElapsedMilliseconds}ms"); + // 没有任何转换任务,啥都不干 } + await image.SaveAsPngAsync(convertHandler.OutputFile, new PngEncoder() + { + ColorType = PngColorType.RgbWithAlpha, + BitDepth = PngBitDepth.Bit8, + // 压缩等级 1-9,数值越大压缩率越高但速度越慢,默认值为 6。在 1-9 范围外的值会被视为默认值 + CompressionLevel = imageConvertContext.PngCompressionLevel is >= 1 and <= 9 + ? (PngCompressionLevel) imageConvertContext.PngCompressionLevel + // 范围外,使用默认值 + : PngCompressionLevel.DefaultCompression + }); + + context.LogMessage($"[Performance] SaveAsPngAsync cost {stepStopwatch.ElapsedMilliseconds}ms Total {totalStopwatch.ElapsedMilliseconds}ms"); + totalStopwatch.Stop(); context.LogMessage($"Success converted image. Cost {totalStopwatch.ElapsedMilliseconds}ms. OutputFile:'{convertHandler.OutputFile}'"); diff --git a/src/MediaConverters/README.md b/src/MediaConverters/README.md index 51f81cf..d91eb2c 100644 --- a/src/MediaConverters/README.md +++ b/src/MediaConverters/README.md @@ -9,13 +9,13 @@ Verb: `convert` Command line parameters: ```shell ---WorkingFolder: Working directory ---InputFile: Path to the input file ---OutputFile: Path to the output file ---ConvertConfigurationFile: Path to the conversion configuration file +-WorkingFolder: Working directory +-InputFile: Path to the input file +-OutputFile: Path to the output file +-ConvertConfigurationFile: Path to the conversion configuration file ``` -The `--ConvertConfigurationFile` parameter specifies a JSON-format configuration file, which contains the settings for the conversion tasks. The configuration follows the structure of a serialized `ImageConvertContext` object, defined as follows: +The `-ConvertConfigurationFile` parameter specifies a JSON-format configuration file, which contains the settings for the conversion tasks. The configuration follows the structure of a serialized `ImageConvertContext` object, defined as follows: - **MaxImageWidth**: Maximum image width limit. Optional; if omitted or empty, no limit is applied. - **MaxImageHeight**: Maximum image height limit. Optional; if omitted or empty, no limit is applied. diff --git a/src/MediaConverters/README.zh-CN.md b/src/MediaConverters/README.zh-CN.md index e69d217..e4797c0 100644 --- a/src/MediaConverters/README.zh-CN.md +++ b/src/MediaConverters/README.zh-CN.md @@ -9,13 +9,13 @@ Verb: `convert` 命令行参数: ```shell ---WorkingFolder: 工作目录 ---InputFile: 输入文件路径 ---OutputFile: 输出文件路径 ---ConvertConfigurationFile: 转换配置文件路径 +-WorkingFolder: 工作目录 +-InputFile: 输入文件路径 +-OutputFile: 输出文件路径 +-ConvertConfigurationFile: 转换配置文件路径 ``` -其中 `--ConvertConfigurationFile` 转换配置文件是一个 Json 格式的文件,里面包含转换的任务的配置内容。配置内容格式为 ImageConvertContext 类型的序列化内容,具体定义如下: +其中 `-ConvertConfigurationFile` 转换配置文件是一个 Json 格式的文件,里面包含转换的任务的配置内容。配置内容格式为 ImageConvertContext 类型的序列化内容,具体定义如下: - MaxImageWidth: 最大图片宽度限制。可不填或为空,表示不限制 - MaxImageHeight: 最大图片高度限制。可不填或为空,表示不限制 diff --git a/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/Build/Core.props b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/Build/Core.props new file mode 100644 index 0000000..5580cf5 --- /dev/null +++ b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/Build/Core.props @@ -0,0 +1,10 @@ + + + + + + + \ No newline at end of file diff --git a/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/Build/Package.props b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/Build/Package.props new file mode 100644 index 0000000..88bf8ae --- /dev/null +++ b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/Build/Package.props @@ -0,0 +1,3 @@ + + + diff --git a/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/Build/Package.targets b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/Build/Package.targets new file mode 100644 index 0000000..f240c79 --- /dev/null +++ b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/Build/Package.targets @@ -0,0 +1,5 @@ + + + + + diff --git a/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/BuildTransitive/Package.props b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/BuildTransitive/Package.props new file mode 100644 index 0000000..42f14aa --- /dev/null +++ b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/BuildTransitive/Package.props @@ -0,0 +1,3 @@ + + + diff --git a/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/BuildTransitive/Package.targets b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/BuildTransitive/Package.targets new file mode 100644 index 0000000..f240c79 --- /dev/null +++ b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/BuildTransitive/Package.targets @@ -0,0 +1,5 @@ + + + + + diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/Fonts/StandardSymbolsPS.ttf b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/Fonts/StandardSymbolsPS.ttf similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/Fonts/StandardSymbolsPS.ttf rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/Fonts/StandardSymbolsPS.ttf diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/NimbusMonoPS-Bold.afm b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/NimbusMonoPS-Bold.afm similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/NimbusMonoPS-Bold.afm rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/NimbusMonoPS-Bold.afm diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/NimbusMonoPS-Bold.t1 b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/NimbusMonoPS-Bold.t1 similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/NimbusMonoPS-Bold.t1 rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/NimbusMonoPS-Bold.t1 diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/NimbusMonoPS-BoldItalic.afm b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/NimbusMonoPS-BoldItalic.afm similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/NimbusMonoPS-BoldItalic.afm rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/NimbusMonoPS-BoldItalic.afm diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/NimbusMonoPS-BoldItalic.t1 b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/NimbusMonoPS-BoldItalic.t1 similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/NimbusMonoPS-BoldItalic.t1 rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/NimbusMonoPS-BoldItalic.t1 diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/NimbusMonoPS-Italic.afm b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/NimbusMonoPS-Italic.afm similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/NimbusMonoPS-Italic.afm rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/NimbusMonoPS-Italic.afm diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/NimbusMonoPS-Italic.t1 b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/NimbusMonoPS-Italic.t1 similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/NimbusMonoPS-Italic.t1 rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/NimbusMonoPS-Italic.t1 diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/NimbusMonoPS-Regular.afm b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/NimbusMonoPS-Regular.afm similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/NimbusMonoPS-Regular.afm rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/NimbusMonoPS-Regular.afm diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/NimbusMonoPS-Regular.t1 b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/NimbusMonoPS-Regular.t1 similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/NimbusMonoPS-Regular.t1 rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/NimbusMonoPS-Regular.t1 diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/NimbusRoman-Bold.afm b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/NimbusRoman-Bold.afm similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/NimbusRoman-Bold.afm rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/NimbusRoman-Bold.afm diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/NimbusRoman-Bold.t1 b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/NimbusRoman-Bold.t1 similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/NimbusRoman-Bold.t1 rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/NimbusRoman-Bold.t1 diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/NimbusRoman-BoldItalic.afm b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/NimbusRoman-BoldItalic.afm similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/NimbusRoman-BoldItalic.afm rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/NimbusRoman-BoldItalic.afm diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/NimbusRoman-BoldItalic.t1 b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/NimbusRoman-BoldItalic.t1 similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/NimbusRoman-BoldItalic.t1 rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/NimbusRoman-BoldItalic.t1 diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/NimbusRoman-Italic.afm b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/NimbusRoman-Italic.afm similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/NimbusRoman-Italic.afm rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/NimbusRoman-Italic.afm diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/NimbusRoman-Italic.t1 b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/NimbusRoman-Italic.t1 similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/NimbusRoman-Italic.t1 rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/NimbusRoman-Italic.t1 diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/NimbusRoman-Regular.afm b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/NimbusRoman-Regular.afm similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/NimbusRoman-Regular.afm rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/NimbusRoman-Regular.afm diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/NimbusRoman-Regular.t1 b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/NimbusRoman-Regular.t1 similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/NimbusRoman-Regular.t1 rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/NimbusRoman-Regular.t1 diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/NimbusSans-Bold.afm b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/NimbusSans-Bold.afm similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/NimbusSans-Bold.afm rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/NimbusSans-Bold.afm diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/NimbusSans-Bold.t1 b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/NimbusSans-Bold.t1 similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/NimbusSans-Bold.t1 rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/NimbusSans-Bold.t1 diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/NimbusSans-BoldItalic.afm b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/NimbusSans-BoldItalic.afm similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/NimbusSans-BoldItalic.afm rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/NimbusSans-BoldItalic.afm diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/NimbusSans-BoldItalic.t1 b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/NimbusSans-BoldItalic.t1 similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/NimbusSans-BoldItalic.t1 rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/NimbusSans-BoldItalic.t1 diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/NimbusSans-Italic.afm b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/NimbusSans-Italic.afm similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/NimbusSans-Italic.afm rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/NimbusSans-Italic.afm diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/NimbusSans-Italic.t1 b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/NimbusSans-Italic.t1 similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/NimbusSans-Italic.t1 rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/NimbusSans-Italic.t1 diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/NimbusSans-Regular.afm b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/NimbusSans-Regular.afm similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/NimbusSans-Regular.afm rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/NimbusSans-Regular.afm diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/NimbusSans-Regular.t1 b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/NimbusSans-Regular.t1 similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/NimbusSans-Regular.t1 rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/NimbusSans-Regular.t1 diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/README.md b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/README.md similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/README.md rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/README.md diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/StandardSymbolsPS.afm b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/StandardSymbolsPS.afm similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/StandardSymbolsPS.afm rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/StandardSymbolsPS.afm diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/StandardSymbolsPS.t1 b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/StandardSymbolsPS.t1 similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/StandardSymbolsPS.t1 rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/StandardSymbolsPS.t1 diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/a010013l.afm b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/a010013l.afm similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/a010013l.afm rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/a010013l.afm diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/a010013l.pfb b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/a010013l.pfb similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/a010013l.pfb rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/a010013l.pfb diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/a010013l.pfm b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/a010013l.pfm similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/a010013l.pfm rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/a010013l.pfm diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/a010015l.afm b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/a010015l.afm similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/a010015l.afm rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/a010015l.afm diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/a010015l.pfb b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/a010015l.pfb similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/a010015l.pfb rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/a010015l.pfb diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/a010015l.pfm b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/a010015l.pfm similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/a010015l.pfm rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/a010015l.pfm diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/a010033l.afm b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/a010033l.afm similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/a010033l.afm rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/a010033l.afm diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/a010033l.pfb b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/a010033l.pfb similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/a010033l.pfb rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/a010033l.pfb diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/a010033l.pfm b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/a010033l.pfm similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/a010033l.pfm rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/a010033l.pfm diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/a010035l.afm b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/a010035l.afm similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/a010035l.afm rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/a010035l.afm diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/a010035l.pfb b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/a010035l.pfb similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/a010035l.pfb rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/a010035l.pfb diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/a010035l.pfm b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/a010035l.pfm similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/a010035l.pfm rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/a010035l.pfm diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/b018012l.afm b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/b018012l.afm similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/b018012l.afm rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/b018012l.afm diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/b018012l.pfb b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/b018012l.pfb similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/b018012l.pfb rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/b018012l.pfb diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/b018012l.pfm b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/b018012l.pfm similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/b018012l.pfm rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/b018012l.pfm diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/b018015l.afm b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/b018015l.afm similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/b018015l.afm rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/b018015l.afm diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/b018015l.pfb b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/b018015l.pfb similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/b018015l.pfb rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/b018015l.pfb diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/b018015l.pfm b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/b018015l.pfm similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/b018015l.pfm rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/b018015l.pfm diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/b018032l.afm b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/b018032l.afm similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/b018032l.afm rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/b018032l.afm diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/b018032l.pfb b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/b018032l.pfb similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/b018032l.pfb rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/b018032l.pfb diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/b018032l.pfm b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/b018032l.pfm similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/b018032l.pfm rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/b018032l.pfm diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/b018035l.afm b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/b018035l.afm similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/b018035l.afm rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/b018035l.afm diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/b018035l.pfb b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/b018035l.pfb similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/b018035l.pfb rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/b018035l.pfb diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/b018035l.pfm b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/b018035l.pfm similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/b018035l.pfm rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/b018035l.pfm diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/c059013l.afm b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/c059013l.afm similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/c059013l.afm rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/c059013l.afm diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/c059013l.pfb b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/c059013l.pfb similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/c059013l.pfb rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/c059013l.pfb diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/c059013l.pfm b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/c059013l.pfm similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/c059013l.pfm rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/c059013l.pfm diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/c059016l.afm b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/c059016l.afm similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/c059016l.afm rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/c059016l.afm diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/c059016l.pfb b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/c059016l.pfb similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/c059016l.pfb rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/c059016l.pfb diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/c059016l.pfm b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/c059016l.pfm similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/c059016l.pfm rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/c059016l.pfm diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/c059033l.afm b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/c059033l.afm similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/c059033l.afm rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/c059033l.afm diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/c059033l.pfb b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/c059033l.pfb similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/c059033l.pfb rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/c059033l.pfb diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/c059033l.pfm b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/c059033l.pfm similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/c059033l.pfm rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/c059033l.pfm diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/c059036l.afm b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/c059036l.afm similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/c059036l.afm rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/c059036l.afm diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/c059036l.pfb b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/c059036l.pfb similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/c059036l.pfb rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/c059036l.pfb diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/c059036l.pfm b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/c059036l.pfm similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/c059036l.pfm rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/c059036l.pfm diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/d050000l.afm b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/d050000l.afm similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/d050000l.afm rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/d050000l.afm diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/d050000l.pfb b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/d050000l.pfb similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/d050000l.pfb rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/d050000l.pfb diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/d050000l.pfm b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/d050000l.pfm similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/d050000l.pfm rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/d050000l.pfm diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n019003l.afm b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n019003l.afm similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n019003l.afm rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n019003l.afm diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n019003l.pfb b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n019003l.pfb similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n019003l.pfb rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n019003l.pfb diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n019003l.pfm b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n019003l.pfm similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n019003l.pfm rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n019003l.pfm diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n019004l.afm b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n019004l.afm similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n019004l.afm rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n019004l.afm diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n019004l.pfb b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n019004l.pfb similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n019004l.pfb rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n019004l.pfb diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n019004l.pfm b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n019004l.pfm similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n019004l.pfm rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n019004l.pfm diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n019023l.afm b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n019023l.afm similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n019023l.afm rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n019023l.afm diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n019023l.pfb b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n019023l.pfb similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n019023l.pfb rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n019023l.pfb diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n019023l.pfm b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n019023l.pfm similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n019023l.pfm rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n019023l.pfm diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n019024l.afm b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n019024l.afm similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n019024l.afm rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n019024l.afm diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n019024l.pfb b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n019024l.pfb similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n019024l.pfb rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n019024l.pfb diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n019024l.pfm b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n019024l.pfm similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n019024l.pfm rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n019024l.pfm diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n019043l.afm b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n019043l.afm similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n019043l.afm rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n019043l.afm diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n019043l.pfb b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n019043l.pfb similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n019043l.pfb rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n019043l.pfb diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n019043l.pfm b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n019043l.pfm similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n019043l.pfm rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n019043l.pfm diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n019044l.afm b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n019044l.afm similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n019044l.afm rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n019044l.afm diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n019044l.pfb b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n019044l.pfb similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n019044l.pfb rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n019044l.pfb diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n019044l.pfm b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n019044l.pfm similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n019044l.pfm rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n019044l.pfm diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n019063l.afm b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n019063l.afm similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n019063l.afm rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n019063l.afm diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n019063l.pfb b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n019063l.pfb similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n019063l.pfb rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n019063l.pfb diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n019063l.pfm b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n019063l.pfm similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n019063l.pfm rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n019063l.pfm diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n019064l.afm b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n019064l.afm similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n019064l.afm rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n019064l.afm diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n019064l.pfb b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n019064l.pfb similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n019064l.pfb rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n019064l.pfb diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n019064l.pfm b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n019064l.pfm similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n019064l.pfm rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n019064l.pfm diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n021003l.afm b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n021003l.afm similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n021003l.afm rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n021003l.afm diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n021003l.pfb b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n021003l.pfb similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n021003l.pfb rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n021003l.pfb diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n021003l.pfm b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n021003l.pfm similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n021003l.pfm rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n021003l.pfm diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n021004l.afm b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n021004l.afm similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n021004l.afm rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n021004l.afm diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n021004l.pfb b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n021004l.pfb similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n021004l.pfb rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n021004l.pfb diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n021004l.pfm b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n021004l.pfm similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n021004l.pfm rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n021004l.pfm diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n021023l.afm b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n021023l.afm similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n021023l.afm rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n021023l.afm diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n021023l.pfb b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n021023l.pfb similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n021023l.pfb rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n021023l.pfb diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n021023l.pfm b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n021023l.pfm similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n021023l.pfm rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n021023l.pfm diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n021024l.afm b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n021024l.afm similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n021024l.afm rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n021024l.afm diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n021024l.pfb b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n021024l.pfb similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n021024l.pfb rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n021024l.pfb diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n021024l.pfm b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n021024l.pfm similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n021024l.pfm rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n021024l.pfm diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n022003l.afm b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n022003l.afm similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n022003l.afm rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n022003l.afm diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n022003l.pfb b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n022003l.pfb similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n022003l.pfb rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n022003l.pfb diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n022003l.pfm b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n022003l.pfm similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n022003l.pfm rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n022003l.pfm diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n022004l.afm b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n022004l.afm similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n022004l.afm rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n022004l.afm diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n022004l.pfb b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n022004l.pfb similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n022004l.pfb rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n022004l.pfb diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n022004l.pfm b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n022004l.pfm similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n022004l.pfm rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n022004l.pfm diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n022023l.afm b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n022023l.afm similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n022023l.afm rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n022023l.afm diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n022023l.pfb b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n022023l.pfb similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n022023l.pfb rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n022023l.pfb diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n022023l.pfm b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n022023l.pfm similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n022023l.pfm rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n022023l.pfm diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n022024l.afm b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n022024l.afm similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n022024l.afm rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n022024l.afm diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n022024l.pfb b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n022024l.pfb similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n022024l.pfb rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n022024l.pfb diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n022024l.pfm b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n022024l.pfm similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/n022024l.pfm rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/n022024l.pfm diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/p052003l.afm b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/p052003l.afm similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/p052003l.afm rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/p052003l.afm diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/p052003l.pfb b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/p052003l.pfb similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/p052003l.pfb rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/p052003l.pfb diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/p052003l.pfm b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/p052003l.pfm similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/p052003l.pfm rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/p052003l.pfm diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/p052004l.afm b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/p052004l.afm similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/p052004l.afm rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/p052004l.afm diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/p052004l.pfb b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/p052004l.pfb similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/p052004l.pfb rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/p052004l.pfb diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/p052004l.pfm b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/p052004l.pfm similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/p052004l.pfm rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/p052004l.pfm diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/p052023l.afm b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/p052023l.afm similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/p052023l.afm rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/p052023l.afm diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/p052023l.pfb b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/p052023l.pfb similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/p052023l.pfb rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/p052023l.pfb diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/p052023l.pfm b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/p052023l.pfm similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/p052023l.pfm rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/p052023l.pfm diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/p052024l.afm b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/p052024l.afm similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/p052024l.afm rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/p052024l.afm diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/p052024l.pfb b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/p052024l.pfb similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/p052024l.pfb rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/p052024l.pfb diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/p052024l.pfm b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/p052024l.pfm similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/p052024l.pfm rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/p052024l.pfm diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/s050000l.afm b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/s050000l.afm similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/s050000l.afm rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/s050000l.afm diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/s050000l.pfb b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/s050000l.pfb similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/s050000l.pfb rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/s050000l.pfb diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/s050000l.pfm b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/s050000l.pfm similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/s050000l.pfm rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/s050000l.pfm diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/z003034l.afm b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/z003034l.afm similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/z003034l.afm rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/z003034l.afm diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/z003034l.pfb b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/z003034l.pfb similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/z003034l.pfb rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/z003034l.pfb diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/z003034l.pfm b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/z003034l.pfm similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/gsfonts/z003034l.pfm rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/gsfonts/z003034l.pfm diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/linux-arm64/README.md b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/linux-arm64/README.md similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/linux-arm64/README.md rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/linux-arm64/README.md diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/linux-arm64/libwmf-0.2.so.7 b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/linux-arm64/libwmf-0.2.so.7 similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/linux-arm64/libwmf-0.2.so.7 rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/linux-arm64/libwmf-0.2.so.7 diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/linux-arm64/libwmflite-0.2.so.7 b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/linux-arm64/libwmflite-0.2.so.7 similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/linux-arm64/libwmflite-0.2.so.7 rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/linux-arm64/libwmflite-0.2.so.7 diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/linux-arm64/wmf2svg b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/linux-arm64/wmf2svg similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/linux-arm64/wmf2svg rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/linux-arm64/wmf2svg diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/linux-loongarch64/libwmf-0.2.so.7 b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/linux-loongarch64/libwmf-0.2.so.7 similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/linux-loongarch64/libwmf-0.2.so.7 rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/linux-loongarch64/libwmf-0.2.so.7 diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/linux-loongarch64/libwmflite-0.2.so.7 b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/linux-loongarch64/libwmflite-0.2.so.7 similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/linux-loongarch64/libwmflite-0.2.so.7 rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/linux-loongarch64/libwmflite-0.2.so.7 diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/linux-loongarch64/wmf2svg b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/linux-loongarch64/wmf2svg similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/linux-loongarch64/wmf2svg rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/linux-loongarch64/wmf2svg diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/linux-x64/README.md b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/linux-x64/README.md similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/linux-x64/README.md rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/linux-x64/README.md diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/linux-x64/libwmf-0.2.so.7 b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/linux-x64/libwmf-0.2.so.7 similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/linux-x64/libwmf-0.2.so.7 rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/linux-x64/libwmf-0.2.so.7 diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/linux-x64/libwmflite-0.2.so.7 b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/linux-x64/libwmflite-0.2.so.7 similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/linux-x64/libwmflite-0.2.so.7 rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/linux-x64/libwmflite-0.2.so.7 diff --git a/src/MediaConverters/MediaConverters.Tool/Assets/linux-x64/wmf2svg b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/linux-x64/wmf2svg similarity index 100% rename from src/MediaConverters/MediaConverters.Tool/Assets/linux-x64/wmf2svg rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/linux-x64/wmf2svg diff --git a/src/MediaConverters/MediaConverters.Lib/Imaging/Optimizations/EnhancedGraphicsMetafileOptimization.cs b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Optimizations/EnhancedGraphicsMetafileOptimization.cs similarity index 64% rename from src/MediaConverters/MediaConverters.Lib/Imaging/Optimizations/EnhancedGraphicsMetafileOptimization.cs rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Optimizations/EnhancedGraphicsMetafileOptimization.cs index 620cde9..9e8fbfc 100644 --- a/src/MediaConverters/MediaConverters.Lib/Imaging/Optimizations/EnhancedGraphicsMetafileOptimization.cs +++ b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Optimizations/EnhancedGraphicsMetafileOptimization.cs @@ -1,27 +1,81 @@ -using System; -using System.ComponentModel; +using System.ComponentModel; using System.Diagnostics; using System.Drawing; using System.Drawing.Imaging; -using System.IO; using System.Runtime.InteropServices; using System.Runtime.Versioning; -using DotNetCampus.MediaConverter.SkiaWmfRenderer; - -namespace DotNetCampus.MediaConverters.Imaging.Optimizations; +namespace DotNetCampus.MediaConverter.SkiaWmfRenderer.Optimizations; /// -/// 增强图元优化方法,用于优化 emf 和 wmf 图片 +/// 提供用于将增强型图元(WMF/EMF)转换为 PNG 或 SVG 的工具方法。 +/// 此类会根据运行时平台选择合适的实现(Windows 使用 GDI+,Linux 使用 Inkscape/Skia/libwmf 等)。 /// public static class EnhancedGraphicsMetafileOptimization { - public static ImageFileOptimizationResult ConvertWmfOrEmfToPngFile(ImageFileOptimizationContext context) + /// + /// 尝试将矢量图文件(SVG/WMF/EMF)转换为 PNG 文件 + /// + /// + /// + /// + public static bool TryOptimizeSvgOrWmf(EnhancedGraphicsMetafileOptimizationContext context, + out EnhancedGraphicsMetafileOptimizationResult result) + { + if (IsExtension(".svg")) + { + // 如果是 svg 那就直接转换了,因为后续叠加特效等逻辑都不能支持 SVG 格式 + try + { + var outputFilePath = SvgFileOptimization.ConvertSvgToPngFile(in context); + result = new EnhancedGraphicsMetafileOptimizationResult() + { + OptimizedImageFile = outputFilePath, + }; + } + catch (Exception e) + { + context.LogMessage($"Convert SVG to PNG failed: {e}"); + + result = EnhancedGraphicsMetafileOptimizationResult.FailException(e); + } + + return true; + } + else if (IsExtension(".wmf") || + IsExtension(".emf")) + { + result = ConvertWmfOrEmfToPngFile(in context); + + return true; + } + else + { + result = new EnhancedGraphicsMetafileOptimizationResult() + { + // 无需转换 + NotNeedOptimize = true, + }; + return false; + } + + bool IsExtension(string extension) + { + return string.Equals(context.ImageFile.Extension, extension, StringComparison.OrdinalIgnoreCase); + } + } + + /// + /// 将 WMF 或 EMF 文件转换为 PNG 文件。根据当前运行平台选择合适的转换实现。 + /// + /// 包含要转换文件和工作目录等设置的上下文。 + /// 转换操作的结果,包含生成的文件或错误信息。 + public static EnhancedGraphicsMetafileOptimizationResult ConvertWmfOrEmfToPngFile(in EnhancedGraphicsMetafileOptimizationContext context) { // 在 Windows 上,直接使用 GDI+ 将 WMF 或 EMF 文件转换为 PNG 文件 if (OperatingSystem.IsWindowsVersionAtLeast(6, 1)) { - return ConvertInWindows(context); + return ConvertInWindows(in context); } if (OperatingSystem.IsLinux()) @@ -35,19 +89,15 @@ public static ImageFileOptimizationResult ConvertWmfOrEmfToPngFile(ImageFileOpti { context.LogMessage($"Convert wmf or emf in linux Fail. Exception: {e}"); - return ImageFileOptimizationResult.FailException(e); + return EnhancedGraphicsMetafileOptimizationResult.FailException(e); } } - return new ImageFileOptimizationResult() - { - OptimizedImageFile = null, - FailureReason = ImageFileOptimizationFailureReason.NotSupported - }; + return EnhancedGraphicsMetafileOptimizationResult.NotSupported(); } [SupportedOSPlatform("linux")] - private static ImageFileOptimizationResult ConvertInLinux(ImageFileOptimizationContext context) + private static EnhancedGraphicsMetafileOptimizationResult ConvertInLinux(EnhancedGraphicsMetafileOptimizationContext context) { var file = context.ImageFile; @@ -56,7 +106,7 @@ private static ImageFileOptimizationResult ConvertInLinux(ImageFileOptimizationC // 再使用 libwmf 进行转换 // 调用 Inkscape 进行转换 - ImageFileOptimizationResult result = ConvertWithInkscape(context); + EnhancedGraphicsMetafileOptimizationResult result = ConvertWithInkscape(context); if (result.OptimizedImageFile is { } svgFile) { return ConvertSvgToPngFile(svgFile); @@ -71,15 +121,11 @@ private static ImageFileOptimizationResult ConvertInLinux(ImageFileOptimizationC { context.LogMessage($"Convert emf to png is not supported with libwmf. File:'{context.ImageFile.FullName}'"); - return new ImageFileOptimizationResult() - { - OptimizedImageFile = null, - FailureReason = ImageFileOptimizationFailureReason.NotSupported - }; + return EnhancedGraphicsMetafileOptimizationResult.NotSupported(); } // 使用 SkiaWmfRenderer 进行转换 - result = ConvertWithSkiaWmfRenderer(context); + result = ConvertWithSkiaWmfRenderer(in context); if (result.IsSuccess) { return result; @@ -92,7 +138,7 @@ private static ImageFileOptimizationResult ConvertInLinux(ImageFileOptimizationC // 使用 libwmf 进行转换 - result = ConvertWithLibWmf(context); + result = ConvertWithLibWmf(in context); if (result.OptimizedImageFile is { } svgLibWmfFile) { return ConvertSvgToPngFile(svgLibWmfFile); @@ -102,45 +148,41 @@ private static ImageFileOptimizationResult ConvertInLinux(ImageFileOptimizationC return result; } - ImageFileOptimizationResult ConvertSvgToPngFile(FileInfo svgImageFile) + EnhancedGraphicsMetafileOptimizationResult ConvertSvgToPngFile(FileInfo svgImageFile) { try { - var convertSvgToPngFile = ImageFileOptimization.ConvertSvgToPngFile(context with + var convertSvgToPngFile = SvgFileOptimization.ConvertSvgToPngFile(context with { ImageFile = svgImageFile }); if (convertSvgToPngFile is not null) { - return new ImageFileOptimizationResult() + return new EnhancedGraphicsMetafileOptimizationResult() { OptimizedImageFile = convertSvgToPngFile }; } else { - return new ImageFileOptimizationResult() - { - OptimizedImageFile = null, - FailureReason = ImageFileOptimizationFailureReason.NotSupported - }; + return EnhancedGraphicsMetafileOptimizationResult.NotSupported(); } } catch (Exception e) { context.LogMessage($"Convert svg to png file failed. File: '{svgImageFile.FullName}' Exception: {e}"); - return ImageFileOptimizationResult.FailException(e); + return EnhancedGraphicsMetafileOptimizationResult.FailException(e); } } } /// - /// 使用自己写的基于 Oxage.Wmf 的 SkiaWmfRenderer 进行转换,可以比较好处理公式内容 + /// 使用基于 Oxage.Wmf 的 SkiaWmfRenderer 将 WMF/EMF 转换为 PNG。该方法适用于需要更好文本/公式支持的场景。 /// - /// - /// - private static ImageFileOptimizationResult ConvertWithSkiaWmfRenderer(ImageFileOptimizationContext context) + /// 包含输入文件、输出目录和尺寸限制等信息的上下文。 + /// 如果转换成功则返回包含输出 PNG 文件的结果,否则返回不支持或失败的结果。 + private static EnhancedGraphicsMetafileOptimizationResult ConvertWithSkiaWmfRenderer(in EnhancedGraphicsMetafileOptimizationContext context) { int requestWidth = context.MaxImageWidth ?? 0; int requestHeight = context.MaxImageHeight ?? 0; @@ -161,22 +203,18 @@ private static ImageFileOptimizationResult ConvertWithSkiaWmfRenderer(ImageFileO { context.LogMessage($"Success converted wmf to png by SkiaWmfRenderer. File:'{file}' Output:'{outputPngFile}'"); - return new ImageFileOptimizationResult() + return new EnhancedGraphicsMetafileOptimizationResult() { OptimizedImageFile = outputPngFile }; } context.LogMessage($"Fail convert wmf to png by SkiaWmfRenderer. File:'{file}'"); - return new ImageFileOptimizationResult() - { - OptimizedImageFile = null, - FailureReason = ImageFileOptimizationFailureReason.NotSupported - }; + return EnhancedGraphicsMetafileOptimizationResult.NotSupported(); } [SupportedOSPlatform("linux")] - private static ImageFileOptimizationResult ConvertWithLibWmf(ImageFileOptimizationContext context) + private static EnhancedGraphicsMetafileOptimizationResult ConvertWithLibWmf(in EnhancedGraphicsMetafileOptimizationContext context) { var file = context.ImageFile; var workingFolder = context.WorkingFolder; @@ -188,6 +226,7 @@ private static ImageFileOptimizationResult ConvertWithLibWmf(ImageFileOptimizati context.LogMessage($"Start convert wmf to svg by libwmf. File:'{file}' wmf2svg='{wmf2svgFile}'"); +#if NET7_0_OR_GREATER try { File.SetUnixFileMode(wmf2svgFile, UnixFileMode.UserExecute); @@ -196,6 +235,7 @@ private static ImageFileOptimizationResult ConvertWithLibWmf(ImageFileOptimizati { context.LogMessage($"File.SetUnixFileMode +x Fail. wmf2svgFile='{wmf2svgFile}'. Exception: {e}"); } +#endif // ./wmf2svg -o 1.svg image.wmf var processStartInfo = new ProcessStartInfo(wmf2svgFile) @@ -221,17 +261,17 @@ private static ImageFileOptimizationResult ConvertWithLibWmf(ImageFileOptimizati try { using var process = Process.Start(processStartInfo); - process?.WaitForExit(TimeSpan.FromSeconds(5)); + process?.WaitForExit(5000); if (process?.ExitCode == 0 && File.Exists(svgFile)) { // 转换成功,再次执行 SVG 转 PNG 的转换 // 由于可能存在 SVG 文件中包含无效字符的问题,因此需要修复一下 - var convertedFile = ImageFileOptimization.FixSvgInvalidCharacter(context with + var convertedFile = SvgFileOptimization.FixSvgInvalidCharacter(context with { ImageFile = new FileInfo(svgFile) }); - return new ImageFileOptimizationResult() + return new EnhancedGraphicsMetafileOptimizationResult() { OptimizedImageFile = convertedFile }; @@ -245,18 +285,14 @@ private static ImageFileOptimizationResult ConvertWithLibWmf(ImageFileOptimizati { // 比如 wmf2svg: error while loading shared libraries: libwmf-0.2.so.7: cannot open shared object file: No such file or directory 等错误 context.LogMessage($"Convert emf or wmf to svg by libwmf failed. File:'{file}' Exception: {e}"); - return ImageFileOptimizationResult.FailException(e); + return EnhancedGraphicsMetafileOptimizationResult.FailException(e); } - return new ImageFileOptimizationResult() - { - OptimizedImageFile = null, - FailureReason = ImageFileOptimizationFailureReason.NotSupported, - }; + return EnhancedGraphicsMetafileOptimizationResult.NotSupported(); } [SupportedOSPlatform("linux")] - private static ImageFileOptimizationResult ConvertWithInkscape(ImageFileOptimizationContext context) + private static EnhancedGraphicsMetafileOptimizationResult ConvertWithInkscape(EnhancedGraphicsMetafileOptimizationContext context) { var file = context.ImageFile; var workingFolder = context.WorkingFolder; @@ -277,11 +313,11 @@ private static ImageFileOptimizationResult ConvertWithInkscape(ImageFileOptimiza try { using var process = Process.Start(processStartInfo); - process?.WaitForExit(TimeSpan.FromSeconds(5)); + process?.WaitForExit(5000); if (process?.ExitCode == 0 && File.Exists(svgFile)) { // 转换成功,再次执行 SVG 转 PNG 的转换 - return new ImageFileOptimizationResult() + return new EnhancedGraphicsMetafileOptimizationResult() { OptimizedImageFile = new FileInfo(svgFile) }; @@ -306,18 +342,14 @@ private static ImageFileOptimizationResult ConvertWithInkscape(ImageFileOptimiza context.LogMessage($"Convert emf or wmf to svg by Inkscape failed. We will continue use libwmf to convert the image. File:'{file}' Exception: {e}"); } - return ImageFileOptimizationResult.FailException(e); + return EnhancedGraphicsMetafileOptimizationResult.FailException(e); } - return new ImageFileOptimizationResult() - { - OptimizedImageFile = null, - FailureReason = ImageFileOptimizationFailureReason.NotSupported, - }; + return EnhancedGraphicsMetafileOptimizationResult.NotSupported(); } [SupportedOSPlatform("windows6.1")] - private static ImageFileOptimizationResult ConvertInWindows(ImageFileOptimizationContext context) + private static EnhancedGraphicsMetafileOptimizationResult ConvertInWindows(in EnhancedGraphicsMetafileOptimizationContext context) { var file = context.ImageFile; var workingFolder = context.WorkingFolder; @@ -332,7 +364,7 @@ private static ImageFileOptimizationResult ConvertInWindows(ImageFileOptimizatio // 将增强型图形元文件转成位图。 emf.Save(convertedFile, ImageFormat.Png); - return new ImageFileOptimizationResult() + return new EnhancedGraphicsMetafileOptimizationResult() { OptimizedImageFile = new FileInfo(convertedFile), }; @@ -341,12 +373,7 @@ private static ImageFileOptimizationResult ConvertInWindows(ImageFileOptimizatio { context.LogMessage($"Fail convert emf or wmf to png by GDI. File:'{file}' Exception:{e}"); - return new ImageFileOptimizationResult - { - OptimizedImageFile = null, - Exception = e, - FailureReason = ImageFileOptimizationFailureReason.GdiException - }; + return EnhancedGraphicsMetafileOptimizationResult.FailException(e); } } } \ No newline at end of file diff --git a/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Optimizations/EnhancedGraphicsMetafileOptimizationContext.cs b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Optimizations/EnhancedGraphicsMetafileOptimizationContext.cs new file mode 100644 index 0000000..e640997 --- /dev/null +++ b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Optimizations/EnhancedGraphicsMetafileOptimizationContext.cs @@ -0,0 +1,73 @@ +namespace DotNetCampus.MediaConverter.SkiaWmfRenderer.Optimizations; + +/// +/// 包含用于增强图元(EMF/WMF)优化操作的上下文信息。 +/// +public readonly record struct EnhancedGraphicsMetafileOptimizationContext() +{ + /// + /// 跟踪标识符,用于日志定位。 + /// + public string TraceId { get; init; } = Guid.NewGuid().ToString("N"); + + /// + /// 要优化的图像文件信息。 + /// + public required FileInfo ImageFile { get; init; } + + /// + /// 工作目录,临时输出文件将写入此目录。 + /// + public required DirectoryInfo WorkingFolder { get; init; } + + /// + /// 请求的最大图像宽度(像素)。null 表示不限制。 + /// + public required int? MaxImageWidth { get; init; } + + /// + /// 请求的最大图像高度(像素)。null 表示不限制。 + /// + public required int? MaxImageHeight { get; init; } = null; + + /// + /// 是否将日志输出到控制台。 + /// + public bool ShouldLogToConsole { get; init; } = false; + + /// + /// 是否将日志写入文件。 + /// + public bool ShouldLogToFile { get; init; } = false; + + /// + /// 日志文件名(相对于 )。 + /// + public string LogFileName { get; init; } = "Log.txt"; + + /// + /// 将一条日志消息输出到控制台或工作目录中的日志文件(取决于配置)。 + /// + /// 要记录的消息内容。 + public void LogMessage(string message) + { + if (!ShouldLogToConsole && !ShouldLogToFile) + { + return; + } + + if (ShouldLogToConsole) + { + Console.WriteLine(message); + } + + if (ShouldLogToFile) + { + var logMessage = $"[{DateTime.Now:yyyy-MM-dd HH:mm:ss,fff}][{TraceId}] {message}"; + + var logFile = Path.Join(WorkingFolder.FullName, LogFileName ?? "Log.txt"); + + File.AppendAllLines(logFile, [logMessage]); + } + } +} \ No newline at end of file diff --git a/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Optimizations/EnhancedGraphicsMetafileOptimizationResult.cs b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Optimizations/EnhancedGraphicsMetafileOptimizationResult.cs new file mode 100644 index 0000000..e6ae252 --- /dev/null +++ b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Optimizations/EnhancedGraphicsMetafileOptimizationResult.cs @@ -0,0 +1,60 @@ +using System.Diagnostics.CodeAnalysis; + +namespace DotNetCampus.MediaConverter.SkiaWmfRenderer.Optimizations; + +/// +/// 表示增强图元优化操作的结果。 +/// +public readonly record struct EnhancedGraphicsMetafileOptimizationResult() +{ + /// + /// 如果优化过程成功并产生了输出文件,则为 true。 + /// + [MemberNotNullWhen(returnValue: true, nameof(OptimizedImageFile))] + public bool IsSuccess => OptimizedImageFile is not null; + + /// + /// 优化后生成的图像文件(如果成功)。 + /// + public FileInfo? OptimizedImageFile { get; init; } + + /// + /// 表示该操作不被支持(例如平台或格式不支持)。 + /// + public bool IsNotSupport { get; init; } + + /// + /// 无需转换优化,原始文件已满足要求 + /// + public bool NotNeedOptimize { get; init; } + + /// + /// 如果发生异常则包含异常对象,否则为 null。 + /// + public Exception? Exception { get; init; } + + /// + /// 创建一个表示不支持的结果实例。 + /// + /// 标识操作不被支持的结果。 + public static EnhancedGraphicsMetafileOptimizationResult NotSupported() + { + return new EnhancedGraphicsMetafileOptimizationResult() + { + IsNotSupport = true, + }; + } + + /// + /// 创建一个包含异常信息的失败结果实例。 + /// + /// 导致失败的异常。 + /// 包含异常的失败结果。 + public static EnhancedGraphicsMetafileOptimizationResult FailException(Exception exception) + { + return new EnhancedGraphicsMetafileOptimizationResult() + { + Exception = exception, + }; + } +} \ No newline at end of file diff --git a/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Optimizations/SvgFileOptimization.cs b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Optimizations/SvgFileOptimization.cs new file mode 100644 index 0000000..ea4a789 --- /dev/null +++ b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Optimizations/SvgFileOptimization.cs @@ -0,0 +1,115 @@ +using System.Xml.Linq; +using SkiaSharp; +using Svg.Skia; + +namespace DotNetCampus.MediaConverter.SkiaWmfRenderer.Optimizations; + +/// +/// 提供 SVG 文件相关的优化与修复方法,例如将 SVG 转换为 PNG,或修复 SVG 中的无效字符。 +/// +public static class SvgFileOptimization +{ + /// + /// 将指定上下文中的 SVG 文件渲染并保存为 PNG 文件。 + /// + /// 包含 SVG 文件和工作目录等信息的上下文。 + /// 成功时返回生成的 PNG 文件信息;失败时返回 null。 + public static FileInfo? ConvertSvgToPngFile(in EnhancedGraphicsMetafileOptimizationContext context) + { + var imageFile = context.ImageFile; + var workingFolder = context.WorkingFolder; + + using var skSvg = new SKSvg(); + using var skPicture = skSvg.Load(imageFile.FullName); + var outputFile = Path.Join(workingFolder.FullName, + $"SVG_{Path.GetRandomFileName()}.png"); + var canSave = skSvg.Save(outputFile, SKColors.Transparent); + if (canSave && File.Exists(outputFile)) + { + return new FileInfo(outputFile); + } + + // 转换失败 + return null; + } + + /// + /// 异步修复 SVG 文件中可能包含的无效字符(例如替换或删除不可见占位符),并在需要时将修复后的文件写入工作目录。 + /// + /// 要修复的 SVG 文件。 + /// 修复后文件写入的工作目录。 + /// 修复后文件的 ;如果未作修改则返回原始文件实例。 + public static async Task FixSvgInvalidCharacterAsync(FileInfo svgFile, + DirectoryInfo workingFolder) + { + using var fileStream = svgFile.OpenRead(); + using var streamReader = new StreamReader(fileStream); + + var xDocument = await XDocument.LoadAsync(streamReader, LoadOptions.SetLineInfo, CancellationToken.None); + bool anyUpdate = false; + + foreach (var xElement in xDocument.Descendants("text")) + { + var value = xElement.Value; + if (!string.IsNullOrEmpty(value) && value.Length > 0 && value[0] is var c && c == 0xFFFD) + { + // 0xFFFFD 是 utf8 特殊字符 + // 画出来就是�符号,不如删掉 + xElement.Value = string.Empty; + + anyUpdate = true; + } + } + + if (anyUpdate) + { + var convertedFile = Path.Join(workingFolder.FullName, $"FixSVG_{Path.GetRandomFileName()}.svg"); + using var stream = File.Create(convertedFile); + await xDocument.SaveAsync(stream, SaveOptions.None, CancellationToken.None); + return new FileInfo(convertedFile); + } + + // 啥都不用改,返回原图 + return svgFile; + } + + /// + /// 同步修复 SVG 文件中可能包含的无效字符(例如替换或删除不可见占位符),并在需要时将修复后的文件写入工作目录。 + /// + /// 包含 SVG 文件和工作目录等信息的上下文。 + /// 修复后文件的 ;如果未作修改则返回原始文件实例。 + public static FileInfo FixSvgInvalidCharacter(EnhancedGraphicsMetafileOptimizationContext context) + { + FileInfo svgFile = context.ImageFile; + DirectoryInfo workingFolder = context.WorkingFolder; + + using var fileStream = svgFile.OpenRead(); + using var streamReader = new StreamReader(fileStream); + + var xDocument = XDocument.Load(streamReader, LoadOptions.SetLineInfo); + bool anyUpdate = false; + + foreach (var xElement in xDocument.Descendants("text")) + { + var value = xElement.Value; + if (!string.IsNullOrEmpty(value) && value.Length > 0 && value[0] is var c && c == 0xFFFD) + { + // 0xFFFFD 是 utf8 特殊字符 + // 画出来就是�符号,不如删掉 + xElement.Value = string.Empty; + + anyUpdate = true; + } + } + + if (anyUpdate) + { + var convertedFile = Path.Join(workingFolder.FullName, $"FixSVG_{Path.GetRandomFileName()}.svg"); + xDocument.Save(convertedFile); + return new FileInfo(convertedFile); + } + + // 啥都不用改,返回原图 + return svgFile; + } +} \ No newline at end of file diff --git a/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/SkiaWmfRenderer.csproj b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/SkiaWmfRenderer.csproj index c3923d7..7418d1f 100644 --- a/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/SkiaWmfRenderer.csproj +++ b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/SkiaWmfRenderer.csproj @@ -10,6 +10,22 @@ DotNetCampus.MediaConverter.SkiaWmfRenderer + + + + + + + + + + + + + + + + README.md @@ -25,7 +41,7 @@ - + @@ -38,11 +54,14 @@ runtime; build; native; contentfiles; analyzers; buildtransitive - + + + - + +