From 7606420234c6c06d75d6d5791f6da5af18613296 Mon Sep 17 00:00:00 2001 From: lindexi Date: Tue, 2 Sep 2025 14:21:52 +0800 Subject: [PATCH 01/33] =?UTF-8?q?=E6=8B=86=E5=88=86=E5=87=BA=E4=B8=80?= =?UTF-8?q?=E4=B8=AA=E8=BF=98=E4=B8=8D=E7=94=A8=E4=BD=BF=E7=94=A8=20skia?= =?UTF-8?q?=20=E7=9A=84=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 依然有 21MB 大小 --- .../Optimizations/ImageFileOptimization.cs | 138 +--------------- .../ImageFileOptimizationResult.cs | 9 + .../MediaConverters.Lib.csproj | 8 - .../EnhancedGraphicsMetafileOptimization.cs | 156 +++++++++++++++++- .../SkiaWmfRenderer/SkiaWmfRenderer.csproj | 6 +- 5 files changed, 168 insertions(+), 149 deletions(-) rename src/MediaConverters/{MediaConverters.Lib/Imaging => SkiaWmfRenderer/src/SkiaWmfRenderer}/Optimizations/EnhancedGraphicsMetafileOptimization.cs (72%) diff --git a/src/MediaConverters/MediaConverters.Lib/Imaging/Optimizations/ImageFileOptimization.cs b/src/MediaConverters/MediaConverters.Lib/Imaging/Optimizations/ImageFileOptimization.cs index 6129f80..ad4bd63 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}'"); @@ -303,96 +261,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/ImageFileOptimizationResult.cs b/src/MediaConverters/MediaConverters.Lib/Imaging/Optimizations/ImageFileOptimizationResult.cs index aa30cf1..4925f0e 100644 --- a/src/MediaConverters/MediaConverters.Lib/Imaging/Optimizations/ImageFileOptimizationResult.cs +++ b/src/MediaConverters/MediaConverters.Lib/Imaging/Optimizations/ImageFileOptimizationResult.cs @@ -39,4 +39,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.Lib/Imaging/Optimizations/EnhancedGraphicsMetafileOptimization.cs b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Optimizations/EnhancedGraphicsMetafileOptimization.cs similarity index 72% rename from src/MediaConverters/MediaConverters.Lib/Imaging/Optimizations/EnhancedGraphicsMetafileOptimization.cs rename to src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Optimizations/EnhancedGraphicsMetafileOptimization.cs index 620cde9..64a8220 100644 --- a/src/MediaConverters/MediaConverters.Lib/Imaging/Optimizations/EnhancedGraphicsMetafileOptimization.cs +++ b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Optimizations/EnhancedGraphicsMetafileOptimization.cs @@ -1,4 +1,10 @@ -using System; +using DotNetCampus.MediaConverter.SkiaWmfRenderer; + +using SkiaSharp; + +using Svg.Skia; + +using System; using System.ComponentModel; using System.Diagnostics; using System.Drawing; @@ -6,8 +12,7 @@ using System.IO; using System.Runtime.InteropServices; using System.Runtime.Versioning; - -using DotNetCampus.MediaConverter.SkiaWmfRenderer; +using System.Xml.Linq; namespace DotNetCampus.MediaConverters.Imaging.Optimizations; @@ -349,4 +354,149 @@ private static ImageFileOptimizationResult ConvertInWindows(ImageFileOptimizatio }; } } +} + +public static class SvgFileOptimization +{ +/* + 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); + } + } + 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; + } + } + */ + + /// + /// 转换 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/SkiaWmfRenderer/src/SkiaWmfRenderer/SkiaWmfRenderer.csproj b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/SkiaWmfRenderer.csproj index c3923d7..0f7d27b 100644 --- a/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/SkiaWmfRenderer.csproj +++ b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/SkiaWmfRenderer.csproj @@ -25,7 +25,7 @@ - + @@ -38,7 +38,9 @@ runtime; build; native; contentfiles; analyzers; buildtransitive - + + + From 2b6668306d88bb569bf3ca6b90d4e3605e97f28c Mon Sep 17 00:00:00 2001 From: lindexi Date: Tue, 2 Sep 2025 14:38:28 +0800 Subject: [PATCH 02/33] =?UTF-8?q?=E5=8E=BB=E6=8E=89=20IPC=20=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0=EF=BC=8C=E5=9B=A0=E4=B8=BA=20AOT=20=E4=B9=8B=E5=90=8E?= =?UTF-8?q?=E5=B1=85=E7=84=B6=E6=9C=89=2020=20MB=20=E5=A4=A7=E5=B0=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../IpcHandlers/IpcHandler.cs | 155 ------------------ .../IpcHandlers/MediaConverterIpcLogger.cs | 57 ------- .../MediaConverters.Tool.csproj | 1 - .../MediaConverters.Tool/Program.cs | 1 - 4 files changed, 214 deletions(-) delete mode 100644 src/MediaConverters/MediaConverters.Tool/CommandLineHandlers/IpcHandlers/IpcHandler.cs delete mode 100644 src/MediaConverters/MediaConverters.Tool/CommandLineHandlers/IpcHandlers/MediaConverterIpcLogger.cs diff --git a/src/MediaConverters/MediaConverters.Tool/CommandLineHandlers/IpcHandlers/IpcHandler.cs b/src/MediaConverters/MediaConverters.Tool/CommandLineHandlers/IpcHandlers/IpcHandler.cs deleted file mode 100644 index ef49a5b..0000000 --- a/src/MediaConverters/MediaConverters.Tool/CommandLineHandlers/IpcHandlers/IpcHandler.cs +++ /dev/null @@ -1,155 +0,0 @@ -using System; -using dotnetCampus.Ipc.Context; -using dotnetCampus.Ipc.IpcRouteds.DirectRouteds; -using dotnetCampus.Ipc.Pipes; -using dotnetCampus.Ipc.Threading; -using dotnetCampus.Ipc.Utils.Buffers; - -using DotNetCampus.Cli; -using DotNetCampus.Cli.Compiler; -using DotNetCampus.MediaConverters.Contexts; -using DotNetCampus.MediaConverters.Contexts.IpcContexts; - -using System.Buffers; -using System.IO; -using System.Threading; -using System.Threading.Tasks; - -namespace DotNetCampus.MediaConverters.CommandLineHandlers; - -public class IpcHandler : ICommandHandler -{ - [Option] - public required string IpcName { get; init; } - - /// - /// 总的工作路径,可用在后续的转换过程中,存放日志或过程文件等 - /// - [Option] - public required string WorkingFolder { get; init; } - - [Option] - public bool? ShouldLogToConsole { get; init; } - - [Option] - public bool? ShouldLogToFile { get; init; } - - public async Task RunAsync() - { - var ipcConfiguration = new IpcConfiguration() - { - AutoReconnectPeers = false, - IpcLoggerProvider = name => new MediaConverterIpcLogger(name, this), - - // 以下为默认配置 - SharedArrayPool = new SharedArrayPool(ArrayPool.Shared), - IpcTaskScheduling = IpcTaskScheduling.GlobalConcurrent, - }; - ipcConfiguration.UseSystemJsonIpcObjectSerializer(MediaConverterJsonSerializerSourceGenerationContext.Default); - - var ipcProvider = new IpcProvider(IpcName, ipcConfiguration); - - var ipcHandlerLogger = new IpcHandlerLogger(this); - var exitTaskCompletionSource = new TaskCompletionSource(); - - var jsonIpcDirectRoutedProvider = new JsonIpcDirectRoutedProvider(ipcProvider); - - jsonIpcDirectRoutedProvider.AddRequestHandler(IpcPaths.RequestConvertImage, async (IpcConvertImageRequest request) => - { - if (request.InputFile is null || request.OutputFile is null || request.ConvertConfigurationFile is null) - { - return IpcConvertImageResponse.FromErrorCode(MediaConverterErrorCode.InvalidIpcRequestArgument); - } - - var traceId = request.TraceId ?? Guid.NewGuid().ToString(); - - var workingFolder = request.WorkingFolder; - if (string.IsNullOrEmpty(workingFolder)) - { - workingFolder = Path.Join(WorkingFolder, traceId); - } - - Directory.CreateDirectory(workingFolder); - - ipcHandlerLogger.LogMessage($"[{traceId}] Receive RequestConvertImage. InputFile='{request.InputFile}' OutputFile='{request.OutputFile}' ConvertConfigurationFile='{request.ConvertConfigurationFile}' WorkingFolder='{workingFolder}'"); - - var convertHandler = new ConvertHandler() - { - InputFile = request.InputFile, - OutputFile = request.OutputFile, - ConvertConfigurationFile = request.ConvertConfigurationFile, - WorkingFolder = workingFolder, - ShouldLogToConsole = ShouldLogToConsole, - ShouldLogToFile = ShouldLogToFile, - }; - - var errorCode = await Program.RunAsync(convertHandler); - ipcHandlerLogger.LogMessage($"[{traceId}] RequestConvertImage completed. ErrorCode={errorCode.Code} Message={errorCode.Message}"); - return IpcConvertImageResponse.FromErrorCode(errorCode); - }); - - jsonIpcDirectRoutedProvider.AddRequestHandler(IpcPaths.Exit, (IpcExitRequest request) => - { - ipcHandlerLogger.LogMessage($"Request Exit. Code={request.ExitCode} Reason={request.Reason}"); - - Task.Run(async () => - { - await Task.Delay(TimeSpan.FromSeconds(1)); - exitTaskCompletionSource.SetResult(request.ExitCode); - }); - - return new IpcExitResponse() - { - Code = MediaConverterErrorCode.Success.Code, - Message = MediaConverterErrorCode.Success.Message - }; - }); - - jsonIpcDirectRoutedProvider.StartServer(); - return await exitTaskCompletionSource.Task; - } -} - -file class IpcHandlerLogger -{ - public IpcHandlerLogger(IpcHandler ipcHandler) - { - _ipcHandler = ipcHandler; - - CanLog = _ipcHandler.ShouldLogToConsole is true || _ipcHandler.ShouldLogToFile is true; - - if (_ipcHandler.ShouldLogToFile is true) - { - var logFile = Path.Join(_ipcHandler.WorkingFolder, "Log.txt"); - _logFile = new FileInfo(logFile); - } - } - - private readonly FileInfo? _logFile; - private readonly IpcHandler _ipcHandler; - private readonly Lock _locker = new Lock(); - - private bool CanLog { get; } - - public void LogMessage(string message) - { - if (!CanLog) - { - return; - } - - if (_ipcHandler.ShouldLogToConsole is true) - { - Console.WriteLine(message); - } - - if (_logFile is { } logFile) - { - var logMessage = $"[{DateTime.Now:yyyy-MM-dd HH:mm:ss,fff}] {message}"; - lock (_locker) - { - File.AppendAllLines(logFile.FullName, [logMessage]); - } - } - } -} \ No newline at end of file diff --git a/src/MediaConverters/MediaConverters.Tool/CommandLineHandlers/IpcHandlers/MediaConverterIpcLogger.cs b/src/MediaConverters/MediaConverters.Tool/CommandLineHandlers/IpcHandlers/MediaConverterIpcLogger.cs deleted file mode 100644 index 696bdbb..0000000 --- a/src/MediaConverters/MediaConverters.Tool/CommandLineHandlers/IpcHandlers/MediaConverterIpcLogger.cs +++ /dev/null @@ -1,57 +0,0 @@ -using System; -using System.IO; - -using dotnetCampus.Ipc.Utils.Logging; - -namespace DotNetCampus.MediaConverters.CommandLineHandlers; - -class MediaConverterIpcLogger : IpcLogger -{ - public MediaConverterIpcLogger(string name, IpcHandler ipcHandler) : base(name) - { - _ipcHandler = ipcHandler; - if (_ipcHandler.ShouldLogToFile is true) - { - var ipcLogFile = Path.Join(_ipcHandler.WorkingFolder, "IpcLog.log"); - _logFile = new FileInfo(ipcLogFile); - } - } - - private readonly IpcHandler _ipcHandler; - - private bool ShouldLogToConsole => _ipcHandler.ShouldLogToConsole ?? false; - private readonly FileInfo? _logFile; - - protected override bool IsEnabled(LogLevel logLevel) - { - if (!ShouldLogToConsole && _logFile is null) - { - // 没有任何日志输出 - return false; - } - - return base.IsEnabled(logLevel); - } - - protected override void Log(LogLevel logLevel, TState state, Exception? exception, Func formatter) - { - if (!IsEnabled(logLevel)) - { - return; - } - - var message = formatter(state, exception); - if (ShouldLogToConsole) - { - Console.WriteLine($"[IPC] {message}"); - } - if (_logFile is { } logFile) - { - var logMessage = $"[{DateTime.Now:yyyy-MM-dd HH:mm:ss,fff}][{logLevel}] {message}"; - lock (logFile) - { - File.AppendAllLines(logFile.FullName, [logMessage]); - } - } - } -} \ No newline at end of file diff --git a/src/MediaConverters/MediaConverters.Tool/MediaConverters.Tool.csproj b/src/MediaConverters/MediaConverters.Tool/MediaConverters.Tool.csproj index de94b8b..feb1c4a 100644 --- a/src/MediaConverters/MediaConverters.Tool/MediaConverters.Tool.csproj +++ b/src/MediaConverters/MediaConverters.Tool/MediaConverters.Tool.csproj @@ -21,7 +21,6 @@ - diff --git a/src/MediaConverters/MediaConverters.Tool/Program.cs b/src/MediaConverters/MediaConverters.Tool/Program.cs index 2d74107..47b6a53 100644 --- a/src/MediaConverters/MediaConverters.Tool/Program.cs +++ b/src/MediaConverters/MediaConverters.Tool/Program.cs @@ -57,7 +57,6 @@ static async Task Main(string[] args) return await DotNetCampus.Cli.CommandLine.Parse(args) .AddHandler() - .AddHandler() .RunAsync() ; } From 369e109b9633f31ed30b2fd6a3c20da60fd0d2ae Mon Sep 17 00:00:00 2001 From: lindexi Date: Tue, 2 Sep 2025 17:19:23 +0800 Subject: [PATCH 03/33] =?UTF-8?q?Revert=20"=E5=8E=BB=E6=8E=89=20IPC=20?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0=EF=BC=8C=E5=9B=A0=E4=B8=BA=20AOT=20=E4=B9=8B?= =?UTF-8?q?=E5=90=8E=E5=B1=85=E7=84=B6=E6=9C=89=2020=20MB=20=E5=A4=A7?= =?UTF-8?q?=E5=B0=8F"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 2b6668306d88bb569bf3ca6b90d4e3605e97f28c. --- .../IpcHandlers/IpcHandler.cs | 155 ++++++++++++++++++ .../IpcHandlers/MediaConverterIpcLogger.cs | 57 +++++++ .../MediaConverters.Tool.csproj | 1 + .../MediaConverters.Tool/Program.cs | 1 + 4 files changed, 214 insertions(+) create mode 100644 src/MediaConverters/MediaConverters.Tool/CommandLineHandlers/IpcHandlers/IpcHandler.cs create mode 100644 src/MediaConverters/MediaConverters.Tool/CommandLineHandlers/IpcHandlers/MediaConverterIpcLogger.cs diff --git a/src/MediaConverters/MediaConverters.Tool/CommandLineHandlers/IpcHandlers/IpcHandler.cs b/src/MediaConverters/MediaConverters.Tool/CommandLineHandlers/IpcHandlers/IpcHandler.cs new file mode 100644 index 0000000..ef49a5b --- /dev/null +++ b/src/MediaConverters/MediaConverters.Tool/CommandLineHandlers/IpcHandlers/IpcHandler.cs @@ -0,0 +1,155 @@ +using System; +using dotnetCampus.Ipc.Context; +using dotnetCampus.Ipc.IpcRouteds.DirectRouteds; +using dotnetCampus.Ipc.Pipes; +using dotnetCampus.Ipc.Threading; +using dotnetCampus.Ipc.Utils.Buffers; + +using DotNetCampus.Cli; +using DotNetCampus.Cli.Compiler; +using DotNetCampus.MediaConverters.Contexts; +using DotNetCampus.MediaConverters.Contexts.IpcContexts; + +using System.Buffers; +using System.IO; +using System.Threading; +using System.Threading.Tasks; + +namespace DotNetCampus.MediaConverters.CommandLineHandlers; + +public class IpcHandler : ICommandHandler +{ + [Option] + public required string IpcName { get; init; } + + /// + /// 总的工作路径,可用在后续的转换过程中,存放日志或过程文件等 + /// + [Option] + public required string WorkingFolder { get; init; } + + [Option] + public bool? ShouldLogToConsole { get; init; } + + [Option] + public bool? ShouldLogToFile { get; init; } + + public async Task RunAsync() + { + var ipcConfiguration = new IpcConfiguration() + { + AutoReconnectPeers = false, + IpcLoggerProvider = name => new MediaConverterIpcLogger(name, this), + + // 以下为默认配置 + SharedArrayPool = new SharedArrayPool(ArrayPool.Shared), + IpcTaskScheduling = IpcTaskScheduling.GlobalConcurrent, + }; + ipcConfiguration.UseSystemJsonIpcObjectSerializer(MediaConverterJsonSerializerSourceGenerationContext.Default); + + var ipcProvider = new IpcProvider(IpcName, ipcConfiguration); + + var ipcHandlerLogger = new IpcHandlerLogger(this); + var exitTaskCompletionSource = new TaskCompletionSource(); + + var jsonIpcDirectRoutedProvider = new JsonIpcDirectRoutedProvider(ipcProvider); + + jsonIpcDirectRoutedProvider.AddRequestHandler(IpcPaths.RequestConvertImage, async (IpcConvertImageRequest request) => + { + if (request.InputFile is null || request.OutputFile is null || request.ConvertConfigurationFile is null) + { + return IpcConvertImageResponse.FromErrorCode(MediaConverterErrorCode.InvalidIpcRequestArgument); + } + + var traceId = request.TraceId ?? Guid.NewGuid().ToString(); + + var workingFolder = request.WorkingFolder; + if (string.IsNullOrEmpty(workingFolder)) + { + workingFolder = Path.Join(WorkingFolder, traceId); + } + + Directory.CreateDirectory(workingFolder); + + ipcHandlerLogger.LogMessage($"[{traceId}] Receive RequestConvertImage. InputFile='{request.InputFile}' OutputFile='{request.OutputFile}' ConvertConfigurationFile='{request.ConvertConfigurationFile}' WorkingFolder='{workingFolder}'"); + + var convertHandler = new ConvertHandler() + { + InputFile = request.InputFile, + OutputFile = request.OutputFile, + ConvertConfigurationFile = request.ConvertConfigurationFile, + WorkingFolder = workingFolder, + ShouldLogToConsole = ShouldLogToConsole, + ShouldLogToFile = ShouldLogToFile, + }; + + var errorCode = await Program.RunAsync(convertHandler); + ipcHandlerLogger.LogMessage($"[{traceId}] RequestConvertImage completed. ErrorCode={errorCode.Code} Message={errorCode.Message}"); + return IpcConvertImageResponse.FromErrorCode(errorCode); + }); + + jsonIpcDirectRoutedProvider.AddRequestHandler(IpcPaths.Exit, (IpcExitRequest request) => + { + ipcHandlerLogger.LogMessage($"Request Exit. Code={request.ExitCode} Reason={request.Reason}"); + + Task.Run(async () => + { + await Task.Delay(TimeSpan.FromSeconds(1)); + exitTaskCompletionSource.SetResult(request.ExitCode); + }); + + return new IpcExitResponse() + { + Code = MediaConverterErrorCode.Success.Code, + Message = MediaConverterErrorCode.Success.Message + }; + }); + + jsonIpcDirectRoutedProvider.StartServer(); + return await exitTaskCompletionSource.Task; + } +} + +file class IpcHandlerLogger +{ + public IpcHandlerLogger(IpcHandler ipcHandler) + { + _ipcHandler = ipcHandler; + + CanLog = _ipcHandler.ShouldLogToConsole is true || _ipcHandler.ShouldLogToFile is true; + + if (_ipcHandler.ShouldLogToFile is true) + { + var logFile = Path.Join(_ipcHandler.WorkingFolder, "Log.txt"); + _logFile = new FileInfo(logFile); + } + } + + private readonly FileInfo? _logFile; + private readonly IpcHandler _ipcHandler; + private readonly Lock _locker = new Lock(); + + private bool CanLog { get; } + + public void LogMessage(string message) + { + if (!CanLog) + { + return; + } + + if (_ipcHandler.ShouldLogToConsole is true) + { + Console.WriteLine(message); + } + + if (_logFile is { } logFile) + { + var logMessage = $"[{DateTime.Now:yyyy-MM-dd HH:mm:ss,fff}] {message}"; + lock (_locker) + { + File.AppendAllLines(logFile.FullName, [logMessage]); + } + } + } +} \ No newline at end of file diff --git a/src/MediaConverters/MediaConverters.Tool/CommandLineHandlers/IpcHandlers/MediaConverterIpcLogger.cs b/src/MediaConverters/MediaConverters.Tool/CommandLineHandlers/IpcHandlers/MediaConverterIpcLogger.cs new file mode 100644 index 0000000..696bdbb --- /dev/null +++ b/src/MediaConverters/MediaConverters.Tool/CommandLineHandlers/IpcHandlers/MediaConverterIpcLogger.cs @@ -0,0 +1,57 @@ +using System; +using System.IO; + +using dotnetCampus.Ipc.Utils.Logging; + +namespace DotNetCampus.MediaConverters.CommandLineHandlers; + +class MediaConverterIpcLogger : IpcLogger +{ + public MediaConverterIpcLogger(string name, IpcHandler ipcHandler) : base(name) + { + _ipcHandler = ipcHandler; + if (_ipcHandler.ShouldLogToFile is true) + { + var ipcLogFile = Path.Join(_ipcHandler.WorkingFolder, "IpcLog.log"); + _logFile = new FileInfo(ipcLogFile); + } + } + + private readonly IpcHandler _ipcHandler; + + private bool ShouldLogToConsole => _ipcHandler.ShouldLogToConsole ?? false; + private readonly FileInfo? _logFile; + + protected override bool IsEnabled(LogLevel logLevel) + { + if (!ShouldLogToConsole && _logFile is null) + { + // 没有任何日志输出 + return false; + } + + return base.IsEnabled(logLevel); + } + + protected override void Log(LogLevel logLevel, TState state, Exception? exception, Func formatter) + { + if (!IsEnabled(logLevel)) + { + return; + } + + var message = formatter(state, exception); + if (ShouldLogToConsole) + { + Console.WriteLine($"[IPC] {message}"); + } + if (_logFile is { } logFile) + { + var logMessage = $"[{DateTime.Now:yyyy-MM-dd HH:mm:ss,fff}][{logLevel}] {message}"; + lock (logFile) + { + File.AppendAllLines(logFile.FullName, [logMessage]); + } + } + } +} \ No newline at end of file diff --git a/src/MediaConverters/MediaConverters.Tool/MediaConverters.Tool.csproj b/src/MediaConverters/MediaConverters.Tool/MediaConverters.Tool.csproj index feb1c4a..de94b8b 100644 --- a/src/MediaConverters/MediaConverters.Tool/MediaConverters.Tool.csproj +++ b/src/MediaConverters/MediaConverters.Tool/MediaConverters.Tool.csproj @@ -21,6 +21,7 @@ + diff --git a/src/MediaConverters/MediaConverters.Tool/Program.cs b/src/MediaConverters/MediaConverters.Tool/Program.cs index 47b6a53..2d74107 100644 --- a/src/MediaConverters/MediaConverters.Tool/Program.cs +++ b/src/MediaConverters/MediaConverters.Tool/Program.cs @@ -57,6 +57,7 @@ static async Task Main(string[] args) return await DotNetCampus.Cli.CommandLine.Parse(args) .AddHandler() + .AddHandler() .RunAsync() ; } From 8a3923c70807617ce1fce103c00829b718ddb6e9 Mon Sep 17 00:00:00 2001 From: lindexi Date: Tue, 2 Sep 2025 17:19:49 +0800 Subject: [PATCH 04/33] =?UTF-8?q?=E5=AE=8C=E6=88=90=E6=8B=86=E5=88=86=20Sk?= =?UTF-8?q?ia=20=E5=88=B0=E7=8B=AC=E7=AB=8B=E5=8F=AF=E5=BA=93=E5=BC=95?= =?UTF-8?q?=E7=94=A8=E7=9A=84=E9=A1=B9=E7=9B=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../EnhancedGraphicsMetafileOptimization.cs | 131 ++++++++++++------ 1 file changed, 91 insertions(+), 40 deletions(-) diff --git a/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Optimizations/EnhancedGraphicsMetafileOptimization.cs b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Optimizations/EnhancedGraphicsMetafileOptimization.cs index 64a8220..b53a863 100644 --- a/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Optimizations/EnhancedGraphicsMetafileOptimization.cs +++ b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Optimizations/EnhancedGraphicsMetafileOptimization.cs @@ -7,15 +7,93 @@ using System; using System.ComponentModel; using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; using System.Drawing; using System.Drawing.Imaging; using System.IO; using System.Runtime.InteropServices; using System.Runtime.Versioning; using System.Xml.Linq; +using ImageFileOptimizationContext = DotNetCampus.MediaConverters.Imaging.Optimizations.EnhancedGraphicsMetafileOptimizationContext; +using ImageFileOptimizationResult = DotNetCampus.MediaConverters.Imaging.Optimizations.EnhancedGraphicsMetafileOptimizationResult; namespace DotNetCampus.MediaConverters.Imaging.Optimizations; +/// +/// 图片文件优化上下文信息 +/// +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; } + public required int? MaxImageWidth { get; init; } + 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]); + } + } +} + +/// +/// 图片文件优化结果 +/// +public readonly record struct EnhancedGraphicsMetafileOptimizationResult() +{ + [MemberNotNullWhen(returnValue: true)] + public bool IsSuccess => OptimizedImageFile is not null; + + /// + /// 优化后的图片文件 + /// + public FileInfo? OptimizedImageFile { get; init; } + + public bool IsNotSupport { get; init; } + + public Exception? Exception { get; init; } + + public static ImageFileOptimizationResult NotSupported() + { + return new EnhancedGraphicsMetafileOptimizationResult() + { + IsNotSupport = true, + }; + } + + public static ImageFileOptimizationResult FailException(Exception exception) + { + return new EnhancedGraphicsMetafileOptimizationResult() + { + Exception = exception, + }; + } +} + /// /// 增强图元优化方法,用于优化 emf 和 wmf 图片 /// @@ -44,11 +122,7 @@ public static ImageFileOptimizationResult ConvertWmfOrEmfToPngFile(ImageFileOpti } } - return new ImageFileOptimizationResult() - { - OptimizedImageFile = null, - FailureReason = ImageFileOptimizationFailureReason.NotSupported - }; + return ImageFileOptimizationResult.NotSupported(); } [SupportedOSPlatform("linux")] @@ -76,11 +150,7 @@ 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 ImageFileOptimizationResult.NotSupported(); } // 使用 SkiaWmfRenderer 进行转换 @@ -111,7 +181,7 @@ ImageFileOptimizationResult ConvertSvgToPngFile(FileInfo svgImageFile) { try { - var convertSvgToPngFile = ImageFileOptimization.ConvertSvgToPngFile(context with + var convertSvgToPngFile = SvgFileOptimization.ConvertSvgToPngFile(context with { ImageFile = svgImageFile }); @@ -124,11 +194,7 @@ ImageFileOptimizationResult ConvertSvgToPngFile(FileInfo svgImageFile) } else { - return new ImageFileOptimizationResult() - { - OptimizedImageFile = null, - FailureReason = ImageFileOptimizationFailureReason.NotSupported - }; + return ImageFileOptimizationResult.NotSupported(); } } catch (Exception e) @@ -173,11 +239,7 @@ private static ImageFileOptimizationResult ConvertWithSkiaWmfRenderer(ImageFileO } context.LogMessage($"Fail convert wmf to png by SkiaWmfRenderer. File:'{file}'"); - return new ImageFileOptimizationResult() - { - OptimizedImageFile = null, - FailureReason = ImageFileOptimizationFailureReason.NotSupported - }; + return ImageFileOptimizationResult.NotSupported(); } [SupportedOSPlatform("linux")] @@ -193,6 +255,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); @@ -201,6 +264,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) @@ -226,12 +290,12 @@ 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) }); @@ -253,11 +317,7 @@ private static ImageFileOptimizationResult ConvertWithLibWmf(ImageFileOptimizati return ImageFileOptimizationResult.FailException(e); } - return new ImageFileOptimizationResult() - { - OptimizedImageFile = null, - FailureReason = ImageFileOptimizationFailureReason.NotSupported, - }; + return ImageFileOptimizationResult.NotSupported(); } [SupportedOSPlatform("linux")] @@ -282,7 +342,7 @@ 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 的转换 @@ -314,11 +374,7 @@ private static ImageFileOptimizationResult ConvertWithInkscape(ImageFileOptimiza return ImageFileOptimizationResult.FailException(e); } - return new ImageFileOptimizationResult() - { - OptimizedImageFile = null, - FailureReason = ImageFileOptimizationFailureReason.NotSupported, - }; + return ImageFileOptimizationResult.NotSupported(); } [SupportedOSPlatform("windows6.1")] @@ -346,12 +402,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 ImageFileOptimizationResult.FailException(e); } } } From d09d81dd169802e6edb517c744eac36d419066d9 Mon Sep 17 00:00:00 2001 From: lindexi Date: Tue, 2 Sep 2025 17:25:58 +0800 Subject: [PATCH 05/33] =?UTF-8?q?=E8=AF=B7=E4=BA=86=20GitHub=20Copilot=20?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../EnhancedGraphicsMetafileOptimization.cs | 165 +++++++++++++----- 1 file changed, 118 insertions(+), 47 deletions(-) diff --git a/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Optimizations/EnhancedGraphicsMetafileOptimization.cs b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Optimizations/EnhancedGraphicsMetafileOptimization.cs index b53a863..8ef66d3 100644 --- a/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Optimizations/EnhancedGraphicsMetafileOptimization.cs +++ b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Optimizations/EnhancedGraphicsMetafileOptimization.cs @@ -13,6 +13,7 @@ using System.IO; using System.Runtime.InteropServices; using System.Runtime.Versioning; +using System.Threading; using System.Xml.Linq; using ImageFileOptimizationContext = DotNetCampus.MediaConverters.Imaging.Optimizations.EnhancedGraphicsMetafileOptimizationContext; using ImageFileOptimizationResult = DotNetCampus.MediaConverters.Imaging.Optimizations.EnhancedGraphicsMetafileOptimizationResult; @@ -20,23 +21,54 @@ namespace DotNetCampus.MediaConverters.Imaging.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) @@ -61,22 +93,35 @@ public void LogMessage(string message) } /// -/// 图片文件优化结果 +/// 表示增强图元优化操作的结果。 /// public readonly record struct EnhancedGraphicsMetafileOptimizationResult() { + /// + /// 如果优化过程成功并产生了输出文件,则为 true。 + /// [MemberNotNullWhen(returnValue: true)] public bool IsSuccess => OptimizedImageFile is not null; /// - /// 优化后的图片文件 + /// 优化后生成的图像文件(如果成功)。 /// public FileInfo? OptimizedImageFile { get; init; } + /// + /// 表示该操作不被支持(例如平台或格式不支持)。 + /// public bool IsNotSupport { get; init; } + /// + /// 如果发生异常则包含异常对象,否则为 null。 + /// public Exception? Exception { get; init; } + /// + /// 创建一个表示不支持的结果实例。 + /// + /// 标识操作不被支持的结果。 public static ImageFileOptimizationResult NotSupported() { return new EnhancedGraphicsMetafileOptimizationResult() @@ -85,6 +130,11 @@ public static ImageFileOptimizationResult NotSupported() }; } + /// + /// 创建一个包含异常信息的失败结果实例。 + /// + /// 导致失败的异常。 + /// 包含异常的失败结果。 public static ImageFileOptimizationResult FailException(Exception exception) { return new EnhancedGraphicsMetafileOptimizationResult() @@ -95,10 +145,16 @@ public static ImageFileOptimizationResult FailException(Exception exception) } /// -/// 增强图元优化方法,用于优化 emf 和 wmf 图片 +/// 提供用于将增强型图元(WMF/EMF)转换为 PNG 或 SVG 的工具方法。 +/// 此类会根据运行时平台选择合适的实现(Windows 使用 GDI+,Linux 使用 Inkscape/Skia/libwmf 等)。 /// public static class EnhancedGraphicsMetafileOptimization { + /// + /// 将 WMF 或 EMF 文件转换为 PNG 文件。根据当前运行平台选择合适的转换实现。 + /// + /// 包含要转换文件和工作目录等设置的上下文。 + /// 转换操作的结果,包含生成的文件或错误信息。 public static ImageFileOptimizationResult ConvertWmfOrEmfToPngFile(ImageFileOptimizationContext context) { // 在 Windows 上,直接使用 GDI+ 将 WMF 或 EMF 文件转换为 PNG 文件 @@ -207,10 +263,10 @@ ImageFileOptimizationResult ConvertSvgToPngFile(FileInfo svgImageFile) } /// - /// 使用自己写的基于 Oxage.Wmf 的 SkiaWmfRenderer 进行转换,可以比较好处理公式内容 + /// 使用基于 Oxage.Wmf 的 SkiaWmfRenderer 将 WMF/EMF 转换为 PNG。该方法适用于需要更好文本/公式支持的场景。 /// - /// - /// + /// 包含输入文件、输出目录和尺寸限制等信息的上下文。 + /// 如果转换成功则返回包含输出 PNG 文件的结果,否则返回不支持或失败的结果。 private static ImageFileOptimizationResult ConvertWithSkiaWmfRenderer(ImageFileOptimizationContext context) { int requestWidth = context.MaxImageWidth ?? 0; @@ -407,62 +463,66 @@ private static ImageFileOptimizationResult ConvertInWindows(ImageFileOptimizatio } } +/// +/// 提供 SVG 文件相关的优化与修复方法,例如将 SVG 转换为 PNG,或修复 SVG 中的无效字符。 +/// public static class SvgFileOptimization { -/* - if (IsExtension(".svg")) - { - // 如果是 svg 那就直接转换了,因为后续叠加特效等逻辑都不能支持 SVG 格式 - try + /* + if (IsExtension(".svg")) { - var outputFilePath = ConvertSvgToPngFile(context); - if (outputFilePath is null) + // 如果是 svg 那就直接转换了,因为后续叠加特效等逻辑都不能支持 SVG 格式 + try { - return new ImageFileOptimizationResult() + var outputFilePath = ConvertSvgToPngFile(context); + if (outputFilePath is null) { - OptimizedImageFile = null, - FailureReason = ImageFileOptimizationFailureReason.NotSupported - }; + 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 + }; + } } - else + catch (Exception e) + { + context.LogMessage($"Convert SVG to PNG failed: {e}"); + + return ImageFileOptimizationResult.FailException(e); + } + } + else if (IsExtension(".wmf") || + IsExtension(".emf")) + { + var result = EnhancedGraphicsMetafileOptimization.ConvertWmfOrEmfToPngFile(context); + if (result.OptimizedImageFile is not null) { - context.LogMessage($"Success ConvertSvgToPngFile. Update current image file to '{outputFilePath.FullName}'"); + context.LogMessage($"Success ConvertWmfOrEmfToPngFile. Update current image file to '{result.OptimizedImageFile}'"); context = context with { - ImageFile = outputFilePath + ImageFile = result.OptimizedImageFile }; } - } - catch (Exception e) - { - context.LogMessage($"Convert SVG to PNG failed: {e}"); - - return ImageFileOptimizationResult.FailException(e); - } - } - 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 + else { - ImageFile = result.OptimizedImageFile - }; - } - else - { - return result; + return result; + } } - } - */ + */ /// - /// 转换 svg 文件为 png 文件 + /// 将指定上下文中的 SVG 文件渲染并保存为 PNG 文件。 /// - /// + /// 包含 SVG 文件和工作目录等信息的上下文。 + /// 成功时返回生成的 PNG 文件信息;失败时返回 null。 public static FileInfo? ConvertSvgToPngFile(ImageFileOptimizationContext context) { var imageFile = context.ImageFile; @@ -482,6 +542,12 @@ public static class SvgFileOptimization return null; } + /// + /// 异步修复 SVG 文件中可能包含的无效字符(例如替换或删除不可见占位符),并在需要时将修复后的文件写入工作目录。 + /// + /// 要修复的 SVG 文件。 + /// 修复后文件写入的工作目录。 + /// 修复后文件的 ;如果未作修改则返回原始文件实例。 public static async Task FixSvgInvalidCharacterAsync(FileInfo svgFile, DirectoryInfo workingFolder) { @@ -516,6 +582,11 @@ public static async Task FixSvgInvalidCharacterAsync(FileInfo svgFile, return svgFile; } + /// + /// 同步修复 SVG 文件中可能包含的无效字符(例如替换或删除不可见占位符),并在需要时将修复后的文件写入工作目录。 + /// + /// 包含 SVG 文件和工作目录等信息的上下文。 + /// 修复后文件的 ;如果未作修改则返回原始文件实例。 public static FileInfo FixSvgInvalidCharacter(ImageFileOptimizationContext context) { FileInfo svgFile = context.ImageFile; From cb398ce270f511871ff64c08fe20cd849e43e2d1 Mon Sep 17 00:00:00 2001 From: lindexi Date: Tue, 2 Sep 2025 17:26:44 +0800 Subject: [PATCH 06/33] =?UTF-8?q?=E5=AE=8C=E6=88=90=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E7=9A=84=E6=8B=86=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../EnhancedGraphicsMetafileOptimization.cs | 349 ++---------------- ...ncedGraphicsMetafileOptimizationContext.cs | 73 ++++ ...ancedGraphicsMetafileOptimizationResult.cs | 55 +++ .../Optimizations/SvgFileOptimization.cs | 165 +++++++++ 4 files changed, 319 insertions(+), 323 deletions(-) create mode 100644 src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Optimizations/EnhancedGraphicsMetafileOptimizationContext.cs create mode 100644 src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Optimizations/EnhancedGraphicsMetafileOptimizationResult.cs create mode 100644 src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Optimizations/SvgFileOptimization.cs diff --git a/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Optimizations/EnhancedGraphicsMetafileOptimization.cs b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Optimizations/EnhancedGraphicsMetafileOptimization.cs index 8ef66d3..d2fb8b3 100644 --- a/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Optimizations/EnhancedGraphicsMetafileOptimization.cs +++ b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Optimizations/EnhancedGraphicsMetafileOptimization.cs @@ -1,148 +1,11 @@ -using DotNetCampus.MediaConverter.SkiaWmfRenderer; - -using SkiaSharp; - -using Svg.Skia; - -using System; -using System.ComponentModel; +using System.ComponentModel; using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; using System.Drawing; using System.Drawing.Imaging; -using System.IO; using System.Runtime.InteropServices; using System.Runtime.Versioning; -using System.Threading; -using System.Xml.Linq; -using ImageFileOptimizationContext = DotNetCampus.MediaConverters.Imaging.Optimizations.EnhancedGraphicsMetafileOptimizationContext; -using ImageFileOptimizationResult = DotNetCampus.MediaConverters.Imaging.Optimizations.EnhancedGraphicsMetafileOptimizationResult; -namespace DotNetCampus.MediaConverters.Imaging.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]); - } - } -} - -/// -/// 表示增强图元优化操作的结果。 -/// -public readonly record struct EnhancedGraphicsMetafileOptimizationResult() -{ - /// - /// 如果优化过程成功并产生了输出文件,则为 true。 - /// - [MemberNotNullWhen(returnValue: true)] - public bool IsSuccess => OptimizedImageFile is not null; - - /// - /// 优化后生成的图像文件(如果成功)。 - /// - public FileInfo? OptimizedImageFile { get; init; } - - /// - /// 表示该操作不被支持(例如平台或格式不支持)。 - /// - public bool IsNotSupport { get; init; } - - /// - /// 如果发生异常则包含异常对象,否则为 null。 - /// - public Exception? Exception { get; init; } - - /// - /// 创建一个表示不支持的结果实例。 - /// - /// 标识操作不被支持的结果。 - public static ImageFileOptimizationResult NotSupported() - { - return new EnhancedGraphicsMetafileOptimizationResult() - { - IsNotSupport = true, - }; - } - - /// - /// 创建一个包含异常信息的失败结果实例。 - /// - /// 导致失败的异常。 - /// 包含异常的失败结果。 - public static ImageFileOptimizationResult FailException(Exception exception) - { - return new EnhancedGraphicsMetafileOptimizationResult() - { - Exception = exception, - }; - } -} +namespace DotNetCampus.MediaConverter.SkiaWmfRenderer.Optimizations; /// /// 提供用于将增强型图元(WMF/EMF)转换为 PNG 或 SVG 的工具方法。 @@ -155,7 +18,7 @@ public static class EnhancedGraphicsMetafileOptimization /// /// 包含要转换文件和工作目录等设置的上下文。 /// 转换操作的结果,包含生成的文件或错误信息。 - public static ImageFileOptimizationResult ConvertWmfOrEmfToPngFile(ImageFileOptimizationContext context) + public static EnhancedGraphicsMetafileOptimizationResult ConvertWmfOrEmfToPngFile(EnhancedGraphicsMetafileOptimizationContext context) { // 在 Windows 上,直接使用 GDI+ 将 WMF 或 EMF 文件转换为 PNG 文件 if (OperatingSystem.IsWindowsVersionAtLeast(6, 1)) @@ -174,15 +37,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 ImageFileOptimizationResult.NotSupported(); + return EnhancedGraphicsMetafileOptimizationResult.NotSupported(); } [SupportedOSPlatform("linux")] - private static ImageFileOptimizationResult ConvertInLinux(ImageFileOptimizationContext context) + private static EnhancedGraphicsMetafileOptimizationResult ConvertInLinux(EnhancedGraphicsMetafileOptimizationContext context) { var file = context.ImageFile; @@ -191,7 +54,7 @@ private static ImageFileOptimizationResult ConvertInLinux(ImageFileOptimizationC // 再使用 libwmf 进行转换 // 调用 Inkscape 进行转换 - ImageFileOptimizationResult result = ConvertWithInkscape(context); + EnhancedGraphicsMetafileOptimizationResult result = ConvertWithInkscape(context); if (result.OptimizedImageFile is { } svgFile) { return ConvertSvgToPngFile(svgFile); @@ -206,7 +69,7 @@ private static ImageFileOptimizationResult ConvertInLinux(ImageFileOptimizationC { context.LogMessage($"Convert emf to png is not supported with libwmf. File:'{context.ImageFile.FullName}'"); - return ImageFileOptimizationResult.NotSupported(); + return EnhancedGraphicsMetafileOptimizationResult.NotSupported(); } // 使用 SkiaWmfRenderer 进行转换 @@ -233,7 +96,7 @@ private static ImageFileOptimizationResult ConvertInLinux(ImageFileOptimizationC return result; } - ImageFileOptimizationResult ConvertSvgToPngFile(FileInfo svgImageFile) + EnhancedGraphicsMetafileOptimizationResult ConvertSvgToPngFile(FileInfo svgImageFile) { try { @@ -243,21 +106,21 @@ ImageFileOptimizationResult ConvertSvgToPngFile(FileInfo svgImageFile) }); if (convertSvgToPngFile is not null) { - return new ImageFileOptimizationResult() + return new EnhancedGraphicsMetafileOptimizationResult() { OptimizedImageFile = convertSvgToPngFile }; } else { - return ImageFileOptimizationResult.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); } } } @@ -267,7 +130,7 @@ ImageFileOptimizationResult ConvertSvgToPngFile(FileInfo svgImageFile) /// /// 包含输入文件、输出目录和尺寸限制等信息的上下文。 /// 如果转换成功则返回包含输出 PNG 文件的结果,否则返回不支持或失败的结果。 - private static ImageFileOptimizationResult ConvertWithSkiaWmfRenderer(ImageFileOptimizationContext context) + private static EnhancedGraphicsMetafileOptimizationResult ConvertWithSkiaWmfRenderer(EnhancedGraphicsMetafileOptimizationContext context) { int requestWidth = context.MaxImageWidth ?? 0; int requestHeight = context.MaxImageHeight ?? 0; @@ -288,18 +151,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 ImageFileOptimizationResult.NotSupported(); + return EnhancedGraphicsMetafileOptimizationResult.NotSupported(); } [SupportedOSPlatform("linux")] - private static ImageFileOptimizationResult ConvertWithLibWmf(ImageFileOptimizationContext context) + private static EnhancedGraphicsMetafileOptimizationResult ConvertWithLibWmf(EnhancedGraphicsMetafileOptimizationContext context) { var file = context.ImageFile; var workingFolder = context.WorkingFolder; @@ -356,7 +219,7 @@ private static ImageFileOptimizationResult ConvertWithLibWmf(ImageFileOptimizati ImageFile = new FileInfo(svgFile) }); - return new ImageFileOptimizationResult() + return new EnhancedGraphicsMetafileOptimizationResult() { OptimizedImageFile = convertedFile }; @@ -370,14 +233,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 ImageFileOptimizationResult.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; @@ -402,7 +265,7 @@ private static ImageFileOptimizationResult ConvertWithInkscape(ImageFileOptimiza if (process?.ExitCode == 0 && File.Exists(svgFile)) { // 转换成功,再次执行 SVG 转 PNG 的转换 - return new ImageFileOptimizationResult() + return new EnhancedGraphicsMetafileOptimizationResult() { OptimizedImageFile = new FileInfo(svgFile) }; @@ -427,14 +290,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 ImageFileOptimizationResult.NotSupported(); + return EnhancedGraphicsMetafileOptimizationResult.NotSupported(); } [SupportedOSPlatform("windows6.1")] - private static ImageFileOptimizationResult ConvertInWindows(ImageFileOptimizationContext context) + private static EnhancedGraphicsMetafileOptimizationResult ConvertInWindows(EnhancedGraphicsMetafileOptimizationContext context) { var file = context.ImageFile; var workingFolder = context.WorkingFolder; @@ -449,7 +312,7 @@ private static ImageFileOptimizationResult ConvertInWindows(ImageFileOptimizatio // 将增强型图形元文件转成位图。 emf.Save(convertedFile, ImageFormat.Png); - return new ImageFileOptimizationResult() + return new EnhancedGraphicsMetafileOptimizationResult() { OptimizedImageFile = new FileInfo(convertedFile), }; @@ -458,167 +321,7 @@ private static ImageFileOptimizationResult ConvertInWindows(ImageFileOptimizatio { context.LogMessage($"Fail convert emf or wmf to png by GDI. File:'{file}' Exception:{e}"); - return ImageFileOptimizationResult.FailException(e); - } - } -} - -/// -/// 提供 SVG 文件相关的优化与修复方法,例如将 SVG 转换为 PNG,或修复 SVG 中的无效字符。 -/// -public static class SvgFileOptimization -{ - /* - 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); - } - } - 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; - } - } - */ - - /// - /// 将指定上下文中的 SVG 文件渲染并保存为 PNG 文件。 - /// - /// 包含 SVG 文件和工作目录等信息的上下文。 - /// 成功时返回生成的 PNG 文件信息;失败时返回 null。 - 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; - } - - /// - /// 异步修复 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(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; - } + return EnhancedGraphicsMetafileOptimizationResult.FailException(e); } - - 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/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..a402d79 --- /dev/null +++ b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Optimizations/EnhancedGraphicsMetafileOptimizationResult.cs @@ -0,0 +1,55 @@ +using System.Diagnostics.CodeAnalysis; + +namespace DotNetCampus.MediaConverter.SkiaWmfRenderer.Optimizations; + +/// +/// 表示增强图元优化操作的结果。 +/// +public readonly record struct EnhancedGraphicsMetafileOptimizationResult() +{ + /// + /// 如果优化过程成功并产生了输出文件,则为 true。 + /// + [MemberNotNullWhen(returnValue: true)] + public bool IsSuccess => OptimizedImageFile is not null; + + /// + /// 优化后生成的图像文件(如果成功)。 + /// + public FileInfo? OptimizedImageFile { get; init; } + + /// + /// 表示该操作不被支持(例如平台或格式不支持)。 + /// + public bool IsNotSupport { 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..ba31ed1 --- /dev/null +++ b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Optimizations/SvgFileOptimization.cs @@ -0,0 +1,165 @@ +using System.Xml.Linq; +using SkiaSharp; +using Svg.Skia; + +namespace DotNetCampus.MediaConverter.SkiaWmfRenderer.Optimizations; + +/// +/// 提供 SVG 文件相关的优化与修复方法,例如将 SVG 转换为 PNG,或修复 SVG 中的无效字符。 +/// +public static class SvgFileOptimization +{ + /* + 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); + } + } + 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; + } + } + */ + + /// + /// 将指定上下文中的 SVG 文件渲染并保存为 PNG 文件。 + /// + /// 包含 SVG 文件和工作目录等信息的上下文。 + /// 成功时返回生成的 PNG 文件信息;失败时返回 null。 + public static FileInfo? ConvertSvgToPngFile(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 From eb3aad6c67ee59840220b1ad7e2bf69d22f9ad3c Mon Sep 17 00:00:00 2001 From: lindexi Date: Tue, 2 Sep 2025 17:35:06 +0800 Subject: [PATCH 07/33] =?UTF-8?q?=E6=8F=90=E4=BE=9B=E7=AE=80=E4=BE=BF?= =?UTF-8?q?=E7=9A=84=E8=BD=AC=E6=8D=A2=E5=AE=9E=E7=8E=B0=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../EnhancedGraphicsMetafileOptimization.cs | 60 ++++++++++++++++--- .../Optimizations/SvgFileOptimization.cs | 52 +--------------- 2 files changed, 54 insertions(+), 58 deletions(-) diff --git a/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Optimizations/EnhancedGraphicsMetafileOptimization.cs b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Optimizations/EnhancedGraphicsMetafileOptimization.cs index d2fb8b3..95acc41 100644 --- a/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Optimizations/EnhancedGraphicsMetafileOptimization.cs +++ b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Optimizations/EnhancedGraphicsMetafileOptimization.cs @@ -13,17 +13,63 @@ namespace DotNetCampus.MediaConverter.SkiaWmfRenderer.Optimizations; /// public static class EnhancedGraphicsMetafileOptimization { + /// + /// 尝试将矢量图文件(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; + } + + result = default; + return false; + + bool IsExtension(string extension) + { + return string.Equals(context.ImageFile.Extension, extension, StringComparison.OrdinalIgnoreCase); + } + } + /// /// 将 WMF 或 EMF 文件转换为 PNG 文件。根据当前运行平台选择合适的转换实现。 /// /// 包含要转换文件和工作目录等设置的上下文。 /// 转换操作的结果,包含生成的文件或错误信息。 - public static EnhancedGraphicsMetafileOptimizationResult ConvertWmfOrEmfToPngFile(EnhancedGraphicsMetafileOptimizationContext context) + 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()) @@ -73,7 +119,7 @@ private static EnhancedGraphicsMetafileOptimizationResult ConvertInLinux(Enhance } // 使用 SkiaWmfRenderer 进行转换 - result = ConvertWithSkiaWmfRenderer(context); + result = ConvertWithSkiaWmfRenderer(in context); if (result.IsSuccess) { return result; @@ -86,7 +132,7 @@ private static EnhancedGraphicsMetafileOptimizationResult ConvertInLinux(Enhance // 使用 libwmf 进行转换 - result = ConvertWithLibWmf(context); + result = ConvertWithLibWmf(in context); if (result.OptimizedImageFile is { } svgLibWmfFile) { return ConvertSvgToPngFile(svgLibWmfFile); @@ -130,7 +176,7 @@ EnhancedGraphicsMetafileOptimizationResult ConvertSvgToPngFile(FileInfo svgImage /// /// 包含输入文件、输出目录和尺寸限制等信息的上下文。 /// 如果转换成功则返回包含输出 PNG 文件的结果,否则返回不支持或失败的结果。 - private static EnhancedGraphicsMetafileOptimizationResult ConvertWithSkiaWmfRenderer(EnhancedGraphicsMetafileOptimizationContext context) + private static EnhancedGraphicsMetafileOptimizationResult ConvertWithSkiaWmfRenderer(in EnhancedGraphicsMetafileOptimizationContext context) { int requestWidth = context.MaxImageWidth ?? 0; int requestHeight = context.MaxImageHeight ?? 0; @@ -162,7 +208,7 @@ private static EnhancedGraphicsMetafileOptimizationResult ConvertWithSkiaWmfRend } [SupportedOSPlatform("linux")] - private static EnhancedGraphicsMetafileOptimizationResult ConvertWithLibWmf(EnhancedGraphicsMetafileOptimizationContext context) + private static EnhancedGraphicsMetafileOptimizationResult ConvertWithLibWmf(in EnhancedGraphicsMetafileOptimizationContext context) { var file = context.ImageFile; var workingFolder = context.WorkingFolder; @@ -297,7 +343,7 @@ private static EnhancedGraphicsMetafileOptimizationResult ConvertWithInkscape(En } [SupportedOSPlatform("windows6.1")] - private static EnhancedGraphicsMetafileOptimizationResult ConvertInWindows(EnhancedGraphicsMetafileOptimizationContext context) + private static EnhancedGraphicsMetafileOptimizationResult ConvertInWindows(in EnhancedGraphicsMetafileOptimizationContext context) { var file = context.ImageFile; var workingFolder = context.WorkingFolder; diff --git a/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Optimizations/SvgFileOptimization.cs b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Optimizations/SvgFileOptimization.cs index ba31ed1..ea4a789 100644 --- a/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Optimizations/SvgFileOptimization.cs +++ b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Optimizations/SvgFileOptimization.cs @@ -9,62 +9,12 @@ namespace DotNetCampus.MediaConverter.SkiaWmfRenderer.Optimizations; /// public static class SvgFileOptimization { - /* - 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); - } - } - 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; - } - } - */ - /// /// 将指定上下文中的 SVG 文件渲染并保存为 PNG 文件。 /// /// 包含 SVG 文件和工作目录等信息的上下文。 /// 成功时返回生成的 PNG 文件信息;失败时返回 null。 - public static FileInfo? ConvertSvgToPngFile(EnhancedGraphicsMetafileOptimizationContext context) + public static FileInfo? ConvertSvgToPngFile(in EnhancedGraphicsMetafileOptimizationContext context) { var imageFile = context.ImageFile; var workingFolder = context.WorkingFolder; From a5455e9820873af8b08a3eba7119562d19379d96 Mon Sep 17 00:00:00 2001 From: lindexi Date: Tue, 2 Sep 2025 17:39:25 +0800 Subject: [PATCH 08/33] =?UTF-8?q?=E6=9B=B4=E6=94=B9=E8=B5=84=E6=BA=90?= =?UTF-8?q?=E8=B4=9F=E8=BD=BD=E8=B5=84=E6=BA=90=E6=89=80=E5=9C=A8=E9=A1=B9?= =?UTF-8?q?=E7=9B=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MediaConverters.Tool.csproj | 6 ------ .../Assets/Fonts/StandardSymbolsPS.ttf | Bin .../Assets/gsfonts/NimbusMonoPS-Bold.afm | 0 .../Assets/gsfonts/NimbusMonoPS-Bold.t1 | Bin .../Assets/gsfonts/NimbusMonoPS-BoldItalic.afm | 0 .../Assets/gsfonts/NimbusMonoPS-BoldItalic.t1 | Bin .../Assets/gsfonts/NimbusMonoPS-Italic.afm | 0 .../Assets/gsfonts/NimbusMonoPS-Italic.t1 | Bin .../Assets/gsfonts/NimbusMonoPS-Regular.afm | 0 .../Assets/gsfonts/NimbusMonoPS-Regular.t1 | Bin .../Assets/gsfonts/NimbusRoman-Bold.afm | 0 .../Assets/gsfonts/NimbusRoman-Bold.t1 | Bin .../Assets/gsfonts/NimbusRoman-BoldItalic.afm | 0 .../Assets/gsfonts/NimbusRoman-BoldItalic.t1 | Bin .../Assets/gsfonts/NimbusRoman-Italic.afm | 0 .../Assets/gsfonts/NimbusRoman-Italic.t1 | Bin .../Assets/gsfonts/NimbusRoman-Regular.afm | 0 .../Assets/gsfonts/NimbusRoman-Regular.t1 | Bin .../Assets/gsfonts/NimbusSans-Bold.afm | 0 .../Assets/gsfonts/NimbusSans-Bold.t1 | Bin .../Assets/gsfonts/NimbusSans-BoldItalic.afm | 0 .../Assets/gsfonts/NimbusSans-BoldItalic.t1 | Bin .../Assets/gsfonts/NimbusSans-Italic.afm | 0 .../Assets/gsfonts/NimbusSans-Italic.t1 | Bin .../Assets/gsfonts/NimbusSans-Regular.afm | 0 .../Assets/gsfonts/NimbusSans-Regular.t1 | Bin .../src/SkiaWmfRenderer}/Assets/gsfonts/README.md | 0 .../Assets/gsfonts/StandardSymbolsPS.afm | 0 .../Assets/gsfonts/StandardSymbolsPS.t1 | Bin .../SkiaWmfRenderer}/Assets/gsfonts/a010013l.afm | 0 .../SkiaWmfRenderer}/Assets/gsfonts/a010013l.pfb | Bin .../SkiaWmfRenderer}/Assets/gsfonts/a010013l.pfm | Bin .../SkiaWmfRenderer}/Assets/gsfonts/a010015l.afm | 0 .../SkiaWmfRenderer}/Assets/gsfonts/a010015l.pfb | Bin .../SkiaWmfRenderer}/Assets/gsfonts/a010015l.pfm | Bin .../SkiaWmfRenderer}/Assets/gsfonts/a010033l.afm | 0 .../SkiaWmfRenderer}/Assets/gsfonts/a010033l.pfb | Bin .../SkiaWmfRenderer}/Assets/gsfonts/a010033l.pfm | Bin .../SkiaWmfRenderer}/Assets/gsfonts/a010035l.afm | 0 .../SkiaWmfRenderer}/Assets/gsfonts/a010035l.pfb | Bin .../SkiaWmfRenderer}/Assets/gsfonts/a010035l.pfm | Bin .../SkiaWmfRenderer}/Assets/gsfonts/b018012l.afm | 0 .../SkiaWmfRenderer}/Assets/gsfonts/b018012l.pfb | Bin .../SkiaWmfRenderer}/Assets/gsfonts/b018012l.pfm | Bin .../SkiaWmfRenderer}/Assets/gsfonts/b018015l.afm | 0 .../SkiaWmfRenderer}/Assets/gsfonts/b018015l.pfb | Bin .../SkiaWmfRenderer}/Assets/gsfonts/b018015l.pfm | Bin .../SkiaWmfRenderer}/Assets/gsfonts/b018032l.afm | 0 .../SkiaWmfRenderer}/Assets/gsfonts/b018032l.pfb | Bin .../SkiaWmfRenderer}/Assets/gsfonts/b018032l.pfm | Bin .../SkiaWmfRenderer}/Assets/gsfonts/b018035l.afm | 0 .../SkiaWmfRenderer}/Assets/gsfonts/b018035l.pfb | Bin .../SkiaWmfRenderer}/Assets/gsfonts/b018035l.pfm | Bin .../SkiaWmfRenderer}/Assets/gsfonts/c059013l.afm | 0 .../SkiaWmfRenderer}/Assets/gsfonts/c059013l.pfb | Bin .../SkiaWmfRenderer}/Assets/gsfonts/c059013l.pfm | Bin .../SkiaWmfRenderer}/Assets/gsfonts/c059016l.afm | 0 .../SkiaWmfRenderer}/Assets/gsfonts/c059016l.pfb | Bin .../SkiaWmfRenderer}/Assets/gsfonts/c059016l.pfm | Bin .../SkiaWmfRenderer}/Assets/gsfonts/c059033l.afm | 0 .../SkiaWmfRenderer}/Assets/gsfonts/c059033l.pfb | Bin .../SkiaWmfRenderer}/Assets/gsfonts/c059033l.pfm | Bin .../SkiaWmfRenderer}/Assets/gsfonts/c059036l.afm | 0 .../SkiaWmfRenderer}/Assets/gsfonts/c059036l.pfb | Bin .../SkiaWmfRenderer}/Assets/gsfonts/c059036l.pfm | Bin .../SkiaWmfRenderer}/Assets/gsfonts/d050000l.afm | 0 .../SkiaWmfRenderer}/Assets/gsfonts/d050000l.pfb | Bin .../SkiaWmfRenderer}/Assets/gsfonts/d050000l.pfm | Bin .../SkiaWmfRenderer}/Assets/gsfonts/n019003l.afm | 0 .../SkiaWmfRenderer}/Assets/gsfonts/n019003l.pfb | Bin .../SkiaWmfRenderer}/Assets/gsfonts/n019003l.pfm | Bin .../SkiaWmfRenderer}/Assets/gsfonts/n019004l.afm | 0 .../SkiaWmfRenderer}/Assets/gsfonts/n019004l.pfb | Bin .../SkiaWmfRenderer}/Assets/gsfonts/n019004l.pfm | Bin .../SkiaWmfRenderer}/Assets/gsfonts/n019023l.afm | 0 .../SkiaWmfRenderer}/Assets/gsfonts/n019023l.pfb | Bin .../SkiaWmfRenderer}/Assets/gsfonts/n019023l.pfm | Bin .../SkiaWmfRenderer}/Assets/gsfonts/n019024l.afm | 0 .../SkiaWmfRenderer}/Assets/gsfonts/n019024l.pfb | Bin .../SkiaWmfRenderer}/Assets/gsfonts/n019024l.pfm | Bin .../SkiaWmfRenderer}/Assets/gsfonts/n019043l.afm | 0 .../SkiaWmfRenderer}/Assets/gsfonts/n019043l.pfb | Bin .../SkiaWmfRenderer}/Assets/gsfonts/n019043l.pfm | Bin .../SkiaWmfRenderer}/Assets/gsfonts/n019044l.afm | 0 .../SkiaWmfRenderer}/Assets/gsfonts/n019044l.pfb | Bin .../SkiaWmfRenderer}/Assets/gsfonts/n019044l.pfm | Bin .../SkiaWmfRenderer}/Assets/gsfonts/n019063l.afm | 0 .../SkiaWmfRenderer}/Assets/gsfonts/n019063l.pfb | Bin .../SkiaWmfRenderer}/Assets/gsfonts/n019063l.pfm | Bin .../SkiaWmfRenderer}/Assets/gsfonts/n019064l.afm | 0 .../SkiaWmfRenderer}/Assets/gsfonts/n019064l.pfb | Bin .../SkiaWmfRenderer}/Assets/gsfonts/n019064l.pfm | Bin .../SkiaWmfRenderer}/Assets/gsfonts/n021003l.afm | 0 .../SkiaWmfRenderer}/Assets/gsfonts/n021003l.pfb | Bin .../SkiaWmfRenderer}/Assets/gsfonts/n021003l.pfm | Bin .../SkiaWmfRenderer}/Assets/gsfonts/n021004l.afm | 0 .../SkiaWmfRenderer}/Assets/gsfonts/n021004l.pfb | Bin .../SkiaWmfRenderer}/Assets/gsfonts/n021004l.pfm | Bin .../SkiaWmfRenderer}/Assets/gsfonts/n021023l.afm | 0 .../SkiaWmfRenderer}/Assets/gsfonts/n021023l.pfb | Bin .../SkiaWmfRenderer}/Assets/gsfonts/n021023l.pfm | Bin .../SkiaWmfRenderer}/Assets/gsfonts/n021024l.afm | 0 .../SkiaWmfRenderer}/Assets/gsfonts/n021024l.pfb | Bin .../SkiaWmfRenderer}/Assets/gsfonts/n021024l.pfm | Bin .../SkiaWmfRenderer}/Assets/gsfonts/n022003l.afm | 0 .../SkiaWmfRenderer}/Assets/gsfonts/n022003l.pfb | Bin .../SkiaWmfRenderer}/Assets/gsfonts/n022003l.pfm | Bin .../SkiaWmfRenderer}/Assets/gsfonts/n022004l.afm | 0 .../SkiaWmfRenderer}/Assets/gsfonts/n022004l.pfb | Bin .../SkiaWmfRenderer}/Assets/gsfonts/n022004l.pfm | Bin .../SkiaWmfRenderer}/Assets/gsfonts/n022023l.afm | 0 .../SkiaWmfRenderer}/Assets/gsfonts/n022023l.pfb | Bin .../SkiaWmfRenderer}/Assets/gsfonts/n022023l.pfm | Bin .../SkiaWmfRenderer}/Assets/gsfonts/n022024l.afm | 0 .../SkiaWmfRenderer}/Assets/gsfonts/n022024l.pfb | Bin .../SkiaWmfRenderer}/Assets/gsfonts/n022024l.pfm | Bin .../SkiaWmfRenderer}/Assets/gsfonts/p052003l.afm | 0 .../SkiaWmfRenderer}/Assets/gsfonts/p052003l.pfb | Bin .../SkiaWmfRenderer}/Assets/gsfonts/p052003l.pfm | Bin .../SkiaWmfRenderer}/Assets/gsfonts/p052004l.afm | 0 .../SkiaWmfRenderer}/Assets/gsfonts/p052004l.pfb | Bin .../SkiaWmfRenderer}/Assets/gsfonts/p052004l.pfm | Bin .../SkiaWmfRenderer}/Assets/gsfonts/p052023l.afm | 0 .../SkiaWmfRenderer}/Assets/gsfonts/p052023l.pfb | Bin .../SkiaWmfRenderer}/Assets/gsfonts/p052023l.pfm | Bin .../SkiaWmfRenderer}/Assets/gsfonts/p052024l.afm | 0 .../SkiaWmfRenderer}/Assets/gsfonts/p052024l.pfb | Bin .../SkiaWmfRenderer}/Assets/gsfonts/p052024l.pfm | Bin .../SkiaWmfRenderer}/Assets/gsfonts/s050000l.afm | 0 .../SkiaWmfRenderer}/Assets/gsfonts/s050000l.pfb | Bin .../SkiaWmfRenderer}/Assets/gsfonts/s050000l.pfm | Bin .../SkiaWmfRenderer}/Assets/gsfonts/z003034l.afm | 0 .../SkiaWmfRenderer}/Assets/gsfonts/z003034l.pfb | Bin .../SkiaWmfRenderer}/Assets/gsfonts/z003034l.pfm | Bin .../SkiaWmfRenderer}/Assets/linux-arm64/README.md | 0 .../Assets/linux-arm64/libwmf-0.2.so.7 | Bin .../Assets/linux-arm64/libwmflite-0.2.so.7 | Bin .../src/SkiaWmfRenderer}/Assets/linux-arm64/wmf2svg | Bin .../Assets/linux-loongarch64/libwmf-0.2.so.7 | Bin .../Assets/linux-loongarch64/libwmflite-0.2.so.7 | Bin .../Assets/linux-loongarch64/wmf2svg | Bin .../src/SkiaWmfRenderer}/Assets/linux-x64/README.md | 0 .../Assets/linux-x64/libwmf-0.2.so.7 | Bin .../Assets/linux-x64/libwmflite-0.2.so.7 | Bin .../src/SkiaWmfRenderer}/Assets/linux-x64/wmf2svg | Bin .../src/SkiaWmfRenderer/SkiaWmfRenderer.csproj | 6 ++++++ 146 files changed, 6 insertions(+), 6 deletions(-) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/Fonts/StandardSymbolsPS.ttf (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/NimbusMonoPS-Bold.afm (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/NimbusMonoPS-Bold.t1 (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/NimbusMonoPS-BoldItalic.afm (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/NimbusMonoPS-BoldItalic.t1 (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/NimbusMonoPS-Italic.afm (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/NimbusMonoPS-Italic.t1 (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/NimbusMonoPS-Regular.afm (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/NimbusMonoPS-Regular.t1 (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/NimbusRoman-Bold.afm (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/NimbusRoman-Bold.t1 (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/NimbusRoman-BoldItalic.afm (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/NimbusRoman-BoldItalic.t1 (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/NimbusRoman-Italic.afm (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/NimbusRoman-Italic.t1 (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/NimbusRoman-Regular.afm (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/NimbusRoman-Regular.t1 (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/NimbusSans-Bold.afm (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/NimbusSans-Bold.t1 (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/NimbusSans-BoldItalic.afm (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/NimbusSans-BoldItalic.t1 (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/NimbusSans-Italic.afm (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/NimbusSans-Italic.t1 (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/NimbusSans-Regular.afm (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/NimbusSans-Regular.t1 (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/README.md (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/StandardSymbolsPS.afm (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/StandardSymbolsPS.t1 (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/a010013l.afm (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/a010013l.pfb (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/a010013l.pfm (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/a010015l.afm (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/a010015l.pfb (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/a010015l.pfm (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/a010033l.afm (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/a010033l.pfb (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/a010033l.pfm (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/a010035l.afm (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/a010035l.pfb (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/a010035l.pfm (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/b018012l.afm (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/b018012l.pfb (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/b018012l.pfm (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/b018015l.afm (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/b018015l.pfb (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/b018015l.pfm (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/b018032l.afm (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/b018032l.pfb (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/b018032l.pfm (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/b018035l.afm (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/b018035l.pfb (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/b018035l.pfm (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/c059013l.afm (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/c059013l.pfb (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/c059013l.pfm (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/c059016l.afm (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/c059016l.pfb (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/c059016l.pfm (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/c059033l.afm (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/c059033l.pfb (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/c059033l.pfm (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/c059036l.afm (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/c059036l.pfb (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/c059036l.pfm (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/d050000l.afm (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/d050000l.pfb (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/d050000l.pfm (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/n019003l.afm (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/n019003l.pfb (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/n019003l.pfm (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/n019004l.afm (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/n019004l.pfb (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/n019004l.pfm (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/n019023l.afm (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/n019023l.pfb (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/n019023l.pfm (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/n019024l.afm (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/n019024l.pfb (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/n019024l.pfm (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/n019043l.afm (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/n019043l.pfb (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/n019043l.pfm (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/n019044l.afm (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/n019044l.pfb (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/n019044l.pfm (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/n019063l.afm (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/n019063l.pfb (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/n019063l.pfm (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/n019064l.afm (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/n019064l.pfb (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/n019064l.pfm (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/n021003l.afm (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/n021003l.pfb (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/n021003l.pfm (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/n021004l.afm (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/n021004l.pfb (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/n021004l.pfm (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/n021023l.afm (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/n021023l.pfb (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/n021023l.pfm (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/n021024l.afm (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/n021024l.pfb (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/n021024l.pfm (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/n022003l.afm (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/n022003l.pfb (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/n022003l.pfm (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/n022004l.afm (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/n022004l.pfb (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/n022004l.pfm (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/n022023l.afm (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/n022023l.pfb (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/n022023l.pfm (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/n022024l.afm (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/n022024l.pfb (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/n022024l.pfm (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/p052003l.afm (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/p052003l.pfb (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/p052003l.pfm (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/p052004l.afm (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/p052004l.pfb (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/p052004l.pfm (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/p052023l.afm (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/p052023l.pfb (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/p052023l.pfm (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/p052024l.afm (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/p052024l.pfb (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/p052024l.pfm (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/s050000l.afm (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/s050000l.pfb (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/s050000l.pfm (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/z003034l.afm (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/z003034l.pfb (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/gsfonts/z003034l.pfm (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/linux-arm64/README.md (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/linux-arm64/libwmf-0.2.so.7 (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/linux-arm64/libwmflite-0.2.so.7 (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/linux-arm64/wmf2svg (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/linux-loongarch64/libwmf-0.2.so.7 (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/linux-loongarch64/libwmflite-0.2.so.7 (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/linux-loongarch64/wmf2svg (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/linux-x64/README.md (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/linux-x64/libwmf-0.2.so.7 (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/linux-x64/libwmflite-0.2.so.7 (100%) rename src/MediaConverters/{MediaConverters.Tool => SkiaWmfRenderer/src/SkiaWmfRenderer}/Assets/linux-x64/wmf2svg (100%) diff --git a/src/MediaConverters/MediaConverters.Tool/MediaConverters.Tool.csproj b/src/MediaConverters/MediaConverters.Tool/MediaConverters.Tool.csproj index de94b8b..032680d 100644 --- a/src/MediaConverters/MediaConverters.Tool/MediaConverters.Tool.csproj +++ b/src/MediaConverters/MediaConverters.Tool/MediaConverters.Tool.csproj @@ -13,12 +13,6 @@ false - - - - - - 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/SkiaWmfRenderer/src/SkiaWmfRenderer/SkiaWmfRenderer.csproj b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/SkiaWmfRenderer.csproj index 0f7d27b..189aadc 100644 --- a/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/SkiaWmfRenderer.csproj +++ b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/SkiaWmfRenderer.csproj @@ -10,6 +10,12 @@ DotNetCampus.MediaConverter.SkiaWmfRenderer + + + + + + README.md From f9125265e00b599dcece2493612a39d6b391fc6a Mon Sep 17 00:00:00 2001 From: lindexi Date: Wed, 3 Sep 2025 10:05:37 +0800 Subject: [PATCH 09/33] =?UTF-8?q?=E9=85=8D=E7=BD=AE=E6=89=93=E5=8C=85?= =?UTF-8?q?=E8=BE=93=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/SkiaWmfRenderer/SkiaWmfRenderer.csproj | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/SkiaWmfRenderer.csproj b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/SkiaWmfRenderer.csproj index 189aadc..f18653d 100644 --- a/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/SkiaWmfRenderer.csproj +++ b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/SkiaWmfRenderer.csproj @@ -11,9 +11,9 @@ - - - + + + @@ -50,7 +50,8 @@ - + + From 9d6b21d56c73352d36988de144b1be8493a415ad Mon Sep 17 00:00:00 2001 From: lindexi Date: Wed, 3 Sep 2025 17:50:13 +0800 Subject: [PATCH 10/33] =?UTF-8?q?=E5=8A=A0=E4=B8=8A=E6=89=93=E5=8C=85?= =?UTF-8?q?=E6=9E=84=E5=BB=BA=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/SkiaWmfRenderer/Assets/Build/Core.props | 7 +++++++ .../src/SkiaWmfRenderer/Assets/Build/Package.props | 3 +++ .../SkiaWmfRenderer/Assets/Build/Package.targets | 5 +++++ .../Assets/BuildTransitive/Package.props | 3 +++ .../Assets/BuildTransitive/Package.targets | 5 +++++ .../src/SkiaWmfRenderer/SkiaWmfRenderer.csproj | 14 +++++++++++--- 6 files changed, 34 insertions(+), 3 deletions(-) create mode 100644 src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/Build/Core.props create mode 100644 src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/Build/Package.props create mode 100644 src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/Build/Package.targets create mode 100644 src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/BuildTransitive/Package.props create mode 100644 src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/BuildTransitive/Package.targets 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..9e274bf --- /dev/null +++ b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/Build/Core.props @@ -0,0 +1,7 @@ + + + + + + + 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..1ff92e8 --- /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/SkiaWmfRenderer/src/SkiaWmfRenderer/SkiaWmfRenderer.csproj b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/SkiaWmfRenderer.csproj index f18653d..40449b2 100644 --- a/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/SkiaWmfRenderer.csproj +++ b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/SkiaWmfRenderer.csproj @@ -11,11 +11,19 @@ - - - + + + + + + + + + + + README.md From eeffd65ab4b988ba2a1a0ff3b5cd80545f4ae2c2 Mon Sep 17 00:00:00 2001 From: lindexi Date: Wed, 3 Sep 2025 17:54:57 +0800 Subject: [PATCH 11/33] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E8=B7=AF=E5=BE=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/SkiaWmfRenderer/Assets/BuildTransitive/Package.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/BuildTransitive/Package.props b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/BuildTransitive/Package.props index 1ff92e8..41df319 100644 --- a/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/BuildTransitive/Package.props +++ b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/BuildTransitive/Package.props @@ -1,3 +1,3 @@  - + From 85eee8eae4589e4853bb17f594b1ee4cc19bd843 Mon Sep 17 00:00:00 2001 From: lindexi Date: Wed, 3 Sep 2025 17:57:28 +0800 Subject: [PATCH 12/33] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=8B=B7=E8=B4=9D?= =?UTF-8?q?=E9=94=99=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/Build/Core.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/Build/Core.props b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/Build/Core.props index 9e274bf..70f0ed6 100644 --- a/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/Build/Core.props +++ b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/Build/Core.props @@ -2,6 +2,6 @@ - + From 6e0f53f5628b0730b8de38dfa3cff994b4876b84 Mon Sep 17 00:00:00 2001 From: lindexi Date: Wed, 3 Sep 2025 18:00:17 +0800 Subject: [PATCH 13/33] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=86=85=E5=AE=B9?= =?UTF-8?q?=E8=A2=AB=E5=B1=95=E5=BC=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/SkiaWmfRenderer/Assets/Build/Core.props | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/Build/Core.props b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/Build/Core.props index 70f0ed6..1b44a81 100644 --- a/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/Build/Core.props +++ b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/Build/Core.props @@ -1,7 +1,7 @@  - - - + + + From b7f4275bd2f8594fb3e473a7d987d58546775000 Mon Sep 17 00:00:00 2001 From: lindexi Date: Wed, 3 Sep 2025 18:02:16 +0800 Subject: [PATCH 14/33] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=89=93=E5=8C=85?= =?UTF-8?q?=E8=BF=87=E7=A8=8B=E6=B2=A1=E6=9C=89=E5=B0=86=E6=AD=A3=E7=A1=AE?= =?UTF-8?q?=E5=B9=B3=E5=8F=B0=E6=94=BE=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/SkiaWmfRenderer/SkiaWmfRenderer.csproj | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/SkiaWmfRenderer.csproj b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/SkiaWmfRenderer.csproj index 40449b2..7418d1f 100644 --- a/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/SkiaWmfRenderer.csproj +++ b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/SkiaWmfRenderer.csproj @@ -11,7 +11,9 @@ - + + + From 00d4756b7ff0197aa02d3123d5d80ccf14c6b0d9 Mon Sep 17 00:00:00 2001 From: lindexi Date: Wed, 3 Sep 2025 20:09:06 +0800 Subject: [PATCH 15/33] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20Windows=20=E7=AB=AF?= =?UTF-8?q?=E4=B9=9F=E8=A2=AB=E6=8B=B7=E8=B4=9D=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/SkiaWmfRenderer/Assets/Build/Core.props | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/Build/Core.props b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/Build/Core.props index 1b44a81..c875d29 100644 --- a/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/Build/Core.props +++ b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/Build/Core.props @@ -1,7 +1,7 @@  - + - - + + From 6fc64cede60c0ba76a0fa0e1d5754be44a8a020a Mon Sep 17 00:00:00 2001 From: lindexi Date: Wed, 3 Sep 2025 20:11:02 +0800 Subject: [PATCH 16/33] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=94=99=E8=AF=AF?= =?UTF-8?q?=E7=9A=84=E5=B1=9E=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/SkiaWmfRenderer/Assets/Build/Core.props | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/Build/Core.props b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/Build/Core.props index c875d29..5580cf5 100644 --- a/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/Build/Core.props +++ b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/Build/Core.props @@ -1,7 +1,10 @@  - - - - - + + + + + \ No newline at end of file From 881384d40ab95813de7e884557d7bcbc1345c9bf Mon Sep 17 00:00:00 2001 From: lindexi Date: Wed, 3 Sep 2025 20:40:09 +0800 Subject: [PATCH 17/33] =?UTF-8?q?=E5=8E=BB=E6=8E=89=E4=B8=8D=E8=83=BD?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E7=9A=84=E5=8D=95=E5=85=83=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Optimizations/ImageFileOptimizationTests.cs | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) 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() From 1b860b0897f50e1ae378f636b7543a81e3b6509d Mon Sep 17 00:00:00 2001 From: lindexi Date: Fri, 5 Sep 2025 10:20:18 +0800 Subject: [PATCH 18/33] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=BF=98=E8=AE=B0?= =?UTF-8?q?=E6=A0=87=E8=AE=B0=E5=8F=AF=E7=A9=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Optimizations/EnhancedGraphicsMetafileOptimizationResult.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Optimizations/EnhancedGraphicsMetafileOptimizationResult.cs b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Optimizations/EnhancedGraphicsMetafileOptimizationResult.cs index a402d79..f01c66d 100644 --- a/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Optimizations/EnhancedGraphicsMetafileOptimizationResult.cs +++ b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Optimizations/EnhancedGraphicsMetafileOptimizationResult.cs @@ -10,7 +10,7 @@ public readonly record struct EnhancedGraphicsMetafileOptimizationResult() /// /// 如果优化过程成功并产生了输出文件,则为 true。 /// - [MemberNotNullWhen(returnValue: true)] + [MemberNotNullWhen(returnValue: true, nameof(OptimizedImageFile))] public bool IsSuccess => OptimizedImageFile is not null; /// From a73432ef6b1da5b4688e7eac98584e689d59848a Mon Sep 17 00:00:00 2001 From: lindexi Date: Fri, 5 Sep 2025 10:32:18 +0800 Subject: [PATCH 19/33] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=97=A0=E9=9C=80?= =?UTF-8?q?=E8=BD=AC=E6=8D=A2=E7=9A=84=E5=B1=9E=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../EnhancedGraphicsMetafileOptimization.cs | 12 +++++++++--- .../EnhancedGraphicsMetafileOptimizationResult.cs | 5 +++++ 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Optimizations/EnhancedGraphicsMetafileOptimization.cs b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Optimizations/EnhancedGraphicsMetafileOptimization.cs index 95acc41..9e8fbfc 100644 --- a/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Optimizations/EnhancedGraphicsMetafileOptimization.cs +++ b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Optimizations/EnhancedGraphicsMetafileOptimization.cs @@ -49,9 +49,15 @@ public static bool TryOptimizeSvgOrWmf(EnhancedGraphicsMetafileOptimizationConte return true; } - - result = default; - return false; + else + { + result = new EnhancedGraphicsMetafileOptimizationResult() + { + // 无需转换 + NotNeedOptimize = true, + }; + return false; + } bool IsExtension(string extension) { diff --git a/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Optimizations/EnhancedGraphicsMetafileOptimizationResult.cs b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Optimizations/EnhancedGraphicsMetafileOptimizationResult.cs index f01c66d..e6ae252 100644 --- a/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Optimizations/EnhancedGraphicsMetafileOptimizationResult.cs +++ b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Optimizations/EnhancedGraphicsMetafileOptimizationResult.cs @@ -23,6 +23,11 @@ public readonly record struct EnhancedGraphicsMetafileOptimizationResult() /// public bool IsNotSupport { get; init; } + /// + /// 无需转换优化,原始文件已满足要求 + /// + public bool NotNeedOptimize { get; init; } + /// /// 如果发生异常则包含异常对象,否则为 null。 /// From 04c656acfa7163e3bfd8fc66f81a771e47d563de Mon Sep 17 00:00:00 2001 From: lindexi Date: Fri, 5 Sep 2025 11:07:19 +0800 Subject: [PATCH 20/33] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=8E=8B=E7=BC=A9?= =?UTF-8?q?=E7=AD=89=E7=BA=A7=E6=B2=A1=E6=9C=89=E4=BC=A0=E9=80=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Imaging/Optimizations/ImageFileOptimization.cs | 1 + .../Imaging/Optimizations/ImageFileOptimizationContext.cs | 1 + src/MediaConverters/MediaConverters.Tool/Program.cs | 1 + 3 files changed, 3 insertions(+) diff --git a/src/MediaConverters/MediaConverters.Lib/Imaging/Optimizations/ImageFileOptimization.cs b/src/MediaConverters/MediaConverters.Lib/Imaging/Optimizations/ImageFileOptimization.cs index ad4bd63..0e34408 100644 --- a/src/MediaConverters/MediaConverters.Lib/Imaging/Optimizations/ImageFileOptimization.cs +++ b/src/MediaConverters/MediaConverters.Lib/Imaging/Optimizations/ImageFileOptimization.cs @@ -131,6 +131,7 @@ public static async Task OptimizeImageFileAsync(Ima { ColorType = PngColorType.RgbWithAlpha, BitDepth = PngBitDepth.Bit8, + CompressionLevel = ((PngCompressionLevel?) context.PngCompressionLevel) ?? PngCompressionLevel.DefaultCompression }); return new ImageFileOptimizationResult() diff --git a/src/MediaConverters/MediaConverters.Lib/Imaging/Optimizations/ImageFileOptimizationContext.cs b/src/MediaConverters/MediaConverters.Lib/Imaging/Optimizations/ImageFileOptimizationContext.cs index ef34a4e..a9cfaa4 100644 --- a/src/MediaConverters/MediaConverters.Lib/Imaging/Optimizations/ImageFileOptimizationContext.cs +++ b/src/MediaConverters/MediaConverters.Lib/Imaging/Optimizations/ImageFileOptimizationContext.cs @@ -20,6 +20,7 @@ public readonly record struct ImageFileOptimizationContext(FileInfo ImageFile, public bool ShouldLogToFile { get; init; } = false; public string? LogFileName { get; init; } + public int? PngCompressionLevel { get; init; } public void LogMessage(string message) { diff --git a/src/MediaConverters/MediaConverters.Tool/Program.cs b/src/MediaConverters/MediaConverters.Tool/Program.cs index 2d74107..2ceb1c1 100644 --- a/src/MediaConverters/MediaConverters.Tool/Program.cs +++ b/src/MediaConverters/MediaConverters.Tool/Program.cs @@ -87,6 +87,7 @@ 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, }; From 17a9ff43479ea777e4e11c7923a2c8a44588b9da Mon Sep 17 00:00:00 2001 From: lindexi Date: Fri, 5 Sep 2025 11:14:52 +0800 Subject: [PATCH 21/33] =?UTF-8?q?=E5=B0=9D=E8=AF=95=E4=BF=AE=E5=A4=8D=20Li?= =?UTF-8?q?nux=20=E4=B8=8A=E5=8C=BA=E5=88=86=E5=A4=A7=E5=B0=8F=E5=86=99?= =?UTF-8?q?=E6=89=BE=E4=B8=8D=E5=88=B0=E6=96=87=E4=BB=B6=E5=A4=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/SkiaWmfRenderer/Assets/BuildTransitive/Package.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/BuildTransitive/Package.props b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/BuildTransitive/Package.props index 41df319..42f14aa 100644 --- a/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/BuildTransitive/Package.props +++ b/src/MediaConverters/SkiaWmfRenderer/src/SkiaWmfRenderer/Assets/BuildTransitive/Package.props @@ -1,3 +1,3 @@  - + From 43c4fb27fd389ca29a722b95e05107aaa47dbfec Mon Sep 17 00:00:00 2001 From: lindexi Date: Fri, 5 Sep 2025 11:44:27 +0800 Subject: [PATCH 22/33] =?UTF-8?q?=E5=88=86=E5=BC=80=E4=BF=9D=E5=AD=98?= =?UTF-8?q?=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Optimizations/ImageFileOptimization.cs | 15 ++++--- .../ImageFileOptimizationContext.cs | 5 +++ .../ImageFileOptimizationResult.cs | 3 +- .../MediaConverters.Tool/Program.cs | 40 ++++++++++--------- 4 files changed, 36 insertions(+), 27 deletions(-) diff --git a/src/MediaConverters/MediaConverters.Lib/Imaging/Optimizations/ImageFileOptimization.cs b/src/MediaConverters/MediaConverters.Lib/Imaging/Optimizations/ImageFileOptimization.cs index 0e34408..1a8c18f 100644 --- a/src/MediaConverters/MediaConverters.Lib/Imaging/Optimizations/ImageFileOptimization.cs +++ b/src/MediaConverters/MediaConverters.Lib/Imaging/Optimizations/ImageFileOptimization.cs @@ -125,14 +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, - CompressionLevel = ((PngCompressionLevel?) context.PngCompressionLevel) ?? PngCompressionLevel.DefaultCompression - }); + // 重新保存即可,保存就等于解决了各种格式问题,输出为标准的格式 + await image.SaveAsPngAsync(outputImageFilePath, new PngEncoder() + { + ColorType = PngColorType.RgbWithAlpha, + BitDepth = PngBitDepth.Bit8, + CompressionLevel = ((PngCompressionLevel?) context.PngCompressionLevel) ?? PngCompressionLevel.DefaultCompression + }); + } return new ImageFileOptimizationResult() { diff --git a/src/MediaConverters/MediaConverters.Lib/Imaging/Optimizations/ImageFileOptimizationContext.cs b/src/MediaConverters/MediaConverters.Lib/Imaging/Optimizations/ImageFileOptimizationContext.cs index a9cfaa4..21036ff 100644 --- a/src/MediaConverters/MediaConverters.Lib/Imaging/Optimizations/ImageFileOptimizationContext.cs +++ b/src/MediaConverters/MediaConverters.Lib/Imaging/Optimizations/ImageFileOptimizationContext.cs @@ -19,6 +19,11 @@ 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; } diff --git a/src/MediaConverters/MediaConverters.Lib/Imaging/Optimizations/ImageFileOptimizationResult.cs b/src/MediaConverters/MediaConverters.Lib/Imaging/Optimizations/ImageFileOptimizationResult.cs index 4925f0e..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; } diff --git a/src/MediaConverters/MediaConverters.Tool/Program.cs b/src/MediaConverters/MediaConverters.Tool/Program.cs index 2ceb1c1..6951503 100644 --- a/src/MediaConverters/MediaConverters.Tool/Program.cs +++ b/src/MediaConverters/MediaConverters.Tool/Program.cs @@ -87,9 +87,14 @@ internal static async Task RunAsync(ConvertHandler convertHandler) var context = new ImageFileOptimizationContext(inputFile, workingFolder, imageConvertContext.MaxImageWidth, imageConvertContext.MaxImageHeight) { - PngCompressionLevel = imageConvertContext.PngCompressionLevel, + // 由于不准备在此步骤保存为文件,所以不需要设置保存等级 + //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"); @@ -133,8 +138,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) @@ -148,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}'"); From 531df0642b97bb4691c426a04ee238851ea3781e Mon Sep 17 00:00:00 2001 From: lindexi Date: Fri, 5 Sep 2025 11:49:27 +0800 Subject: [PATCH 23/33] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=88=A4=E6=96=AD?= =?UTF-8?q?=E5=8F=AF=E7=A9=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/MediaConverters/MediaConverters.Tool/Program.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/MediaConverters/MediaConverters.Tool/Program.cs b/src/MediaConverters/MediaConverters.Tool/Program.cs index 6951503..78359f4 100644 --- a/src/MediaConverters/MediaConverters.Tool/Program.cs +++ b/src/MediaConverters/MediaConverters.Tool/Program.cs @@ -105,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) @@ -138,10 +140,8 @@ internal static async Task RunAsync(ConvertHandler convertHandler) return ErrorCode.UnknownError; } - - var image = imageFileOptimizationResult.Image; - if (image is not null && imageConvertContext.ImageConvertTaskList is { } list) + if (imageConvertContext.ImageConvertTaskList is { } list) { var workerProvider = new WorkerProvider(); From 8ea23b243f8a02f53b11833c071aabf47d434448 Mon Sep 17 00:00:00 2001 From: lindexi Date: Fri, 5 Sep 2025 11:52:02 +0800 Subject: [PATCH 24/33] =?UTF-8?q?=E5=8D=87=E7=BA=A7=20IPC=20=E5=BA=93?= =?UTF-8?q?=EF=BC=8C=E4=BF=AE=E5=A4=8D=20AOT=20=E4=BD=93=E7=A7=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit https://github.com/dotnet-campus/dotnetCampus.Ipc/pull/166 --- .../MediaConverters.Tool/MediaConverters.Tool.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/MediaConverters/MediaConverters.Tool/MediaConverters.Tool.csproj b/src/MediaConverters/MediaConverters.Tool/MediaConverters.Tool.csproj index 032680d..cdb5182 100644 --- a/src/MediaConverters/MediaConverters.Tool/MediaConverters.Tool.csproj +++ b/src/MediaConverters/MediaConverters.Tool/MediaConverters.Tool.csproj @@ -15,7 +15,7 @@ - + From aba9cbf113b857a3919bfce7d60ee64989977eb0 Mon Sep 17 00:00:00 2001 From: lindexi Date: Fri, 5 Sep 2025 11:53:25 +0800 Subject: [PATCH 25/33] =?UTF-8?q?=E5=B0=9D=E8=AF=95=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E6=9E=84=E5=BB=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CommandLineHandlers/IpcHandlers/IpcHandler.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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); From 6d0b95f79e19d05981729926d98884071fbc6ee0 Mon Sep 17 00:00:00 2001 From: lindexi Date: Fri, 5 Sep 2025 11:54:51 +0800 Subject: [PATCH 26/33] =?UTF-8?q?=E9=BB=98=E8=AE=A4=E5=B8=A6=E6=B5=8B?= =?UTF-8?q?=E9=87=8F=E5=A4=A7=E5=B0=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MediaConverters.Tool/MediaConverters.Tool.csproj | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/MediaConverters/MediaConverters.Tool/MediaConverters.Tool.csproj b/src/MediaConverters/MediaConverters.Tool/MediaConverters.Tool.csproj index cdb5182..5d9ad28 100644 --- a/src/MediaConverters/MediaConverters.Tool/MediaConverters.Tool.csproj +++ b/src/MediaConverters/MediaConverters.Tool/MediaConverters.Tool.csproj @@ -10,6 +10,8 @@ true true false + true + true false From c10c2594cfbe6f53959c45295254d0521e395d5f Mon Sep 17 00:00:00 2001 From: lindexi Date: Fri, 5 Sep 2025 14:34:58 +0800 Subject: [PATCH 27/33] =?UTF-8?q?Revert=20"=E5=8D=87=E7=BA=A7=20IPC=20?= =?UTF-8?q?=E5=BA=93=EF=BC=8C=E4=BF=AE=E5=A4=8D=20AOT=20=E4=BD=93=E7=A7=AF?= =?UTF-8?q?"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 8ea23b243f8a02f53b11833c071aabf47d434448. --- .../MediaConverters.Tool/MediaConverters.Tool.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/MediaConverters/MediaConverters.Tool/MediaConverters.Tool.csproj b/src/MediaConverters/MediaConverters.Tool/MediaConverters.Tool.csproj index 5d9ad28..141ae64 100644 --- a/src/MediaConverters/MediaConverters.Tool/MediaConverters.Tool.csproj +++ b/src/MediaConverters/MediaConverters.Tool/MediaConverters.Tool.csproj @@ -17,7 +17,7 @@ - + From cc59561f00348e33d1a29a80989cbc9bc502d295 Mon Sep 17 00:00:00 2001 From: lindexi Date: Fri, 5 Sep 2025 14:35:29 +0800 Subject: [PATCH 28/33] =?UTF-8?q?=E7=94=B1=E4=BA=8E=20IPC=20=E5=AF=BC?= =?UTF-8?q?=E8=87=B4=E5=BA=8F=E5=88=97=E5=8C=96=E6=96=87=E6=A1=A3=EF=BC=8C?= =?UTF-8?q?=E6=9A=82=E6=97=B6=E5=9B=9E=E6=BB=9A=E4=BB=A3=E7=A0=81=EF=BC=8C?= =?UTF-8?q?=E5=90=8C=E6=97=B6=E6=B7=BB=E5=8A=A0=E9=99=90=E5=AE=9A=E8=B6=85?= =?UTF-8?q?=E6=97=B6=E6=97=B6=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MediaConverters.Tests/Tool/MediaConverterIpcTests.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/MediaConverters/MediaConverters.Tests/Tool/MediaConverterIpcTests.cs b/src/MediaConverters/MediaConverters.Tests/Tool/MediaConverterIpcTests.cs index 8eb9080..2b233c7 100644 --- a/src/MediaConverters/MediaConverters.Tests/Tool/MediaConverterIpcTests.cs +++ b/src/MediaConverters/MediaConverters.Tests/Tool/MediaConverterIpcTests.cs @@ -95,9 +95,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) From ab3b3512a348a5c3b0341d028acfbe83df4769a5 Mon Sep 17 00:00:00 2001 From: lindexi Date: Fri, 5 Sep 2025 14:38:46 +0800 Subject: [PATCH 29/33] =?UTF-8?q?Reapply=20"=E5=8D=87=E7=BA=A7=20IPC=20?= =?UTF-8?q?=E5=BA=93=EF=BC=8C=E4=BF=AE=E5=A4=8D=20AOT=20=E4=BD=93=E7=A7=AF?= =?UTF-8?q?"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit c10c2594cfbe6f53959c45295254d0521e395d5f. --- .../MediaConverters.Tool/MediaConverters.Tool.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/MediaConverters/MediaConverters.Tool/MediaConverters.Tool.csproj b/src/MediaConverters/MediaConverters.Tool/MediaConverters.Tool.csproj index 141ae64..5d9ad28 100644 --- a/src/MediaConverters/MediaConverters.Tool/MediaConverters.Tool.csproj +++ b/src/MediaConverters/MediaConverters.Tool/MediaConverters.Tool.csproj @@ -17,7 +17,7 @@ - + From 43791475defdac5aa5e1e65e221f837f6b6dc07f Mon Sep 17 00:00:00 2001 From: lindexi Date: Fri, 5 Sep 2025 14:40:04 +0800 Subject: [PATCH 30/33] =?UTF-8?q?=E5=B0=9D=E8=AF=95=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E5=8D=95=E5=85=83=E6=B5=8B=E8=AF=95=E7=AD=89=E5=BE=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MediaConverters.Tests/Tool/MediaConverterIpcTests.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/MediaConverters/MediaConverters.Tests/Tool/MediaConverterIpcTests.cs b/src/MediaConverters/MediaConverters.Tests/Tool/MediaConverterIpcTests.cs index 2b233c7..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() From 20b90ee1bd2c103db43a27fe030098af5cfae948 Mon Sep 17 00:00:00 2001 From: lindexi Date: Fri, 5 Sep 2025 15:49:48 +0800 Subject: [PATCH 31/33] =?UTF-8?q?=E6=97=A2=E7=84=B6=E5=B7=B2=E7=BB=8F?= =?UTF-8?q?=E6=B2=A1=E6=9C=89=E6=94=AF=E6=8C=81=20wmf=20=E6=A0=BC=E5=BC=8F?= =?UTF-8?q?=E4=BA=86=EF=BC=8C=E9=82=A3=E5=B0=B1=E4=B8=8D=E5=86=8D=E4=BD=9C?= =?UTF-8?q?=E4=B8=BA=E9=BB=98=E8=AE=A4=E8=B0=83=E8=AF=95=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/MediaConverters/MediaConverters.Tool/Program.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/MediaConverters/MediaConverters.Tool/Program.cs b/src/MediaConverters/MediaConverters.Tool/Program.cs index 78359f4..fd04368 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]; From 2361f2574addc3f828a0fa387ab91dc89f65b38a Mon Sep 17 00:00:00 2001 From: lindexi Date: Fri, 5 Sep 2025 16:43:18 +0800 Subject: [PATCH 32/33] =?UTF-8?q?=E5=8D=87=E7=BA=A7=E5=BA=93=EF=BC=8C?= =?UTF-8?q?=E5=B0=9D=E8=AF=95=E4=BF=AE=E5=A4=8D=20Linux=20=E7=9A=84?= =?UTF-8?q?=E8=B7=AF=E5=BE=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MediaConverters.Tool/MediaConverters.Tool.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/MediaConverters/MediaConverters.Tool/MediaConverters.Tool.csproj b/src/MediaConverters/MediaConverters.Tool/MediaConverters.Tool.csproj index 5d9ad28..173132c 100644 --- a/src/MediaConverters/MediaConverters.Tool/MediaConverters.Tool.csproj +++ b/src/MediaConverters/MediaConverters.Tool/MediaConverters.Tool.csproj @@ -16,7 +16,7 @@ - + From 4276db3eef3a5394ae080e77bbd7d5aa4c27fe80 Mon Sep 17 00:00:00 2001 From: lindexi Date: Fri, 5 Sep 2025 16:47:34 +0800 Subject: [PATCH 33/33] =?UTF-8?q?=E6=98=8E=E7=A1=AE=E4=BD=BF=E7=94=A8=20Po?= =?UTF-8?q?werShell=20=E9=A3=8E=E6=A0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/MediaConverters/MediaConverters.Tool/Program.cs | 2 +- src/MediaConverters/README.md | 10 +++++----- src/MediaConverters/README.zh-CN.md | 10 +++++----- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/MediaConverters/MediaConverters.Tool/Program.cs b/src/MediaConverters/MediaConverters.Tool/Program.cs index fd04368..c7ea23f 100644 --- a/src/MediaConverters/MediaConverters.Tool/Program.cs +++ b/src/MediaConverters/MediaConverters.Tool/Program.cs @@ -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() 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: 最大图片高度限制。可不填或为空,表示不限制