ToData now supports multiple formats.

Introduce `ProgrartC` to build a single image to work with other build tools.
Added a `CombinedStorageProvider` to allow aggregate storage providers.
This commit is contained in:
Creeper Lv
2026-01-16 00:36:38 +11:00
parent e4e868a393
commit dce1ff2518
9 changed files with 261 additions and 17 deletions

View File

@@ -20,10 +20,10 @@ namespace Progrart.Core
return Fonts[fontName];
else
{
var task=StorageProvider.TryOpenRead(fontName);
var task = StorageProvider.TryOpenRead(fontName);
task.Wait();
var stream=task.Result;
if(stream != null)
var stream = task.Result;
if (stream != null)
{
SKTypeface typeface = SKTypeface.FromStream(stream);
@@ -47,6 +47,44 @@ namespace Progrart.Core
{
return surface.Snapshot().Encode(SKEncodedImageFormat.Png, 100);
}
public SKData ToData(SKEncodedImageFormat format)
{
return surface.Snapshot().Encode(format, 100);
}
public SKData ToData(string extension)
{
SKEncodedImageFormat format = SKEncodedImageFormat.Png;
if (extension.StartsWith('.'))
extension = extension[1..];
switch (extension)
{
case "jpg":
case "jpeg":
format = SKEncodedImageFormat.Jpeg;
break;
case "bmp":
format = SKEncodedImageFormat.Bmp;
break;
case "webp":
format = SKEncodedImageFormat.Webp;
break;
case "ico":
format = SKEncodedImageFormat.Ico;
break;
case "heif":
format = SKEncodedImageFormat.Heif;
break;
case "avif":
format = SKEncodedImageFormat.Avif;
break;
case "jxl":
format = SKEncodedImageFormat.Jpegxl;
break;
default:
break;
}
return surface.Snapshot().Encode(format, 100);
}
public void Dispose()
{
if (isDisposed) return;

View File

@@ -34,10 +34,11 @@ namespace Progrart.Core.ProjectSystem
return;
using var reader = new StreamReader(stream);
var img = executor.RenderImage(item.Size, reader.ReadToEnd(), args);
using var img_stream = await provider.TryOpenWrite(Path.Combine(project.OutputDir, item.Target ?? item.Source + ".png"));
var outputFile= Path.Combine(project.OutputDir, item.Target ?? item.Source + ".png");
using var img_stream = await provider.TryOpenWrite(outputFile);
if (img_stream is null)
return;
img.DrawingCore.ToData().SaveTo(img_stream);
img.DrawingCore.ToData(Path.GetExtension(outputFile)).SaveTo(img_stream);
img_stream.Flush();
}
public async Task Build(string targetConfig, int maxJobCount = 1)

View File

@@ -0,0 +1,26 @@
namespace Progrart.Core.Storage
{
public class CombinedStorageProvider : IStorageProvider
{
public List<IStorageProvider> providers = new List<IStorageProvider>();
public async Task<Stream?> TryOpenRead(string path)
{
foreach (var item in providers)
{
var v = await item.TryOpenRead(path);
if (v != null) return v;
}
return null;
}
public async Task<Stream?> TryOpenWrite(string path)
{
foreach (var item in providers)
{
var v = await item.TryOpenWrite(path);
if (v != null) return v;
}
return null;
}
}
}