mirror of
https://github.com/AtomUI/AtomUI.git
synced 2026-10-18 14:37:19 +08:00
86 lines
2.5 KiB
C#
86 lines
2.5 KiB
C#
using System.Buffers.Binary;
|
|
using Avalonia;
|
|
using Avalonia.Media;
|
|
|
|
namespace AtomUI.Controls.Shared.Tests.ImageLoading;
|
|
|
|
internal static class ImageLoadingTestSupport
|
|
{
|
|
internal static ImageLoadingOptions CreateOptions(Action<ImageLoadingOptionsBuilder>? configure = null)
|
|
{
|
|
var builder = new ImageLoadingOptionsBuilder
|
|
{
|
|
IsPersistentCacheEnabled = false
|
|
};
|
|
configure?.Invoke(builder);
|
|
return builder.Build("AtomUI.Controls.Shared.Tests");
|
|
}
|
|
|
|
internal static byte[] CreatePngHeader(int width = 2, int height = 3, bool animated = false)
|
|
{
|
|
var bytes = new byte[animated ? 65 : 45];
|
|
new byte[] { 0x89, (byte)'P', (byte)'N', (byte)'G', 0x0d, 0x0a, 0x1a, 0x0a }
|
|
.CopyTo(bytes, 0);
|
|
BinaryPrimitives.WriteUInt32BigEndian(bytes.AsSpan(8, 4), 13);
|
|
"IHDR"u8.CopyTo(bytes.AsSpan(12));
|
|
BinaryPrimitives.WriteUInt32BigEndian(bytes.AsSpan(16, 4), checked((uint)width));
|
|
BinaryPrimitives.WriteUInt32BigEndian(bytes.AsSpan(20, 4), checked((uint)height));
|
|
bytes[24] = 8;
|
|
bytes[25] = 6;
|
|
bytes[26] = 0;
|
|
bytes[27] = 0;
|
|
bytes[28] = 0;
|
|
if (animated)
|
|
{
|
|
BinaryPrimitives.WriteUInt32BigEndian(bytes.AsSpan(33, 4), 8);
|
|
"acTL"u8.CopyTo(bytes.AsSpan(37));
|
|
BinaryPrimitives.WriteUInt32BigEndian(bytes.AsSpan(41, 4), 1);
|
|
BinaryPrimitives.WriteUInt32BigEndian(bytes.AsSpan(45, 4), 0);
|
|
"IEND"u8.CopyTo(bytes.AsSpan(57));
|
|
}
|
|
else
|
|
{
|
|
"IEND"u8.CopyTo(bytes.AsSpan(37));
|
|
}
|
|
return bytes;
|
|
}
|
|
|
|
internal static ImageEncodedContent CreateContent(
|
|
byte[] bytes,
|
|
string? mediaType = "image/png",
|
|
ImageLoadOrigin cacheSource = ImageLoadOrigin.Local,
|
|
bool noStore = false)
|
|
{
|
|
return new ImageEncodedContent(
|
|
bytes,
|
|
mediaType,
|
|
cacheSource,
|
|
DateTimeOffset.UtcNow,
|
|
NoStore: noStore,
|
|
SecurityPolicyVersion: ImageSecurityPolicy.Version);
|
|
}
|
|
}
|
|
|
|
internal sealed class TestImage : IImage, IDisposable
|
|
{
|
|
private int _disposeCount;
|
|
|
|
internal TestImage(double width = 10, double height = 10)
|
|
{
|
|
Size = new Size(width, height);
|
|
}
|
|
|
|
public Size Size { get; }
|
|
|
|
internal int DisposeCount => Volatile.Read(ref _disposeCount);
|
|
|
|
public void Draw(DrawingContext context, Rect sourceRect, Rect destRect)
|
|
{
|
|
}
|
|
|
|
public void Dispose()
|
|
{
|
|
Interlocked.Increment(ref _disposeCount);
|
|
}
|
|
}
|