From 629550cdd2cb4030eaea8f39f2b86bde8065913a Mon Sep 17 00:00:00 2001 From: sdcb Date: Wed, 4 Nov 2026 19:16:54 +0800 Subject: [PATCH 1/5] Abstractions: init-only registrations and metadata; one way to the ICC profile ImageDecoderRegistration, ImageEncoderRegistration and ImageMetadata take their members as init properties (required where the facade needs them) instead of positional constructors, so 2.x can add members without breaking compiled callers. ImageMetadata is a record: change one block with `with`. IDecodedImage.IccProfile and RasterImage's iccProfile parameter are gone; the profile is Metadata.Icc. The facade's Register checks the planar delegate pair. Co-Authored-By: Claude Opus 5.5 --- docs/known-gaps/jpeg-gainmap.md | 2 +- .../IDecodedImage.cs | 6 - .../IImageEncoder.cs | 49 +++++--- .../ImageDecoderRegistration.cs | 111 +++++++----------- .../ImageMetadata.cs | 37 ++---- .../RasterImage.cs | 51 ++++---- src/Sdcb.SimdCodecs.Bmp/BmpImageDecoder.cs | 17 ++- src/Sdcb.SimdCodecs.Bmp/BmpImageEncoder.cs | 7 +- src/Sdcb.SimdCodecs.Gif/GifImageDecoder.cs | 14 ++- src/Sdcb.SimdCodecs.Gif/GifImageEncoder.cs | 7 +- src/Sdcb.SimdCodecs.Heif/HeifImageDecoder.cs | 21 +++- src/Sdcb.SimdCodecs.Heif/HeifMetadata.cs | 2 +- .../linqpad-samples/facade.linq | 2 +- src/Sdcb.SimdCodecs.Ico/IcoImageDecoder.cs | 28 ++++- src/Sdcb.SimdCodecs.Ico/IcoImageEncoder.cs | 7 +- .../Jbig2ImageDecoder.cs | 13 +- .../GainMapImage.cs | 4 +- .../GainMapImageDecoder.cs | 13 +- src/Sdcb.SimdCodecs.Jpeg/JpegImageDecoder.cs | 25 ++-- src/Sdcb.SimdCodecs.Jpeg/JpegImageEncoder.cs | 7 +- .../Jpeg2000ImageDecoder.cs | 19 ++- src/Sdcb.SimdCodecs.Png/PngImageDecoder.cs | 26 ++-- src/Sdcb.SimdCodecs.Png/PngImageEncoder.cs | 7 +- src/Sdcb.SimdCodecs.Pnm/PnmImageDecoder.cs | 26 +++- src/Sdcb.SimdCodecs.Pnm/PnmImageEncoder.cs | 7 +- src/Sdcb.SimdCodecs.Qoi/QoiImageDecoder.cs | 13 +- src/Sdcb.SimdCodecs.Qoi/QoiImageEncoder.cs | 7 +- src/Sdcb.SimdCodecs.Tiff/TiffImageDecoder.cs | 21 +++- src/Sdcb.SimdCodecs.Tiff/TiffImageEncoder.cs | 7 +- src/Sdcb.SimdCodecs.Webp/WebpFrameReader.cs | 3 +- src/Sdcb.SimdCodecs.Webp/WebpImageDecoder.cs | 37 ++++-- src/Sdcb.SimdCodecs.Webp/WebpImageEncoder.cs | 7 +- src/Sdcb.SimdCodecs/SimdCodecs.Encode.cs | 2 - src/Sdcb.SimdCodecs/SimdCodecs.cs | 2 + .../linqpad-samples/quick-start.linq | 2 +- tests/Sdcb.SimdCodecs.AotSmoke/FacadeSmoke.cs | 2 +- .../Sdcb.SimdCodecs.Tests/BmpDecoderTests.cs | 2 +- .../ColorEncodingTests.cs | 2 +- .../EncoderAdapterJpegWebpTiffTests.cs | 8 +- .../EncoderAdapterQoiPnmBmpTests.cs | 2 +- .../Sdcb.SimdCodecs.Tests/FrameReaderTests.cs | 2 +- .../Sdcb.SimdCodecs.Tests/HeifFacadeTests.cs | 68 +++++++++-- .../HeifImageDecoderTests.cs | 4 +- .../Jpeg2000FacadeTests.cs | 2 +- .../Sdcb.SimdCodecs.Tests/JpegIccReadTests.cs | 8 +- .../JpegIccWriteTests.cs | 2 +- tests/Sdcb.SimdCodecs.Tests/MetadataTests.cs | 8 +- .../Sdcb.SimdCodecs.Tests/RasterImageTests.cs | 5 +- .../RasterImageV2Tests.cs | 36 +++--- .../WebpMetadataTests.cs | 2 +- 50 files changed, 476 insertions(+), 286 deletions(-) diff --git a/docs/known-gaps/jpeg-gainmap.md b/docs/known-gaps/jpeg-gainmap.md index ebda89e..7920acb 100644 --- a/docs/known-gaps/jpeg-gainmap.md +++ b/docs/known-gaps/jpeg-gainmap.md @@ -2,7 +2,7 @@ 条目约定(“不支持”“门面不提供”“未调优”)和跨格式的门面限制见 [总览](../known-gaps.md)。 -- **重建出的 HDR 不带 ICC。** `IDecodedImage.IccProfile` 有意留空:浮点结果是线性光,底图的 ICC 描述的是 +- **重建出的 HDR 不带 ICC。** `IDecodedImage.Metadata.Icc` 有意留空:浮点结果是线性光,底图的 ICC 描述的是 非线性的显示曲线,套上去会误导色彩管理。需要底图的配置文件时,用 `JpegDecoder.TryReadIccProfile(file)` 读取, 并注明它属于 SDR 底图。原色仍会报告:`ColorEncoding.Primaries` 取自底图的 ICC(`IccProfiles.TryGetPrimaries` 能识别 BT.709、Display P3、BT.2020),没有 ICC 时按 sRGB 报 BT.709,识别不了时报 `Unspecified`。 diff --git a/src/Sdcb.SimdCodecs.Abstractions/IDecodedImage.cs b/src/Sdcb.SimdCodecs.Abstractions/IDecodedImage.cs index 2b12733..3a6c6db 100644 --- a/src/Sdcb.SimdCodecs.Abstractions/IDecodedImage.cs +++ b/src/Sdcb.SimdCodecs.Abstractions/IDecodedImage.cs @@ -53,12 +53,6 @@ public interface IDecodedImage : IDisposable /// The image has been disposed and its pixels returned to a pool. ReadOnlySpan Pixels { get; } - /// - /// The embedded ICC colour profile, or an empty span when the source carried - /// none. Informational for a colour-managed consumer; never rescales pixels. - /// - ReadOnlySpan IccProfile { get; } - /// /// How the sample values encode colour: H.273 primaries + transfer, code /// range, and (for float rasters) what the values are referenced to. diff --git a/src/Sdcb.SimdCodecs.Abstractions/IImageEncoder.cs b/src/Sdcb.SimdCodecs.Abstractions/IImageEncoder.cs index 363b131..ffeb491 100644 --- a/src/Sdcb.SimdCodecs.Abstractions/IImageEncoder.cs +++ b/src/Sdcb.SimdCodecs.Abstractions/IImageEncoder.cs @@ -90,8 +90,9 @@ public interface IImageFrameEncoder } /// -/// A codec's entry in the facade's encoder registry: its members as delegates. Build it from -/// the concrete type's method groups — never inside a generic method (Mono AOT; see ). +/// A codec's entry in the facade's encoder registry: its members as delegates. Build it with +/// an object initializer over the concrete type's method groups, never inside a generic method (Mono AOT; see +/// ). /// public sealed class ImageEncoderRegistration { @@ -101,26 +102,38 @@ public sealed class ImageEncoderRegistration /// . public delegate IImageEncoderSession CreateHandler(IBufferWriter output, EncodeOptions? options); - /// Describes an encoder for the facade's registry. - /// A delegate is null. - /// is or undefined. - public ImageEncoderRegistration(ImageFormat format, GetClosestInputFormatHandler getClosestInputFormat, CreateHandler create) + /// The format the encoder writes. + /// Set to or an undefined value. + public required ImageFormat Format { - if (format == ImageFormat.Unknown || !Enum.IsDefined(format)) - throw new ArgumentOutOfRangeException(nameof(format), format, "A registration names a defined, known format."); - ArgumentNullException.ThrowIfNull(getClosestInputFormat); - ArgumentNullException.ThrowIfNull(create); - Format = format; - GetClosestInputFormat = getClosestInputFormat; - Create = create; + get; + init + { + if (value == ImageFormat.Unknown || !Enum.IsDefined(value)) + throw new ArgumentOutOfRangeException(nameof(value), value, "A registration names a defined, known format."); + field = value; + } } - /// The format the encoder writes. - public ImageFormat Format { get; } - /// The encoder's input-format negotiation. - public GetClosestInputFormatHandler GetClosestInputFormat { get; } + public required GetClosestInputFormatHandler GetClosestInputFormat + { + get; + init + { + ArgumentNullException.ThrowIfNull(value); + field = value; + } + } /// The encoder's session factory. - public CreateHandler Create { get; } + public required CreateHandler Create + { + get; + init + { + ArgumentNullException.ThrowIfNull(value); + field = value; + } + } } diff --git a/src/Sdcb.SimdCodecs.Abstractions/ImageDecoderRegistration.cs b/src/Sdcb.SimdCodecs.Abstractions/ImageDecoderRegistration.cs index 1446663..59f6b3e 100644 --- a/src/Sdcb.SimdCodecs.Abstractions/ImageDecoderRegistration.cs +++ b/src/Sdcb.SimdCodecs.Abstractions/ImageDecoderRegistration.cs @@ -10,7 +10,7 @@ namespace Sdcb.SimdCodecs.Abstractions; /// (e.g. Sdcb.SimdCodecs.Heif, kept out for patent reasons) exposes one as a static property, built from /// its own members, and a consumer enables the codec once, at start-up, with SimdCodecs.Register. /// -/// Build it from the concrete type's method groups — new(ImageFormat.Heif, HeifImageDecoder.CanDecode, …) — +/// Build it with an object initializer over the concrete type's method groups — new() { Format = ImageFormat.Heif, CanDecode = HeifImageDecoder.CanDecode, … } — /// never inside a generic method over T : IImageDecoder: Mono AOT (browser-wasm, iOS, Android) compiles a /// delegate over a type parameter's static abstract member into a call that traps. That is why there is no /// generic factory. @@ -52,90 +52,65 @@ public delegate bool TryDecodeIntoHandler(ReadOnlySpan data, Span de public delegate bool TryDecodePlanesHandler(ReadOnlySpan data, Span y, Span cb, Span cr, CancellationToken cancellationToken); - /// Describes a codec for the facade's registry. - /// The format the codec decodes (what SimdCodecs.DetectFormat reports for it). - /// The codec's signature test. - /// The codec's header read. - /// The codec's native-size negotiation. - /// The codec's fidelity decode. - /// The codec's decode into a caller's buffer. - /// The codec's metadata extraction. - /// The codec's embedded-preview decode. - /// The codec's frame reader, or null for a still-only codec: the facade then - /// presents its image as one frame. - /// The codec's planar description, or null when it has no planar output. - /// The codec's planar decode; given exactly when is. - /// A required delegate is null. - /// Only one of the two planar delegates is given. - /// is - /// or not a defined member. - public ImageDecoderRegistration( - ImageFormat format, - CanDecodeHandler canDecode, - TryReadInfoHandler tryReadInfo, - TryGetClosestSizeHandler tryGetClosestSize, - TryDecodeHandler tryDecode, - TryDecodeIntoHandler tryDecodeInto, - TryReadMetadataHandler tryReadMetadata, - TryDecodeThumbnailHandler tryDecodeThumbnail, - TryOpenFramesHandler? tryOpenFrames = null, - TryReadPlanarInfoHandler? tryReadPlanarInfo = null, - TryDecodePlanesHandler? tryDecodePlanes = null) + + /// The format the codec decodes (what SimdCodecs.DetectFormat reports for it). + /// Set to or an undefined value. + public required ImageFormat Format { - if (format == ImageFormat.Unknown || !Enum.IsDefined(format)) - throw new ArgumentOutOfRangeException(nameof(format), format, "A registration names a defined, known format."); - ArgumentNullException.ThrowIfNull(canDecode); - ArgumentNullException.ThrowIfNull(tryReadInfo); - ArgumentNullException.ThrowIfNull(tryGetClosestSize); - ArgumentNullException.ThrowIfNull(tryDecode); - ArgumentNullException.ThrowIfNull(tryDecodeInto); - ArgumentNullException.ThrowIfNull(tryReadMetadata); - ArgumentNullException.ThrowIfNull(tryDecodeThumbnail); - if ((tryReadPlanarInfo is null) != (tryDecodePlanes is null)) - throw new ArgumentException("Give both planar delegates or neither.", nameof(tryDecodePlanes)); - Format = format; - CanDecode = canDecode; - TryReadInfo = tryReadInfo; - TryGetClosestSize = tryGetClosestSize; - TryDecode = tryDecode; - TryDecodeInto = tryDecodeInto; - TryReadMetadata = tryReadMetadata; - TryDecodeThumbnail = tryDecodeThumbnail; - TryOpenFrames = tryOpenFrames; - TryReadPlanarInfo = tryReadPlanarInfo; - TryDecodePlanes = tryDecodePlanes; + get; + init + { + if (value == ImageFormat.Unknown || !Enum.IsDefined(value)) + throw new ArgumentOutOfRangeException(nameof(value), value, "A registration names a defined, known format."); + field = value; + } } - /// The format the codec decodes. - public ImageFormat Format { get; } - /// The codec's signature test. - public CanDecodeHandler CanDecode { get; } + public required CanDecodeHandler CanDecode { get; init => field = NotNull(value); } /// The codec's header read. - public TryReadInfoHandler TryReadInfo { get; } + public required TryReadInfoHandler TryReadInfo { get; init => field = NotNull(value); } /// The codec's native-size negotiation. - public TryGetClosestSizeHandler TryGetClosestSize { get; } + public required TryGetClosestSizeHandler TryGetClosestSize { get; init => field = NotNull(value); } /// The codec's fidelity decode. - public TryDecodeHandler TryDecode { get; } + public required TryDecodeHandler TryDecode { get; init => field = NotNull(value); } /// The codec's decode into a caller's buffer. - public TryDecodeIntoHandler TryDecodeInto { get; } + public required TryDecodeIntoHandler TryDecodeInto { get; init => field = NotNull(value); } /// The codec's metadata extraction. - public TryReadMetadataHandler TryReadMetadata { get; } + public required TryReadMetadataHandler TryReadMetadata { get; init => field = NotNull(value); } /// The codec's embedded-preview decode. - public TryDecodeThumbnailHandler TryDecodeThumbnail { get; } + public required TryDecodeThumbnailHandler TryDecodeThumbnail { get; init => field = NotNull(value); } + + /// The codec's frame reader, or null for a still-only codec: the facade then presents its image as one frame. + public TryOpenFramesHandler? TryOpenFrames { get; init; } + + /// The codec's planar description, or null when it has no planar output. Set together with + /// . + public TryReadPlanarInfoHandler? TryReadPlanarInfo { get; init; } - /// The codec's frame reader; null for a still-only codec. - public TryOpenFramesHandler? TryOpenFrames { get; } + /// The codec's planar decode; set exactly when is. + public TryDecodePlanesHandler? TryDecodePlanes { get; init; } - /// The codec's planar description; null when it has no planar output. - public TryReadPlanarInfoHandler? TryReadPlanarInfo { get; } + /// + /// Checks what the initializer cannot check property by property: that both planar delegates or neither are set. + /// The facade calls it on registration. + /// + /// Only one of the two planar delegates is set. + public void Validate() + { + if ((TryReadPlanarInfo is null) != (TryDecodePlanes is null)) + throw new ArgumentException("Set both planar delegates or neither.", nameof(TryDecodePlanes)); + } - /// The codec's planar decode; null when it has no planar output. - public TryDecodePlanesHandler? TryDecodePlanes { get; } + private static T NotNull(T value) where T : class + { + ArgumentNullException.ThrowIfNull(value); + return value; + } } diff --git a/src/Sdcb.SimdCodecs.Abstractions/ImageMetadata.cs b/src/Sdcb.SimdCodecs.Abstractions/ImageMetadata.cs index bc91389..e0142b4 100644 --- a/src/Sdcb.SimdCodecs.Abstractions/ImageMetadata.cs +++ b/src/Sdcb.SimdCodecs.Abstractions/ImageMetadata.cs @@ -6,42 +6,27 @@ namespace Sdcb.SimdCodecs.Abstractions; /// The metadata blocks a file carries besides its pixels, as raw bytes: what a transcoder copies across so that /// capture time, GPS position and colour profile survive. The interface layer only extracts and passes these /// blocks on; parsing Exif is the Sdcb.SimdCodecs.Exif package's job. +/// +/// Build one with an object initializer (new ImageMetadata { Exif = exif, Icc = icc }) and change one with +/// with (metadata with { Icc = profile }); a block left unset is empty. Two instances are equal when +/// they refer to the same memory for every block, not when the bytes match. +/// /// -public sealed class ImageMetadata +public sealed record ImageMetadata { - /// Wraps raw metadata blocks; an empty one means the file has none. - /// The Exif block, starting at its TIFF header (II*\0 or MM\0*) — without the - /// JPEG Exif\0\0 prefix. - /// The XMP packet, UTF-8. - /// The ICC profile. - public ImageMetadata(ReadOnlyMemory exif = default, ReadOnlyMemory xmp = default, ReadOnlyMemory icc = default) - { - Exif = exif; - Xmp = xmp; - Icc = icc; - } - /// No metadata. public static ImageMetadata Empty { get; } = new(); - /// The Exif block from its TIFF header on; empty when the file has none. - public ReadOnlyMemory Exif { get; } + /// The Exif block, starting at its TIFF header (II*\0 or MM\0*), without the JPEG + /// Exif\0\0 prefix; empty when the file has none. + public ReadOnlyMemory Exif { get; init; } /// The UTF-8 XMP packet; empty when the file has none. - public ReadOnlyMemory Xmp { get; } + public ReadOnlyMemory Xmp { get; init; } /// The ICC profile; empty when the file has none. - public ReadOnlyMemory Icc { get; } + public ReadOnlyMemory Icc { get; init; } /// True when every block is empty. public bool IsEmpty => Exif.IsEmpty && Xmp.IsEmpty && Icc.IsEmpty; - - /// The same blocks with replaced. - public ImageMetadata WithExif(ReadOnlyMemory exif) => new(exif, Xmp, Icc); - - /// The same blocks with replaced. - public ImageMetadata WithXmp(ReadOnlyMemory xmp) => new(Exif, xmp, Icc); - - /// The same blocks with replaced. - public ImageMetadata WithIcc(ReadOnlyMemory icc) => new(Exif, Xmp, icc); } diff --git a/src/Sdcb.SimdCodecs.Abstractions/RasterImage.cs b/src/Sdcb.SimdCodecs.Abstractions/RasterImage.cs index 1ec15d9..bd60233 100644 --- a/src/Sdcb.SimdCodecs.Abstractions/RasterImage.cs +++ b/src/Sdcb.SimdCodecs.Abstractions/RasterImage.cs @@ -11,10 +11,10 @@ namespace Sdcb.SimdCodecs.Abstractions; /// for the fidelity tier or call / for /// display. /// -/// Four ways to make one: +/// Four ways to make one: /// takes over an array the caller filled; and create an empty one to fill /// through (from new memory or from a pool); and -/// +/// /// takes over memory with an owner. returns pooled or owned memory; afterwards /// throws , whichever way the image was made. /// @@ -29,7 +29,7 @@ public sealed class RasterImage : IDecodedImage private int _disposed; private RasterImage(int width, int height, int channels, SampleFormat sampleFormat, int bitDepth, - byte[]? iccProfile, ColorEncoding? colorEncoding, ImageMetadata? metadata) + ColorEncoding? colorEncoding, ImageMetadata? metadata) { if (width <= 0 || height <= 0) throw new ArgumentOutOfRangeException(nameof(width), "Width and height must be positive."); @@ -46,8 +46,7 @@ private RasterImage(int width, int height, int channels, SampleFormat sampleForm _bitDepth = bitDepth; _length = checked(width * height * channels * BytesPerSample(sampleFormat)); ColorEncoding = colorEncoding ?? ColorEncoding.AssumedSrgb; - metadata ??= ImageMetadata.Empty; - Metadata = iccProfile is { Length: > 0 } && metadata.Icc.IsEmpty ? metadata.WithIcc(iccProfile) : metadata; + Metadata = metadata ?? ImageMetadata.Empty; } /// @@ -60,17 +59,15 @@ private RasterImage(int width, int height, int channels, SampleFormat sampleForm /// The per-channel sample type of . /// Interleaved, row-major, tightly-packed samples in host byte order, straight alpha; at least /// width × height × channels × bytesPerSample bytes. - /// The embedded ICC profile, if any (becomes unless - /// has one). /// How the samples encode colour; null means . /// Bits of real precision per sample; 0 means the full width of . - /// The file's metadata blocks. + /// The file's metadata blocks (Exif, XMP, ICC profile). /// An argument is out of range, or is too small. public static RasterImage Wrap(int width, int height, int channels, SampleFormat sampleFormat, byte[] pixels, - byte[]? iccProfile = null, ColorEncoding? colorEncoding = null, int bitDepth = 0, ImageMetadata? metadata = null) + ColorEncoding? colorEncoding = null, int bitDepth = 0, ImageMetadata? metadata = null) { ArgumentNullException.ThrowIfNull(pixels); - var image = new RasterImage(width, height, channels, sampleFormat, bitDepth, iccProfile, colorEncoding, metadata); + var image = new RasterImage(width, height, channels, sampleFormat, bitDepth, colorEncoding, metadata); if (pixels.Length < image._length) throw new ArgumentException($"Pixel buffer too small: {pixels.Length} < {image._length} (width*height*channels*bytesPerSample).", nameof(pixels)); image._array = pixels; @@ -86,16 +83,15 @@ public static RasterImage Wrap(int width, int height, int channels, SampleFormat /// Samples per pixel, 1..4. /// The per-channel sample type. /// The memory holding the samples, laid out as describes. - /// The embedded ICC profile, if any. /// How the samples encode colour; null means . /// Bits of real precision per sample; 0 means the full width of . - /// The file's metadata blocks. + /// The file's metadata blocks (Exif, XMP, ICC profile). /// An argument is out of range, or the memory is too small. public static RasterImage Wrap(int width, int height, int channels, SampleFormat sampleFormat, IMemoryOwner owner, - byte[]? iccProfile = null, ColorEncoding? colorEncoding = null, int bitDepth = 0, ImageMetadata? metadata = null) + ColorEncoding? colorEncoding = null, int bitDepth = 0, ImageMetadata? metadata = null) { ArgumentNullException.ThrowIfNull(owner); - var image = new RasterImage(width, height, channels, sampleFormat, bitDepth, iccProfile, colorEncoding, metadata); + var image = new RasterImage(width, height, channels, sampleFormat, bitDepth, colorEncoding, metadata); if (owner.Memory.Length < image._length) throw new ArgumentException($"Pixel memory too small: {owner.Memory.Length} < {image._length}.", nameof(owner)); image._owner = owner; @@ -107,14 +103,13 @@ public static RasterImage Wrap(int width, int height, int channels, SampleFormat /// Pixel height (> 0). /// Samples per pixel, 1..4. /// The per-channel sample type. - /// The embedded ICC profile, if any. /// How the samples encode colour; null means . /// Bits of real precision per sample; 0 means the full width of . - /// The file's metadata blocks. + /// The file's metadata blocks (Exif, XMP, ICC profile). public static RasterImage Allocate(int width, int height, int channels, SampleFormat sampleFormat, - byte[]? iccProfile = null, ColorEncoding? colorEncoding = null, int bitDepth = 0, ImageMetadata? metadata = null) + ColorEncoding? colorEncoding = null, int bitDepth = 0, ImageMetadata? metadata = null) { - var image = new RasterImage(width, height, channels, sampleFormat, bitDepth, iccProfile, colorEncoding, metadata); + var image = new RasterImage(width, height, channels, sampleFormat, bitDepth, colorEncoding, metadata); image._array = GC.AllocateUninitializedArray(image._length); image._array.AsSpan().Clear(); return image; @@ -129,14 +124,13 @@ public static RasterImage Allocate(int width, int height, int channels, SampleFo /// Samples per pixel, 1..4. /// The per-channel sample type. /// The pool; null means . - /// The embedded ICC profile, if any. /// How the samples encode colour; null means . /// Bits of real precision per sample; 0 means the full width of . - /// The file's metadata blocks. + /// The file's metadata blocks (Exif, XMP, ICC profile). public static RasterImage Rent(int width, int height, int channels, SampleFormat sampleFormat, ArrayPool? pool = null, - byte[]? iccProfile = null, ColorEncoding? colorEncoding = null, int bitDepth = 0, ImageMetadata? metadata = null) + ColorEncoding? colorEncoding = null, int bitDepth = 0, ImageMetadata? metadata = null) { - var image = new RasterImage(width, height, channels, sampleFormat, bitDepth, iccProfile, colorEncoding, metadata); + var image = new RasterImage(width, height, channels, sampleFormat, bitDepth, colorEncoding, metadata); image._pool = pool ?? ArrayPool.Shared; image._array = image._pool.Rent(image._length); return image; @@ -147,10 +141,10 @@ public static RasterImage Rent(int width, int height, int channels, SampleFormat /// otherwise . What a codec calls with . /// public static RasterImage Create(int width, int height, int channels, SampleFormat sampleFormat, ArrayPool? pool, - byte[]? iccProfile = null, ColorEncoding? colorEncoding = null, int bitDepth = 0, ImageMetadata? metadata = null) => + ColorEncoding? colorEncoding = null, int bitDepth = 0, ImageMetadata? metadata = null) => pool is null - ? Allocate(width, height, channels, sampleFormat, iccProfile, colorEncoding, bitDepth, metadata) - : Rent(width, height, channels, sampleFormat, pool, iccProfile, colorEncoding, bitDepth, metadata); + ? Allocate(width, height, channels, sampleFormat, colorEncoding, bitDepth, metadata) + : Rent(width, height, channels, sampleFormat, pool, colorEncoding, bitDepth, metadata); /// /// Copies the pixels of out of into a new image (rented from @@ -163,8 +157,8 @@ public static RasterImage Crop(IDecodedImage source, PixelRect region, ArrayPool if (!region.FitsIn(source.Width, source.Height)) throw new ArgumentException($"The region {region} does not lie inside the {source.Width}x{source.Height} image.", nameof(region)); var image = Create(region.Width, region.Height, source.Channels, source.SampleFormat, pool, - null, source.ColorEncoding, source.BitDepth == BytesPerSample(source.SampleFormat) * 8 ? 0 : source.BitDepth, - source.Metadata.Icc.IsEmpty && !source.IccProfile.IsEmpty ? source.Metadata.WithIcc(source.IccProfile.ToArray()) : source.Metadata); + source.ColorEncoding, source.BitDepth == BytesPerSample(source.SampleFormat) * 8 ? 0 : source.BitDepth, + source.Metadata); var bpp = source.Channels * BytesPerSample(source.SampleFormat); var inRow = source.Width * bpp; var outRow = region.Width * bpp; @@ -207,9 +201,6 @@ public Span WritablePixels } } - /// - public ReadOnlySpan IccProfile => Metadata.Icc.Span; - /// public ColorEncoding ColorEncoding { get; } diff --git a/src/Sdcb.SimdCodecs.Bmp/BmpImageDecoder.cs b/src/Sdcb.SimdCodecs.Bmp/BmpImageDecoder.cs index 07cd72f..c08b98e 100644 --- a/src/Sdcb.SimdCodecs.Bmp/BmpImageDecoder.cs +++ b/src/Sdcb.SimdCodecs.Bmp/BmpImageDecoder.cs @@ -13,8 +13,17 @@ namespace Sdcb.SimdCodecs.Bmp; public sealed class BmpImageDecoder : IImageDecoder { /// The registration for SimdCodecs.Register, built from this type's method groups. - public static ImageDecoderRegistration Registration { get; } = new(ImageFormat.Bmp, CanDecode, TryReadInfo, - TryGetClosestSize, TryDecode, TryDecodeInto, TryReadMetadata, TryDecodeThumbnail); + public static ImageDecoderRegistration Registration { get; } = new() + { + Format = ImageFormat.Bmp, + CanDecode = CanDecode, + TryReadInfo = TryReadInfo, + TryGetClosestSize = TryGetClosestSize, + TryDecode = TryDecode, + TryDecodeInto = TryDecodeInto, + TryReadMetadata = TryReadMetadata, + TryDecodeThumbnail = TryDecodeThumbnail, + }; /// /// The 14-byte file header and the bitmap header's size field. @@ -70,7 +79,7 @@ public static bool TryDecode(ReadOnlySpan data, [NotNullWhen(true)] out ID options?.Validate(bmp.Width, bmp.Height, supportsScale: false); var raster = RasterImage.Create(bmp.Width, bmp.Height, bmp.Channels, SampleFormat.UInt8, options?.Pool, - BmpDecoder.Icc(data, header)); + metadata: BmpDecoder.Icc(data, header) is { } icc ? new ImageMetadata { Icc = icc } : null); try { BmpPixels.Decode(data, header, raster.WritablePixels, bmp.Width * bmp.Channels, @@ -114,7 +123,7 @@ public static bool TryReadMetadata(ReadOnlySpan data, [NotNullWhen(true)] try { var icc = BmpDecoder.Icc(data, BmpHeader.ReadFile(data)); - metadata = icc is null ? ImageMetadata.Empty : new ImageMetadata(icc: icc); + metadata = icc is null ? ImageMetadata.Empty : new ImageMetadata { Icc = icc }; return true; } catch (InvalidDataException) diff --git a/src/Sdcb.SimdCodecs.Bmp/BmpImageEncoder.cs b/src/Sdcb.SimdCodecs.Bmp/BmpImageEncoder.cs index 05e67a5..4d919d7 100644 --- a/src/Sdcb.SimdCodecs.Bmp/BmpImageEncoder.cs +++ b/src/Sdcb.SimdCodecs.Bmp/BmpImageEncoder.cs @@ -13,7 +13,12 @@ namespace Sdcb.SimdCodecs.Bmp; public sealed class BmpImageEncoder : IImageEncoder { /// The registration for the facade's encoder registry, built from this type's method groups. - public static ImageEncoderRegistration Registration { get; } = new(ImageFormat.Bmp, GetClosestInputFormat, Create); + public static ImageEncoderRegistration Registration { get; } = new() + { + Format = ImageFormat.Bmp, + GetClosestInputFormat = GetClosestInputFormat, + Create = Create, + }; /// public static ImageFormat Format => ImageFormat.Bmp; diff --git a/src/Sdcb.SimdCodecs.Gif/GifImageDecoder.cs b/src/Sdcb.SimdCodecs.Gif/GifImageDecoder.cs index 05ee0a5..c22876b 100644 --- a/src/Sdcb.SimdCodecs.Gif/GifImageDecoder.cs +++ b/src/Sdcb.SimdCodecs.Gif/GifImageDecoder.cs @@ -13,8 +13,18 @@ namespace Sdcb.SimdCodecs.Gif; public sealed class GifImageDecoder : IMultiFrameImageDecoder { /// The registration for SimdCodecs.Register, built from this type's method groups. - public static ImageDecoderRegistration Registration { get; } = new(ImageFormat.Gif, CanDecode, TryReadInfo, - TryGetClosestSize, TryDecode, TryDecodeInto, TryReadMetadata, TryDecodeThumbnail, TryOpenFrames); + public static ImageDecoderRegistration Registration { get; } = new() + { + Format = ImageFormat.Gif, + CanDecode = CanDecode, + TryReadInfo = TryReadInfo, + TryGetClosestSize = TryGetClosestSize, + TryDecode = TryDecode, + TryDecodeInto = TryDecodeInto, + TryReadMetadata = TryReadMetadata, + TryDecodeThumbnail = TryDecodeThumbnail, + TryOpenFrames = TryOpenFrames, + }; /// public static int SignatureLength => 6; diff --git a/src/Sdcb.SimdCodecs.Gif/GifImageEncoder.cs b/src/Sdcb.SimdCodecs.Gif/GifImageEncoder.cs index 4d8d942..5a2fb94 100644 --- a/src/Sdcb.SimdCodecs.Gif/GifImageEncoder.cs +++ b/src/Sdcb.SimdCodecs.Gif/GifImageEncoder.cs @@ -13,7 +13,12 @@ namespace Sdcb.SimdCodecs.Gif; public sealed class GifImageEncoder : IImageEncoder { /// The registration for the facade's encoder registry, built from this type's method groups. - public static ImageEncoderRegistration Registration { get; } = new(ImageFormat.Gif, GetClosestInputFormat, Create); + public static ImageEncoderRegistration Registration { get; } = new() + { + Format = ImageFormat.Gif, + GetClosestInputFormat = GetClosestInputFormat, + Create = Create, + }; /// public static ImageFormat Format => ImageFormat.Gif; diff --git a/src/Sdcb.SimdCodecs.Heif/HeifImageDecoder.cs b/src/Sdcb.SimdCodecs.Heif/HeifImageDecoder.cs index b4b58a7..c7114b2 100644 --- a/src/Sdcb.SimdCodecs.Heif/HeifImageDecoder.cs +++ b/src/Sdcb.SimdCodecs.Heif/HeifImageDecoder.cs @@ -51,9 +51,19 @@ public sealed class HeifImageDecoder : IPlanarImageDecoder /// registry requires (see ). Still images only: the facade presents one /// as a single frame. /// - public static ImageDecoderRegistration Registration { get; } = - new(ImageFormat.Heif, CanDecode, TryReadInfo, TryGetClosestSize, TryDecode, TryDecodeInto, TryReadMetadata, - TryDecodeThumbnail, tryReadPlanarInfo: TryReadPlanarInfo, tryDecodePlanes: TryDecodePlanes); + public static ImageDecoderRegistration Registration { get; } = new() + { + Format = ImageFormat.Heif, + CanDecode = CanDecode, + TryReadInfo = TryReadInfo, + TryGetClosestSize = TryGetClosestSize, + TryDecode = TryDecode, + TryDecodeInto = TryDecodeInto, + TryReadMetadata = TryReadMetadata, + TryDecodeThumbnail = TryDecodeThumbnail, + TryReadPlanarInfo = TryReadPlanarInfo, + TryDecodePlanes = TryDecodePlanes, + }; /// The ftyp box with its compatible brands; an AVIF brand can sit anywhere in the list. public static int SignatureLength => 64; @@ -139,7 +149,7 @@ public static bool TryDecode(ReadOnlySpan data, [NotNullWhen(true)] out ID var wide = depth > 8; var raster = RasterImage.Create(size.Width, size.Height, 3, wide ? SampleFormat.UInt16 : SampleFormat.UInt8, - options?.Pool, container.IccProfile, ColorEncodingOf(container), bitDepth: wide && depth < 16 ? depth : 0, + options?.Pool, ColorEncodingOf(container), bitDepth: wide && depth < 16 ? depth : 0, metadata: HeifMetadata.Read(data, container)); try { @@ -224,7 +234,8 @@ public static bool TryDecodeThumbnail(ReadOnlySpan data, [NotNullWhen(true var depth = thumb.TileConfigs[0].ParseSps().BitDepthY; var wide = depth > 8; var raster = RasterImage.Allocate(width, height, 3, wide ? SampleFormat.UInt16 : SampleFormat.UInt8, - thumb.IccProfile, ColorEncodingOf(thumb), bitDepth: wide && depth < 16 ? depth : 0); + ColorEncodingOf(thumb), bitDepth: wide && depth < 16 ? depth : 0, + metadata: thumb.IccProfile is { Length: > 0 } icc ? new ImageMetadata { Icc = icc } : null); HeifDecoder.DecodeInto(data, thumb, raster.WritablePixels, width * 3 * (wide ? 2 : 1), wide ? PixelFormat.Rgb48 : PixelFormat.Rgb24); thumbnail = raster; return true; diff --git a/src/Sdcb.SimdCodecs.Heif/HeifMetadata.cs b/src/Sdcb.SimdCodecs.Heif/HeifMetadata.cs index e817bb7..d6e9dbb 100644 --- a/src/Sdcb.SimdCodecs.Heif/HeifMetadata.cs +++ b/src/Sdcb.SimdCodecs.Heif/HeifMetadata.cs @@ -36,7 +36,7 @@ public static ImageMetadata Read(ReadOnlySpan data, HeifContainer containe else if (item.Type == ItemMime && xmp.IsEmpty && IsXmp(item.ContentType)) xmp = ReadItem(data, items, item) ?? default; } - return new ImageMetadata(exif, xmp, container.IccProfile ?? default(ReadOnlyMemory)); + return new ImageMetadata { Exif = exif, Xmp = xmp, Icc = container.IccProfile }; } /// The first hvc1 thumbnail item of the primary image, if any. diff --git a/src/Sdcb.SimdCodecs.Heif/linqpad-samples/facade.linq b/src/Sdcb.SimdCodecs.Heif/linqpad-samples/facade.linq index a4d8b8f..d256b8a 100644 --- a/src/Sdcb.SimdCodecs.Heif/linqpad-samples/facade.linq +++ b/src/Sdcb.SimdCodecs.Heif/linqpad-samples/facade.linq @@ -51,7 +51,7 @@ async Task Main() // The fidelity view: 8-bit RGB with the ICC profile passed through and the colour encoding from the file. if (SimdCodecs.TryDecode(heic, out IDecodedImage? image)) { - new { image.Width, image.Height, image.Channels, image.SampleFormat, IccBytes = image.IccProfile.Length, image.ColorEncoding } + new { image.Width, image.Height, image.Channels, image.SampleFormat, IccBytes = image.Metadata.Icc.Length, image.ColorEncoding } .Dump("SimdCodecs.TryDecode"); } } diff --git a/src/Sdcb.SimdCodecs.Ico/IcoImageDecoder.cs b/src/Sdcb.SimdCodecs.Ico/IcoImageDecoder.cs index f7c091d..cb444d7 100644 --- a/src/Sdcb.SimdCodecs.Ico/IcoImageDecoder.cs +++ b/src/Sdcb.SimdCodecs.Ico/IcoImageDecoder.cs @@ -12,8 +12,18 @@ namespace Sdcb.SimdCodecs.Ico; public sealed class IcoImageDecoder : IMultiFrameImageDecoder { /// The registration for SimdCodecs.Register, built from this type's method groups. - public static ImageDecoderRegistration Registration { get; } = new(ImageFormat.Ico, CanDecode, TryReadInfo, - TryGetClosestSize, TryDecode, TryDecodeInto, TryReadMetadata, TryDecodeThumbnail, TryOpenFrames); + public static ImageDecoderRegistration Registration { get; } = new() + { + Format = ImageFormat.Ico, + CanDecode = CanDecode, + TryReadInfo = TryReadInfo, + TryGetClosestSize = TryGetClosestSize, + TryDecode = TryDecode, + TryDecodeInto = TryDecodeInto, + TryReadMetadata = TryReadMetadata, + TryDecodeThumbnail = TryDecodeThumbnail, + TryOpenFrames = TryOpenFrames, + }; /// /// The directory and its first entry. @@ -64,8 +74,18 @@ public static bool TryOpenFrames(ReadOnlyMemory data, [NotNullWhen(true)] public sealed class CurImageDecoder : IMultiFrameImageDecoder { /// The registration for SimdCodecs.Register, built from this type's method groups. - public static ImageDecoderRegistration Registration { get; } = new(ImageFormat.Cur, CanDecode, TryReadInfo, - TryGetClosestSize, TryDecode, TryDecodeInto, TryReadMetadata, TryDecodeThumbnail, TryOpenFrames); + public static ImageDecoderRegistration Registration { get; } = new() + { + Format = ImageFormat.Cur, + CanDecode = CanDecode, + TryReadInfo = TryReadInfo, + TryGetClosestSize = TryGetClosestSize, + TryDecode = TryDecode, + TryDecodeInto = TryDecodeInto, + TryReadMetadata = TryReadMetadata, + TryDecodeThumbnail = TryDecodeThumbnail, + TryOpenFrames = TryOpenFrames, + }; /// /// The directory and its first entry. diff --git a/src/Sdcb.SimdCodecs.Ico/IcoImageEncoder.cs b/src/Sdcb.SimdCodecs.Ico/IcoImageEncoder.cs index 27af31f..3d57034 100644 --- a/src/Sdcb.SimdCodecs.Ico/IcoImageEncoder.cs +++ b/src/Sdcb.SimdCodecs.Ico/IcoImageEncoder.cs @@ -13,7 +13,12 @@ namespace Sdcb.SimdCodecs.Ico; public sealed class IcoImageEncoder : IImageEncoder { /// The registration for the facade's encoder registry, built from this type's method groups. - public static ImageEncoderRegistration Registration { get; } = new(ImageFormat.Ico, GetClosestInputFormat, Create); + public static ImageEncoderRegistration Registration { get; } = new() + { + Format = ImageFormat.Ico, + GetClosestInputFormat = GetClosestInputFormat, + Create = Create, + }; /// public static ImageFormat Format => ImageFormat.Ico; diff --git a/src/Sdcb.SimdCodecs.Jbig2/Jbig2ImageDecoder.cs b/src/Sdcb.SimdCodecs.Jbig2/Jbig2ImageDecoder.cs index d44a66a..85c6733 100644 --- a/src/Sdcb.SimdCodecs.Jbig2/Jbig2ImageDecoder.cs +++ b/src/Sdcb.SimdCodecs.Jbig2/Jbig2ImageDecoder.cs @@ -29,8 +29,17 @@ namespace Sdcb.SimdCodecs.Jbig2; public sealed class Jbig2ImageDecoder : IImageDecoder { /// The registration for SimdCodecs.Register, built from this type's method groups. - public static ImageDecoderRegistration Registration { get; } = new(ImageFormat.Jbig2, CanDecode, TryReadInfo, - TryGetClosestSize, TryDecode, TryDecodeInto, TryReadMetadata, TryDecodeThumbnail); + public static ImageDecoderRegistration Registration { get; } = new() + { + Format = ImageFormat.Jbig2, + CanDecode = CanDecode, + TryReadInfo = TryReadInfo, + TryGetClosestSize = TryGetClosestSize, + TryDecode = TryDecode, + TryDecodeInto = TryDecodeInto, + TryReadMetadata = TryReadMetadata, + TryDecodeThumbnail = TryDecodeThumbnail, + }; /// public static int SignatureLength => 8; diff --git a/src/Sdcb.SimdCodecs.Jpeg.GainMap/GainMapImage.cs b/src/Sdcb.SimdCodecs.Jpeg.GainMap/GainMapImage.cs index 96c94af..5463460 100644 --- a/src/Sdcb.SimdCodecs.Jpeg.GainMap/GainMapImage.cs +++ b/src/Sdcb.SimdCodecs.Jpeg.GainMap/GainMapImage.cs @@ -72,7 +72,7 @@ public RasterImage ReconstructHdr(double displayHeadroom) output[o + 1] = (float)lut[basePixels[i + baseG]]; output[o + 2] = (float)lut[basePixels[i + baseB]]; } - return RasterImage.Wrap(width, height, 3, SampleFormat.Float32, outBytes, null, encoding); + return RasterImage.Wrap(width, height, 3, SampleFormat.Float32, outBytes, encoding); } var logMin = Math.Log2(Metadata.GainMapMin); @@ -126,7 +126,7 @@ public RasterImage ReconstructHdr(double displayHeadroom) } } - return RasterImage.Wrap(width, height, 3, SampleFormat.Float32, outBytes, null, encoding); + return RasterImage.Wrap(width, height, 3, SampleFormat.Float32, outBytes, encoding); } /// The gain-application weight W ∈ [0,1] for a display headroom — the diff --git a/src/Sdcb.SimdCodecs.Jpeg.GainMap/GainMapImageDecoder.cs b/src/Sdcb.SimdCodecs.Jpeg.GainMap/GainMapImageDecoder.cs index 04a802a..b703d77 100644 --- a/src/Sdcb.SimdCodecs.Jpeg.GainMap/GainMapImageDecoder.cs +++ b/src/Sdcb.SimdCodecs.Jpeg.GainMap/GainMapImageDecoder.cs @@ -22,8 +22,17 @@ namespace Sdcb.SimdCodecs.Jpeg; public sealed class GainMapImageDecoder : IImageDecoder { /// The registration for SimdCodecs.Register, built from this type's method groups. - public static ImageDecoderRegistration Registration { get; } = new(ImageFormat.Jpeg, CanDecode, TryReadInfo, - TryGetClosestSize, TryDecode, TryDecodeInto, TryReadMetadata, TryDecodeThumbnail); + public static ImageDecoderRegistration Registration { get; } = new() + { + Format = ImageFormat.Jpeg, + CanDecode = CanDecode, + TryReadInfo = TryReadInfo, + TryGetClosestSize = TryGetClosestSize, + TryDecode = TryDecode, + TryDecodeInto = TryDecodeInto, + TryReadMetadata = TryReadMetadata, + TryDecodeThumbnail = TryDecodeThumbnail, + }; /// public static int SignatureLength => 3; diff --git a/src/Sdcb.SimdCodecs.Jpeg/JpegImageDecoder.cs b/src/Sdcb.SimdCodecs.Jpeg/JpegImageDecoder.cs index 6d9103a..9203281 100644 --- a/src/Sdcb.SimdCodecs.Jpeg/JpegImageDecoder.cs +++ b/src/Sdcb.SimdCodecs.Jpeg/JpegImageDecoder.cs @@ -26,8 +26,17 @@ public sealed class JpegImageDecoder : IImageDecoder private static ReadOnlySpan Signature => [0xFF, 0xD8, 0xFF]; /// The registration for SimdCodecs.Register, built from this type's method groups. - public static ImageDecoderRegistration Registration { get; } = new(ImageFormat.Jpeg, CanDecode, TryReadInfo, - TryGetClosestSize, TryDecode, TryDecodeInto, TryReadMetadata, TryDecodeThumbnail); + public static ImageDecoderRegistration Registration { get; } = new() + { + Format = ImageFormat.Jpeg, + CanDecode = CanDecode, + TryReadInfo = TryReadInfo, + TryGetClosestSize = TryGetClosestSize, + TryDecode = TryDecode, + TryDecodeInto = TryDecodeInto, + TryReadMetadata = TryReadMetadata, + TryDecodeThumbnail = TryDecodeThumbnail, + }; /// public static int SignatureLength => 3; @@ -84,7 +93,7 @@ public static bool TryDecode(ReadOnlySpan data, [NotNullWhen(true)] out ID // every other frame is colour, written as RGB since JPEG carries no alpha. var (channels, format) = info.Components == 1 ? (1, JpegPixelFormat.Gray8) : (3, JpegPixelFormat.Rgb24); var raster = RasterImage.Create(width, height, channels, SampleFormat.UInt8, options?.Pool, - JpegDecoder.TryReadIccProfile(data, out var icc) ? icc : null, metadata: ReadMetadata(data)); + metadata: ReadMetadata(data)); try { _ = JpegDecoder.DecodeTo(data, raster.WritablePixels, width * channels, format, scale, cancellationToken); @@ -167,8 +176,6 @@ public static bool TryReadMetadata(ReadOnlySpan data, [NotNullWhen(true)] if (!JpegDecoder.TryReadInfo(data, out _)) return false; metadata = ReadMetadata(data); - if (JpegDecoder.TryReadIccProfile(data, out var icc)) - metadata = metadata.WithIcc(icc); return true; } @@ -203,8 +210,12 @@ internal static JpegPixelFormat ToJpegFormat(PixelFormat format) => format == PixelFormat.Gray8 ? JpegPixelFormat.Gray8 : throw new ArgumentOutOfRangeException(nameof(format), format, "JPEG decodes natively to the five basic 8-bit formats only."); - private static ImageMetadata ReadMetadata(ReadOnlySpan data) => - new(JpegMetadata.ReadExif(data), JpegMetadata.ReadXmp(data)); + private static ImageMetadata ReadMetadata(ReadOnlySpan data) => new() + { + Exif = JpegMetadata.ReadExif(data), + Xmp = JpegMetadata.ReadXmp(data), + Icc = JpegDecoder.TryReadIccProfile(data, out var icc) ? icc : default, + }; private static RasterImage Crop(RasterImage raster, PixelRect region, System.Buffers.ArrayPool? pool) { diff --git a/src/Sdcb.SimdCodecs.Jpeg/JpegImageEncoder.cs b/src/Sdcb.SimdCodecs.Jpeg/JpegImageEncoder.cs index 1fe57f4..a39c62d 100644 --- a/src/Sdcb.SimdCodecs.Jpeg/JpegImageEncoder.cs +++ b/src/Sdcb.SimdCodecs.Jpeg/JpegImageEncoder.cs @@ -24,7 +24,12 @@ namespace Sdcb.SimdCodecs.Jpeg; public sealed class JpegImageEncoder : IImageEncoder { /// The registration for the facade's encoder registry, built from this type's method groups. - public static ImageEncoderRegistration Registration { get; } = new(ImageFormat.Jpeg, GetClosestInputFormat, Create); + public static ImageEncoderRegistration Registration { get; } = new() + { + Format = ImageFormat.Jpeg, + GetClosestInputFormat = GetClosestInputFormat, + Create = Create, + }; /// public static ImageFormat Format => ImageFormat.Jpeg; diff --git a/src/Sdcb.SimdCodecs.Jpeg2000/Jpeg2000ImageDecoder.cs b/src/Sdcb.SimdCodecs.Jpeg2000/Jpeg2000ImageDecoder.cs index 4ee84ef..3d6bf37 100644 --- a/src/Sdcb.SimdCodecs.Jpeg2000/Jpeg2000ImageDecoder.cs +++ b/src/Sdcb.SimdCodecs.Jpeg2000/Jpeg2000ImageDecoder.cs @@ -33,8 +33,17 @@ namespace Sdcb.SimdCodecs.Jpeg2000; public sealed class Jpeg2000ImageDecoder : IImageDecoder { /// The registration for SimdCodecs.Register, built from this type's method groups. - public static ImageDecoderRegistration Registration { get; } = new(ImageFormat.Jpeg2000, CanDecode, TryReadInfo, - TryGetClosestSize, TryDecode, TryDecodeInto, TryReadMetadata, TryDecodeThumbnail); + public static ImageDecoderRegistration Registration { get; } = new() + { + Format = ImageFormat.Jpeg2000, + CanDecode = CanDecode, + TryReadInfo = TryReadInfo, + TryGetClosestSize = TryGetClosestSize, + TryDecode = TryDecode, + TryDecodeInto = TryDecodeInto, + TryReadMetadata = TryReadMetadata, + TryDecodeThumbnail = TryDecodeThumbnail, + }; /// public static int SignatureLength => 12; @@ -134,7 +143,7 @@ public static bool TryReadMetadata(ReadOnlySpan data, [NotNullWhen(true)] var layout = Jp2Reader.Read(data); if (layout.Colour is { Method: 2, IccProfile: { } profile }) { - metadata = ImageMetadata.Empty.WithIcc(profile); + metadata = new ImageMetadata { Icc = profile }; return true; } } @@ -180,8 +189,8 @@ public static bool TryDecodeIntoRgba8(ReadOnlySpan data, Span rgbaDe image.Components, format, pool, - iccProfile: icc, - bitDepth: bitDepth); + bitDepth: bitDepth, + metadata: icc is null ? null : new ImageMetadata { Icc = icc }); if (format == SampleFormat.UInt8) { diff --git a/src/Sdcb.SimdCodecs.Png/PngImageDecoder.cs b/src/Sdcb.SimdCodecs.Png/PngImageDecoder.cs index 370632c..d6bd412 100644 --- a/src/Sdcb.SimdCodecs.Png/PngImageDecoder.cs +++ b/src/Sdcb.SimdCodecs.Png/PngImageDecoder.cs @@ -28,8 +28,17 @@ namespace Sdcb.SimdCodecs.Png; public sealed class PngImageDecoder : IImageDecoder { /// The registration for SimdCodecs.Register, built from this type's method groups. - public static ImageDecoderRegistration Registration { get; } = new(ImageFormat.Png, CanDecode, TryReadInfo, - TryGetClosestSize, TryDecode, TryDecodeInto, TryReadMetadata, TryDecodeThumbnail); + public static ImageDecoderRegistration Registration { get; } = new() + { + Format = ImageFormat.Png, + CanDecode = CanDecode, + TryReadInfo = TryReadInfo, + TryGetClosestSize = TryGetClosestSize, + TryDecode = TryDecode, + TryDecodeInto = TryDecodeInto, + TryReadMetadata = TryReadMetadata, + TryDecodeThumbnail = TryDecodeThumbnail, + }; private static ReadOnlySpan Signature => [0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A]; @@ -107,7 +116,7 @@ private static ImageMetadata MetadataOf(PngImage png) break; } } - return new ImageMetadata(png.Exif, xmp, png.IccProfile); + return new ImageMetadata { Exif = png.Exif, Xmp = xmp, Icc = png.IccProfile }; } /// @@ -329,7 +338,6 @@ private static bool TryMapLayout(int colorType, int bitDepth, bool transparentCo private static RasterImage ToDecoded(PngImage png) { - var icc = png.IccProfile; var color = MapColorEncoding(png.Cicp, png.Gamma); var metadata = MetadataOf(png); // 1-, 2- and 4-bit greyscale comes out as 8-bit samples; the file's precision is what bitDepth records. @@ -337,7 +345,7 @@ private static RasterImage ToDecoded(PngImage png) // Indexed: palette (+ optional tRNS) expansion to RGBA8 - PngImage.ToRgba8 already does this. if (png.ColorType == 3) - return RasterImage.Wrap(png.Width, png.Height, 4, SampleFormat.UInt8, png.ToRgba8(), icc, color, metadata: metadata); + return RasterImage.Wrap(png.Width, png.Height, 4, SampleFormat.UInt8, png.ToRgba8(), color, metadata: metadata); var channels = PngReader.SamplesPerPixel(png.ColorType); var key = png.UnpackedTransparentColor(); @@ -348,19 +356,19 @@ private static RasterImage ToDecoded(PngImage png) var samples = png.AsUInt16Samples(); if (key is not null) return RasterImage.Wrap(png.Width, png.Height, channels + 1, SampleFormat.UInt16, - MemoryMarshal.AsBytes(WithKeyAlpha(samples, channels, key, ushort.MaxValue).AsSpan()).ToArray(), icc, color, + MemoryMarshal.AsBytes(WithKeyAlpha(samples, channels, key, ushort.MaxValue).AsSpan()).ToArray(), color, metadata: metadata); var bytes = MemoryMarshal.AsBytes(samples.AsSpan()).ToArray(); - return RasterImage.Wrap(png.Width, png.Height, channels, SampleFormat.UInt16, bytes, icc, color, metadata: metadata); + return RasterImage.Wrap(png.Width, png.Height, channels, SampleFormat.UInt16, bytes, color, metadata: metadata); } // 8-bit: Pixels are already the interleaved host-order raster. if (key is not null) { return RasterImage.Wrap(png.Width, png.Height, channels + 1, SampleFormat.UInt8, - WithKeyAlpha(png.Pixels, channels, key, byte.MaxValue), icc, color, depth, metadata); + WithKeyAlpha(png.Pixels, channels, key, byte.MaxValue), color, depth, metadata); } - return RasterImage.Wrap(png.Width, png.Height, channels, SampleFormat.UInt8, png.Pixels, icc, color, depth, metadata); + return RasterImage.Wrap(png.Width, png.Height, channels, SampleFormat.UInt8, png.Pixels, color, depth, metadata); } // Samples of `channels` per pixel with an alpha sample appended to each pixel: 0 where the pixel is diff --git a/src/Sdcb.SimdCodecs.Png/PngImageEncoder.cs b/src/Sdcb.SimdCodecs.Png/PngImageEncoder.cs index e022559..7e24432 100644 --- a/src/Sdcb.SimdCodecs.Png/PngImageEncoder.cs +++ b/src/Sdcb.SimdCodecs.Png/PngImageEncoder.cs @@ -20,7 +20,12 @@ namespace Sdcb.SimdCodecs.Png; public sealed class PngImageEncoder : IImageEncoder { /// The registration for the facade's encoder registry, built from this type's method groups. - public static ImageEncoderRegistration Registration { get; } = new(ImageFormat.Png, GetClosestInputFormat, Create); + public static ImageEncoderRegistration Registration { get; } = new() + { + Format = ImageFormat.Png, + GetClosestInputFormat = GetClosestInputFormat, + Create = Create, + }; /// public static ImageFormat Format => ImageFormat.Png; diff --git a/src/Sdcb.SimdCodecs.Pnm/PnmImageDecoder.cs b/src/Sdcb.SimdCodecs.Pnm/PnmImageDecoder.cs index 5468e7a..4c7216d 100644 --- a/src/Sdcb.SimdCodecs.Pnm/PnmImageDecoder.cs +++ b/src/Sdcb.SimdCodecs.Pnm/PnmImageDecoder.cs @@ -13,8 +13,17 @@ namespace Sdcb.SimdCodecs.Pnm; public sealed class PnmImageDecoder : IImageDecoder { /// The registration for SimdCodecs.Register, built from this type's method groups. - public static ImageDecoderRegistration Registration { get; } = new(ImageFormat.Pnm, CanDecode, TryReadInfo, - TryGetClosestSize, TryDecode, TryDecodeInto, TryReadMetadata, TryDecodeThumbnail); + public static ImageDecoderRegistration Registration { get; } = new() + { + Format = ImageFormat.Pnm, + CanDecode = CanDecode, + TryReadInfo = TryReadInfo, + TryGetClosestSize = TryGetClosestSize, + TryDecode = TryDecode, + TryDecodeInto = TryDecodeInto, + TryReadMetadata = TryReadMetadata, + TryDecodeThumbnail = TryDecodeThumbnail, + }; /// /// P1 to P7 and a whitespace byte. @@ -69,8 +78,17 @@ public static bool TryDecodeIntoRgba8(ReadOnlySpan data, Span rgbaDe public sealed class PfmImageDecoder : IImageDecoder { /// The registration for SimdCodecs.Register, built from this type's method groups. - public static ImageDecoderRegistration Registration { get; } = new(ImageFormat.Pfm, CanDecode, TryReadInfo, - TryGetClosestSize, TryDecode, TryDecodeInto, TryReadMetadata, TryDecodeThumbnail); + public static ImageDecoderRegistration Registration { get; } = new() + { + Format = ImageFormat.Pfm, + CanDecode = CanDecode, + TryReadInfo = TryReadInfo, + TryGetClosestSize = TryGetClosestSize, + TryDecode = TryDecode, + TryDecodeInto = TryDecodeInto, + TryReadMetadata = TryReadMetadata, + TryDecodeThumbnail = TryDecodeThumbnail, + }; /// /// Pf or PF and a whitespace byte. diff --git a/src/Sdcb.SimdCodecs.Pnm/PnmImageEncoder.cs b/src/Sdcb.SimdCodecs.Pnm/PnmImageEncoder.cs index 7adb178..cf8e2d9 100644 --- a/src/Sdcb.SimdCodecs.Pnm/PnmImageEncoder.cs +++ b/src/Sdcb.SimdCodecs.Pnm/PnmImageEncoder.cs @@ -13,7 +13,12 @@ namespace Sdcb.SimdCodecs.Pnm; public sealed class PnmImageEncoder : IImageEncoder { /// The registration for the facade's encoder registry, built from this type's method groups. - public static ImageEncoderRegistration Registration { get; } = new(ImageFormat.Pnm, GetClosestInputFormat, Create); + public static ImageEncoderRegistration Registration { get; } = new() + { + Format = ImageFormat.Pnm, + GetClosestInputFormat = GetClosestInputFormat, + Create = Create, + }; /// public static ImageFormat Format => ImageFormat.Pnm; diff --git a/src/Sdcb.SimdCodecs.Qoi/QoiImageDecoder.cs b/src/Sdcb.SimdCodecs.Qoi/QoiImageDecoder.cs index 6e72ca5..a51cbef 100644 --- a/src/Sdcb.SimdCodecs.Qoi/QoiImageDecoder.cs +++ b/src/Sdcb.SimdCodecs.Qoi/QoiImageDecoder.cs @@ -15,8 +15,17 @@ public sealed class QoiImageDecoder : IImageDecoder private static readonly ColorEncoding LinearSrgb = new() { Transfer = TransferFunction.Linear }; /// The registration for SimdCodecs.Register, built from this type's method groups. - public static ImageDecoderRegistration Registration { get; } = new(ImageFormat.Qoi, CanDecode, TryReadInfo, - TryGetClosestSize, TryDecode, TryDecodeInto, TryReadMetadata, TryDecodeThumbnail); + public static ImageDecoderRegistration Registration { get; } = new() + { + Format = ImageFormat.Qoi, + CanDecode = CanDecode, + TryReadInfo = TryReadInfo, + TryGetClosestSize = TryGetClosestSize, + TryDecode = TryDecode, + TryDecodeInto = TryDecodeInto, + TryReadMetadata = TryReadMetadata, + TryDecodeThumbnail = TryDecodeThumbnail, + }; /// /// The magic qoif. diff --git a/src/Sdcb.SimdCodecs.Qoi/QoiImageEncoder.cs b/src/Sdcb.SimdCodecs.Qoi/QoiImageEncoder.cs index c3e350f..8eb6720 100644 --- a/src/Sdcb.SimdCodecs.Qoi/QoiImageEncoder.cs +++ b/src/Sdcb.SimdCodecs.Qoi/QoiImageEncoder.cs @@ -17,7 +17,12 @@ namespace Sdcb.SimdCodecs.Qoi; public sealed class QoiImageEncoder : IImageEncoder { /// The registration for the facade's encoder registry, built from this type's method groups. - public static ImageEncoderRegistration Registration { get; } = new(ImageFormat.Qoi, GetClosestInputFormat, Create); + public static ImageEncoderRegistration Registration { get; } = new() + { + Format = ImageFormat.Qoi, + GetClosestInputFormat = GetClosestInputFormat, + Create = Create, + }; /// public static ImageFormat Format => ImageFormat.Qoi; diff --git a/src/Sdcb.SimdCodecs.Tiff/TiffImageDecoder.cs b/src/Sdcb.SimdCodecs.Tiff/TiffImageDecoder.cs index eb208a5..df59d1b 100644 --- a/src/Sdcb.SimdCodecs.Tiff/TiffImageDecoder.cs +++ b/src/Sdcb.SimdCodecs.Tiff/TiffImageDecoder.cs @@ -39,8 +39,18 @@ namespace Sdcb.SimdCodecs.Tiff; public sealed class TiffImageDecoder : IMultiFrameImageDecoder { /// The registration for SimdCodecs.Register, built from this type's method groups. - public static ImageDecoderRegistration Registration { get; } = new(ImageFormat.Tiff, CanDecode, TryReadInfo, - TryGetClosestSize, TryDecode, TryDecodeInto, TryReadMetadata, TryDecodeThumbnail, TryOpenFrames); + public static ImageDecoderRegistration Registration { get; } = new() + { + Format = ImageFormat.Tiff, + CanDecode = CanDecode, + TryReadInfo = TryReadInfo, + TryGetClosestSize = TryGetClosestSize, + TryDecode = TryDecode, + TryDecodeInto = TryDecodeInto, + TryReadMetadata = TryReadMetadata, + TryDecodeThumbnail = TryDecodeThumbnail, + TryOpenFrames = TryOpenFrames, + }; /// public static int SignatureLength => 4; @@ -136,7 +146,7 @@ public static bool TryReadMetadata(ReadOnlySpan data, [NotNullWhen(true)] try { var layout = TiffReader.ReadLayout(data, 0); - metadata = new ImageMetadata(xmp: layout.Xmp ?? default, icc: layout.IccProfile ?? default); + metadata = new ImageMetadata { Xmp = layout.Xmp, Icc = layout.IccProfile }; return true; } catch (Exception e) when (e is InvalidDataException or ArgumentException or NotSupportedException) @@ -212,6 +222,7 @@ internal static bool TryDecodePage(ReadOnlySpan data, int pageIndex, Decod var fullBits = format switch { SampleFormat.UInt8 => 8, SampleFormat.UInt16 => 16, _ => 32 }; var bitDepth = page.StoredBitsPerSample > 0 && page.StoredBitsPerSample < fullBits ? page.StoredBitsPerSample : 0; + var metadata = page.IccProfile is null ? null : new ImageMetadata { Icc = page.IccProfile }; RasterImage raster; if (page.BitsPerSample == 16 && page.SampleFormat == TiffSampleFormat.IeeeFloat) { @@ -220,11 +231,11 @@ internal static bool TryDecodePage(ReadOnlySpan data, int pageIndex, Decod var widened = new float[halves.Length]; for (var i = 0; i < halves.Length; i++) widened[i] = (float)halves[i]; raster = RasterImage.Wrap(page.Width, page.Height, channels, SampleFormat.Float32, - MemoryMarshal.AsBytes(widened.AsSpan()).ToArray(), page.IccProfile, color, bitDepth); + MemoryMarshal.AsBytes(widened.AsSpan()).ToArray(), color, bitDepth, metadata); } else { - raster = RasterImage.Wrap(page.Width, page.Height, channels, format, page.Pixels, page.IccProfile, color, bitDepth); + raster = RasterImage.Wrap(page.Width, page.Height, channels, format, page.Pixels, color, bitDepth, metadata); } image = DecodeOptions.Apply(raster, options); return true; diff --git a/src/Sdcb.SimdCodecs.Tiff/TiffImageEncoder.cs b/src/Sdcb.SimdCodecs.Tiff/TiffImageEncoder.cs index 83ee723..8132b99 100644 --- a/src/Sdcb.SimdCodecs.Tiff/TiffImageEncoder.cs +++ b/src/Sdcb.SimdCodecs.Tiff/TiffImageEncoder.cs @@ -16,7 +16,12 @@ namespace Sdcb.SimdCodecs.Tiff; public sealed class TiffImageEncoder : IImageEncoder { /// The registration for the facade's encoder registry, built from this type's method groups. - public static ImageEncoderRegistration Registration { get; } = new(ImageFormat.Tiff, GetClosestInputFormat, Create); + public static ImageEncoderRegistration Registration { get; } = new() + { + Format = ImageFormat.Tiff, + GetClosestInputFormat = GetClosestInputFormat, + Create = Create, + }; /// public static ImageFormat Format => ImageFormat.Tiff; diff --git a/src/Sdcb.SimdCodecs.Webp/WebpFrameReader.cs b/src/Sdcb.SimdCodecs.Webp/WebpFrameReader.cs index dd0366e..2beea84 100644 --- a/src/Sdcb.SimdCodecs.Webp/WebpFrameReader.cs +++ b/src/Sdcb.SimdCodecs.Webp/WebpFrameReader.cs @@ -66,7 +66,8 @@ public bool TryDecodeFrame(int index, [NotNullWhen(true)] out IDecodedImage? ima var canvas = animation.Canvas; int width = _frameInfo.Width, height = _frameInfo.Height, channels = _frameInfo.Channels; var raster = RasterImage.Create(width, height, channels, SampleFormat.UInt8, options?.Pool, - iccProfile: _icc, colorEncoding: ColorEncoding.AssumedSrgb, bitDepth: 8); + colorEncoding: ColorEncoding.AssumedSrgb, bitDepth: 8, + metadata: _icc is null ? null : new ImageMetadata { Icc = _icc }); try { if (channels == 4) diff --git a/src/Sdcb.SimdCodecs.Webp/WebpImageDecoder.cs b/src/Sdcb.SimdCodecs.Webp/WebpImageDecoder.cs index 660392e..9904656 100644 --- a/src/Sdcb.SimdCodecs.Webp/WebpImageDecoder.cs +++ b/src/Sdcb.SimdCodecs.Webp/WebpImageDecoder.cs @@ -91,15 +91,16 @@ public static bool TryDecode(ReadOnlySpan data, [NotNullWhen(true)] out ID int channels = webpInfo.HasAlpha ? 4 : 3; ImageMetadata? metadata = (container.HasExif || container.HasXmp || container.HasIccProfile) - ? new ImageMetadata( - container.HasExif ? container.Exif.ToArray() : default, - container.HasXmp ? container.Xmp.ToArray() : default, - container.HasIccProfile ? container.IccProfile.ToArray() : default) + ? new ImageMetadata + { + Exif = container.HasExif ? container.Exif.ToArray() : default, + Xmp = container.HasXmp ? container.Xmp.ToArray() : default, + Icc = container.HasIccProfile ? container.IccProfile.ToArray() : default, + } : null; - byte[]? icc = container.HasIccProfile ? container.IccProfile.ToArray() : null; var raster = RasterImage.Create(webpInfo.Width, webpInfo.Height, channels, SampleFormat.UInt8, options?.Pool, - iccProfile: icc, colorEncoding: ColorEncoding.AssumedSrgb, bitDepth: 8, metadata: metadata); + colorEncoding: ColorEncoding.AssumedSrgb, bitDepth: 8, metadata: metadata); try { @@ -217,10 +218,12 @@ public static bool TryReadMetadata(ReadOnlySpan data, [NotNullWhen(true)] return true; } - metadata = new ImageMetadata( - container.HasExif ? container.Exif.ToArray() : default, - container.HasXmp ? container.Xmp.ToArray() : default, - container.HasIccProfile ? container.IccProfile.ToArray() : default); + metadata = new ImageMetadata + { + Exif = container.HasExif ? container.Exif.ToArray() : default, + Xmp = container.HasXmp ? container.Xmp.ToArray() : default, + Icc = container.HasIccProfile ? container.IccProfile.ToArray() : default, + }; return true; } catch (Exception e) when (e is InvalidDataException or ArgumentException or NotSupportedException) @@ -235,8 +238,18 @@ public static bool TryDecodeThumbnail(ReadOnlySpan data, [NotNullWhen(true ImageDecoderFallback.NoThumbnail(out thumbnail); /// The registration for SimdCodecs.Register, built from this type's method groups. - public static ImageDecoderRegistration Registration { get; } = new(ImageFormat.Webp, CanDecode, TryReadInfo, - TryGetClosestSize, TryDecode, TryDecodeInto, TryReadMetadata, TryDecodeThumbnail, TryOpenFrames); + public static ImageDecoderRegistration Registration { get; } = new() + { + Format = ImageFormat.Webp, + CanDecode = CanDecode, + TryReadInfo = TryReadInfo, + TryGetClosestSize = TryGetClosestSize, + TryDecode = TryDecode, + TryDecodeInto = TryDecodeInto, + TryReadMetadata = TryReadMetadata, + TryDecodeThumbnail = TryDecodeThumbnail, + TryOpenFrames = TryOpenFrames, + }; /// /// to tightly packed 8-bit RGBA (an animation's first frame for animated diff --git a/src/Sdcb.SimdCodecs.Webp/WebpImageEncoder.cs b/src/Sdcb.SimdCodecs.Webp/WebpImageEncoder.cs index 142f191..e5142bb 100644 --- a/src/Sdcb.SimdCodecs.Webp/WebpImageEncoder.cs +++ b/src/Sdcb.SimdCodecs.Webp/WebpImageEncoder.cs @@ -26,7 +26,12 @@ public sealed class WebpImageEncoder : IImageEncoder private static readonly TimeSpan DefaultDuration = TimeSpan.FromMilliseconds(100); /// The registration for the facade's encoder registry, built from this type's method groups. - public static ImageEncoderRegistration Registration { get; } = new(ImageFormat.Webp, GetClosestInputFormat, Create); + public static ImageEncoderRegistration Registration { get; } = new() + { + Format = ImageFormat.Webp, + GetClosestInputFormat = GetClosestInputFormat, + Create = Create, + }; /// public static ImageFormat Format => ImageFormat.Webp; diff --git a/src/Sdcb.SimdCodecs/SimdCodecs.Encode.cs b/src/Sdcb.SimdCodecs/SimdCodecs.Encode.cs index e0dbccb..753f091 100644 --- a/src/Sdcb.SimdCodecs/SimdCodecs.Encode.cs +++ b/src/Sdcb.SimdCodecs/SimdCodecs.Encode.cs @@ -105,8 +105,6 @@ public static void Encode(IDecodedImage image, ImageFormat format, IBufferWriter throw new NotSupportedException($"{image.SampleFormat} images have no integer projection to encode; convert them first."); var source = PixelFormat.ForChannels(image.Channels, image.SampleFormat); var metadata = image.Metadata; - if (metadata.Icc.IsEmpty && !image.IccProfile.IsEmpty) - metadata = metadata.WithIcc(image.IccProfile.ToArray()); using var session = CreateEncoder(format, destination, options); var frame = session.AddFrame(image.Width, image.Height, source, image.ColorEncoding, metadata.IsEmpty ? null : metadata); frame.WriteRows(image.Pixels, image.Height, 0, cancellationToken); diff --git a/src/Sdcb.SimdCodecs/SimdCodecs.cs b/src/Sdcb.SimdCodecs/SimdCodecs.cs index 850c798..cf9e59e 100644 --- a/src/Sdcb.SimdCodecs/SimdCodecs.cs +++ b/src/Sdcb.SimdCodecs/SimdCodecs.cs @@ -147,9 +147,11 @@ internal static ImageDecoderRegistration[] ExchangeRegistry(ImageDecoderRegistra /// /// The codec's entry, e.g. HeifImageDecoder.Registration. /// is null. + /// Only one of the registration's two planar delegates is set. public static void Register(ImageDecoderRegistration registration) { ArgumentNullException.ThrowIfNull(registration); + registration.Validate(); lock (s_registerLock) { var current = s_registry; diff --git a/src/Sdcb.SimdCodecs/linqpad-samples/quick-start.linq b/src/Sdcb.SimdCodecs/linqpad-samples/quick-start.linq index a85b329..7c60a3c 100644 --- a/src/Sdcb.SimdCodecs/linqpad-samples/quick-start.linq +++ b/src/Sdcb.SimdCodecs/linqpad-samples/quick-start.linq @@ -30,7 +30,7 @@ async Task Main() // Or keep the decoder's native layout (channels, 8/16-bit or float samples, ICC profile). if (SimdCodecs.TryDecode(data, out IDecodedImage? image)) { - new { image.Width, image.Height, image.Channels, image.SampleFormat, IccBytes = image.IccProfile.Length, image.ColorEncoding } + new { image.Width, image.Height, image.Channels, image.SampleFormat, IccBytes = image.Metadata.Icc.Length, image.ColorEncoding } .Dump("SimdCodecs.TryDecode"); } } diff --git a/tests/Sdcb.SimdCodecs.AotSmoke/FacadeSmoke.cs b/tests/Sdcb.SimdCodecs.AotSmoke/FacadeSmoke.cs index 2f3ef18..0191b6d 100644 --- a/tests/Sdcb.SimdCodecs.AotSmoke/FacadeSmoke.cs +++ b/tests/Sdcb.SimdCodecs.AotSmoke/FacadeSmoke.cs @@ -45,7 +45,7 @@ private static int V2() const int w = 37, h = 23; var rgb = Program.Pattern(w, h); var png = SimdCodecs.Encode(rgb, w, h, PixelFormat.Rgb24, ImageFormat.Png, - metadata: new ImageMetadata(icc: new byte[] { 1, 2, 3 })); + metadata: new ImageMetadata { Icc = new byte[] { 1, 2, 3 } }); var jpeg = SimdCodecs.Encode(rgb, w, h, PixelFormat.Rgb24, ImageFormat.Jpeg); Check(SimdCodecs.TryGetClosestSize(jpeg, 10, 6, out var cw, out var ch, out var scale), "v2", "TryGetClosestSize"); diff --git a/tests/Sdcb.SimdCodecs.Tests/BmpDecoderTests.cs b/tests/Sdcb.SimdCodecs.Tests/BmpDecoderTests.cs index 02aefb2..9354244 100644 --- a/tests/Sdcb.SimdCodecs.Tests/BmpDecoderTests.cs +++ b/tests/Sdcb.SimdCodecs.Tests/BmpDecoderTests.cs @@ -441,7 +441,7 @@ public void A_v5_embedded_profile_is_returned() var bmp = W.File(header, [], W.Concat(pixels, profile)); BmpDecoder.Decode(bmp).IccProfile.ShouldBe(profile); BmpImageDecoder.TryDecode(bmp, out var image, cancellationToken: TestContext.Current.CancellationToken).ShouldBeTrue(); - image!.IccProfile.ToArray().ShouldBe(profile); + image!.Metadata.Icc.Span.ToArray().ShouldBe(profile); // A profile that points outside the data is ignored, not fatal. var broken = W.File(W.InfoHeader(124, width, height, 24, 0, colorSpace: 0x4D424544, profileOffset: 5000, profileSize: 300), [], pixels); diff --git a/tests/Sdcb.SimdCodecs.Tests/ColorEncodingTests.cs b/tests/Sdcb.SimdCodecs.Tests/ColorEncodingTests.cs index d36b63b..f500810 100644 --- a/tests/Sdcb.SimdCodecs.Tests/ColorEncodingTests.cs +++ b/tests/Sdcb.SimdCodecs.Tests/ColorEncodingTests.cs @@ -32,7 +32,7 @@ public void RasterImage_defaults_to_the_assumed_srgb_encoding() public void RasterImage_carries_an_explicit_encoding_verbatim() { var pq = new ColorEncoding { Primaries = ColorPrimaries.BT2020, Transfer = TransferFunction.Pq }; - var img = RasterImage.Wrap(1, 1, 3, SampleFormat.UInt8, [0, 0, 0], iccProfile: null, colorEncoding: pq); + var img = RasterImage.Wrap(1, 1, 3, SampleFormat.UInt8, [0, 0, 0], colorEncoding: pq); img.ColorEncoding.ShouldBeSameAs(pq); } diff --git a/tests/Sdcb.SimdCodecs.Tests/EncoderAdapterJpegWebpTiffTests.cs b/tests/Sdcb.SimdCodecs.Tests/EncoderAdapterJpegWebpTiffTests.cs index 214eb4c..4d4164b 100644 --- a/tests/Sdcb.SimdCodecs.Tests/EncoderAdapterJpegWebpTiffTests.cs +++ b/tests/Sdcb.SimdCodecs.Tests/EncoderAdapterJpegWebpTiffTests.cs @@ -99,7 +99,7 @@ public void Jpeg_metadata_comes_back_and_an_unwritable_block_is_dropped() var output = new ArrayBufferWriter(); using (var session = JpegImageEncoder.Create(output)) { - Push(session, pixels, PixelFormat.Rgb24, new ImageMetadata(exif: exif, icc: icc)); + Push(session, pixels, PixelFormat.Rgb24, new ImageMetadata { Exif = exif, Icc = icc }); session.Commit(TestContext.Current.CancellationToken); } SimdCodecs.TryReadMetadata(output.WrittenSpan, out var metadata).ShouldBeTrue(); @@ -112,7 +112,7 @@ public void Jpeg_metadata_comes_back_and_an_unwritable_block_is_dropped() var dropped = new ArrayBufferWriter(); using (var session = JpegImageEncoder.Create(dropped)) { - Push(session, pixels, PixelFormat.Rgb24, new ImageMetadata(exif: new byte[20], xmp: new byte[10])); + Push(session, pixels, PixelFormat.Rgb24, new ImageMetadata { Exif = new byte[20], Xmp = new byte[10] }); session.Commit(TestContext.Current.CancellationToken); } dropped.WrittenSpan.ToArray().ShouldBe(plain); @@ -199,7 +199,7 @@ public void Webp_metadata_comes_back() var output = new ArrayBufferWriter(); using (var session = WebpImageEncoder.Create(output, options)) { - Push(session, RandomImage(PixelFormat.Rgb24, 8), PixelFormat.Rgb24, new ImageMetadata(exif: exif, icc: icc)); + Push(session, RandomImage(PixelFormat.Rgb24, 8), PixelFormat.Rgb24, new ImageMetadata { Exif = exif, Icc = icc }); session.Commit(TestContext.Current.CancellationToken); } SimdCodecs.TryReadMetadata(output.WrittenSpan, out var metadata).ShouldBeTrue(); @@ -278,7 +278,7 @@ public void Tiff_icc_profile_comes_back() var output = new ArrayBufferWriter(); using (var session = TiffImageEncoder.Create(output)) { - Push(session, RandomImage(PixelFormat.Rgb24, 9), PixelFormat.Rgb24, new ImageMetadata(icc: icc)); + Push(session, RandomImage(PixelFormat.Rgb24, 9), PixelFormat.Rgb24, new ImageMetadata { Icc = icc }); session.Commit(TestContext.Current.CancellationToken); } TiffImageDecoder.TryReadMetadata(output.WrittenSpan, out var metadata).ShouldBeTrue(); diff --git a/tests/Sdcb.SimdCodecs.Tests/EncoderAdapterQoiPnmBmpTests.cs b/tests/Sdcb.SimdCodecs.Tests/EncoderAdapterQoiPnmBmpTests.cs index f5778d3..baa9c30 100644 --- a/tests/Sdcb.SimdCodecs.Tests/EncoderAdapterQoiPnmBmpTests.cs +++ b/tests/Sdcb.SimdCodecs.Tests/EncoderAdapterQoiPnmBmpTests.cs @@ -196,7 +196,7 @@ public void Bmp_FrameMetadataIcc_PropagatesToOptions() byte[] icc = [1, 2, 3, 4, 5, 6, 7, 8]; var writer = new ArrayBufferWriter(); using var session = BmpImageEncoder.Create(writer, null); - var frame = session.AddFrame(1, 1, PixelFormat.Rgb24, metadata: new ImageMetadata(icc: icc)); + var frame = session.AddFrame(1, 1, PixelFormat.Rgb24, metadata: new ImageMetadata { Icc = icc }); frame.WriteRows(new byte[3], 1, 0, cancellationToken: ct); session.Commit(ct); diff --git a/tests/Sdcb.SimdCodecs.Tests/FrameReaderTests.cs b/tests/Sdcb.SimdCodecs.Tests/FrameReaderTests.cs index 13b47bc..4728811 100644 --- a/tests/Sdcb.SimdCodecs.Tests/FrameReaderTests.cs +++ b/tests/Sdcb.SimdCodecs.Tests/FrameReaderTests.cs @@ -61,7 +61,7 @@ public void AnimatedWebpFrameZeroIsTheStillImage() (first.Width, first.Height, first.Channels, first.SampleFormat) .ShouldBe((still.Width, still.Height, still.Channels, still.SampleFormat)); first.Pixels.ToArray().ShouldBe(still.Pixels.ToArray(), Path.GetFileName(fixture)); - first.IccProfile.ToArray().ShouldBe(still.IccProfile.ToArray()); + first.Metadata.Icc.Span.ToArray().ShouldBe(still.Metadata.Icc.Span.ToArray()); } } } diff --git a/tests/Sdcb.SimdCodecs.Tests/HeifFacadeTests.cs b/tests/Sdcb.SimdCodecs.Tests/HeifFacadeTests.cs index ab5a679..0cc5651 100644 --- a/tests/Sdcb.SimdCodecs.Tests/HeifFacadeTests.cs +++ b/tests/Sdcb.SimdCodecs.Tests/HeifFacadeTests.cs @@ -127,9 +127,19 @@ public void Register_IsIdempotent() SimdCodecs.RegisteredCount.ShouldBe(before + 1); // A second registration object built from the same method groups is the same codec. - SimdCodecs.Register(new ImageDecoderRegistration(ImageFormat.Heif, HeifImageDecoder.CanDecode, HeifImageDecoder.TryReadInfo, - HeifImageDecoder.TryGetClosestSize, HeifImageDecoder.TryDecode, HeifImageDecoder.TryDecodeInto, HeifImageDecoder.TryReadMetadata, HeifImageDecoder.TryDecodeThumbnail, - tryReadPlanarInfo: HeifImageDecoder.TryReadPlanarInfo, tryDecodePlanes: HeifImageDecoder.TryDecodePlanes)); + SimdCodecs.Register(new ImageDecoderRegistration + { + Format = ImageFormat.Heif, + CanDecode = HeifImageDecoder.CanDecode, + TryReadInfo = HeifImageDecoder.TryReadInfo, + TryGetClosestSize = HeifImageDecoder.TryGetClosestSize, + TryDecode = HeifImageDecoder.TryDecode, + TryDecodeInto = HeifImageDecoder.TryDecodeInto, + TryReadMetadata = HeifImageDecoder.TryReadMetadata, + TryDecodeThumbnail = HeifImageDecoder.TryDecodeThumbnail, + TryReadPlanarInfo = HeifImageDecoder.TryReadPlanarInfo, + TryDecodePlanes = HeifImageDecoder.TryDecodePlanes, + }); SimdCodecs.RegisteredCount.ShouldBe(before + 1); // A different codec is not. @@ -162,16 +172,39 @@ public void RegisteredCodecs_AreSniffedAfterTheBuiltInOnes() public void Register_ValidatesItsArgument() { Should.Throw(() => SimdCodecs.Register(null!)); - Should.Throw(() => new ImageDecoderRegistration(ImageFormat.Unknown, HeifImageDecoder.CanDecode, - HeifImageDecoder.TryReadInfo, HeifImageDecoder.TryGetClosestSize, HeifImageDecoder.TryDecode, HeifImageDecoder.TryDecodeInto, HeifImageDecoder.TryReadMetadata, HeifImageDecoder.TryDecodeThumbnail)); - Should.Throw(() => new ImageDecoderRegistration((ImageFormat)200, HeifImageDecoder.CanDecode, - HeifImageDecoder.TryReadInfo, HeifImageDecoder.TryGetClosestSize, HeifImageDecoder.TryDecode, HeifImageDecoder.TryDecodeInto, HeifImageDecoder.TryReadMetadata, HeifImageDecoder.TryDecodeThumbnail)); - Should.Throw(() => new ImageDecoderRegistration(ImageFormat.Heif, null!, - HeifImageDecoder.TryReadInfo, HeifImageDecoder.TryGetClosestSize, HeifImageDecoder.TryDecode, HeifImageDecoder.TryDecodeInto, HeifImageDecoder.TryReadMetadata, HeifImageDecoder.TryDecodeThumbnail)); - Should.Throw(() => new ImageDecoderRegistration(ImageFormat.Heif, HeifImageDecoder.CanDecode, - HeifImageDecoder.TryReadInfo, HeifImageDecoder.TryGetClosestSize, HeifImageDecoder.TryDecode, null!, HeifImageDecoder.TryReadMetadata, HeifImageDecoder.TryDecodeThumbnail)); + Should.Throw(() => HeifLike(ImageFormat.Unknown)); + Should.Throw(() => HeifLike((ImageFormat)200)); + Should.Throw(() => HeifLike(ImageFormat.Heif, nullCanDecode: true)); + Should.Throw(() => HeifLike(ImageFormat.Heif, nullDecodeInto: true)); + + // Only one planar delegate: the initializer cannot see the pair, so Register checks it. + var halfPlanar = new ImageDecoderRegistration + { + Format = ImageFormat.Heif, + CanDecode = HeifImageDecoder.CanDecode, + TryReadInfo = HeifImageDecoder.TryReadInfo, + TryGetClosestSize = HeifImageDecoder.TryGetClosestSize, + TryDecode = HeifImageDecoder.TryDecode, + TryDecodeInto = HeifImageDecoder.TryDecodeInto, + TryReadMetadata = HeifImageDecoder.TryReadMetadata, + TryDecodeThumbnail = HeifImageDecoder.TryDecodeThumbnail, + TryReadPlanarInfo = HeifImageDecoder.TryReadPlanarInfo, + }; + Should.Throw(() => SimdCodecs.Register(halfPlanar)); } + private static ImageDecoderRegistration HeifLike(ImageFormat format, bool nullCanDecode = false, bool nullDecodeInto = false) => new() + { + Format = format, + CanDecode = nullCanDecode ? null! : HeifImageDecoder.CanDecode, + TryReadInfo = HeifImageDecoder.TryReadInfo, + TryGetClosestSize = HeifImageDecoder.TryGetClosestSize, + TryDecode = HeifImageDecoder.TryDecode, + TryDecodeInto = nullDecodeInto ? null! : HeifImageDecoder.TryDecodeInto, + TryReadMetadata = HeifImageDecoder.TryReadMetadata, + TryDecodeThumbnail = HeifImageDecoder.TryDecodeThumbnail, + }; + /// Registration while other threads decode: no decode fails or sees a torn registry, and every /// distinct codec ends up registered exactly once. [Fact] @@ -224,8 +257,17 @@ public async Task ConcurrentRegistrationAndDecoding() /// A stand-in codec that claims streams starting with and reports a 1×1 /// AVIF; its signature test captures , so each call is a distinct codec. private static ImageDecoderRegistration Fake(byte[] magic) => - new(ImageFormat.Avif, header => header.StartsWith(magic), FakeInfo, FakeClosestSize, FakeDecode, (_, _, _, _, _, _) => false, - FakeMetadata, FakeThumbnail); + new() + { + Format = ImageFormat.Avif, + CanDecode = header => header.StartsWith(magic), + TryReadInfo = FakeInfo, + TryGetClosestSize = FakeClosestSize, + TryDecode = FakeDecode, + TryDecodeInto = (_, _, _, _, _, _) => false, + TryReadMetadata = FakeMetadata, + TryDecodeThumbnail = FakeThumbnail, + }; private static bool FakeClosestSize(ReadOnlySpan data, int w, int h, out int width, out int height, out int scale) { diff --git a/tests/Sdcb.SimdCodecs.Tests/HeifImageDecoderTests.cs b/tests/Sdcb.SimdCodecs.Tests/HeifImageDecoderTests.cs index 6bd1522..a3adf2a 100644 --- a/tests/Sdcb.SimdCodecs.Tests/HeifImageDecoderTests.cs +++ b/tests/Sdcb.SimdCodecs.Tests/HeifImageDecoderTests.cs @@ -139,7 +139,7 @@ public void ReadInfo_DescribesTheDecodedImage(string fixture) .ShouldBe((info.Width, info.Height, 3, sample, native.BitDepth)); (native.Width, native.Height).ShouldBe((info.Width, info.Height)); - image.IccProfile.ToArray().ShouldBe(native.IccProfile ?? []); + image.Metadata.Icc.Span.ToArray().ShouldBe(native.IccProfile ?? []); image.ColorEncoding.FullRange.ShouldBeTrue(); } @@ -268,7 +268,7 @@ public void ColourSignalling_Precedence(string fixture, ColorPrimaries primaries byte[] data = HeifTests.ReadFixture(fixture); HeifImageDecoder.TryDecode(data, out var image, cancellationToken: TestContext.Current.CancellationToken).ShouldBeTrue(); image.ColorEncoding.ShouldBe(new ColorEncoding { Primaries = primaries, Transfer = transfer, FullRange = true }); - if (image.IccProfile.Length > 0) image.ColorEncoding.ShouldBeSameAs(ColorEncoding.AssumedSrgb); + if (image.Metadata.Icc.Span.Length > 0) image.ColorEncoding.ShouldBeSameAs(ColorEncoding.AssumedSrgb); } /// Rewrites the nclx box in memory: each code point is reported as is, the transfer decides the refusal. diff --git a/tests/Sdcb.SimdCodecs.Tests/Jpeg2000FacadeTests.cs b/tests/Sdcb.SimdCodecs.Tests/Jpeg2000FacadeTests.cs index 7ef3fd5..d884f53 100644 --- a/tests/Sdcb.SimdCodecs.Tests/Jpeg2000FacadeTests.cs +++ b/tests/Sdcb.SimdCodecs.Tests/Jpeg2000FacadeTests.cs @@ -108,7 +108,7 @@ public void AnIccProfile_IsPassedThrough() SimdCodecs.TryDecode(jp2, out var image, cancellationToken: TestContext.Current.CancellationToken).ShouldBeTrue(); - image.IccProfile.ToArray().ShouldBe(profile); + image.Metadata.Icc.Span.ToArray().ShouldBe(profile); } /// diff --git a/tests/Sdcb.SimdCodecs.Tests/JpegIccReadTests.cs b/tests/Sdcb.SimdCodecs.Tests/JpegIccReadTests.cs index fe9e006..9b63e38 100644 --- a/tests/Sdcb.SimdCodecs.Tests/JpegIccReadTests.cs +++ b/tests/Sdcb.SimdCodecs.Tests/JpegIccReadTests.cs @@ -34,8 +34,8 @@ public void Reads_a_single_chunk_profile_written_by_libjpeg() Icc(jpeg).ShouldBe(profile.ToByteArray()); SimdCodecs.TryDecode(jpeg, out var image, cancellationToken: TestContext.Current.CancellationToken).ShouldBeTrue(); - image.IccProfile.ToArray().ShouldBe(profile.ToByteArray()); - IccProfiles.Describe(image.IccProfile).ShouldBe("Adobe RGB (1998)"); + image.Metadata.Icc.Span.ToArray().ShouldBe(profile.ToByteArray()); + IccProfiles.Describe(image.Metadata.Icc.Span).ShouldBe("Adobe RGB (1998)"); } [Fact] @@ -48,7 +48,7 @@ public void Joins_a_multi_chunk_profile_written_by_libjpeg() Icc(jpeg).ShouldBe(profile.ToByteArray()); SimdCodecs.TryDecode(jpeg, out var image, cancellationToken: TestContext.Current.CancellationToken).ShouldBeTrue(); - image.IccProfile.ToArray().ShouldBe(profile.ToByteArray()); + image.Metadata.Icc.Span.ToArray().ShouldBe(profile.ToByteArray()); } [Fact] @@ -58,7 +58,7 @@ public void No_profile_is_null_and_an_empty_IccProfile() Icc(jpeg).ShouldBeNull(); SimdCodecs.TryDecode(jpeg, out var image, cancellationToken: TestContext.Current.CancellationToken).ShouldBeTrue(); - image.IccProfile.IsEmpty.ShouldBeTrue(); + image.Metadata.Icc.Span.IsEmpty.ShouldBeTrue(); Icc("not a jpeg"u8).ShouldBeNull(); } diff --git a/tests/Sdcb.SimdCodecs.Tests/JpegIccWriteTests.cs b/tests/Sdcb.SimdCodecs.Tests/JpegIccWriteTests.cs index 730af6d..3a36cc2 100644 --- a/tests/Sdcb.SimdCodecs.Tests/JpegIccWriteTests.cs +++ b/tests/Sdcb.SimdCodecs.Tests/JpegIccWriteTests.cs @@ -43,7 +43,7 @@ public void Profile_changes_no_pixel_and_no_option_changes_no_byte() byte[]? none = null; JpegEncoder.Encode(Rgb, 64, 48, 3, new JpegEncodeOptions { Quality = 85, IccProfile = none }).ShouldBe(plain); SimdCodecs.TryDecode(plain, out var image, cancellationToken: TestContext.Current.CancellationToken).ShouldBeTrue(); - JpegEncoder.Encode(Rgb, 64, 48, 3, new JpegEncodeOptions { Quality = 85, IccProfile = image.IccProfile.ToArray() }).ShouldBe(plain); + JpegEncoder.Encode(Rgb, 64, 48, 3, new JpegEncodeOptions { Quality = 85, IccProfile = image.Metadata.Icc.Span.ToArray() }).ShouldBe(plain); } [Fact] diff --git a/tests/Sdcb.SimdCodecs.Tests/MetadataTests.cs b/tests/Sdcb.SimdCodecs.Tests/MetadataTests.cs index cfe4914..16f3da1 100644 --- a/tests/Sdcb.SimdCodecs.Tests/MetadataTests.cs +++ b/tests/Sdcb.SimdCodecs.Tests/MetadataTests.cs @@ -131,7 +131,7 @@ public void JpegExifXmpAndIccRoundTrip() image.Metadata.Exif.ToArray().ShouldBe(exif); image.Metadata.Xmp.ToArray().ShouldBe(xmp.BuildPacket()); image.Metadata.Icc.ToArray().ShouldBe(icc); - image.IccProfile.ToArray().ShouldBe(icc); + image.Metadata.Icc.Span.ToArray().ShouldBe(icc); } // The Exif package reads the same bytes the metadata carries. @@ -170,7 +170,7 @@ public void AJpegWithoutMetadataHasNone() using (image) { image.Metadata.IsEmpty.ShouldBeTrue(); - image.IccProfile.IsEmpty.ShouldBeTrue(); + image.Metadata.Icc.Span.IsEmpty.ShouldBeTrue(); } } @@ -200,7 +200,7 @@ public void PngExifXmpAndIccRoundTrip() image.Metadata.Exif.ToArray().ShouldBe(exif); image.Metadata.Xmp.ToArray().ShouldBe(packet); image.Metadata.Icc.ToArray().ShouldBe(icc); - image.IccProfile.ToArray().ShouldBe(icc); + image.Metadata.Icc.Span.ToArray().ShouldBe(icc); } } @@ -241,7 +241,7 @@ public void WebpLosslessExifXmpAndIccRoundTrip() image.Metadata.Exif.ToArray().ShouldBe(exif); image.Metadata.Xmp.ToArray().ShouldBe(packet); image.Metadata.Icc.ToArray().ShouldBe(icc); - image.IccProfile.ToArray().ShouldBe(icc); + image.Metadata.Icc.Span.ToArray().ShouldBe(icc); } } diff --git a/tests/Sdcb.SimdCodecs.Tests/RasterImageTests.cs b/tests/Sdcb.SimdCodecs.Tests/RasterImageTests.cs index 00b0de1..235705a 100644 --- a/tests/Sdcb.SimdCodecs.Tests/RasterImageTests.cs +++ b/tests/Sdcb.SimdCodecs.Tests/RasterImageTests.cs @@ -84,10 +84,11 @@ public void Float32_has_no_canonical_rgba_mapping() [Fact] public void IccProfile_defaults_empty_and_round_trips_when_present() { - RasterImage.Wrap(1, 1, 3, SampleFormat.UInt8, [0, 0, 0]).IccProfile.IsEmpty.ShouldBeTrue(); + RasterImage.Wrap(1, 1, 3, SampleFormat.UInt8, [0, 0, 0]).Metadata.Icc.Span.IsEmpty.ShouldBeTrue(); byte[] icc = [1, 2, 3]; - RasterImage.Wrap(1, 1, 3, SampleFormat.UInt8, [0, 0, 0], icc).IccProfile.ToArray().ShouldBe(icc); + RasterImage.Wrap(1, 1, 3, SampleFormat.UInt8, [0, 0, 0], metadata: new ImageMetadata { Icc = icc }) + .Metadata.Icc.ToArray().ShouldBe(icc); } [Theory] diff --git a/tests/Sdcb.SimdCodecs.Tests/RasterImageV2Tests.cs b/tests/Sdcb.SimdCodecs.Tests/RasterImageV2Tests.cs index bb32d31..bc64df6 100644 --- a/tests/Sdcb.SimdCodecs.Tests/RasterImageV2Tests.cs +++ b/tests/Sdcb.SimdCodecs.Tests/RasterImageV2Tests.cs @@ -36,7 +36,7 @@ public void WrapUsesTheArrayWithoutCopying() image.BitDepth.ShouldBe(8); image.ColorEncoding.ShouldBe(ColorEncoding.AssumedSrgb); image.Metadata.ShouldBeSameAs(ImageMetadata.Empty); - image.IccProfile.IsEmpty.ShouldBeTrue(); + image.Metadata.Icc.Span.IsEmpty.ShouldBeTrue(); } [Fact] @@ -209,37 +209,33 @@ public void ABitDepthDoesNotChangeTheSamples() public void MetadataAndColourEncodingAreCarried() { var encoding = new ColorEncoding { Primaries = ColorPrimaries.BT2020, Transfer = TransferFunction.Pq }; - var metadata = new ImageMetadata(exif: new byte[] { 1, 2, 3 }, xmp: new byte[] { 4, 5 }); + var metadata = new ImageMetadata { Exif = new byte[] { 1, 2, 3 }, Xmp = new byte[] { 4, 5 } }; using var image = RasterImage.Wrap(1, 1, 3, SampleFormat.UInt8, new byte[3], colorEncoding: encoding, metadata: metadata); image.ColorEncoding.ShouldBe(encoding); image.Metadata.ShouldBeSameAs(metadata); image.Metadata.Exif.ToArray().ShouldBe([1, 2, 3]); - image.IccProfile.IsEmpty.ShouldBeTrue(); + image.Metadata.Icc.Span.IsEmpty.ShouldBeTrue(); } [Fact] - public void AnIccProfileArgumentFillsTheMetadataAndTheMetadatasOwnWins() + public void TheIccProfileTravelsInTheMetadata() { byte[] icc = [9, 8, 7, 6]; - using (var image = RasterImage.Allocate(1, 1, 3, SampleFormat.UInt8, iccProfile: icc)) + var metadata = new ImageMetadata { Exif = new byte[] { 1, 1, 1, 1, 1, 1, 1, 1 }, Icc = icc }; + using (var image = RasterImage.Allocate(1, 1, 3, SampleFormat.UInt8, metadata: metadata)) { - image.IccProfile.ToArray().ShouldBe(icc); image.Metadata.Icc.ToArray().ShouldBe(icc); + image.Metadata.Exif.Length.ShouldBe(8); } - using (var withMetadata = RasterImage.Allocate(1, 1, 3, SampleFormat.UInt8, iccProfile: icc, - metadata: new ImageMetadata(exif: new byte[] { 1, 1, 1, 1, 1, 1, 1, 1 }))) - { - withMetadata.Metadata.Icc.ToArray().ShouldBe(icc); - withMetadata.Metadata.Exif.Length.ShouldBe(8); - } - - byte[] own = [1, 2]; - using (var both = RasterImage.Allocate(1, 1, 3, SampleFormat.UInt8, iccProfile: icc, metadata: new ImageMetadata(icc: own))) - both.IccProfile.ToArray().ShouldBe(own); + using (var none = RasterImage.Allocate(1, 1, 3, SampleFormat.UInt8)) + none.Metadata.ShouldBeSameAs(ImageMetadata.Empty); - using (var empty = RasterImage.Allocate(1, 1, 3, SampleFormat.UInt8, iccProfile: [])) - empty.Metadata.ShouldBeSameAs(ImageMetadata.Empty); + // ImageMetadata is a record: `with` replaces one block and keeps the others. + var replaced = metadata with { Icc = new byte[] { 1, 2 } }; + replaced.Icc.ToArray().ShouldBe([1, 2]); + replaced.Exif.ShouldBe(metadata.Exif); + metadata.Icc.ToArray().ShouldBe(icc); } // ---- Crop -------------------------------------------------------------------------------------------------- @@ -248,7 +244,7 @@ public void AnIccProfileArgumentFillsTheMetadataAndTheMetadatasOwnWins() public void CropCopiesTheRegionAndKeepsTheDescription() { var encoding = new ColorEncoding { Primaries = ColorPrimaries.BT2020, Transfer = TransferFunction.Hlg }; - var metadata = new ImageMetadata(exif: new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 }, icc: new byte[] { 1, 2, 3 }); + var metadata = new ImageMetadata { Exif = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 }, Icc = new byte[] { 1, 2, 3 } }; var pixels = Counting(6 * 5 * 2 * 3); using var source = RasterImage.Wrap(6, 5, 3, SampleFormat.UInt16, pixels, colorEncoding: encoding, bitDepth: 12, metadata: metadata); @@ -256,7 +252,7 @@ public void CropCopiesTheRegionAndKeepsTheDescription() (crop.Width, crop.Height, crop.Channels, crop.SampleFormat, crop.BitDepth).ShouldBe((3, 2, 3, SampleFormat.UInt16, 12)); crop.ColorEncoding.ShouldBe(encoding); crop.Metadata.Exif.ToArray().ShouldBe(metadata.Exif.ToArray()); - crop.IccProfile.ToArray().ShouldBe([1, 2, 3]); + crop.Metadata.Icc.Span.ToArray().ShouldBe([1, 2, 3]); var expected = new List(); for (var y = 1; y < 3; y++) diff --git a/tests/Sdcb.SimdCodecs.Tests/WebpMetadataTests.cs b/tests/Sdcb.SimdCodecs.Tests/WebpMetadataTests.cs index 4642654..a8b90e1 100644 --- a/tests/Sdcb.SimdCodecs.Tests/WebpMetadataTests.cs +++ b/tests/Sdcb.SimdCodecs.Tests/WebpMetadataTests.cs @@ -21,7 +21,7 @@ public void StillImageAndAdapterPreserveMetadataBytes() Assert.Equal(xmp, image.Xmp); Assert.True(WebpImageDecoder.TryDecode(source, out IDecodedImage? decoded, cancellationToken: TestContext.Current.CancellationToken)); Assert.NotNull(decoded); - Assert.Equal(icc, decoded.IccProfile.ToArray()); + Assert.Equal(icc, decoded.Metadata.Icc.Span.ToArray()); Assert.Equal(ColorEncoding.AssumedSrgb, decoded.ColorEncoding); } From b48ece9af2e5da257cc9cf2d422ed32a980f91eb Mon Sep 17 00:00:00 2001 From: sdcb Date: Wed, 4 Nov 2026 19:26:18 +0800 Subject: [PATCH 2/5] Abstractions: IByteSource moves in; codec-author helpers get their own namespace IByteSource / ByteSource move from the facade to Abstractions (namespace Sdcb.SimdCodecs.Abstractions), so a codec can take one in 2.x without a breaking move. ImageDecoderFallback, BufferedEncoderSession / BufferedFrame / EncoderFormats and DecodeOptions.Validate / Apply (now C# 14 extension members, call sites unchanged) move to Sdcb.SimdCodecs.Abstractions.CodecSupport: codec authors import it, consumers no longer see them. ImageDecoder.Metadata is read from the file once per session instead of on every get. Docs: api-design (compatibility section), migration guide, known-gaps. Co-Authored-By: Claude Opus 5.5 --- docs/api-design.md | 23 ++++++-- docs/known-gaps.md | 2 +- docs/migrating-to-2.0.md | 9 ++- .../ByteSource.cs | 14 ++--- .../BufferedEncoderSession.cs | 2 +- .../CodecSupport/DecodeOptionsChecks.cs | 56 +++++++++++++++++++ .../ImageDecoderFallback.cs | 2 +- .../ColorEncoding.cs | 2 +- .../DecodeOptions.cs | 38 ------------- .../IDecodedImage.cs | 4 +- src/Sdcb.SimdCodecs.Bmp/BmpImageDecoder.cs | 1 + src/Sdcb.SimdCodecs.Bmp/BmpImageEncoder.cs | 1 + src/Sdcb.SimdCodecs.Gif/GifFrameReader.cs | 1 + src/Sdcb.SimdCodecs.Gif/GifImageDecoder.cs | 1 + src/Sdcb.SimdCodecs.Gif/GifImageEncoder.cs | 1 + src/Sdcb.SimdCodecs.Heif/HeifImageDecoder.cs | 1 + src/Sdcb.SimdCodecs.Ico/IcoImageDecoder.cs | 1 + src/Sdcb.SimdCodecs.Ico/IcoImageEncoder.cs | 1 + .../Jbig2ImageDecoder.cs | 1 + .../GainMapImageDecoder.cs | 1 + src/Sdcb.SimdCodecs.Jpeg/JpegEncodeOptions.cs | 2 +- src/Sdcb.SimdCodecs.Jpeg/JpegImageDecoder.cs | 3 +- src/Sdcb.SimdCodecs.Jpeg/JpegImageEncoder.cs | 1 + .../Jpeg2000ImageDecoder.cs | 1 + src/Sdcb.SimdCodecs.Png/PngImageDecoder.cs | 1 + src/Sdcb.SimdCodecs.Png/PngImageEncoder.cs | 1 + src/Sdcb.SimdCodecs.Pnm/PnmImageDecoder.cs | 1 + src/Sdcb.SimdCodecs.Pnm/PnmImageEncoder.cs | 1 + src/Sdcb.SimdCodecs.Qoi/QoiImageDecoder.cs | 1 + src/Sdcb.SimdCodecs.Qoi/QoiImageEncoder.cs | 1 + src/Sdcb.SimdCodecs.Tiff/TiffFrameReader.cs | 1 + src/Sdcb.SimdCodecs.Tiff/TiffImageDecoder.cs | 1 + src/Sdcb.SimdCodecs.Tiff/TiffImageEncoder.cs | 1 + src/Sdcb.SimdCodecs.Webp/WebpFrameReader.cs | 1 + src/Sdcb.SimdCodecs.Webp/WebpImageDecoder.cs | 1 + src/Sdcb.SimdCodecs.Webp/WebpImageEncoder.cs | 1 + src/Sdcb.SimdCodecs/ImageDecoder.cs | 13 ++++- .../ImageDecoderSessionTests.cs | 3 + tests/Sdcb.SimdCodecs.Tests/PnmTests.cs | 1 + 39 files changed, 135 insertions(+), 63 deletions(-) rename src/{Sdcb.SimdCodecs => Sdcb.SimdCodecs.Abstractions}/ByteSource.cs (91%) rename src/Sdcb.SimdCodecs.Abstractions/{ => CodecSupport}/BufferedEncoderSession.cs (99%) create mode 100644 src/Sdcb.SimdCodecs.Abstractions/CodecSupport/DecodeOptionsChecks.cs rename src/Sdcb.SimdCodecs.Abstractions/{ => CodecSupport}/ImageDecoderFallback.cs (98%) diff --git a/docs/api-design.md b/docs/api-design.md index c8c83cf..cfd3dc3 100644 --- a/docs/api-design.md +++ b/docs/api-design.md @@ -6,9 +6,9 @@ ## 保留的原则 -- **静态抽象成员 + 显式注册。** codec 不靠反射发现,NativeAOT 和 Mono AOT 都安全。每个 codec 用自己具体类型的方法组 - 构造 `Registration`(解码器的 `ImageDecoderRegistration`、编码器的 `ImageEncoderRegistration`),门面只引用这些属性, - 从不在泛型方法里绑定委托(Mono AOT 会在那里陷入)。wasm 冒烟测试覆盖所有门面入口。 +- **静态抽象成员 + 显式注册。** codec 不靠反射发现,NativeAOT 和 Mono AOT 都安全。每个 codec 用对象初始化器、以自己 + 具体类型的方法组构造 `Registration`(解码器的 `ImageDecoderRegistration`、编码器的 `ImageEncoderRegistration`),门面 + 只引用这些属性,从不在泛型方法里绑定委托(Mono AOT 会在那里陷入)。wasm 冒烟测试覆盖所有门面入口。 - **`ReadOnlySpan` 一次性 API 是热路径。** 会话 API(`ImageDecoder`)建在它之上。 - **错误约定。** 不可信输入:`Try*` 返回 `false`(抛出型 API 抛 `InvalidDataException`),不挂起,不无界分配。取消 抛 `OperationCanceledException`;调用方给的选项做不到(不支持的缩放、越界的区域)抛 `NotSupportedException` / @@ -51,20 +51,24 @@ Premultiplied,只对 Rgba / Bgra 有意义)。构造函数拒绝无意义的 - **取消**:检查点放在粗粒度位置(JPEG 每个 MCU 行、HEIF 每个 tile 和每 64 行输出、PNG / QOI 等每 64 行、WebP 每个 宏块行),不进内层循环。 - **`ImageInfo`** 在解码前给出 `ColorEncoding`(判断是不是 PQ / HLG)、`Resolution`(单位按文件声明)、`HasThumbnail`。 -- **`ImageDecoderFallback`** 给不具备原生能力的 codec 一行实现:解码再转换、原尺寸、无元数据、无缩略图。 +- **`ImageDecoderFallback`** 给不具备原生能力的 codec 一行实现:解码再转换、原尺寸、无元数据、无缩略图。它和 + `DecodeOptions` 的 `Validate` / `Apply`(扩展成员)、`BufferedEncoderSession` 一样放在 + `Sdcb.SimdCodecs.Abstractions.CodecSupport`:只有写 codec 的人需要,用户的 IntelliSense 里看不到。 ## 元数据与缩略图 接口层只提取和透传原始块(`ImageMetadata`:Exif 从 TIFF 头开始,XMP 是 UTF-8 包,ICC),解析交给 Exif 包, Abstractions 不依赖它。提取:JPEG(APP1 Exif / XMP、APP2 ICC)、PNG(eXIf、iTXt XMP、iCCP)、WebP(EXIF、XMP、ICCP)、 TIFF(XMP 标签 700、ICC)、HEIF(`cdsc` 关联的 Exif item 和 `mime` XMP item、`colr` ICC)。缩略图:JPEG Exif IFD1、 -HEIF `thmb`。编码器把帧的 `ImageMetadata` 写进各自格式的位置。 +HEIF `thmb`。编码器把帧的 `ImageMetadata` 写进各自格式的位置。ICC 只有这一个入口(`IDecodedImage.Metadata.Icc`)。 +`ImageMetadata` 是 record,用初始化器构造、`with` 修改,以后加块(IPTC、文本、HDR 静态元数据)不破坏兼容。 ## 会话:`ImageDecoder` / `ImageFrame` 借鉴 WIC:`ImageDecoder.Open(Stream | path | memory)`、`OpenAsync`;`Format`、`FrameCount`、`LoopCount`、`Metadata`; `GetFrame(i)` 给出 `Info`、`Duration`、`Decode(options)`、`CopyPixels(region, format, buffer, stride)`、 `TryGetClosestSize`、`TryGetThumbnail`。输入经过 `IByteSource`(内存、可寻址流、内存映射文件,不可寻址流先缓冲)。 +`IByteSource` 放在 Abstractions 而不是门面里,这样 2.x 的 codec 可以直接接收它、只读需要的部分。 2.0 里所有 codec 仍在整份文件上解码;逐 codec 换成增量输入是 2.x 的性能项,不改 API。 ## 平面 YCbCr:`IPlanarImageDecoder` @@ -91,3 +95,12 @@ duration)` → `WriteRows(rows, count, stride)` → `Commit()`。 `RasterImage` 只有工厂方法:`Wrap`(接管调用方填好的数组或 `IMemoryOwner`)、`Allocate` / `Rent` / `Create`(创建后 经 `WritablePixels` 填充)、`Crop`。`IDecodedImage : IDisposable`;释放后访问 `Pixels` 抛 `ObjectDisposedException`。 不指定池时行为同 1.x,`Dispose` 可以不调用。 + +## 兼容性 + +2.0 之后不再破坏兼容,形状按这个目标定: + +- 注册类和 `ImageMetadata` 用 `init` 属性(门面需要的标 `required`),不用位置参数的构造函数:加成员不会让已编译的 + 调用方在运行时找不到方法。只有成对出现的平面委托由 `SimdCodecs.Register` 调 `Validate()` 检查。 +- 每个包都有 `PublicAPI.Shipped.txt` / `PublicAPI.Unshipped.txt`(`Microsoft.CodeAnalysis.PublicApiAnalyzers`): + 公开 API 的任何变动都要在这两个文件里出现,否则编译报错;发布一个版本时把 Unshipped 并进 Shipped。 diff --git a/docs/known-gaps.md b/docs/known-gaps.md index b95412b..397770a 100644 --- a/docs/known-gaps.md +++ b/docs/known-gaps.md @@ -44,7 +44,7 @@ HEIF 解码也已调优(M3),基准项目是 `Sdcb.SimdCodecs.Heif.Benchmar 逐 codec 换成真正的增量输入是 2.x 的性能项。 - **`ColorEncoding` 不反映 ICC。** 只有格式自己的色彩标记(PNG 的 cICP,表示线性的 gAMA 1.0,HEIF 的 nclx `colr` 盒或 HEVC VUI)会写进 `IDecodedImage.ColorEncoding`;只带 ICC 的图片(例如 Display P3 照片)仍报默认的 sRGB。要知道 ICC 声明的 - 色彩空间,请读 `IccProfile`。 + 色彩空间,请读 `Metadata.Icc`。 - **EXIF 方向只报告、不应用。** `ImageInfo.Orientation` 告诉你该怎样旋转或翻转,像素本身始终是存储时的 方向。 - **浮点图像没有自动的整数投影。** 浮点 TIFF、增益图 JPEG 重建出的 HDR 等,`TryDecodeInto` 返回 `false` diff --git a/docs/migrating-to-2.0.md b/docs/migrating-to-2.0.md index be95aa7..640afd8 100644 --- a/docs/migrating-to-2.0.md +++ b/docs/migrating-to-2.0.md @@ -10,10 +10,11 @@ without breaking again. Most code needs a rename and nothing else. Every 8-bit d |---|---| | `ImagePixelFormat` (enum) | `PixelFormat` (readonly record struct): `PixelFormat.Rgba32`, `.Bgra32`, `.Rgb24`, `.Bgr24`, `.Gray8` are the same layouts | | `PixelConverter.BytesPerPixel(format)` | `format.BytesPerPixel` | -| `new RasterImage(w, h, channels, sample, pixels, icc, color)` | `RasterImage.Wrap(w, h, channels, sample, pixels, icc, color)` | +| `new RasterImage(w, h, channels, sample, pixels, icc, color)` | `RasterImage.Wrap(w, h, channels, sample, pixels, color, metadata: new ImageMetadata { Icc = icc })` | +| `image.IccProfile` | `image.Metadata.Icc` (the ICC profile now travels with the Exif and XMP blocks) | | `rasterImage.ExpandToRgba8(destination)` | `image.TryCopyTo(destination, 0, PixelFormat.Rgba32)` | | `PixelConverter.ConvertRow(src, channels, sample, dst, ImagePixelFormat, n)` | the same call with a `PixelFormat`; or the new `ConvertRow(src, srcFormat, dst, dstFormat, n)` from any format to any format | -| `new ImageDecoderRegistration(format, canDecode, readInfo, decode, decodeInto[, openFrames])` | use the codec's `XxxImageDecoder.Registration` property; building one by hand takes the eight 2.0 members | +| `new ImageDecoderRegistration(format, canDecode, readInfo, decode, decodeInto[, openFrames])` | use the codec's `XxxImageDecoder.Registration` property; one built by hand is an object initializer: `new ImageDecoderRegistration { Format = …, CanDecode = …, … }` with the eight required 2.0 members | Code that `switch`ed over `ImagePixelFormat` switches over `format.Layout` (`ChannelLayout.Rgba`, …) or compares with `==`. A method that took `ImagePixelFormat format = ImagePixelFormat.Rgba32` takes `PixelFormat? format = null`. @@ -29,7 +30,9 @@ Code that `switch`ed over `ImagePixelFormat` switches over `format.Layout` (`Cha value from narrowing the 16-bit image; `TryDecodeInto` to `Rgba64` gives the full precision. - **New members on interfaces.** A third-party `IImageDecoder` implements `TryGetClosestSize`, `TryReadMetadata`, `TryDecodeThumbnail` (`ImageDecoderFallback` has one-line implementations for a codec without native support) and - the `DecodeOptions?` / `CancellationToken` parameters of `TryDecode` / `TryDecodeInto`. + the `DecodeOptions?` / `CancellationToken` parameters of `TryDecode` / `TryDecodeInto`. The helpers for codec + authors (`ImageDecoderFallback`, `BufferedEncoderSession`, `DecodeOptions.Validate` / `Apply`) are in + `Sdcb.SimdCodecs.Abstractions.CodecSupport`. - **Cancellation.** Every decode and encode entry point takes a `CancellationToken`; a cancelled token throws `OperationCanceledException` (it never makes a `Try` method return false). - **`ImageInfo` reports more**: `ColorEncoding`, `Resolution`, `HasThumbnail`. Code comparing whole `ImageInfo` values diff --git a/src/Sdcb.SimdCodecs/ByteSource.cs b/src/Sdcb.SimdCodecs.Abstractions/ByteSource.cs similarity index 91% rename from src/Sdcb.SimdCodecs/ByteSource.cs rename to src/Sdcb.SimdCodecs.Abstractions/ByteSource.cs index b65a406..a3b0f1f 100644 --- a/src/Sdcb.SimdCodecs/ByteSource.cs +++ b/src/Sdcb.SimdCodecs.Abstractions/ByteSource.cs @@ -2,14 +2,14 @@ using System.IO; using System.IO.MemoryMappedFiles; -namespace Sdcb.SimdCodecs; +namespace Sdcb.SimdCodecs.Abstractions; /// -/// Random-access bytes an image is read from: memory, a seekable stream or a memory-mapped file. The session API -/// () reads through it, so a codec can later fetch only the parts it needs (a HEIF item, -/// a TIFF strip) instead of the whole file. In 2.0 every codec still decodes from the whole file in memory: -/// materialises it once (), without a copy for memory and mapped -/// files. +/// Random-access bytes an image is read from: memory, a seekable stream or a memory-mapped file. The facade's session +/// API (Sdcb.SimdCodecs.ImageDecoder) reads through it. It lives here, beside the codec interfaces, so that a +/// codec can later take one and fetch only the parts it needs (a HEIF item, a TIFF strip) instead of the whole file. +/// In 2.0 every codec still decodes from the whole file in memory: the session materialises it once +/// (), without a copy for memory and mapped files. /// public interface IByteSource : IDisposable { @@ -28,7 +28,7 @@ public interface IByteSource : IDisposable ReadOnlyMemory GetMemory(); } -/// The implementations the session API opens. +/// The implementations: over memory, a stream, or a file. public static class ByteSource { /// A source over memory the caller keeps unchanged while it is used. diff --git a/src/Sdcb.SimdCodecs.Abstractions/BufferedEncoderSession.cs b/src/Sdcb.SimdCodecs.Abstractions/CodecSupport/BufferedEncoderSession.cs similarity index 99% rename from src/Sdcb.SimdCodecs.Abstractions/BufferedEncoderSession.cs rename to src/Sdcb.SimdCodecs.Abstractions/CodecSupport/BufferedEncoderSession.cs index 7337328..03c9090 100644 --- a/src/Sdcb.SimdCodecs.Abstractions/BufferedEncoderSession.cs +++ b/src/Sdcb.SimdCodecs.Abstractions/CodecSupport/BufferedEncoderSession.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using System.Threading; -namespace Sdcb.SimdCodecs.Abstractions; +namespace Sdcb.SimdCodecs.Abstractions.CodecSupport; /// One frame a has collected: its pixels, tightly packed, in the format /// its rows arrived in. diff --git a/src/Sdcb.SimdCodecs.Abstractions/CodecSupport/DecodeOptionsChecks.cs b/src/Sdcb.SimdCodecs.Abstractions/CodecSupport/DecodeOptionsChecks.cs new file mode 100644 index 0000000..4cef470 --- /dev/null +++ b/src/Sdcb.SimdCodecs.Abstractions/CodecSupport/DecodeOptionsChecks.cs @@ -0,0 +1,56 @@ +using System; + +namespace Sdcb.SimdCodecs.Abstractions.CodecSupport; + +/// +/// What a codec does with the it is given: check them against the image, and apply a +/// region it cannot decode natively. Extension members, so a codec writes options?.Validate(…) and +/// DecodeOptions.Apply(…); they stay out of a consumer's view unless this namespace is imported. +/// +public static class DecodeOptionsChecks +{ + extension(DecodeOptions options) + { + /// + /// Checks the options against a stored × image, for a + /// decoder that scales natively by (or only at 1). + /// + /// The decoder cannot produce . + /// does not lie inside the scaled image. + public void Validate(int width, int height, bool supportsScale) + { + var scale = options.ScaleDenominator; + if (scale != 1 && !supportsScale) + throw new NotSupportedException( + $"This decoder does not scale natively; it cannot decode at 1/{scale}. Ask TryGetClosestSize, then scale the result."); + if (options.Region is { } r) + { + var (w, h) = options.GetScaledSize(width, height); + if (!r.FitsIn(w, h)) + throw new ArgumentException($"The region {r} does not lie inside the {w}x{h} image.", nameof(options.Region)); + } + } + } + + extension(DecodeOptions) + { + /// + /// The generic region path for a decoder without native region decoding: checks the options (at scale 1 + /// only), then crops — the whole decoded image — to , + /// disposing it. Without a region it returns itself. + /// + /// is not 1. + /// does not lie inside the image. + public static IDecodedImage Apply(IDecodedImage image, DecodeOptions? options) + { + ArgumentNullException.ThrowIfNull(image); + if (options is null) + return image; + options.Validate(image.Width, image.Height, supportsScale: false); + if (options.Region is not { } r) + return image; + using (image) + return RasterImage.Crop(image, r, options.Pool); + } + } +} diff --git a/src/Sdcb.SimdCodecs.Abstractions/ImageDecoderFallback.cs b/src/Sdcb.SimdCodecs.Abstractions/CodecSupport/ImageDecoderFallback.cs similarity index 98% rename from src/Sdcb.SimdCodecs.Abstractions/ImageDecoderFallback.cs rename to src/Sdcb.SimdCodecs.Abstractions/CodecSupport/ImageDecoderFallback.cs index a982cbb..6475249 100644 --- a/src/Sdcb.SimdCodecs.Abstractions/ImageDecoderFallback.cs +++ b/src/Sdcb.SimdCodecs.Abstractions/CodecSupport/ImageDecoderFallback.cs @@ -2,7 +2,7 @@ using System.Diagnostics.CodeAnalysis; using System.Threading; -namespace Sdcb.SimdCodecs.Abstractions; +namespace Sdcb.SimdCodecs.Abstractions.CodecSupport; /// /// The generic paths an implementation falls back on for what it has no native code diff --git a/src/Sdcb.SimdCodecs.Abstractions/ColorEncoding.cs b/src/Sdcb.SimdCodecs.Abstractions/ColorEncoding.cs index 153e626..b849c9f 100644 --- a/src/Sdcb.SimdCodecs.Abstractions/ColorEncoding.cs +++ b/src/Sdcb.SimdCodecs.Abstractions/ColorEncoding.cs @@ -27,7 +27,7 @@ public enum FloatSemantics : byte /// ). Uses the ITU-T H.273 vocabulary /// ( / ) shared with /// PNG-3 cICP signalling and ICC v4.4 cicp tags. Like -/// this is informational — it never rescales +/// this is informational — it never rescales /// pixels; it tells a consumer what transform the samples are already in. /// /// There is deliberately no matrix-coefficients slot: diff --git a/src/Sdcb.SimdCodecs.Abstractions/DecodeOptions.cs b/src/Sdcb.SimdCodecs.Abstractions/DecodeOptions.cs index 1643c9e..4de88b4 100644 --- a/src/Sdcb.SimdCodecs.Abstractions/DecodeOptions.cs +++ b/src/Sdcb.SimdCodecs.Abstractions/DecodeOptions.cs @@ -76,42 +76,4 @@ public int ScaleDenominator /// image: the region's size, or the scaled size. public (int Width, int Height) GetOutputSize(int width, int height) => Region is { } r ? (r.Width, r.Height) : GetScaledSize(width, height); - - /// - /// Checks the options against a stored × image, for a decoder - /// that scales natively by (or only at 1). - /// - /// The decoder cannot produce . - /// does not lie inside the scaled image. - public void Validate(int width, int height, bool supportsScale) - { - if (_scale != 1 && !supportsScale) - throw new NotSupportedException( - $"This decoder does not scale natively; it cannot decode at 1/{_scale}. Ask TryGetClosestSize, then scale the result."); - if (Region is { } r) - { - var (w, h) = GetScaledSize(width, height); - if (!r.FitsIn(w, h)) - throw new ArgumentException($"The region {r} does not lie inside the {w}x{h} image.", nameof(Region)); - } - } - - /// - /// The generic region path for a decoder without native region decoding: checks the options (at scale 1 only), - /// then crops — the whole decoded image — to , disposing it. Without a - /// region it returns itself. - /// - /// is not 1. - /// does not lie inside the image. - public static IDecodedImage Apply(IDecodedImage image, DecodeOptions? options) - { - ArgumentNullException.ThrowIfNull(image); - if (options is null) - return image; - options.Validate(image.Width, image.Height, supportsScale: false); - if (options.Region is not { } r) - return image; - using (image) - return RasterImage.Crop(image, r, options.Pool); - } } diff --git a/src/Sdcb.SimdCodecs.Abstractions/IDecodedImage.cs b/src/Sdcb.SimdCodecs.Abstractions/IDecodedImage.cs index 3a6c6db..4a534b3 100644 --- a/src/Sdcb.SimdCodecs.Abstractions/IDecodedImage.cs +++ b/src/Sdcb.SimdCodecs.Abstractions/IDecodedImage.cs @@ -56,9 +56,9 @@ public interface IDecodedImage : IDisposable /// /// How the sample values encode colour: H.273 primaries + transfer, code /// range, and (for float rasters) what the values are referenced to. - /// Informational like — never rescales pixels. + /// Informational like the ICC profile in — never rescales pixels. /// Defaults to . - /// It is not derived from : an ICC-tagged image + /// It is not derived from that profile: an ICC-tagged image /// (a Display P3 photo) still reports the default unless its format signals /// colour some other way (PNG cICP, or gAMA 1.0 for linear). Read the profile for the /// colour space an ICC tag declares. diff --git a/src/Sdcb.SimdCodecs.Bmp/BmpImageDecoder.cs b/src/Sdcb.SimdCodecs.Bmp/BmpImageDecoder.cs index c08b98e..ea5263f 100644 --- a/src/Sdcb.SimdCodecs.Bmp/BmpImageDecoder.cs +++ b/src/Sdcb.SimdCodecs.Bmp/BmpImageDecoder.cs @@ -1,5 +1,6 @@ using System.Diagnostics.CodeAnalysis; using Sdcb.SimdCodecs.Abstractions; +using Sdcb.SimdCodecs.Abstractions.CodecSupport; namespace Sdcb.SimdCodecs.Bmp; diff --git a/src/Sdcb.SimdCodecs.Bmp/BmpImageEncoder.cs b/src/Sdcb.SimdCodecs.Bmp/BmpImageEncoder.cs index 4d919d7..a72c4b0 100644 --- a/src/Sdcb.SimdCodecs.Bmp/BmpImageEncoder.cs +++ b/src/Sdcb.SimdCodecs.Bmp/BmpImageEncoder.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Threading; using Sdcb.SimdCodecs.Abstractions; +using Sdcb.SimdCodecs.Abstractions.CodecSupport; namespace Sdcb.SimdCodecs.Bmp; diff --git a/src/Sdcb.SimdCodecs.Gif/GifFrameReader.cs b/src/Sdcb.SimdCodecs.Gif/GifFrameReader.cs index 7de7f23..3c8e031 100644 --- a/src/Sdcb.SimdCodecs.Gif/GifFrameReader.cs +++ b/src/Sdcb.SimdCodecs.Gif/GifFrameReader.cs @@ -1,6 +1,7 @@ using System.Buffers; using System.Diagnostics.CodeAnalysis; using Sdcb.SimdCodecs.Abstractions; +using Sdcb.SimdCodecs.Abstractions.CodecSupport; namespace Sdcb.SimdCodecs.Gif; diff --git a/src/Sdcb.SimdCodecs.Gif/GifImageDecoder.cs b/src/Sdcb.SimdCodecs.Gif/GifImageDecoder.cs index c22876b..8cea082 100644 --- a/src/Sdcb.SimdCodecs.Gif/GifImageDecoder.cs +++ b/src/Sdcb.SimdCodecs.Gif/GifImageDecoder.cs @@ -1,5 +1,6 @@ using System.Diagnostics.CodeAnalysis; using Sdcb.SimdCodecs.Abstractions; +using Sdcb.SimdCodecs.Abstractions.CodecSupport; namespace Sdcb.SimdCodecs.Gif; diff --git a/src/Sdcb.SimdCodecs.Gif/GifImageEncoder.cs b/src/Sdcb.SimdCodecs.Gif/GifImageEncoder.cs index 5a2fb94..35c13de 100644 --- a/src/Sdcb.SimdCodecs.Gif/GifImageEncoder.cs +++ b/src/Sdcb.SimdCodecs.Gif/GifImageEncoder.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Threading; using Sdcb.SimdCodecs.Abstractions; +using Sdcb.SimdCodecs.Abstractions.CodecSupport; namespace Sdcb.SimdCodecs.Gif; diff --git a/src/Sdcb.SimdCodecs.Heif/HeifImageDecoder.cs b/src/Sdcb.SimdCodecs.Heif/HeifImageDecoder.cs index c7114b2..c1e1efe 100644 --- a/src/Sdcb.SimdCodecs.Heif/HeifImageDecoder.cs +++ b/src/Sdcb.SimdCodecs.Heif/HeifImageDecoder.cs @@ -1,6 +1,7 @@ using System.Buffers.Binary; using System.Diagnostics.CodeAnalysis; using Sdcb.SimdCodecs.Abstractions; +using Sdcb.SimdCodecs.Abstractions.CodecSupport; namespace Sdcb.SimdCodecs.Heif; diff --git a/src/Sdcb.SimdCodecs.Ico/IcoImageDecoder.cs b/src/Sdcb.SimdCodecs.Ico/IcoImageDecoder.cs index cb444d7..335f48c 100644 --- a/src/Sdcb.SimdCodecs.Ico/IcoImageDecoder.cs +++ b/src/Sdcb.SimdCodecs.Ico/IcoImageDecoder.cs @@ -1,5 +1,6 @@ using System.Diagnostics.CodeAnalysis; using Sdcb.SimdCodecs.Abstractions; +using Sdcb.SimdCodecs.Abstractions.CodecSupport; namespace Sdcb.SimdCodecs.Ico; diff --git a/src/Sdcb.SimdCodecs.Ico/IcoImageEncoder.cs b/src/Sdcb.SimdCodecs.Ico/IcoImageEncoder.cs index 3d57034..e5eb0c6 100644 --- a/src/Sdcb.SimdCodecs.Ico/IcoImageEncoder.cs +++ b/src/Sdcb.SimdCodecs.Ico/IcoImageEncoder.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Threading; using Sdcb.SimdCodecs.Abstractions; +using Sdcb.SimdCodecs.Abstractions.CodecSupport; namespace Sdcb.SimdCodecs.Ico; diff --git a/src/Sdcb.SimdCodecs.Jbig2/Jbig2ImageDecoder.cs b/src/Sdcb.SimdCodecs.Jbig2/Jbig2ImageDecoder.cs index 85c6733..2b466cd 100644 --- a/src/Sdcb.SimdCodecs.Jbig2/Jbig2ImageDecoder.cs +++ b/src/Sdcb.SimdCodecs.Jbig2/Jbig2ImageDecoder.cs @@ -3,6 +3,7 @@ using System.IO; using System.Threading; using Sdcb.SimdCodecs.Abstractions; +using Sdcb.SimdCodecs.Abstractions.CodecSupport; namespace Sdcb.SimdCodecs.Jbig2; diff --git a/src/Sdcb.SimdCodecs.Jpeg.GainMap/GainMapImageDecoder.cs b/src/Sdcb.SimdCodecs.Jpeg.GainMap/GainMapImageDecoder.cs index b703d77..d19fd3b 100644 --- a/src/Sdcb.SimdCodecs.Jpeg.GainMap/GainMapImageDecoder.cs +++ b/src/Sdcb.SimdCodecs.Jpeg.GainMap/GainMapImageDecoder.cs @@ -1,5 +1,6 @@ using System.Diagnostics.CodeAnalysis; using Sdcb.SimdCodecs.Abstractions; +using Sdcb.SimdCodecs.Abstractions.CodecSupport; using Sdcb.SimdCodecs.Color.Icc; namespace Sdcb.SimdCodecs.Jpeg; diff --git a/src/Sdcb.SimdCodecs.Jpeg/JpegEncodeOptions.cs b/src/Sdcb.SimdCodecs.Jpeg/JpegEncodeOptions.cs index 032947a..7c43acf 100644 --- a/src/Sdcb.SimdCodecs.Jpeg/JpegEncodeOptions.cs +++ b/src/Sdcb.SimdCodecs.Jpeg/JpegEncodeOptions.cs @@ -80,7 +80,7 @@ public sealed record JpegEncodeOptions : Sdcb.SimdCodecs.Abstractions.EncodeOpti /// When set, the ICC profile to embed, written as APP2 ICC_PROFILE segments (ICC.1 Annex B.4) after /// the EXIF and XMP segments: one per bytes, each numbered, so a profile of /// any size up to fits. Pass the decoded image's - /// to keep a Display P3 or Adobe RGB photo's colour + /// Metadata.Icc to keep a Display P3 or Adobe RGB photo's colour /// space through a re-encode, whether or not it has one. The bytes are written as given, not validated as /// a profile; an oversized one is an from . /// null (the default) or an empty profile writes no segment and leaves the output byte-identical diff --git a/src/Sdcb.SimdCodecs.Jpeg/JpegImageDecoder.cs b/src/Sdcb.SimdCodecs.Jpeg/JpegImageDecoder.cs index 9203281..e2ca277 100644 --- a/src/Sdcb.SimdCodecs.Jpeg/JpegImageDecoder.cs +++ b/src/Sdcb.SimdCodecs.Jpeg/JpegImageDecoder.cs @@ -3,6 +3,7 @@ using System.IO; using System.Threading; using Sdcb.SimdCodecs.Abstractions; +using Sdcb.SimdCodecs.Abstractions.CodecSupport; namespace Sdcb.SimdCodecs.Jpeg; @@ -11,7 +12,7 @@ namespace Sdcb.SimdCodecs.Jpeg; /// into the Sdcb.SimdCodecs facade. A greyscale JPEG (one SOF component) /// decodes to a 1-channel raster of its samples; /// every other JPEG (YCbCr, RGB, CMYK, YCCK) to 3-channel RGB - JPEG has no alpha. The -/// embedded APP2 ICC profile, if any, comes back as . +/// embedded APP2 ICC profile, if any, comes back as .. /// /// is a genuine zero-copy decode for the five basic 8-bit /// s () via diff --git a/src/Sdcb.SimdCodecs.Jpeg/JpegImageEncoder.cs b/src/Sdcb.SimdCodecs.Jpeg/JpegImageEncoder.cs index a39c62d..d597c86 100644 --- a/src/Sdcb.SimdCodecs.Jpeg/JpegImageEncoder.cs +++ b/src/Sdcb.SimdCodecs.Jpeg/JpegImageEncoder.cs @@ -1,5 +1,6 @@ using System.Buffers; using Sdcb.SimdCodecs.Abstractions; +using Sdcb.SimdCodecs.Abstractions.CodecSupport; namespace Sdcb.SimdCodecs.Jpeg; diff --git a/src/Sdcb.SimdCodecs.Jpeg2000/Jpeg2000ImageDecoder.cs b/src/Sdcb.SimdCodecs.Jpeg2000/Jpeg2000ImageDecoder.cs index 3d6bf37..5644b1f 100644 --- a/src/Sdcb.SimdCodecs.Jpeg2000/Jpeg2000ImageDecoder.cs +++ b/src/Sdcb.SimdCodecs.Jpeg2000/Jpeg2000ImageDecoder.cs @@ -5,6 +5,7 @@ using System.Runtime.InteropServices; using System.Threading; using Sdcb.SimdCodecs.Abstractions; +using Sdcb.SimdCodecs.Abstractions.CodecSupport; namespace Sdcb.SimdCodecs.Jpeg2000; diff --git a/src/Sdcb.SimdCodecs.Png/PngImageDecoder.cs b/src/Sdcb.SimdCodecs.Png/PngImageDecoder.cs index d6bd412..b08b954 100644 --- a/src/Sdcb.SimdCodecs.Png/PngImageDecoder.cs +++ b/src/Sdcb.SimdCodecs.Png/PngImageDecoder.cs @@ -7,6 +7,7 @@ using System.Runtime.InteropServices; using System.Threading; using Sdcb.SimdCodecs.Abstractions; +using Sdcb.SimdCodecs.Abstractions.CodecSupport; namespace Sdcb.SimdCodecs.Png; diff --git a/src/Sdcb.SimdCodecs.Png/PngImageEncoder.cs b/src/Sdcb.SimdCodecs.Png/PngImageEncoder.cs index 7e24432..6b390da 100644 --- a/src/Sdcb.SimdCodecs.Png/PngImageEncoder.cs +++ b/src/Sdcb.SimdCodecs.Png/PngImageEncoder.cs @@ -2,6 +2,7 @@ using System.Runtime.InteropServices; using System.Text; using Sdcb.SimdCodecs.Abstractions; +using Sdcb.SimdCodecs.Abstractions.CodecSupport; namespace Sdcb.SimdCodecs.Png; diff --git a/src/Sdcb.SimdCodecs.Pnm/PnmImageDecoder.cs b/src/Sdcb.SimdCodecs.Pnm/PnmImageDecoder.cs index 4c7216d..4a0e307 100644 --- a/src/Sdcb.SimdCodecs.Pnm/PnmImageDecoder.cs +++ b/src/Sdcb.SimdCodecs.Pnm/PnmImageDecoder.cs @@ -1,6 +1,7 @@ using System.Diagnostics.CodeAnalysis; using System.Numerics; using Sdcb.SimdCodecs.Abstractions; +using Sdcb.SimdCodecs.Abstractions.CodecSupport; namespace Sdcb.SimdCodecs.Pnm; diff --git a/src/Sdcb.SimdCodecs.Pnm/PnmImageEncoder.cs b/src/Sdcb.SimdCodecs.Pnm/PnmImageEncoder.cs index cf8e2d9..41fe562 100644 --- a/src/Sdcb.SimdCodecs.Pnm/PnmImageEncoder.cs +++ b/src/Sdcb.SimdCodecs.Pnm/PnmImageEncoder.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Threading; using Sdcb.SimdCodecs.Abstractions; +using Sdcb.SimdCodecs.Abstractions.CodecSupport; namespace Sdcb.SimdCodecs.Pnm; diff --git a/src/Sdcb.SimdCodecs.Qoi/QoiImageDecoder.cs b/src/Sdcb.SimdCodecs.Qoi/QoiImageDecoder.cs index a51cbef..e753718 100644 --- a/src/Sdcb.SimdCodecs.Qoi/QoiImageDecoder.cs +++ b/src/Sdcb.SimdCodecs.Qoi/QoiImageDecoder.cs @@ -1,5 +1,6 @@ using System.Diagnostics.CodeAnalysis; using Sdcb.SimdCodecs.Abstractions; +using Sdcb.SimdCodecs.Abstractions.CodecSupport; namespace Sdcb.SimdCodecs.Qoi; diff --git a/src/Sdcb.SimdCodecs.Qoi/QoiImageEncoder.cs b/src/Sdcb.SimdCodecs.Qoi/QoiImageEncoder.cs index 8eb6720..2afcff4 100644 --- a/src/Sdcb.SimdCodecs.Qoi/QoiImageEncoder.cs +++ b/src/Sdcb.SimdCodecs.Qoi/QoiImageEncoder.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Threading; using Sdcb.SimdCodecs.Abstractions; +using Sdcb.SimdCodecs.Abstractions.CodecSupport; namespace Sdcb.SimdCodecs.Qoi; diff --git a/src/Sdcb.SimdCodecs.Tiff/TiffFrameReader.cs b/src/Sdcb.SimdCodecs.Tiff/TiffFrameReader.cs index cd464f6..d6d0744 100644 --- a/src/Sdcb.SimdCodecs.Tiff/TiffFrameReader.cs +++ b/src/Sdcb.SimdCodecs.Tiff/TiffFrameReader.cs @@ -1,5 +1,6 @@ using System.Diagnostics.CodeAnalysis; using Sdcb.SimdCodecs.Abstractions; +using Sdcb.SimdCodecs.Abstractions.CodecSupport; namespace Sdcb.SimdCodecs.Tiff; diff --git a/src/Sdcb.SimdCodecs.Tiff/TiffImageDecoder.cs b/src/Sdcb.SimdCodecs.Tiff/TiffImageDecoder.cs index df59d1b..96cf60d 100644 --- a/src/Sdcb.SimdCodecs.Tiff/TiffImageDecoder.cs +++ b/src/Sdcb.SimdCodecs.Tiff/TiffImageDecoder.cs @@ -3,6 +3,7 @@ using System.IO; using System.Runtime.InteropServices; using Sdcb.SimdCodecs.Abstractions; +using Sdcb.SimdCodecs.Abstractions.CodecSupport; namespace Sdcb.SimdCodecs.Tiff; diff --git a/src/Sdcb.SimdCodecs.Tiff/TiffImageEncoder.cs b/src/Sdcb.SimdCodecs.Tiff/TiffImageEncoder.cs index 8132b99..73b9a43 100644 --- a/src/Sdcb.SimdCodecs.Tiff/TiffImageEncoder.cs +++ b/src/Sdcb.SimdCodecs.Tiff/TiffImageEncoder.cs @@ -1,5 +1,6 @@ using System.Buffers; using Sdcb.SimdCodecs.Abstractions; +using Sdcb.SimdCodecs.Abstractions.CodecSupport; namespace Sdcb.SimdCodecs.Tiff; diff --git a/src/Sdcb.SimdCodecs.Webp/WebpFrameReader.cs b/src/Sdcb.SimdCodecs.Webp/WebpFrameReader.cs index 2beea84..7656aef 100644 --- a/src/Sdcb.SimdCodecs.Webp/WebpFrameReader.cs +++ b/src/Sdcb.SimdCodecs.Webp/WebpFrameReader.cs @@ -1,5 +1,6 @@ using System.Diagnostics.CodeAnalysis; using Sdcb.SimdCodecs.Abstractions; +using Sdcb.SimdCodecs.Abstractions.CodecSupport; namespace Sdcb.SimdCodecs.Webp; diff --git a/src/Sdcb.SimdCodecs.Webp/WebpImageDecoder.cs b/src/Sdcb.SimdCodecs.Webp/WebpImageDecoder.cs index 9904656..7cb7fe2 100644 --- a/src/Sdcb.SimdCodecs.Webp/WebpImageDecoder.cs +++ b/src/Sdcb.SimdCodecs.Webp/WebpImageDecoder.cs @@ -1,6 +1,7 @@ using System.Buffers; using System.Diagnostics.CodeAnalysis; using Sdcb.SimdCodecs.Abstractions; +using Sdcb.SimdCodecs.Abstractions.CodecSupport; namespace Sdcb.SimdCodecs.Webp; diff --git a/src/Sdcb.SimdCodecs.Webp/WebpImageEncoder.cs b/src/Sdcb.SimdCodecs.Webp/WebpImageEncoder.cs index e5142bb..ba8a64f 100644 --- a/src/Sdcb.SimdCodecs.Webp/WebpImageEncoder.cs +++ b/src/Sdcb.SimdCodecs.Webp/WebpImageEncoder.cs @@ -1,5 +1,6 @@ using System.Buffers; using Sdcb.SimdCodecs.Abstractions; +using Sdcb.SimdCodecs.Abstractions.CodecSupport; namespace Sdcb.SimdCodecs.Webp; diff --git a/src/Sdcb.SimdCodecs/ImageDecoder.cs b/src/Sdcb.SimdCodecs/ImageDecoder.cs index 8ece779..eb54640 100644 --- a/src/Sdcb.SimdCodecs/ImageDecoder.cs +++ b/src/Sdcb.SimdCodecs/ImageDecoder.cs @@ -27,6 +27,7 @@ public sealed class ImageDecoder : IDisposable private readonly ReadOnlyMemory _data; private readonly ImageDecoderRegistration _codec; private readonly IImageFrameReader _frames; + private ImageMetadata? _metadata; private bool _disposed; private ImageDecoder(IByteSource source, ReadOnlyMemory data, ImageDecoderRegistration codec, IImageFrameReader frames) @@ -105,8 +106,16 @@ public static async ValueTask OpenAsync(Stream stream, bool leaveO /// For an animation, how many times it plays (0: forever); null for pages and stills. public int? LoopCount => _frames.LoopCount; - /// The file's metadata blocks (Exif, XMP, ICC); when it has none. - public ImageMetadata Metadata => _codec.TryReadMetadata(Data, out var metadata) ? metadata : ImageMetadata.Empty; + /// The file's metadata blocks (Exif, XMP, ICC); when it has none. Read + /// from the file once, on first use. + public ImageMetadata Metadata + { + get + { + var data = Data; // throws once disposed, cached or not + return _metadata ??= _codec.TryReadMetadata(data, out var metadata) ? metadata : ImageMetadata.Empty; + } + } /// Frame . /// is not below . diff --git a/tests/Sdcb.SimdCodecs.Tests/ImageDecoderSessionTests.cs b/tests/Sdcb.SimdCodecs.Tests/ImageDecoderSessionTests.cs index a7b3ad3..c4708d3 100644 --- a/tests/Sdcb.SimdCodecs.Tests/ImageDecoderSessionTests.cs +++ b/tests/Sdcb.SimdCodecs.Tests/ImageDecoderSessionTests.cs @@ -466,6 +466,9 @@ public void MetadataIsTheFacadesAndTheFramesInfoIsTheFacadesInfo() decoder.Metadata.Xmp.ToArray().ShouldBe(packet); decoder.Metadata.Icc.Length.ShouldBe(300); decoder.GetFrame(0).Metadata.Exif.ToArray().ShouldBe(exif); + // Read once per session: every frame and every read share one instance. + decoder.Metadata.ShouldBeSameAs(decoder.Metadata); + decoder.GetFrame(0).Metadata.ShouldBeSameAs(decoder.Metadata); SimdCodecs.TryReadInfo(data, out var info).ShouldBeTrue(); decoder.GetFrame(0).Info.ShouldBe(info); diff --git a/tests/Sdcb.SimdCodecs.Tests/PnmTests.cs b/tests/Sdcb.SimdCodecs.Tests/PnmTests.cs index 6d26751..5b35bbf 100644 --- a/tests/Sdcb.SimdCodecs.Tests/PnmTests.cs +++ b/tests/Sdcb.SimdCodecs.Tests/PnmTests.cs @@ -2,6 +2,7 @@ using System.Text; using ImageMagick; using Sdcb.SimdCodecs.Abstractions; +using Sdcb.SimdCodecs.Abstractions.CodecSupport; using Sdcb.SimdCodecs.Pnm; using Shouldly; From 2d32bda2c45e68ecaceb3de485bb097aaf5e3517 Mon Sep 17 00:00:00 2001 From: sdcb Date: Wed, 4 Nov 2026 19:33:49 +0800 Subject: [PATCH 3/5] Public API baseline for every shipped package Microsoft.CodeAnalysis.PublicApiAnalyzers 5.6.0 on every project under src/: PublicAPI.Shipped.txt records the 2.0 surface (with nullability), and an API change that is not written into PublicAPI.Unshipped.txt fails the build (RS0016 / RS0017 as errors, .editorconfig). Checked by adding an undeclared member: RS0016. The analyzer's overload-shape rules RS0026 / RS0027 are off: the codecs deliberately pair byte[] and ReadOnlySpan overloads with the same optional parameters. AGENTS.md and api-design.md state the rule. Co-Authored-By: Claude Opus 5.5 --- .editorconfig | 13 + AGENTS.md | 4 + Directory.Build.props | 8 + Directory.Packages.props | 2 + docs/api-design.md | 6 +- .../PublicAPI.Shipped.txt | 523 ++++++++++++++++++ .../PublicAPI.Unshipped.txt | 1 + src/Sdcb.SimdCodecs.Bmp/PublicAPI.Shipped.txt | 125 +++++ .../PublicAPI.Unshipped.txt | 1 + .../PublicAPI.Shipped.txt | 6 + .../PublicAPI.Unshipped.txt | 1 + .../PublicAPI.Shipped.txt | 142 +++++ .../PublicAPI.Unshipped.txt | 1 + src/Sdcb.SimdCodecs.Gif/PublicAPI.Shipped.txt | 80 +++ .../PublicAPI.Unshipped.txt | 1 + .../PublicAPI.Shipped.txt | 39 ++ .../PublicAPI.Unshipped.txt | 1 + src/Sdcb.SimdCodecs.Ico/PublicAPI.Shipped.txt | 119 ++++ .../PublicAPI.Unshipped.txt | 1 + .../PublicAPI.Shipped.txt | 26 + .../PublicAPI.Unshipped.txt | 1 + .../PublicAPI.Shipped.txt | 114 ++++ .../PublicAPI.Unshipped.txt | 1 + .../PublicAPI.Shipped.txt | 3 + .../PublicAPI.Unshipped.txt | 1 + .../PublicAPI.Shipped.txt | 188 +++++++ .../PublicAPI.Unshipped.txt | 1 + .../PublicAPI.Shipped.txt | 87 +++ .../PublicAPI.Unshipped.txt | 1 + src/Sdcb.SimdCodecs.Png/PublicAPI.Shipped.txt | 274 +++++++++ .../PublicAPI.Unshipped.txt | 1 + src/Sdcb.SimdCodecs.Pnm/PublicAPI.Shipped.txt | 103 ++++ .../PublicAPI.Unshipped.txt | 1 + src/Sdcb.SimdCodecs.Qoi/PublicAPI.Shipped.txt | 54 ++ .../PublicAPI.Unshipped.txt | 1 + .../PublicAPI.Shipped.txt | 322 +++++++++++ .../PublicAPI.Unshipped.txt | 1 + .../PublicAPI.Shipped.txt | 302 ++++++++++ .../PublicAPI.Unshipped.txt | 1 + src/Sdcb.SimdCodecs/PublicAPI.Shipped.txt | 44 ++ src/Sdcb.SimdCodecs/PublicAPI.Unshipped.txt | 1 + 41 files changed, 2600 insertions(+), 2 deletions(-) create mode 100644 .editorconfig create mode 100644 src/Sdcb.SimdCodecs.Abstractions/PublicAPI.Shipped.txt create mode 100644 src/Sdcb.SimdCodecs.Abstractions/PublicAPI.Unshipped.txt create mode 100644 src/Sdcb.SimdCodecs.Bmp/PublicAPI.Shipped.txt create mode 100644 src/Sdcb.SimdCodecs.Bmp/PublicAPI.Unshipped.txt create mode 100644 src/Sdcb.SimdCodecs.Color.Icc/PublicAPI.Shipped.txt create mode 100644 src/Sdcb.SimdCodecs.Color.Icc/PublicAPI.Unshipped.txt create mode 100644 src/Sdcb.SimdCodecs.Exif/PublicAPI.Shipped.txt create mode 100644 src/Sdcb.SimdCodecs.Exif/PublicAPI.Unshipped.txt create mode 100644 src/Sdcb.SimdCodecs.Gif/PublicAPI.Shipped.txt create mode 100644 src/Sdcb.SimdCodecs.Gif/PublicAPI.Unshipped.txt create mode 100644 src/Sdcb.SimdCodecs.Heif/PublicAPI.Shipped.txt create mode 100644 src/Sdcb.SimdCodecs.Heif/PublicAPI.Unshipped.txt create mode 100644 src/Sdcb.SimdCodecs.Ico/PublicAPI.Shipped.txt create mode 100644 src/Sdcb.SimdCodecs.Ico/PublicAPI.Unshipped.txt create mode 100644 src/Sdcb.SimdCodecs.Jbig2/PublicAPI.Shipped.txt create mode 100644 src/Sdcb.SimdCodecs.Jbig2/PublicAPI.Unshipped.txt create mode 100644 src/Sdcb.SimdCodecs.Jpeg.GainMap/PublicAPI.Shipped.txt create mode 100644 src/Sdcb.SimdCodecs.Jpeg.GainMap/PublicAPI.Unshipped.txt create mode 100644 src/Sdcb.SimdCodecs.Jpeg.IccInjector/PublicAPI.Shipped.txt create mode 100644 src/Sdcb.SimdCodecs.Jpeg.IccInjector/PublicAPI.Unshipped.txt create mode 100644 src/Sdcb.SimdCodecs.Jpeg/PublicAPI.Shipped.txt create mode 100644 src/Sdcb.SimdCodecs.Jpeg/PublicAPI.Unshipped.txt create mode 100644 src/Sdcb.SimdCodecs.Jpeg2000/PublicAPI.Shipped.txt create mode 100644 src/Sdcb.SimdCodecs.Jpeg2000/PublicAPI.Unshipped.txt create mode 100644 src/Sdcb.SimdCodecs.Png/PublicAPI.Shipped.txt create mode 100644 src/Sdcb.SimdCodecs.Png/PublicAPI.Unshipped.txt create mode 100644 src/Sdcb.SimdCodecs.Pnm/PublicAPI.Shipped.txt create mode 100644 src/Sdcb.SimdCodecs.Pnm/PublicAPI.Unshipped.txt create mode 100644 src/Sdcb.SimdCodecs.Qoi/PublicAPI.Shipped.txt create mode 100644 src/Sdcb.SimdCodecs.Qoi/PublicAPI.Unshipped.txt create mode 100644 src/Sdcb.SimdCodecs.Tiff/PublicAPI.Shipped.txt create mode 100644 src/Sdcb.SimdCodecs.Tiff/PublicAPI.Unshipped.txt create mode 100644 src/Sdcb.SimdCodecs.Webp/PublicAPI.Shipped.txt create mode 100644 src/Sdcb.SimdCodecs.Webp/PublicAPI.Unshipped.txt create mode 100644 src/Sdcb.SimdCodecs/PublicAPI.Shipped.txt create mode 100644 src/Sdcb.SimdCodecs/PublicAPI.Unshipped.txt diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..efb16b2 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,13 @@ +root = true + +[*.cs] +# Public API baseline (Microsoft.CodeAnalysis.PublicApiAnalyzers, see Directory.Build.props): an API that is not in +# PublicAPI.Shipped.txt / PublicAPI.Unshipped.txt, or one listed there that no longer exists, fails the build. +dotnet_diagnostic.RS0016.severity = error +dotnet_diagnostic.RS0017.severity = error + +# The same analyzer's overload-shape rules (RS0026: several overloads with optional parameters; RS0027: the optional +# parameters on an overload with fewer parameters) are API style, not the baseline. The codecs deliberately offer +# byte[] and ReadOnlySpan overloads with the same optional options; they are not changed for this rule. +dotnet_diagnostic.RS0026.severity = none +dotnet_diagnostic.RS0027.severity = none diff --git a/AGENTS.md b/AGENTS.md index e0902f1..d2b409c 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -84,6 +84,10 @@ bash tests/Sdcb.SimdCodecs.WasmSmoke/run.sh # Mono AOT ( locally after touching the facade or a codec's `IImageDecoder` adapter. - **No new warnings.** The build stays at its current set (pre-existing XML-doc warnings only); fix what you introduce, never suppress it. +- **The public API is a baseline.** Every package under `src/` lists its public API in `PublicAPI.Shipped.txt` + (the 2.0 surface) and `PublicAPI.Unshipped.txt` (changes since the last release); an API change that is not + written there is a build error (RS0016 / RS0017). A removal or a changed signature after 2.0 is a breaking change: + make it only in a major version. On a release, Unshipped moves into Shipped. - **A skipped oracle is not a passing oracle.** Oracle tests skip when their tool is missing; read the skip messages, or run with `REQUIRE_ORACLES=1`. - Every vector kernel has a scalar twin and must produce identical output on every tier diff --git a/Directory.Build.props b/Directory.Build.props index 09eccf8..b2db974 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -36,6 +36,14 @@ $(NoWarn);CS1591;CS1573 + + + + + + + diff --git a/Directory.Packages.props b/Directory.Packages.props index 6e2213e..b620c24 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -5,6 +5,8 @@ + + diff --git a/docs/api-design.md b/docs/api-design.md index cfd3dc3..fcd79d1 100644 --- a/docs/api-design.md +++ b/docs/api-design.md @@ -102,5 +102,7 @@ duration)` → `WriteRows(rows, count, stride)` → `Commit()`。 - 注册类和 `ImageMetadata` 用 `init` 属性(门面需要的标 `required`),不用位置参数的构造函数:加成员不会让已编译的 调用方在运行时找不到方法。只有成对出现的平面委托由 `SimdCodecs.Register` 调 `Validate()` 检查。 -- 每个包都有 `PublicAPI.Shipped.txt` / `PublicAPI.Unshipped.txt`(`Microsoft.CodeAnalysis.PublicApiAnalyzers`): - 公开 API 的任何变动都要在这两个文件里出现,否则编译报错;发布一个版本时把 Unshipped 并进 Shipped。 +- 每个包都有 `PublicAPI.Shipped.txt` / `PublicAPI.Unshipped.txt`(`Microsoft.CodeAnalysis.PublicApiAnalyzers`)。 + Shipped 记的是 2.0 的公开 API;之后的变动写进 Unshipped,不写就编译报错(RS0016 / RS0017);发布一个版本时把 + Unshipped 并进 Shipped。同一分析器里关于可选参数重载形状的 RS0026 / RS0027 在 `.editorconfig` 里关闭:codec 有意 + 同时提供 `byte[]` 和 `ReadOnlySpan` 重载并带相同的可选参数。 diff --git a/src/Sdcb.SimdCodecs.Abstractions/PublicAPI.Shipped.txt b/src/Sdcb.SimdCodecs.Abstractions/PublicAPI.Shipped.txt new file mode 100644 index 0000000..678641c --- /dev/null +++ b/src/Sdcb.SimdCodecs.Abstractions/PublicAPI.Shipped.txt @@ -0,0 +1,523 @@ +#nullable enable +Sdcb.SimdCodecs.Abstractions.AlphaMode +Sdcb.SimdCodecs.Abstractions.AlphaMode.Premultiplied = 1 -> Sdcb.SimdCodecs.Abstractions.AlphaMode +Sdcb.SimdCodecs.Abstractions.AlphaMode.Straight = 0 -> Sdcb.SimdCodecs.Abstractions.AlphaMode +Sdcb.SimdCodecs.Abstractions.ByteSource +Sdcb.SimdCodecs.Abstractions.ChannelLayout +Sdcb.SimdCodecs.Abstractions.ChannelLayout.Bgr = 3 -> Sdcb.SimdCodecs.Abstractions.ChannelLayout +Sdcb.SimdCodecs.Abstractions.ChannelLayout.Bgra = 1 -> Sdcb.SimdCodecs.Abstractions.ChannelLayout +Sdcb.SimdCodecs.Abstractions.ChannelLayout.Gray = 4 -> Sdcb.SimdCodecs.Abstractions.ChannelLayout +Sdcb.SimdCodecs.Abstractions.ChannelLayout.GrayAlpha = 5 -> Sdcb.SimdCodecs.Abstractions.ChannelLayout +Sdcb.SimdCodecs.Abstractions.ChannelLayout.Rgb = 2 -> Sdcb.SimdCodecs.Abstractions.ChannelLayout +Sdcb.SimdCodecs.Abstractions.ChannelLayout.Rgba = 0 -> Sdcb.SimdCodecs.Abstractions.ChannelLayout +Sdcb.SimdCodecs.Abstractions.ChromaLocation +Sdcb.SimdCodecs.Abstractions.ChromaLocation.Bottom = 5 -> Sdcb.SimdCodecs.Abstractions.ChromaLocation +Sdcb.SimdCodecs.Abstractions.ChromaLocation.BottomLeft = 4 -> Sdcb.SimdCodecs.Abstractions.ChromaLocation +Sdcb.SimdCodecs.Abstractions.ChromaLocation.Center = 1 -> Sdcb.SimdCodecs.Abstractions.ChromaLocation +Sdcb.SimdCodecs.Abstractions.ChromaLocation.Left = 0 -> Sdcb.SimdCodecs.Abstractions.ChromaLocation +Sdcb.SimdCodecs.Abstractions.ChromaLocation.Top = 3 -> Sdcb.SimdCodecs.Abstractions.ChromaLocation +Sdcb.SimdCodecs.Abstractions.ChromaLocation.TopLeft = 2 -> Sdcb.SimdCodecs.Abstractions.ChromaLocation +Sdcb.SimdCodecs.Abstractions.CodecSupport.BufferedEncoderSession +Sdcb.SimdCodecs.Abstractions.CodecSupport.BufferedEncoderSession.AddFrame(int width, int height, Sdcb.SimdCodecs.Abstractions.PixelFormat format, Sdcb.SimdCodecs.Abstractions.ColorEncoding? color = null, Sdcb.SimdCodecs.Abstractions.ImageMetadata? metadata = null, System.TimeSpan? duration = null) -> Sdcb.SimdCodecs.Abstractions.IImageFrameEncoder! +Sdcb.SimdCodecs.Abstractions.CodecSupport.BufferedEncoderSession.BufferedEncoderSession(System.Buffers.IBufferWriter! output) -> void +Sdcb.SimdCodecs.Abstractions.CodecSupport.BufferedEncoderSession.Commit(System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> void +Sdcb.SimdCodecs.Abstractions.CodecSupport.BufferedEncoderSession.Dispose() -> void +Sdcb.SimdCodecs.Abstractions.CodecSupport.BufferedEncoderSession.Output.get -> System.Buffers.IBufferWriter! +Sdcb.SimdCodecs.Abstractions.CodecSupport.BufferedEncoderSession.WriteOutput(System.ReadOnlySpan bytes) -> void +Sdcb.SimdCodecs.Abstractions.CodecSupport.BufferedFrame +Sdcb.SimdCodecs.Abstractions.CodecSupport.BufferedFrame.Color.get -> Sdcb.SimdCodecs.Abstractions.ColorEncoding? +Sdcb.SimdCodecs.Abstractions.CodecSupport.BufferedFrame.Duration.get -> System.TimeSpan? +Sdcb.SimdCodecs.Abstractions.CodecSupport.BufferedFrame.Format.get -> Sdcb.SimdCodecs.Abstractions.PixelFormat +Sdcb.SimdCodecs.Abstractions.CodecSupport.BufferedFrame.Height.get -> int +Sdcb.SimdCodecs.Abstractions.CodecSupport.BufferedFrame.Metadata.get -> Sdcb.SimdCodecs.Abstractions.ImageMetadata? +Sdcb.SimdCodecs.Abstractions.CodecSupport.BufferedFrame.Pixels.get -> System.ReadOnlySpan +Sdcb.SimdCodecs.Abstractions.CodecSupport.BufferedFrame.PixelsAs(Sdcb.SimdCodecs.Abstractions.PixelFormat format) -> System.ReadOnlySpan +Sdcb.SimdCodecs.Abstractions.CodecSupport.BufferedFrame.Width.get -> int +Sdcb.SimdCodecs.Abstractions.CodecSupport.DecodeOptionsChecks +Sdcb.SimdCodecs.Abstractions.CodecSupport.DecodeOptionsChecks.extension(Sdcb.SimdCodecs.Abstractions.DecodeOptions!) +Sdcb.SimdCodecs.Abstractions.CodecSupport.DecodeOptionsChecks.extension(Sdcb.SimdCodecs.Abstractions.DecodeOptions!).Validate(int width, int height, bool supportsScale) -> void +Sdcb.SimdCodecs.Abstractions.CodecSupport.EncoderFormats +Sdcb.SimdCodecs.Abstractions.CodecSupport.ImageDecoderFallback +Sdcb.SimdCodecs.Abstractions.ColorEncoding +Sdcb.SimdCodecs.Abstractions.ColorEncoding.$() -> Sdcb.SimdCodecs.Abstractions.ColorEncoding! +Sdcb.SimdCodecs.Abstractions.ColorEncoding.ColorEncoding() -> void +Sdcb.SimdCodecs.Abstractions.ColorEncoding.Equals(Sdcb.SimdCodecs.Abstractions.ColorEncoding? other) -> bool +Sdcb.SimdCodecs.Abstractions.ColorEncoding.Float.get -> Sdcb.SimdCodecs.Abstractions.FloatSemantics +Sdcb.SimdCodecs.Abstractions.ColorEncoding.Float.init -> void +Sdcb.SimdCodecs.Abstractions.ColorEncoding.FullRange.get -> bool +Sdcb.SimdCodecs.Abstractions.ColorEncoding.FullRange.init -> void +Sdcb.SimdCodecs.Abstractions.ColorEncoding.Primaries.get -> Sdcb.SimdCodecs.Abstractions.ColorPrimaries +Sdcb.SimdCodecs.Abstractions.ColorEncoding.Primaries.init -> void +Sdcb.SimdCodecs.Abstractions.ColorEncoding.Transfer.get -> Sdcb.SimdCodecs.Abstractions.TransferFunction +Sdcb.SimdCodecs.Abstractions.ColorEncoding.Transfer.init -> void +Sdcb.SimdCodecs.Abstractions.ColorPrimaries +Sdcb.SimdCodecs.Abstractions.ColorPrimaries.BT2020 = 9 -> Sdcb.SimdCodecs.Abstractions.ColorPrimaries +Sdcb.SimdCodecs.Abstractions.ColorPrimaries.BT470BG = 5 -> Sdcb.SimdCodecs.Abstractions.ColorPrimaries +Sdcb.SimdCodecs.Abstractions.ColorPrimaries.BT470M = 4 -> Sdcb.SimdCodecs.Abstractions.ColorPrimaries +Sdcb.SimdCodecs.Abstractions.ColorPrimaries.BT709 = 1 -> Sdcb.SimdCodecs.Abstractions.ColorPrimaries +Sdcb.SimdCodecs.Abstractions.ColorPrimaries.DciP3 = 11 -> Sdcb.SimdCodecs.Abstractions.ColorPrimaries +Sdcb.SimdCodecs.Abstractions.ColorPrimaries.DisplayP3 = 12 -> Sdcb.SimdCodecs.Abstractions.ColorPrimaries +Sdcb.SimdCodecs.Abstractions.ColorPrimaries.EBU3213 = 22 -> Sdcb.SimdCodecs.Abstractions.ColorPrimaries +Sdcb.SimdCodecs.Abstractions.ColorPrimaries.Generic = 8 -> Sdcb.SimdCodecs.Abstractions.ColorPrimaries +Sdcb.SimdCodecs.Abstractions.ColorPrimaries.SMPTE170M = 6 -> Sdcb.SimdCodecs.Abstractions.ColorPrimaries +Sdcb.SimdCodecs.Abstractions.ColorPrimaries.SMPTE240M = 7 -> Sdcb.SimdCodecs.Abstractions.ColorPrimaries +Sdcb.SimdCodecs.Abstractions.ColorPrimaries.SMPTE428 = 10 -> Sdcb.SimdCodecs.Abstractions.ColorPrimaries +Sdcb.SimdCodecs.Abstractions.ColorPrimaries.Unspecified = 2 -> Sdcb.SimdCodecs.Abstractions.ColorPrimaries +Sdcb.SimdCodecs.Abstractions.DecodeOptions +Sdcb.SimdCodecs.Abstractions.DecodeOptions.$() -> Sdcb.SimdCodecs.Abstractions.DecodeOptions! +Sdcb.SimdCodecs.Abstractions.DecodeOptions.DecodeOptions() -> void +Sdcb.SimdCodecs.Abstractions.DecodeOptions.Equals(Sdcb.SimdCodecs.Abstractions.DecodeOptions? other) -> bool +Sdcb.SimdCodecs.Abstractions.DecodeOptions.GetOutputSize(int width, int height) -> (int Width, int Height) +Sdcb.SimdCodecs.Abstractions.DecodeOptions.GetScaledSize(int width, int height) -> (int Width, int Height) +Sdcb.SimdCodecs.Abstractions.DecodeOptions.IsFullImage.get -> bool +Sdcb.SimdCodecs.Abstractions.DecodeOptions.Pool.get -> System.Buffers.ArrayPool? +Sdcb.SimdCodecs.Abstractions.DecodeOptions.Pool.init -> void +Sdcb.SimdCodecs.Abstractions.DecodeOptions.Region.get -> Sdcb.SimdCodecs.Abstractions.PixelRect? +Sdcb.SimdCodecs.Abstractions.DecodeOptions.Region.init -> void +Sdcb.SimdCodecs.Abstractions.DecodeOptions.ScaleDenominator.get -> int +Sdcb.SimdCodecs.Abstractions.DecodeOptions.ScaleDenominator.init -> void +Sdcb.SimdCodecs.Abstractions.EncodeOptions +Sdcb.SimdCodecs.Abstractions.EncodeOptions.EncodeOptions() -> void +Sdcb.SimdCodecs.Abstractions.EncodeOptions.EncodeOptions(Sdcb.SimdCodecs.Abstractions.EncodeOptions! original) -> void +Sdcb.SimdCodecs.Abstractions.FloatSemantics +Sdcb.SimdCodecs.Abstractions.FloatSemantics.DisplayReferred = 1 -> Sdcb.SimdCodecs.Abstractions.FloatSemantics +Sdcb.SimdCodecs.Abstractions.FloatSemantics.NotApplicable = 0 -> Sdcb.SimdCodecs.Abstractions.FloatSemantics +Sdcb.SimdCodecs.Abstractions.FloatSemantics.SceneReferred = 2 -> Sdcb.SimdCodecs.Abstractions.FloatSemantics +Sdcb.SimdCodecs.Abstractions.FrameTiming +Sdcb.SimdCodecs.Abstractions.FrameTiming.Deconstruct(out int Index, out System.TimeSpan? Duration) -> void +Sdcb.SimdCodecs.Abstractions.FrameTiming.Duration.get -> System.TimeSpan? +Sdcb.SimdCodecs.Abstractions.FrameTiming.Duration.init -> void +Sdcb.SimdCodecs.Abstractions.FrameTiming.Equals(Sdcb.SimdCodecs.Abstractions.FrameTiming other) -> bool +Sdcb.SimdCodecs.Abstractions.FrameTiming.FrameTiming() -> void +Sdcb.SimdCodecs.Abstractions.FrameTiming.FrameTiming(int Index, System.TimeSpan? Duration) -> void +Sdcb.SimdCodecs.Abstractions.FrameTiming.Index.get -> int +Sdcb.SimdCodecs.Abstractions.FrameTiming.Index.init -> void +Sdcb.SimdCodecs.Abstractions.IByteSource +Sdcb.SimdCodecs.Abstractions.IByteSource.CanSeek.get -> bool +Sdcb.SimdCodecs.Abstractions.IByteSource.GetMemory() -> System.ReadOnlyMemory +Sdcb.SimdCodecs.Abstractions.IByteSource.Length.get -> long +Sdcb.SimdCodecs.Abstractions.IByteSource.Read(long offset, System.Span destination) -> int +Sdcb.SimdCodecs.Abstractions.IDecodedImage +Sdcb.SimdCodecs.Abstractions.IDecodedImage.BitDepth.get -> int +Sdcb.SimdCodecs.Abstractions.IDecodedImage.Channels.get -> int +Sdcb.SimdCodecs.Abstractions.IDecodedImage.ColorEncoding.get -> Sdcb.SimdCodecs.Abstractions.ColorEncoding! +Sdcb.SimdCodecs.Abstractions.IDecodedImage.Height.get -> int +Sdcb.SimdCodecs.Abstractions.IDecodedImage.Metadata.get -> Sdcb.SimdCodecs.Abstractions.ImageMetadata! +Sdcb.SimdCodecs.Abstractions.IDecodedImage.Pixels.get -> System.ReadOnlySpan +Sdcb.SimdCodecs.Abstractions.IDecodedImage.SampleFormat.get -> Sdcb.SimdCodecs.Abstractions.SampleFormat +Sdcb.SimdCodecs.Abstractions.IDecodedImage.ToFloats() -> float[]! +Sdcb.SimdCodecs.Abstractions.IDecodedImage.ToRgba16() -> ushort[]! +Sdcb.SimdCodecs.Abstractions.IDecodedImage.ToRgba8() -> byte[]! +Sdcb.SimdCodecs.Abstractions.IDecodedImage.TryCopyTo(System.Span destination, int stride, Sdcb.SimdCodecs.Abstractions.PixelFormat format) -> bool +Sdcb.SimdCodecs.Abstractions.IDecodedImage.Width.get -> int +Sdcb.SimdCodecs.Abstractions.IImageDecoder +Sdcb.SimdCodecs.Abstractions.IImageDecoder.CanDecode(System.ReadOnlySpan header) -> bool +Sdcb.SimdCodecs.Abstractions.IImageDecoder.SignatureLength.get -> int +Sdcb.SimdCodecs.Abstractions.IImageDecoder.TryDecode(System.ReadOnlySpan data, out Sdcb.SimdCodecs.Abstractions.IDecodedImage? image, Sdcb.SimdCodecs.Abstractions.DecodeOptions? options = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> bool +Sdcb.SimdCodecs.Abstractions.IImageDecoder.TryDecodeInto(System.ReadOnlySpan data, System.Span destination, int stride, Sdcb.SimdCodecs.Abstractions.PixelFormat format, Sdcb.SimdCodecs.Abstractions.DecodeOptions? options = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> bool +Sdcb.SimdCodecs.Abstractions.IImageDecoder.TryDecodeThumbnail(System.ReadOnlySpan data, out Sdcb.SimdCodecs.Abstractions.IDecodedImage? thumbnail) -> bool +Sdcb.SimdCodecs.Abstractions.IImageDecoder.TryGetClosestSize(System.ReadOnlySpan data, int requestedWidth, int requestedHeight, out int width, out int height, out int scaleDenominator) -> bool +Sdcb.SimdCodecs.Abstractions.IImageDecoder.TryReadInfo(System.ReadOnlySpan data, out Sdcb.SimdCodecs.Abstractions.ImageInfo info) -> bool +Sdcb.SimdCodecs.Abstractions.IImageDecoder.TryReadMetadata(System.ReadOnlySpan data, out Sdcb.SimdCodecs.Abstractions.ImageMetadata? metadata) -> bool +Sdcb.SimdCodecs.Abstractions.IImageEncoder +Sdcb.SimdCodecs.Abstractions.IImageEncoder.Create(System.Buffers.IBufferWriter! output, Sdcb.SimdCodecs.Abstractions.EncodeOptions? options = null) -> Sdcb.SimdCodecs.Abstractions.IImageEncoderSession! +Sdcb.SimdCodecs.Abstractions.IImageEncoder.Format.get -> Sdcb.SimdCodecs.Abstractions.ImageFormat +Sdcb.SimdCodecs.Abstractions.IImageEncoder.GetClosestInputFormat(Sdcb.SimdCodecs.Abstractions.PixelFormat requested) -> Sdcb.SimdCodecs.Abstractions.PixelFormat +Sdcb.SimdCodecs.Abstractions.IImageEncoderSession +Sdcb.SimdCodecs.Abstractions.IImageEncoderSession.AddFrame(int width, int height, Sdcb.SimdCodecs.Abstractions.PixelFormat format, Sdcb.SimdCodecs.Abstractions.ColorEncoding? color = null, Sdcb.SimdCodecs.Abstractions.ImageMetadata? metadata = null, System.TimeSpan? duration = null) -> Sdcb.SimdCodecs.Abstractions.IImageFrameEncoder! +Sdcb.SimdCodecs.Abstractions.IImageEncoderSession.Commit(System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> void +Sdcb.SimdCodecs.Abstractions.IImageEncoderSession.MaxFrames.get -> int +Sdcb.SimdCodecs.Abstractions.IImageFrameEncoder +Sdcb.SimdCodecs.Abstractions.IImageFrameEncoder.RowsWritten.get -> int +Sdcb.SimdCodecs.Abstractions.IImageFrameEncoder.WriteRows(System.ReadOnlySpan rows, int rowCount, int stride = 0, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> void +Sdcb.SimdCodecs.Abstractions.IImageFrameReader +Sdcb.SimdCodecs.Abstractions.IImageFrameReader.FrameCount.get -> int +Sdcb.SimdCodecs.Abstractions.IImageFrameReader.LoopCount.get -> int? +Sdcb.SimdCodecs.Abstractions.IImageFrameReader.TryDecodeFrame(int index, out Sdcb.SimdCodecs.Abstractions.IDecodedImage? image, Sdcb.SimdCodecs.Abstractions.DecodeOptions? options = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> bool +Sdcb.SimdCodecs.Abstractions.IImageFrameReader.TryDecodeFrameInto(int index, System.Span destination, int stride, Sdcb.SimdCodecs.Abstractions.PixelFormat format, Sdcb.SimdCodecs.Abstractions.DecodeOptions? options = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> bool +Sdcb.SimdCodecs.Abstractions.IImageFrameReader.TryGetFrameInfo(int index, out Sdcb.SimdCodecs.Abstractions.ImageFrameInfo frame) -> bool +Sdcb.SimdCodecs.Abstractions.IMultiFrameImageDecoder +Sdcb.SimdCodecs.Abstractions.IMultiFrameImageDecoder.TryOpenFrames(System.ReadOnlyMemory data, out Sdcb.SimdCodecs.Abstractions.IImageFrameReader? reader) -> bool +Sdcb.SimdCodecs.Abstractions.IPlanarImageDecoder +Sdcb.SimdCodecs.Abstractions.IPlanarImageDecoder.TryDecodePlanes(System.ReadOnlySpan data, System.Span y, System.Span cb, System.Span cr, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> bool +Sdcb.SimdCodecs.Abstractions.IPlanarImageDecoder.TryReadPlanarInfo(System.ReadOnlySpan data, out Sdcb.SimdCodecs.Abstractions.PlanarInfo info) -> bool +Sdcb.SimdCodecs.Abstractions.ImageDecoderRegistration +Sdcb.SimdCodecs.Abstractions.ImageDecoderRegistration.CanDecode.get -> Sdcb.SimdCodecs.Abstractions.ImageDecoderRegistration.CanDecodeHandler! +Sdcb.SimdCodecs.Abstractions.ImageDecoderRegistration.CanDecode.init -> void +Sdcb.SimdCodecs.Abstractions.ImageDecoderRegistration.CanDecodeHandler +Sdcb.SimdCodecs.Abstractions.ImageDecoderRegistration.Format.get -> Sdcb.SimdCodecs.Abstractions.ImageFormat +Sdcb.SimdCodecs.Abstractions.ImageDecoderRegistration.Format.init -> void +Sdcb.SimdCodecs.Abstractions.ImageDecoderRegistration.ImageDecoderRegistration() -> void +Sdcb.SimdCodecs.Abstractions.ImageDecoderRegistration.TryDecode.get -> Sdcb.SimdCodecs.Abstractions.ImageDecoderRegistration.TryDecodeHandler! +Sdcb.SimdCodecs.Abstractions.ImageDecoderRegistration.TryDecode.init -> void +Sdcb.SimdCodecs.Abstractions.ImageDecoderRegistration.TryDecodeHandler +Sdcb.SimdCodecs.Abstractions.ImageDecoderRegistration.TryDecodeInto.get -> Sdcb.SimdCodecs.Abstractions.ImageDecoderRegistration.TryDecodeIntoHandler! +Sdcb.SimdCodecs.Abstractions.ImageDecoderRegistration.TryDecodeInto.init -> void +Sdcb.SimdCodecs.Abstractions.ImageDecoderRegistration.TryDecodeIntoHandler +Sdcb.SimdCodecs.Abstractions.ImageDecoderRegistration.TryDecodePlanes.get -> Sdcb.SimdCodecs.Abstractions.ImageDecoderRegistration.TryDecodePlanesHandler? +Sdcb.SimdCodecs.Abstractions.ImageDecoderRegistration.TryDecodePlanes.init -> void +Sdcb.SimdCodecs.Abstractions.ImageDecoderRegistration.TryDecodePlanesHandler +Sdcb.SimdCodecs.Abstractions.ImageDecoderRegistration.TryDecodeThumbnail.get -> Sdcb.SimdCodecs.Abstractions.ImageDecoderRegistration.TryDecodeThumbnailHandler! +Sdcb.SimdCodecs.Abstractions.ImageDecoderRegistration.TryDecodeThumbnail.init -> void +Sdcb.SimdCodecs.Abstractions.ImageDecoderRegistration.TryDecodeThumbnailHandler +Sdcb.SimdCodecs.Abstractions.ImageDecoderRegistration.TryGetClosestSize.get -> Sdcb.SimdCodecs.Abstractions.ImageDecoderRegistration.TryGetClosestSizeHandler! +Sdcb.SimdCodecs.Abstractions.ImageDecoderRegistration.TryGetClosestSize.init -> void +Sdcb.SimdCodecs.Abstractions.ImageDecoderRegistration.TryGetClosestSizeHandler +Sdcb.SimdCodecs.Abstractions.ImageDecoderRegistration.TryOpenFrames.get -> Sdcb.SimdCodecs.Abstractions.ImageDecoderRegistration.TryOpenFramesHandler? +Sdcb.SimdCodecs.Abstractions.ImageDecoderRegistration.TryOpenFrames.init -> void +Sdcb.SimdCodecs.Abstractions.ImageDecoderRegistration.TryOpenFramesHandler +Sdcb.SimdCodecs.Abstractions.ImageDecoderRegistration.TryReadInfo.get -> Sdcb.SimdCodecs.Abstractions.ImageDecoderRegistration.TryReadInfoHandler! +Sdcb.SimdCodecs.Abstractions.ImageDecoderRegistration.TryReadInfo.init -> void +Sdcb.SimdCodecs.Abstractions.ImageDecoderRegistration.TryReadInfoHandler +Sdcb.SimdCodecs.Abstractions.ImageDecoderRegistration.TryReadMetadata.get -> Sdcb.SimdCodecs.Abstractions.ImageDecoderRegistration.TryReadMetadataHandler! +Sdcb.SimdCodecs.Abstractions.ImageDecoderRegistration.TryReadMetadata.init -> void +Sdcb.SimdCodecs.Abstractions.ImageDecoderRegistration.TryReadMetadataHandler +Sdcb.SimdCodecs.Abstractions.ImageDecoderRegistration.TryReadPlanarInfo.get -> Sdcb.SimdCodecs.Abstractions.ImageDecoderRegistration.TryReadPlanarInfoHandler? +Sdcb.SimdCodecs.Abstractions.ImageDecoderRegistration.TryReadPlanarInfo.init -> void +Sdcb.SimdCodecs.Abstractions.ImageDecoderRegistration.TryReadPlanarInfoHandler +Sdcb.SimdCodecs.Abstractions.ImageDecoderRegistration.Validate() -> void +Sdcb.SimdCodecs.Abstractions.ImageEncoderRegistration +Sdcb.SimdCodecs.Abstractions.ImageEncoderRegistration.Create.get -> Sdcb.SimdCodecs.Abstractions.ImageEncoderRegistration.CreateHandler! +Sdcb.SimdCodecs.Abstractions.ImageEncoderRegistration.Create.init -> void +Sdcb.SimdCodecs.Abstractions.ImageEncoderRegistration.CreateHandler +Sdcb.SimdCodecs.Abstractions.ImageEncoderRegistration.Format.get -> Sdcb.SimdCodecs.Abstractions.ImageFormat +Sdcb.SimdCodecs.Abstractions.ImageEncoderRegistration.Format.init -> void +Sdcb.SimdCodecs.Abstractions.ImageEncoderRegistration.GetClosestInputFormat.get -> Sdcb.SimdCodecs.Abstractions.ImageEncoderRegistration.GetClosestInputFormatHandler! +Sdcb.SimdCodecs.Abstractions.ImageEncoderRegistration.GetClosestInputFormat.init -> void +Sdcb.SimdCodecs.Abstractions.ImageEncoderRegistration.GetClosestInputFormatHandler +Sdcb.SimdCodecs.Abstractions.ImageEncoderRegistration.ImageEncoderRegistration() -> void +Sdcb.SimdCodecs.Abstractions.ImageFormat +Sdcb.SimdCodecs.Abstractions.ImageFormat.Avif = 11 -> Sdcb.SimdCodecs.Abstractions.ImageFormat +Sdcb.SimdCodecs.Abstractions.ImageFormat.Bmp = 8 -> Sdcb.SimdCodecs.Abstractions.ImageFormat +Sdcb.SimdCodecs.Abstractions.ImageFormat.Cur = 17 -> Sdcb.SimdCodecs.Abstractions.ImageFormat +Sdcb.SimdCodecs.Abstractions.ImageFormat.Gif = 7 -> Sdcb.SimdCodecs.Abstractions.ImageFormat +Sdcb.SimdCodecs.Abstractions.ImageFormat.Heif = 10 -> Sdcb.SimdCodecs.Abstractions.ImageFormat +Sdcb.SimdCodecs.Abstractions.ImageFormat.Ico = 9 -> Sdcb.SimdCodecs.Abstractions.ImageFormat +Sdcb.SimdCodecs.Abstractions.ImageFormat.Jbig2 = 4 -> Sdcb.SimdCodecs.Abstractions.ImageFormat +Sdcb.SimdCodecs.Abstractions.ImageFormat.Jpeg = 2 -> Sdcb.SimdCodecs.Abstractions.ImageFormat +Sdcb.SimdCodecs.Abstractions.ImageFormat.Jpeg2000 = 5 -> Sdcb.SimdCodecs.Abstractions.ImageFormat +Sdcb.SimdCodecs.Abstractions.ImageFormat.JpegXl = 12 -> Sdcb.SimdCodecs.Abstractions.ImageFormat +Sdcb.SimdCodecs.Abstractions.ImageFormat.JpegXr = 13 -> Sdcb.SimdCodecs.Abstractions.ImageFormat +Sdcb.SimdCodecs.Abstractions.ImageFormat.OpenExr = 14 -> Sdcb.SimdCodecs.Abstractions.ImageFormat +Sdcb.SimdCodecs.Abstractions.ImageFormat.Pfm = 19 -> Sdcb.SimdCodecs.Abstractions.ImageFormat +Sdcb.SimdCodecs.Abstractions.ImageFormat.Png = 1 -> Sdcb.SimdCodecs.Abstractions.ImageFormat +Sdcb.SimdCodecs.Abstractions.ImageFormat.Pnm = 18 -> Sdcb.SimdCodecs.Abstractions.ImageFormat +Sdcb.SimdCodecs.Abstractions.ImageFormat.Psd = 15 -> Sdcb.SimdCodecs.Abstractions.ImageFormat +Sdcb.SimdCodecs.Abstractions.ImageFormat.Qoi = 16 -> Sdcb.SimdCodecs.Abstractions.ImageFormat +Sdcb.SimdCodecs.Abstractions.ImageFormat.Tiff = 3 -> Sdcb.SimdCodecs.Abstractions.ImageFormat +Sdcb.SimdCodecs.Abstractions.ImageFormat.Unknown = 0 -> Sdcb.SimdCodecs.Abstractions.ImageFormat +Sdcb.SimdCodecs.Abstractions.ImageFormat.Webp = 6 -> Sdcb.SimdCodecs.Abstractions.ImageFormat +Sdcb.SimdCodecs.Abstractions.ImageFrameInfo +Sdcb.SimdCodecs.Abstractions.ImageFrameInfo.Deconstruct(out Sdcb.SimdCodecs.Abstractions.ImageInfo Info, out System.TimeSpan? Duration) -> void +Sdcb.SimdCodecs.Abstractions.ImageFrameInfo.Duration.get -> System.TimeSpan? +Sdcb.SimdCodecs.Abstractions.ImageFrameInfo.Duration.init -> void +Sdcb.SimdCodecs.Abstractions.ImageFrameInfo.Equals(Sdcb.SimdCodecs.Abstractions.ImageFrameInfo other) -> bool +Sdcb.SimdCodecs.Abstractions.ImageFrameInfo.ImageFrameInfo() -> void +Sdcb.SimdCodecs.Abstractions.ImageFrameInfo.ImageFrameInfo(Sdcb.SimdCodecs.Abstractions.ImageInfo Info, System.TimeSpan? Duration) -> void +Sdcb.SimdCodecs.Abstractions.ImageFrameInfo.Info.get -> Sdcb.SimdCodecs.Abstractions.ImageInfo +Sdcb.SimdCodecs.Abstractions.ImageFrameInfo.Info.init -> void +Sdcb.SimdCodecs.Abstractions.ImageFrameReaderExtensions +Sdcb.SimdCodecs.Abstractions.ImageInfo +Sdcb.SimdCodecs.Abstractions.ImageInfo.BitDepth.get -> int +Sdcb.SimdCodecs.Abstractions.ImageInfo.BitDepth.init -> void +Sdcb.SimdCodecs.Abstractions.ImageInfo.Channels.get -> int +Sdcb.SimdCodecs.Abstractions.ImageInfo.Channels.init -> void +Sdcb.SimdCodecs.Abstractions.ImageInfo.ColorEncoding.get -> Sdcb.SimdCodecs.Abstractions.ColorEncoding! +Sdcb.SimdCodecs.Abstractions.ImageInfo.ColorEncoding.init -> void +Sdcb.SimdCodecs.Abstractions.ImageInfo.Deconstruct(out int Width, out int Height, out int Channels, out Sdcb.SimdCodecs.Abstractions.SampleFormat SampleFormat) -> void +Sdcb.SimdCodecs.Abstractions.ImageInfo.Equals(Sdcb.SimdCodecs.Abstractions.ImageInfo other) -> bool +Sdcb.SimdCodecs.Abstractions.ImageInfo.Format.get -> Sdcb.SimdCodecs.Abstractions.ImageFormat +Sdcb.SimdCodecs.Abstractions.ImageInfo.Format.init -> void +Sdcb.SimdCodecs.Abstractions.ImageInfo.FrameCount.get -> int +Sdcb.SimdCodecs.Abstractions.ImageInfo.FrameCount.init -> void +Sdcb.SimdCodecs.Abstractions.ImageInfo.HasThumbnail.get -> bool +Sdcb.SimdCodecs.Abstractions.ImageInfo.HasThumbnail.init -> void +Sdcb.SimdCodecs.Abstractions.ImageInfo.Height.get -> int +Sdcb.SimdCodecs.Abstractions.ImageInfo.Height.init -> void +Sdcb.SimdCodecs.Abstractions.ImageInfo.ImageInfo() -> void +Sdcb.SimdCodecs.Abstractions.ImageInfo.ImageInfo(int Width, int Height, int Channels, Sdcb.SimdCodecs.Abstractions.SampleFormat SampleFormat) -> void +Sdcb.SimdCodecs.Abstractions.ImageInfo.Orientation.get -> Sdcb.SimdCodecs.Abstractions.ImageOrientation +Sdcb.SimdCodecs.Abstractions.ImageInfo.Orientation.init -> void +Sdcb.SimdCodecs.Abstractions.ImageInfo.Resolution.get -> Sdcb.SimdCodecs.Abstractions.Resolution? +Sdcb.SimdCodecs.Abstractions.ImageInfo.Resolution.init -> void +Sdcb.SimdCodecs.Abstractions.ImageInfo.SampleFormat.get -> Sdcb.SimdCodecs.Abstractions.SampleFormat +Sdcb.SimdCodecs.Abstractions.ImageInfo.SampleFormat.init -> void +Sdcb.SimdCodecs.Abstractions.ImageInfo.SwapsDimensions.get -> bool +Sdcb.SimdCodecs.Abstractions.ImageInfo.Width.get -> int +Sdcb.SimdCodecs.Abstractions.ImageInfo.Width.init -> void +Sdcb.SimdCodecs.Abstractions.ImageMetadata +Sdcb.SimdCodecs.Abstractions.ImageMetadata.$() -> Sdcb.SimdCodecs.Abstractions.ImageMetadata! +Sdcb.SimdCodecs.Abstractions.ImageMetadata.Equals(Sdcb.SimdCodecs.Abstractions.ImageMetadata? other) -> bool +Sdcb.SimdCodecs.Abstractions.ImageMetadata.Exif.get -> System.ReadOnlyMemory +Sdcb.SimdCodecs.Abstractions.ImageMetadata.Exif.init -> void +Sdcb.SimdCodecs.Abstractions.ImageMetadata.Icc.get -> System.ReadOnlyMemory +Sdcb.SimdCodecs.Abstractions.ImageMetadata.Icc.init -> void +Sdcb.SimdCodecs.Abstractions.ImageMetadata.ImageMetadata() -> void +Sdcb.SimdCodecs.Abstractions.ImageMetadata.IsEmpty.get -> bool +Sdcb.SimdCodecs.Abstractions.ImageMetadata.Xmp.get -> System.ReadOnlyMemory +Sdcb.SimdCodecs.Abstractions.ImageMetadata.Xmp.init -> void +Sdcb.SimdCodecs.Abstractions.ImageOrientation +Sdcb.SimdCodecs.Abstractions.ImageOrientation.FlipHorizontal = 2 -> Sdcb.SimdCodecs.Abstractions.ImageOrientation +Sdcb.SimdCodecs.Abstractions.ImageOrientation.FlipVertical = 4 -> Sdcb.SimdCodecs.Abstractions.ImageOrientation +Sdcb.SimdCodecs.Abstractions.ImageOrientation.Normal = 1 -> Sdcb.SimdCodecs.Abstractions.ImageOrientation +Sdcb.SimdCodecs.Abstractions.ImageOrientation.Rotate180 = 3 -> Sdcb.SimdCodecs.Abstractions.ImageOrientation +Sdcb.SimdCodecs.Abstractions.ImageOrientation.Rotate270 = 8 -> Sdcb.SimdCodecs.Abstractions.ImageOrientation +Sdcb.SimdCodecs.Abstractions.ImageOrientation.Rotate90 = 6 -> Sdcb.SimdCodecs.Abstractions.ImageOrientation +Sdcb.SimdCodecs.Abstractions.ImageOrientation.Transpose = 5 -> Sdcb.SimdCodecs.Abstractions.ImageOrientation +Sdcb.SimdCodecs.Abstractions.ImageOrientation.Transverse = 7 -> Sdcb.SimdCodecs.Abstractions.ImageOrientation +Sdcb.SimdCodecs.Abstractions.MatrixCoefficients +Sdcb.SimdCodecs.Abstractions.MatrixCoefficients.BT2020CL = 10 -> Sdcb.SimdCodecs.Abstractions.MatrixCoefficients +Sdcb.SimdCodecs.Abstractions.MatrixCoefficients.BT2020NCL = 9 -> Sdcb.SimdCodecs.Abstractions.MatrixCoefficients +Sdcb.SimdCodecs.Abstractions.MatrixCoefficients.BT470BG = 5 -> Sdcb.SimdCodecs.Abstractions.MatrixCoefficients +Sdcb.SimdCodecs.Abstractions.MatrixCoefficients.BT709 = 1 -> Sdcb.SimdCodecs.Abstractions.MatrixCoefficients +Sdcb.SimdCodecs.Abstractions.MatrixCoefficients.Fcc = 4 -> Sdcb.SimdCodecs.Abstractions.MatrixCoefficients +Sdcb.SimdCodecs.Abstractions.MatrixCoefficients.Ictcp = 14 -> Sdcb.SimdCodecs.Abstractions.MatrixCoefficients +Sdcb.SimdCodecs.Abstractions.MatrixCoefficients.Identity = 0 -> Sdcb.SimdCodecs.Abstractions.MatrixCoefficients +Sdcb.SimdCodecs.Abstractions.MatrixCoefficients.SMPTE170M = 6 -> Sdcb.SimdCodecs.Abstractions.MatrixCoefficients +Sdcb.SimdCodecs.Abstractions.MatrixCoefficients.SMPTE2085 = 11 -> Sdcb.SimdCodecs.Abstractions.MatrixCoefficients +Sdcb.SimdCodecs.Abstractions.MatrixCoefficients.SMPTE240M = 7 -> Sdcb.SimdCodecs.Abstractions.MatrixCoefficients +Sdcb.SimdCodecs.Abstractions.MatrixCoefficients.Unspecified = 2 -> Sdcb.SimdCodecs.Abstractions.MatrixCoefficients +Sdcb.SimdCodecs.Abstractions.MatrixCoefficients.YCgCo = 8 -> Sdcb.SimdCodecs.Abstractions.MatrixCoefficients +Sdcb.SimdCodecs.Abstractions.PixelConverter +Sdcb.SimdCodecs.Abstractions.PixelFormat +Sdcb.SimdCodecs.Abstractions.PixelFormat.Alpha.get -> Sdcb.SimdCodecs.Abstractions.AlphaMode +Sdcb.SimdCodecs.Abstractions.PixelFormat.BytesPerPixel.get -> int +Sdcb.SimdCodecs.Abstractions.PixelFormat.BytesPerSample.get -> int +Sdcb.SimdCodecs.Abstractions.PixelFormat.Channels.get -> int +Sdcb.SimdCodecs.Abstractions.PixelFormat.Equals(Sdcb.SimdCodecs.Abstractions.PixelFormat other) -> bool +Sdcb.SimdCodecs.Abstractions.PixelFormat.HasAlpha.get -> bool +Sdcb.SimdCodecs.Abstractions.PixelFormat.IsBasic8.get -> bool +Sdcb.SimdCodecs.Abstractions.PixelFormat.IsBgr.get -> bool +Sdcb.SimdCodecs.Abstractions.PixelFormat.IsGray.get -> bool +Sdcb.SimdCodecs.Abstractions.PixelFormat.IsPremultiplied.get -> bool +Sdcb.SimdCodecs.Abstractions.PixelFormat.Layout.get -> Sdcb.SimdCodecs.Abstractions.ChannelLayout +Sdcb.SimdCodecs.Abstractions.PixelFormat.PixelFormat() -> void +Sdcb.SimdCodecs.Abstractions.PixelFormat.PixelFormat(Sdcb.SimdCodecs.Abstractions.ChannelLayout layout, Sdcb.SimdCodecs.Abstractions.SampleFormat sample, Sdcb.SimdCodecs.Abstractions.AlphaMode alpha = Sdcb.SimdCodecs.Abstractions.AlphaMode.Straight) -> void +Sdcb.SimdCodecs.Abstractions.PixelFormat.Sample.get -> Sdcb.SimdCodecs.Abstractions.SampleFormat +Sdcb.SimdCodecs.Abstractions.PixelFormat.To16Bit() -> Sdcb.SimdCodecs.Abstractions.PixelFormat +Sdcb.SimdCodecs.Abstractions.PixelFormat.To8Bit() -> Sdcb.SimdCodecs.Abstractions.PixelFormat +Sdcb.SimdCodecs.Abstractions.PixelFormat.ToStraight() -> Sdcb.SimdCodecs.Abstractions.PixelFormat +Sdcb.SimdCodecs.Abstractions.PixelFormat.WithLayout(Sdcb.SimdCodecs.Abstractions.ChannelLayout layout) -> Sdcb.SimdCodecs.Abstractions.PixelFormat +Sdcb.SimdCodecs.Abstractions.PixelFormat.WithSample(Sdcb.SimdCodecs.Abstractions.SampleFormat sample) -> Sdcb.SimdCodecs.Abstractions.PixelFormat +Sdcb.SimdCodecs.Abstractions.PixelRect +Sdcb.SimdCodecs.Abstractions.PixelRect.Deconstruct(out int X, out int Y, out int Width, out int Height) -> void +Sdcb.SimdCodecs.Abstractions.PixelRect.Equals(Sdcb.SimdCodecs.Abstractions.PixelRect other) -> bool +Sdcb.SimdCodecs.Abstractions.PixelRect.FitsIn(int width, int height) -> bool +Sdcb.SimdCodecs.Abstractions.PixelRect.Height.get -> int +Sdcb.SimdCodecs.Abstractions.PixelRect.Height.init -> void +Sdcb.SimdCodecs.Abstractions.PixelRect.PixelRect() -> void +Sdcb.SimdCodecs.Abstractions.PixelRect.PixelRect(int X, int Y, int Width, int Height) -> void +Sdcb.SimdCodecs.Abstractions.PixelRect.Width.get -> int +Sdcb.SimdCodecs.Abstractions.PixelRect.Width.init -> void +Sdcb.SimdCodecs.Abstractions.PixelRect.X.get -> int +Sdcb.SimdCodecs.Abstractions.PixelRect.X.init -> void +Sdcb.SimdCodecs.Abstractions.PixelRect.Y.get -> int +Sdcb.SimdCodecs.Abstractions.PixelRect.Y.init -> void +Sdcb.SimdCodecs.Abstractions.PlanarInfo +Sdcb.SimdCodecs.Abstractions.PlanarInfo.BitDepth.get -> int +Sdcb.SimdCodecs.Abstractions.PlanarInfo.BitDepth.init -> void +Sdcb.SimdCodecs.Abstractions.PlanarInfo.ChromaHeight.get -> int +Sdcb.SimdCodecs.Abstractions.PlanarInfo.ChromaLength.get -> int +Sdcb.SimdCodecs.Abstractions.PlanarInfo.ChromaLocation.get -> Sdcb.SimdCodecs.Abstractions.ChromaLocation +Sdcb.SimdCodecs.Abstractions.PlanarInfo.ChromaLocation.init -> void +Sdcb.SimdCodecs.Abstractions.PlanarInfo.ChromaSubsamplingX.get -> int +Sdcb.SimdCodecs.Abstractions.PlanarInfo.ChromaSubsamplingX.init -> void +Sdcb.SimdCodecs.Abstractions.PlanarInfo.ChromaSubsamplingY.get -> int +Sdcb.SimdCodecs.Abstractions.PlanarInfo.ChromaSubsamplingY.init -> void +Sdcb.SimdCodecs.Abstractions.PlanarInfo.ChromaWidth.get -> int +Sdcb.SimdCodecs.Abstractions.PlanarInfo.Deconstruct(out int Width, out int Height, out int ChromaSubsamplingX, out int ChromaSubsamplingY, out int BitDepth, out Sdcb.SimdCodecs.Abstractions.MatrixCoefficients Matrix, out bool FullRange, out Sdcb.SimdCodecs.Abstractions.ChromaLocation ChromaLocation) -> void +Sdcb.SimdCodecs.Abstractions.PlanarInfo.Equals(Sdcb.SimdCodecs.Abstractions.PlanarInfo other) -> bool +Sdcb.SimdCodecs.Abstractions.PlanarInfo.FullRange.get -> bool +Sdcb.SimdCodecs.Abstractions.PlanarInfo.FullRange.init -> void +Sdcb.SimdCodecs.Abstractions.PlanarInfo.Height.get -> int +Sdcb.SimdCodecs.Abstractions.PlanarInfo.Height.init -> void +Sdcb.SimdCodecs.Abstractions.PlanarInfo.LumaLength.get -> int +Sdcb.SimdCodecs.Abstractions.PlanarInfo.Matrix.get -> Sdcb.SimdCodecs.Abstractions.MatrixCoefficients +Sdcb.SimdCodecs.Abstractions.PlanarInfo.Matrix.init -> void +Sdcb.SimdCodecs.Abstractions.PlanarInfo.PlanarInfo() -> void +Sdcb.SimdCodecs.Abstractions.PlanarInfo.PlanarInfo(int Width, int Height, int ChromaSubsamplingX, int ChromaSubsamplingY, int BitDepth, Sdcb.SimdCodecs.Abstractions.MatrixCoefficients Matrix, bool FullRange, Sdcb.SimdCodecs.Abstractions.ChromaLocation ChromaLocation) -> void +Sdcb.SimdCodecs.Abstractions.PlanarInfo.Width.get -> int +Sdcb.SimdCodecs.Abstractions.PlanarInfo.Width.init -> void +Sdcb.SimdCodecs.Abstractions.RasterImage +Sdcb.SimdCodecs.Abstractions.RasterImage.BitDepth.get -> int +Sdcb.SimdCodecs.Abstractions.RasterImage.Channels.get -> int +Sdcb.SimdCodecs.Abstractions.RasterImage.ColorEncoding.get -> Sdcb.SimdCodecs.Abstractions.ColorEncoding! +Sdcb.SimdCodecs.Abstractions.RasterImage.Dispose() -> void +Sdcb.SimdCodecs.Abstractions.RasterImage.ExpandToFloats(System.Span destination) -> void +Sdcb.SimdCodecs.Abstractions.RasterImage.Height.get -> int +Sdcb.SimdCodecs.Abstractions.RasterImage.Metadata.get -> Sdcb.SimdCodecs.Abstractions.ImageMetadata! +Sdcb.SimdCodecs.Abstractions.RasterImage.Pixels.get -> System.ReadOnlySpan +Sdcb.SimdCodecs.Abstractions.RasterImage.SampleFormat.get -> Sdcb.SimdCodecs.Abstractions.SampleFormat +Sdcb.SimdCodecs.Abstractions.RasterImage.ToFloats() -> float[]! +Sdcb.SimdCodecs.Abstractions.RasterImage.ToRgba16() -> ushort[]! +Sdcb.SimdCodecs.Abstractions.RasterImage.ToRgba8() -> byte[]! +Sdcb.SimdCodecs.Abstractions.RasterImage.TryCopyTo(System.Span destination, int stride, Sdcb.SimdCodecs.Abstractions.PixelFormat format) -> bool +Sdcb.SimdCodecs.Abstractions.RasterImage.Width.get -> int +Sdcb.SimdCodecs.Abstractions.RasterImage.WritablePixels.get -> System.Span +Sdcb.SimdCodecs.Abstractions.Resolution +Sdcb.SimdCodecs.Abstractions.Resolution.Deconstruct(out double X, out double Y, out Sdcb.SimdCodecs.Abstractions.ResolutionUnit Unit) -> void +Sdcb.SimdCodecs.Abstractions.Resolution.DpiX.get -> double? +Sdcb.SimdCodecs.Abstractions.Resolution.DpiY.get -> double? +Sdcb.SimdCodecs.Abstractions.Resolution.Equals(Sdcb.SimdCodecs.Abstractions.Resolution other) -> bool +Sdcb.SimdCodecs.Abstractions.Resolution.Resolution() -> void +Sdcb.SimdCodecs.Abstractions.Resolution.Resolution(double X, double Y, Sdcb.SimdCodecs.Abstractions.ResolutionUnit Unit) -> void +Sdcb.SimdCodecs.Abstractions.Resolution.Unit.get -> Sdcb.SimdCodecs.Abstractions.ResolutionUnit +Sdcb.SimdCodecs.Abstractions.Resolution.Unit.init -> void +Sdcb.SimdCodecs.Abstractions.Resolution.X.get -> double +Sdcb.SimdCodecs.Abstractions.Resolution.X.init -> void +Sdcb.SimdCodecs.Abstractions.Resolution.Y.get -> double +Sdcb.SimdCodecs.Abstractions.Resolution.Y.init -> void +Sdcb.SimdCodecs.Abstractions.ResolutionUnit +Sdcb.SimdCodecs.Abstractions.ResolutionUnit.AspectRatio = 0 -> Sdcb.SimdCodecs.Abstractions.ResolutionUnit +Sdcb.SimdCodecs.Abstractions.ResolutionUnit.PerCentimeter = 2 -> Sdcb.SimdCodecs.Abstractions.ResolutionUnit +Sdcb.SimdCodecs.Abstractions.ResolutionUnit.PerInch = 1 -> Sdcb.SimdCodecs.Abstractions.ResolutionUnit +Sdcb.SimdCodecs.Abstractions.ResolutionUnit.PerMeter = 3 -> Sdcb.SimdCodecs.Abstractions.ResolutionUnit +Sdcb.SimdCodecs.Abstractions.SampleFormat +Sdcb.SimdCodecs.Abstractions.SampleFormat.Float32 = 2 -> Sdcb.SimdCodecs.Abstractions.SampleFormat +Sdcb.SimdCodecs.Abstractions.SampleFormat.UInt16 = 1 -> Sdcb.SimdCodecs.Abstractions.SampleFormat +Sdcb.SimdCodecs.Abstractions.SampleFormat.UInt8 = 0 -> Sdcb.SimdCodecs.Abstractions.SampleFormat +Sdcb.SimdCodecs.Abstractions.TransferFunction +Sdcb.SimdCodecs.Abstractions.TransferFunction.BT1361 = 12 -> Sdcb.SimdCodecs.Abstractions.TransferFunction +Sdcb.SimdCodecs.Abstractions.TransferFunction.BT2020_10 = 14 -> Sdcb.SimdCodecs.Abstractions.TransferFunction +Sdcb.SimdCodecs.Abstractions.TransferFunction.BT2020_12 = 15 -> Sdcb.SimdCodecs.Abstractions.TransferFunction +Sdcb.SimdCodecs.Abstractions.TransferFunction.BT470BG = 5 -> Sdcb.SimdCodecs.Abstractions.TransferFunction +Sdcb.SimdCodecs.Abstractions.TransferFunction.BT470M = 4 -> Sdcb.SimdCodecs.Abstractions.TransferFunction +Sdcb.SimdCodecs.Abstractions.TransferFunction.BT709 = 1 -> Sdcb.SimdCodecs.Abstractions.TransferFunction +Sdcb.SimdCodecs.Abstractions.TransferFunction.Hlg = 18 -> Sdcb.SimdCodecs.Abstractions.TransferFunction +Sdcb.SimdCodecs.Abstractions.TransferFunction.Iec6196624 = 11 -> Sdcb.SimdCodecs.Abstractions.TransferFunction +Sdcb.SimdCodecs.Abstractions.TransferFunction.Linear = 8 -> Sdcb.SimdCodecs.Abstractions.TransferFunction +Sdcb.SimdCodecs.Abstractions.TransferFunction.Log100 = 9 -> Sdcb.SimdCodecs.Abstractions.TransferFunction +Sdcb.SimdCodecs.Abstractions.TransferFunction.Log316 = 10 -> Sdcb.SimdCodecs.Abstractions.TransferFunction +Sdcb.SimdCodecs.Abstractions.TransferFunction.Pq = 16 -> Sdcb.SimdCodecs.Abstractions.TransferFunction +Sdcb.SimdCodecs.Abstractions.TransferFunction.SMPTE170M = 6 -> Sdcb.SimdCodecs.Abstractions.TransferFunction +Sdcb.SimdCodecs.Abstractions.TransferFunction.SMPTE240M = 7 -> Sdcb.SimdCodecs.Abstractions.TransferFunction +Sdcb.SimdCodecs.Abstractions.TransferFunction.SMPTE428 = 17 -> Sdcb.SimdCodecs.Abstractions.TransferFunction +Sdcb.SimdCodecs.Abstractions.TransferFunction.Srgb = 13 -> Sdcb.SimdCodecs.Abstractions.TransferFunction +Sdcb.SimdCodecs.Abstractions.TransferFunction.Unspecified = 2 -> Sdcb.SimdCodecs.Abstractions.TransferFunction +abstract Sdcb.SimdCodecs.Abstractions.CodecSupport.BufferedEncoderSession.Encode(System.Collections.Generic.IReadOnlyList! frames, System.Threading.CancellationToken cancellationToken) -> void +abstract Sdcb.SimdCodecs.Abstractions.CodecSupport.BufferedEncoderSession.MaxFrames.get -> int +abstract Sdcb.SimdCodecs.Abstractions.EncodeOptions.$() -> Sdcb.SimdCodecs.Abstractions.EncodeOptions! +override Sdcb.SimdCodecs.Abstractions.ColorEncoding.Equals(object? obj) -> bool +override Sdcb.SimdCodecs.Abstractions.ColorEncoding.GetHashCode() -> int +override Sdcb.SimdCodecs.Abstractions.ColorEncoding.ToString() -> string! +override Sdcb.SimdCodecs.Abstractions.DecodeOptions.Equals(object? obj) -> bool +override Sdcb.SimdCodecs.Abstractions.DecodeOptions.GetHashCode() -> int +override Sdcb.SimdCodecs.Abstractions.DecodeOptions.ToString() -> string! +override Sdcb.SimdCodecs.Abstractions.EncodeOptions.Equals(object? obj) -> bool +override Sdcb.SimdCodecs.Abstractions.EncodeOptions.GetHashCode() -> int +override Sdcb.SimdCodecs.Abstractions.EncodeOptions.ToString() -> string! +override Sdcb.SimdCodecs.Abstractions.FrameTiming.GetHashCode() -> int +override Sdcb.SimdCodecs.Abstractions.ImageFrameInfo.GetHashCode() -> int +override Sdcb.SimdCodecs.Abstractions.ImageInfo.GetHashCode() -> int +override Sdcb.SimdCodecs.Abstractions.ImageMetadata.Equals(object? obj) -> bool +override Sdcb.SimdCodecs.Abstractions.ImageMetadata.GetHashCode() -> int +override Sdcb.SimdCodecs.Abstractions.ImageMetadata.ToString() -> string! +override Sdcb.SimdCodecs.Abstractions.PixelFormat.GetHashCode() -> int +override Sdcb.SimdCodecs.Abstractions.PixelFormat.ToString() -> string! +override Sdcb.SimdCodecs.Abstractions.PixelRect.GetHashCode() -> int +override Sdcb.SimdCodecs.Abstractions.PlanarInfo.GetHashCode() -> int +override Sdcb.SimdCodecs.Abstractions.Resolution.GetHashCode() -> int +static Sdcb.SimdCodecs.Abstractions.ByteSource.FromFile(string! path) -> Sdcb.SimdCodecs.Abstractions.IByteSource! +static Sdcb.SimdCodecs.Abstractions.ByteSource.FromMemory(System.ReadOnlyMemory data) -> Sdcb.SimdCodecs.Abstractions.IByteSource! +static Sdcb.SimdCodecs.Abstractions.ByteSource.FromStream(System.IO.Stream! stream, bool leaveOpen = false) -> Sdcb.SimdCodecs.Abstractions.IByteSource! +static Sdcb.SimdCodecs.Abstractions.CodecSupport.DecodeOptionsChecks.Apply(Sdcb.SimdCodecs.Abstractions.IDecodedImage! image, Sdcb.SimdCodecs.Abstractions.DecodeOptions? options) -> Sdcb.SimdCodecs.Abstractions.IDecodedImage! +static Sdcb.SimdCodecs.Abstractions.CodecSupport.DecodeOptionsChecks.Validate(this Sdcb.SimdCodecs.Abstractions.DecodeOptions! options, int width, int height, bool supportsScale) -> void +static Sdcb.SimdCodecs.Abstractions.CodecSupport.DecodeOptionsChecks.extension(Sdcb.SimdCodecs.Abstractions.DecodeOptions!).Apply(Sdcb.SimdCodecs.Abstractions.IDecodedImage! image, Sdcb.SimdCodecs.Abstractions.DecodeOptions? options) -> Sdcb.SimdCodecs.Abstractions.IDecodedImage! +static Sdcb.SimdCodecs.Abstractions.CodecSupport.EncoderFormats.Closest8Bit(Sdcb.SimdCodecs.Abstractions.PixelFormat requested) -> Sdcb.SimdCodecs.Abstractions.PixelFormat +static Sdcb.SimdCodecs.Abstractions.CodecSupport.EncoderFormats.Same(Sdcb.SimdCodecs.Abstractions.PixelFormat requested) -> Sdcb.SimdCodecs.Abstractions.PixelFormat +static Sdcb.SimdCodecs.Abstractions.CodecSupport.ImageDecoderFallback.NoThumbnail(out Sdcb.SimdCodecs.Abstractions.IDecodedImage? thumbnail) -> bool +static Sdcb.SimdCodecs.Abstractions.CodecSupport.ImageDecoderFallback.TryDecodeFrameInto(Sdcb.SimdCodecs.Abstractions.IImageFrameReader! reader, int index, System.Span destination, int stride, Sdcb.SimdCodecs.Abstractions.PixelFormat format, Sdcb.SimdCodecs.Abstractions.DecodeOptions? options, System.Threading.CancellationToken cancellationToken) -> bool +static Sdcb.SimdCodecs.Abstractions.CodecSupport.ImageDecoderFallback.TryDecodeInto(Sdcb.SimdCodecs.Abstractions.ImageDecoderRegistration.TryDecodeHandler! decode, System.ReadOnlySpan data, System.Span destination, int stride, Sdcb.SimdCodecs.Abstractions.PixelFormat format, Sdcb.SimdCodecs.Abstractions.DecodeOptions? options, System.Threading.CancellationToken cancellationToken) -> bool +static Sdcb.SimdCodecs.Abstractions.CodecSupport.ImageDecoderFallback.TryGetStoredSize(Sdcb.SimdCodecs.Abstractions.ImageDecoderRegistration.TryReadInfoHandler! readInfo, System.ReadOnlySpan data, out int width, out int height, out int scaleDenominator) -> bool +static Sdcb.SimdCodecs.Abstractions.CodecSupport.ImageDecoderFallback.TryReadNoMetadata(Sdcb.SimdCodecs.Abstractions.ImageDecoderRegistration.TryReadInfoHandler! readInfo, System.ReadOnlySpan data, out Sdcb.SimdCodecs.Abstractions.ImageMetadata? metadata) -> bool +static Sdcb.SimdCodecs.Abstractions.ColorEncoding.AssumedSrgb.get -> Sdcb.SimdCodecs.Abstractions.ColorEncoding! +static Sdcb.SimdCodecs.Abstractions.ColorEncoding.operator !=(Sdcb.SimdCodecs.Abstractions.ColorEncoding? left, Sdcb.SimdCodecs.Abstractions.ColorEncoding? right) -> bool +static Sdcb.SimdCodecs.Abstractions.ColorEncoding.operator ==(Sdcb.SimdCodecs.Abstractions.ColorEncoding? left, Sdcb.SimdCodecs.Abstractions.ColorEncoding? right) -> bool +static Sdcb.SimdCodecs.Abstractions.DecodeOptions.Default.get -> Sdcb.SimdCodecs.Abstractions.DecodeOptions! +static Sdcb.SimdCodecs.Abstractions.DecodeOptions.operator !=(Sdcb.SimdCodecs.Abstractions.DecodeOptions? left, Sdcb.SimdCodecs.Abstractions.DecodeOptions? right) -> bool +static Sdcb.SimdCodecs.Abstractions.DecodeOptions.operator ==(Sdcb.SimdCodecs.Abstractions.DecodeOptions? left, Sdcb.SimdCodecs.Abstractions.DecodeOptions? right) -> bool +static Sdcb.SimdCodecs.Abstractions.EncodeOptions.operator !=(Sdcb.SimdCodecs.Abstractions.EncodeOptions? left, Sdcb.SimdCodecs.Abstractions.EncodeOptions? right) -> bool +static Sdcb.SimdCodecs.Abstractions.EncodeOptions.operator ==(Sdcb.SimdCodecs.Abstractions.EncodeOptions? left, Sdcb.SimdCodecs.Abstractions.EncodeOptions? right) -> bool +static Sdcb.SimdCodecs.Abstractions.FrameTiming.operator !=(Sdcb.SimdCodecs.Abstractions.FrameTiming left, Sdcb.SimdCodecs.Abstractions.FrameTiming right) -> bool +static Sdcb.SimdCodecs.Abstractions.FrameTiming.operator ==(Sdcb.SimdCodecs.Abstractions.FrameTiming left, Sdcb.SimdCodecs.Abstractions.FrameTiming right) -> bool +static Sdcb.SimdCodecs.Abstractions.ImageFrameInfo.operator !=(Sdcb.SimdCodecs.Abstractions.ImageFrameInfo left, Sdcb.SimdCodecs.Abstractions.ImageFrameInfo right) -> bool +static Sdcb.SimdCodecs.Abstractions.ImageFrameInfo.operator ==(Sdcb.SimdCodecs.Abstractions.ImageFrameInfo left, Sdcb.SimdCodecs.Abstractions.ImageFrameInfo right) -> bool +static Sdcb.SimdCodecs.Abstractions.ImageFrameReaderExtensions.EnumerateFramesInto(this Sdcb.SimdCodecs.Abstractions.IImageFrameReader! reader, System.Memory destination, int stride, Sdcb.SimdCodecs.Abstractions.PixelFormat format) -> System.Collections.Generic.IEnumerable! +static Sdcb.SimdCodecs.Abstractions.ImageInfo.operator !=(Sdcb.SimdCodecs.Abstractions.ImageInfo left, Sdcb.SimdCodecs.Abstractions.ImageInfo right) -> bool +static Sdcb.SimdCodecs.Abstractions.ImageInfo.operator ==(Sdcb.SimdCodecs.Abstractions.ImageInfo left, Sdcb.SimdCodecs.Abstractions.ImageInfo right) -> bool +static Sdcb.SimdCodecs.Abstractions.ImageMetadata.Empty.get -> Sdcb.SimdCodecs.Abstractions.ImageMetadata! +static Sdcb.SimdCodecs.Abstractions.ImageMetadata.operator !=(Sdcb.SimdCodecs.Abstractions.ImageMetadata? left, Sdcb.SimdCodecs.Abstractions.ImageMetadata? right) -> bool +static Sdcb.SimdCodecs.Abstractions.ImageMetadata.operator ==(Sdcb.SimdCodecs.Abstractions.ImageMetadata? left, Sdcb.SimdCodecs.Abstractions.ImageMetadata? right) -> bool +static Sdcb.SimdCodecs.Abstractions.PixelConverter.Convert(System.ReadOnlySpan source, int sourceStride, Sdcb.SimdCodecs.Abstractions.PixelFormat sourceFormat, System.Span destination, int destinationStride, Sdcb.SimdCodecs.Abstractions.PixelFormat destinationFormat, int width, int height) -> void +static Sdcb.SimdCodecs.Abstractions.PixelConverter.ConvertRow(System.ReadOnlySpan source, Sdcb.SimdCodecs.Abstractions.PixelFormat sourceFormat, System.Span destination, Sdcb.SimdCodecs.Abstractions.PixelFormat destinationFormat, int width) -> void +static Sdcb.SimdCodecs.Abstractions.PixelConverter.ConvertRow(System.ReadOnlySpan source, int channels, Sdcb.SimdCodecs.Abstractions.SampleFormat sampleFormat, System.Span destination, Sdcb.SimdCodecs.Abstractions.PixelFormat format, int width) -> void +static Sdcb.SimdCodecs.Abstractions.PixelConverter.StretchToRgba8(Sdcb.SimdCodecs.Abstractions.IDecodedImage! image, bool srgbEncode = false) -> byte[]! +static Sdcb.SimdCodecs.Abstractions.PixelConverter.StretchToRgba8(Sdcb.SimdCodecs.Abstractions.IDecodedImage! image, float min, float max, bool srgbEncode = false) -> byte[]! +static Sdcb.SimdCodecs.Abstractions.PixelConverter.StretchToRgba8(System.ReadOnlySpan rgba, System.Span destination, float min, float max, bool srgbEncode = false) -> void +static Sdcb.SimdCodecs.Abstractions.PixelConverter.ToPacked(System.ReadOnlySpan source, int sourceStride, Sdcb.SimdCodecs.Abstractions.PixelFormat sourceFormat, Sdcb.SimdCodecs.Abstractions.PixelFormat destinationFormat, int width, int height) -> byte[]! +static Sdcb.SimdCodecs.Abstractions.PixelConverter.TryConvert(Sdcb.SimdCodecs.Abstractions.IDecodedImage! image, System.Span destination, int stride, Sdcb.SimdCodecs.Abstractions.PixelFormat format) -> bool +static Sdcb.SimdCodecs.Abstractions.PixelConverter.TryGetColorRange(System.ReadOnlySpan rgba, out float min, out float max) -> bool +static Sdcb.SimdCodecs.Abstractions.PixelConverter.TryGetLayout(int width, int height, Sdcb.SimdCodecs.Abstractions.PixelFormat format, int stride, int destinationLength, out int rowStride) -> bool +static Sdcb.SimdCodecs.Abstractions.PixelFormat.All.get -> System.ReadOnlySpan +static Sdcb.SimdCodecs.Abstractions.PixelFormat.Bgr24.get -> Sdcb.SimdCodecs.Abstractions.PixelFormat +static Sdcb.SimdCodecs.Abstractions.PixelFormat.Bgr48.get -> Sdcb.SimdCodecs.Abstractions.PixelFormat +static Sdcb.SimdCodecs.Abstractions.PixelFormat.Bgra32.get -> Sdcb.SimdCodecs.Abstractions.PixelFormat +static Sdcb.SimdCodecs.Abstractions.PixelFormat.Bgra32Premultiplied.get -> Sdcb.SimdCodecs.Abstractions.PixelFormat +static Sdcb.SimdCodecs.Abstractions.PixelFormat.Bgra64.get -> Sdcb.SimdCodecs.Abstractions.PixelFormat +static Sdcb.SimdCodecs.Abstractions.PixelFormat.Bgra64Premultiplied.get -> Sdcb.SimdCodecs.Abstractions.PixelFormat +static Sdcb.SimdCodecs.Abstractions.PixelFormat.ForChannels(int channels, Sdcb.SimdCodecs.Abstractions.SampleFormat sample) -> Sdcb.SimdCodecs.Abstractions.PixelFormat +static Sdcb.SimdCodecs.Abstractions.PixelFormat.Gray16.get -> Sdcb.SimdCodecs.Abstractions.PixelFormat +static Sdcb.SimdCodecs.Abstractions.PixelFormat.Gray8.get -> Sdcb.SimdCodecs.Abstractions.PixelFormat +static Sdcb.SimdCodecs.Abstractions.PixelFormat.GrayAlpha16.get -> Sdcb.SimdCodecs.Abstractions.PixelFormat +static Sdcb.SimdCodecs.Abstractions.PixelFormat.GrayAlpha32.get -> Sdcb.SimdCodecs.Abstractions.PixelFormat +static Sdcb.SimdCodecs.Abstractions.PixelFormat.Rgb24.get -> Sdcb.SimdCodecs.Abstractions.PixelFormat +static Sdcb.SimdCodecs.Abstractions.PixelFormat.Rgb48.get -> Sdcb.SimdCodecs.Abstractions.PixelFormat +static Sdcb.SimdCodecs.Abstractions.PixelFormat.Rgba32.get -> Sdcb.SimdCodecs.Abstractions.PixelFormat +static Sdcb.SimdCodecs.Abstractions.PixelFormat.Rgba32Premultiplied.get -> Sdcb.SimdCodecs.Abstractions.PixelFormat +static Sdcb.SimdCodecs.Abstractions.PixelFormat.Rgba64.get -> Sdcb.SimdCodecs.Abstractions.PixelFormat +static Sdcb.SimdCodecs.Abstractions.PixelFormat.Rgba64Premultiplied.get -> Sdcb.SimdCodecs.Abstractions.PixelFormat +static Sdcb.SimdCodecs.Abstractions.PixelFormat.operator !=(Sdcb.SimdCodecs.Abstractions.PixelFormat left, Sdcb.SimdCodecs.Abstractions.PixelFormat right) -> bool +static Sdcb.SimdCodecs.Abstractions.PixelFormat.operator ==(Sdcb.SimdCodecs.Abstractions.PixelFormat left, Sdcb.SimdCodecs.Abstractions.PixelFormat right) -> bool +static Sdcb.SimdCodecs.Abstractions.PixelRect.operator !=(Sdcb.SimdCodecs.Abstractions.PixelRect left, Sdcb.SimdCodecs.Abstractions.PixelRect right) -> bool +static Sdcb.SimdCodecs.Abstractions.PixelRect.operator ==(Sdcb.SimdCodecs.Abstractions.PixelRect left, Sdcb.SimdCodecs.Abstractions.PixelRect right) -> bool +static Sdcb.SimdCodecs.Abstractions.PlanarInfo.operator !=(Sdcb.SimdCodecs.Abstractions.PlanarInfo left, Sdcb.SimdCodecs.Abstractions.PlanarInfo right) -> bool +static Sdcb.SimdCodecs.Abstractions.PlanarInfo.operator ==(Sdcb.SimdCodecs.Abstractions.PlanarInfo left, Sdcb.SimdCodecs.Abstractions.PlanarInfo right) -> bool +static Sdcb.SimdCodecs.Abstractions.RasterImage.Allocate(int width, int height, int channels, Sdcb.SimdCodecs.Abstractions.SampleFormat sampleFormat, Sdcb.SimdCodecs.Abstractions.ColorEncoding? colorEncoding = null, int bitDepth = 0, Sdcb.SimdCodecs.Abstractions.ImageMetadata? metadata = null) -> Sdcb.SimdCodecs.Abstractions.RasterImage! +static Sdcb.SimdCodecs.Abstractions.RasterImage.BytesPerSample(Sdcb.SimdCodecs.Abstractions.SampleFormat format) -> int +static Sdcb.SimdCodecs.Abstractions.RasterImage.Create(int width, int height, int channels, Sdcb.SimdCodecs.Abstractions.SampleFormat sampleFormat, System.Buffers.ArrayPool? pool, Sdcb.SimdCodecs.Abstractions.ColorEncoding? colorEncoding = null, int bitDepth = 0, Sdcb.SimdCodecs.Abstractions.ImageMetadata? metadata = null) -> Sdcb.SimdCodecs.Abstractions.RasterImage! +static Sdcb.SimdCodecs.Abstractions.RasterImage.Crop(Sdcb.SimdCodecs.Abstractions.IDecodedImage! source, Sdcb.SimdCodecs.Abstractions.PixelRect region, System.Buffers.ArrayPool? pool = null) -> Sdcb.SimdCodecs.Abstractions.RasterImage! +static Sdcb.SimdCodecs.Abstractions.RasterImage.Rent(int width, int height, int channels, Sdcb.SimdCodecs.Abstractions.SampleFormat sampleFormat, System.Buffers.ArrayPool? pool = null, Sdcb.SimdCodecs.Abstractions.ColorEncoding? colorEncoding = null, int bitDepth = 0, Sdcb.SimdCodecs.Abstractions.ImageMetadata? metadata = null) -> Sdcb.SimdCodecs.Abstractions.RasterImage! +static Sdcb.SimdCodecs.Abstractions.RasterImage.Wrap(int width, int height, int channels, Sdcb.SimdCodecs.Abstractions.SampleFormat sampleFormat, System.Buffers.IMemoryOwner! owner, Sdcb.SimdCodecs.Abstractions.ColorEncoding? colorEncoding = null, int bitDepth = 0, Sdcb.SimdCodecs.Abstractions.ImageMetadata? metadata = null) -> Sdcb.SimdCodecs.Abstractions.RasterImage! +static Sdcb.SimdCodecs.Abstractions.RasterImage.Wrap(int width, int height, int channels, Sdcb.SimdCodecs.Abstractions.SampleFormat sampleFormat, byte[]! pixels, Sdcb.SimdCodecs.Abstractions.ColorEncoding? colorEncoding = null, int bitDepth = 0, Sdcb.SimdCodecs.Abstractions.ImageMetadata? metadata = null) -> Sdcb.SimdCodecs.Abstractions.RasterImage! +static Sdcb.SimdCodecs.Abstractions.Resolution.FromDpi(double x, double y) -> Sdcb.SimdCodecs.Abstractions.Resolution +static Sdcb.SimdCodecs.Abstractions.Resolution.operator !=(Sdcb.SimdCodecs.Abstractions.Resolution left, Sdcb.SimdCodecs.Abstractions.Resolution right) -> bool +static Sdcb.SimdCodecs.Abstractions.Resolution.operator ==(Sdcb.SimdCodecs.Abstractions.Resolution left, Sdcb.SimdCodecs.Abstractions.Resolution right) -> bool +virtual Sdcb.SimdCodecs.Abstractions.CodecSupport.BufferedEncoderSession.MaxDimension.get -> int +virtual Sdcb.SimdCodecs.Abstractions.EncodeOptions.EqualityContract.get -> System.Type! +virtual Sdcb.SimdCodecs.Abstractions.EncodeOptions.Equals(Sdcb.SimdCodecs.Abstractions.EncodeOptions? other) -> bool +virtual Sdcb.SimdCodecs.Abstractions.EncodeOptions.PrintMembers(System.Text.StringBuilder! builder) -> bool +virtual Sdcb.SimdCodecs.Abstractions.ImageDecoderRegistration.CanDecodeHandler.Invoke(System.ReadOnlySpan header) -> bool +virtual Sdcb.SimdCodecs.Abstractions.ImageDecoderRegistration.TryDecodeHandler.Invoke(System.ReadOnlySpan data, out Sdcb.SimdCodecs.Abstractions.IDecodedImage? image, Sdcb.SimdCodecs.Abstractions.DecodeOptions? options, System.Threading.CancellationToken cancellationToken) -> bool +virtual Sdcb.SimdCodecs.Abstractions.ImageDecoderRegistration.TryDecodeIntoHandler.Invoke(System.ReadOnlySpan data, System.Span destination, int stride, Sdcb.SimdCodecs.Abstractions.PixelFormat format, Sdcb.SimdCodecs.Abstractions.DecodeOptions? options, System.Threading.CancellationToken cancellationToken) -> bool +virtual Sdcb.SimdCodecs.Abstractions.ImageDecoderRegistration.TryDecodePlanesHandler.Invoke(System.ReadOnlySpan data, System.Span y, System.Span cb, System.Span cr, System.Threading.CancellationToken cancellationToken) -> bool +virtual Sdcb.SimdCodecs.Abstractions.ImageDecoderRegistration.TryDecodeThumbnailHandler.Invoke(System.ReadOnlySpan data, out Sdcb.SimdCodecs.Abstractions.IDecodedImage? thumbnail) -> bool +virtual Sdcb.SimdCodecs.Abstractions.ImageDecoderRegistration.TryGetClosestSizeHandler.Invoke(System.ReadOnlySpan data, int requestedWidth, int requestedHeight, out int width, out int height, out int scaleDenominator) -> bool +virtual Sdcb.SimdCodecs.Abstractions.ImageDecoderRegistration.TryOpenFramesHandler.Invoke(System.ReadOnlyMemory data, out Sdcb.SimdCodecs.Abstractions.IImageFrameReader? reader) -> bool +virtual Sdcb.SimdCodecs.Abstractions.ImageDecoderRegistration.TryReadInfoHandler.Invoke(System.ReadOnlySpan data, out Sdcb.SimdCodecs.Abstractions.ImageInfo info) -> bool +virtual Sdcb.SimdCodecs.Abstractions.ImageDecoderRegistration.TryReadMetadataHandler.Invoke(System.ReadOnlySpan data, out Sdcb.SimdCodecs.Abstractions.ImageMetadata? metadata) -> bool +virtual Sdcb.SimdCodecs.Abstractions.ImageDecoderRegistration.TryReadPlanarInfoHandler.Invoke(System.ReadOnlySpan data, out Sdcb.SimdCodecs.Abstractions.PlanarInfo info) -> bool +virtual Sdcb.SimdCodecs.Abstractions.ImageEncoderRegistration.CreateHandler.Invoke(System.Buffers.IBufferWriter! output, Sdcb.SimdCodecs.Abstractions.EncodeOptions? options) -> Sdcb.SimdCodecs.Abstractions.IImageEncoderSession! +virtual Sdcb.SimdCodecs.Abstractions.ImageEncoderRegistration.GetClosestInputFormatHandler.Invoke(Sdcb.SimdCodecs.Abstractions.PixelFormat requested) -> Sdcb.SimdCodecs.Abstractions.PixelFormat +~override Sdcb.SimdCodecs.Abstractions.FrameTiming.Equals(object obj) -> bool +~override Sdcb.SimdCodecs.Abstractions.FrameTiming.ToString() -> string +~override Sdcb.SimdCodecs.Abstractions.ImageFrameInfo.Equals(object obj) -> bool +~override Sdcb.SimdCodecs.Abstractions.ImageFrameInfo.ToString() -> string +~override Sdcb.SimdCodecs.Abstractions.ImageInfo.Equals(object obj) -> bool +~override Sdcb.SimdCodecs.Abstractions.ImageInfo.ToString() -> string +~override Sdcb.SimdCodecs.Abstractions.PixelFormat.Equals(object obj) -> bool +~override Sdcb.SimdCodecs.Abstractions.PixelRect.Equals(object obj) -> bool +~override Sdcb.SimdCodecs.Abstractions.PixelRect.ToString() -> string +~override Sdcb.SimdCodecs.Abstractions.PlanarInfo.Equals(object obj) -> bool +~override Sdcb.SimdCodecs.Abstractions.PlanarInfo.ToString() -> string +~override Sdcb.SimdCodecs.Abstractions.Resolution.Equals(object obj) -> bool +~override Sdcb.SimdCodecs.Abstractions.Resolution.ToString() -> string diff --git a/src/Sdcb.SimdCodecs.Abstractions/PublicAPI.Unshipped.txt b/src/Sdcb.SimdCodecs.Abstractions/PublicAPI.Unshipped.txt new file mode 100644 index 0000000..7dc5c58 --- /dev/null +++ b/src/Sdcb.SimdCodecs.Abstractions/PublicAPI.Unshipped.txt @@ -0,0 +1 @@ +#nullable enable diff --git a/src/Sdcb.SimdCodecs.Bmp/PublicAPI.Shipped.txt b/src/Sdcb.SimdCodecs.Bmp/PublicAPI.Shipped.txt new file mode 100644 index 0000000..d5779a3 --- /dev/null +++ b/src/Sdcb.SimdCodecs.Bmp/PublicAPI.Shipped.txt @@ -0,0 +1,125 @@ +#nullable enable +Sdcb.SimdCodecs.Bmp.BmpCompression +Sdcb.SimdCodecs.Bmp.BmpCompression.AlphaBitfields = 6 -> Sdcb.SimdCodecs.Bmp.BmpCompression +Sdcb.SimdCodecs.Bmp.BmpCompression.Bitfields = 3 -> Sdcb.SimdCodecs.Bmp.BmpCompression +Sdcb.SimdCodecs.Bmp.BmpCompression.Huffman1D = 100 -> Sdcb.SimdCodecs.Bmp.BmpCompression +Sdcb.SimdCodecs.Bmp.BmpCompression.Jpeg = 4 -> Sdcb.SimdCodecs.Bmp.BmpCompression +Sdcb.SimdCodecs.Bmp.BmpCompression.Png = 5 -> Sdcb.SimdCodecs.Bmp.BmpCompression +Sdcb.SimdCodecs.Bmp.BmpCompression.Rgb = 0 -> Sdcb.SimdCodecs.Bmp.BmpCompression +Sdcb.SimdCodecs.Bmp.BmpCompression.Rle24 = 101 -> Sdcb.SimdCodecs.Bmp.BmpCompression +Sdcb.SimdCodecs.Bmp.BmpCompression.Rle4 = 2 -> Sdcb.SimdCodecs.Bmp.BmpCompression +Sdcb.SimdCodecs.Bmp.BmpCompression.Rle8 = 1 -> Sdcb.SimdCodecs.Bmp.BmpCompression +Sdcb.SimdCodecs.Bmp.BmpDecoder +Sdcb.SimdCodecs.Bmp.BmpEncodeFormat +Sdcb.SimdCodecs.Bmp.BmpEncodeFormat.Argb32 = 8 -> Sdcb.SimdCodecs.Bmp.BmpEncodeFormat +Sdcb.SimdCodecs.Bmp.BmpEncodeFormat.Auto = 0 -> Sdcb.SimdCodecs.Bmp.BmpEncodeFormat +Sdcb.SimdCodecs.Bmp.BmpEncodeFormat.Indexed1 = 1 -> Sdcb.SimdCodecs.Bmp.BmpEncodeFormat +Sdcb.SimdCodecs.Bmp.BmpEncodeFormat.Indexed4 = 2 -> Sdcb.SimdCodecs.Bmp.BmpEncodeFormat +Sdcb.SimdCodecs.Bmp.BmpEncodeFormat.Indexed8 = 3 -> Sdcb.SimdCodecs.Bmp.BmpEncodeFormat +Sdcb.SimdCodecs.Bmp.BmpEncodeFormat.Rgb24 = 6 -> Sdcb.SimdCodecs.Bmp.BmpEncodeFormat +Sdcb.SimdCodecs.Bmp.BmpEncodeFormat.Rgb32 = 7 -> Sdcb.SimdCodecs.Bmp.BmpEncodeFormat +Sdcb.SimdCodecs.Bmp.BmpEncodeFormat.Rgb555 = 4 -> Sdcb.SimdCodecs.Bmp.BmpEncodeFormat +Sdcb.SimdCodecs.Bmp.BmpEncodeFormat.Rgb565 = 5 -> Sdcb.SimdCodecs.Bmp.BmpEncodeFormat +Sdcb.SimdCodecs.Bmp.BmpEncodeOptions +Sdcb.SimdCodecs.Bmp.BmpEncodeOptions.BmpEncodeOptions() -> void +Sdcb.SimdCodecs.Bmp.BmpEncodeOptions.Dither.get -> bool +Sdcb.SimdCodecs.Bmp.BmpEncodeOptions.Dither.init -> void +Sdcb.SimdCodecs.Bmp.BmpEncodeOptions.Equals(Sdcb.SimdCodecs.Bmp.BmpEncodeOptions? other) -> bool +Sdcb.SimdCodecs.Bmp.BmpEncodeOptions.Format.get -> Sdcb.SimdCodecs.Bmp.BmpEncodeFormat +Sdcb.SimdCodecs.Bmp.BmpEncodeOptions.Format.init -> void +Sdcb.SimdCodecs.Bmp.BmpEncodeOptions.Header.get -> Sdcb.SimdCodecs.Bmp.BmpHeaderVersion +Sdcb.SimdCodecs.Bmp.BmpEncodeOptions.Header.init -> void +Sdcb.SimdCodecs.Bmp.BmpEncodeOptions.IccProfile.get -> System.ReadOnlyMemory +Sdcb.SimdCodecs.Bmp.BmpEncodeOptions.IccProfile.init -> void +Sdcb.SimdCodecs.Bmp.BmpEncodeOptions.PixelsPerMeterX.get -> int +Sdcb.SimdCodecs.Bmp.BmpEncodeOptions.PixelsPerMeterX.init -> void +Sdcb.SimdCodecs.Bmp.BmpEncodeOptions.PixelsPerMeterY.get -> int +Sdcb.SimdCodecs.Bmp.BmpEncodeOptions.PixelsPerMeterY.init -> void +Sdcb.SimdCodecs.Bmp.BmpEncodeOptions.Rle.get -> bool +Sdcb.SimdCodecs.Bmp.BmpEncodeOptions.Rle.init -> void +Sdcb.SimdCodecs.Bmp.BmpEncodeOptions.TopDown.get -> bool +Sdcb.SimdCodecs.Bmp.BmpEncodeOptions.TopDown.init -> void +Sdcb.SimdCodecs.Bmp.BmpEncoder +Sdcb.SimdCodecs.Bmp.BmpHeaderKind +Sdcb.SimdCodecs.Bmp.BmpHeaderKind.Core = 0 -> Sdcb.SimdCodecs.Bmp.BmpHeaderKind +Sdcb.SimdCodecs.Bmp.BmpHeaderKind.Info = 2 -> Sdcb.SimdCodecs.Bmp.BmpHeaderKind +Sdcb.SimdCodecs.Bmp.BmpHeaderKind.InfoV2 = 3 -> Sdcb.SimdCodecs.Bmp.BmpHeaderKind +Sdcb.SimdCodecs.Bmp.BmpHeaderKind.InfoV3 = 4 -> Sdcb.SimdCodecs.Bmp.BmpHeaderKind +Sdcb.SimdCodecs.Bmp.BmpHeaderKind.Os2 = 1 -> Sdcb.SimdCodecs.Bmp.BmpHeaderKind +Sdcb.SimdCodecs.Bmp.BmpHeaderKind.V4 = 5 -> Sdcb.SimdCodecs.Bmp.BmpHeaderKind +Sdcb.SimdCodecs.Bmp.BmpHeaderKind.V5 = 6 -> Sdcb.SimdCodecs.Bmp.BmpHeaderKind +Sdcb.SimdCodecs.Bmp.BmpHeaderVersion +Sdcb.SimdCodecs.Bmp.BmpHeaderVersion.Auto = 0 -> Sdcb.SimdCodecs.Bmp.BmpHeaderVersion +Sdcb.SimdCodecs.Bmp.BmpHeaderVersion.Core = 1 -> Sdcb.SimdCodecs.Bmp.BmpHeaderVersion +Sdcb.SimdCodecs.Bmp.BmpHeaderVersion.Info = 2 -> Sdcb.SimdCodecs.Bmp.BmpHeaderVersion +Sdcb.SimdCodecs.Bmp.BmpHeaderVersion.V4 = 3 -> Sdcb.SimdCodecs.Bmp.BmpHeaderVersion +Sdcb.SimdCodecs.Bmp.BmpHeaderVersion.V5 = 4 -> Sdcb.SimdCodecs.Bmp.BmpHeaderVersion +Sdcb.SimdCodecs.Bmp.BmpImage +Sdcb.SimdCodecs.Bmp.BmpImage.Channels.get -> int +Sdcb.SimdCodecs.Bmp.BmpImage.Height.get -> int +Sdcb.SimdCodecs.Bmp.BmpImage.IccProfile.get -> byte[]? +Sdcb.SimdCodecs.Bmp.BmpImage.Pixels.get -> byte[]! +Sdcb.SimdCodecs.Bmp.BmpImage.Width.get -> int +Sdcb.SimdCodecs.Bmp.BmpImageDecoder +Sdcb.SimdCodecs.Bmp.BmpImageDecoder.BmpImageDecoder() -> void +Sdcb.SimdCodecs.Bmp.BmpImageEncoder +Sdcb.SimdCodecs.Bmp.BmpImageEncoder.BmpImageEncoder() -> void +Sdcb.SimdCodecs.Bmp.BmpInfo +Sdcb.SimdCodecs.Bmp.BmpInfo.BitsPerPixel.get -> int +Sdcb.SimdCodecs.Bmp.BmpInfo.BitsPerPixel.init -> void +Sdcb.SimdCodecs.Bmp.BmpInfo.BmpInfo() -> void +Sdcb.SimdCodecs.Bmp.BmpInfo.BmpInfo(int Width, int Height, int BitsPerPixel, Sdcb.SimdCodecs.Bmp.BmpCompression Compression, Sdcb.SimdCodecs.Bmp.BmpHeaderKind HeaderKind, bool TopDown, bool HasAlpha, int PaletteSize) -> void +Sdcb.SimdCodecs.Bmp.BmpInfo.Channels.get -> int +Sdcb.SimdCodecs.Bmp.BmpInfo.Compression.get -> Sdcb.SimdCodecs.Bmp.BmpCompression +Sdcb.SimdCodecs.Bmp.BmpInfo.Compression.init -> void +Sdcb.SimdCodecs.Bmp.BmpInfo.Deconstruct(out int Width, out int Height, out int BitsPerPixel, out Sdcb.SimdCodecs.Bmp.BmpCompression Compression, out Sdcb.SimdCodecs.Bmp.BmpHeaderKind HeaderKind, out bool TopDown, out bool HasAlpha, out int PaletteSize) -> void +Sdcb.SimdCodecs.Bmp.BmpInfo.Equals(Sdcb.SimdCodecs.Bmp.BmpInfo other) -> bool +Sdcb.SimdCodecs.Bmp.BmpInfo.HasAlpha.get -> bool +Sdcb.SimdCodecs.Bmp.BmpInfo.HasAlpha.init -> void +Sdcb.SimdCodecs.Bmp.BmpInfo.HeaderKind.get -> Sdcb.SimdCodecs.Bmp.BmpHeaderKind +Sdcb.SimdCodecs.Bmp.BmpInfo.HeaderKind.init -> void +Sdcb.SimdCodecs.Bmp.BmpInfo.Height.get -> int +Sdcb.SimdCodecs.Bmp.BmpInfo.Height.init -> void +Sdcb.SimdCodecs.Bmp.BmpInfo.PaletteSize.get -> int +Sdcb.SimdCodecs.Bmp.BmpInfo.PaletteSize.init -> void +Sdcb.SimdCodecs.Bmp.BmpInfo.TopDown.get -> bool +Sdcb.SimdCodecs.Bmp.BmpInfo.TopDown.init -> void +Sdcb.SimdCodecs.Bmp.BmpInfo.Width.get -> int +Sdcb.SimdCodecs.Bmp.BmpInfo.Width.init -> void +override Sdcb.SimdCodecs.Bmp.BmpEncodeOptions.$() -> Sdcb.SimdCodecs.Bmp.BmpEncodeOptions! +override Sdcb.SimdCodecs.Bmp.BmpEncodeOptions.Equals(object? obj) -> bool +override Sdcb.SimdCodecs.Bmp.BmpEncodeOptions.GetHashCode() -> int +override Sdcb.SimdCodecs.Bmp.BmpEncodeOptions.ToString() -> string! +override Sdcb.SimdCodecs.Bmp.BmpInfo.GetHashCode() -> int +override sealed Sdcb.SimdCodecs.Bmp.BmpEncodeOptions.Equals(Sdcb.SimdCodecs.Abstractions.EncodeOptions? other) -> bool +static Sdcb.SimdCodecs.Bmp.BmpDecoder.Decode(System.ReadOnlySpan data) -> Sdcb.SimdCodecs.Bmp.BmpImage! +static Sdcb.SimdCodecs.Bmp.BmpDecoder.DecodeDib(System.ReadOnlySpan dib, bool iconImage = false) -> Sdcb.SimdCodecs.Bmp.BmpImage! +static Sdcb.SimdCodecs.Bmp.BmpDecoder.DecodeDibTo(System.ReadOnlySpan dib, System.Span destination, Sdcb.SimdCodecs.Abstractions.PixelFormat? format = null, int stride = 0, bool iconImage = false) -> void +static Sdcb.SimdCodecs.Bmp.BmpDecoder.DecodeTo(System.ReadOnlySpan data, System.Span destination, Sdcb.SimdCodecs.Abstractions.PixelFormat? format = null, int stride = 0) -> void +static Sdcb.SimdCodecs.Bmp.BmpDecoder.ReadDibInfo(System.ReadOnlySpan dib, bool iconImage = false) -> Sdcb.SimdCodecs.Bmp.BmpInfo +static Sdcb.SimdCodecs.Bmp.BmpDecoder.ReadInfo(System.ReadOnlySpan data) -> Sdcb.SimdCodecs.Bmp.BmpInfo +static Sdcb.SimdCodecs.Bmp.BmpDecoder.TryReadInfo(System.ReadOnlySpan data, out Sdcb.SimdCodecs.Bmp.BmpInfo info) -> bool +static Sdcb.SimdCodecs.Bmp.BmpEncodeOptions.operator !=(Sdcb.SimdCodecs.Bmp.BmpEncodeOptions? left, Sdcb.SimdCodecs.Bmp.BmpEncodeOptions? right) -> bool +static Sdcb.SimdCodecs.Bmp.BmpEncodeOptions.operator ==(Sdcb.SimdCodecs.Bmp.BmpEncodeOptions? left, Sdcb.SimdCodecs.Bmp.BmpEncodeOptions? right) -> bool +static Sdcb.SimdCodecs.Bmp.BmpEncoder.Encode(System.ReadOnlySpan pixels, int width, int height, Sdcb.SimdCodecs.Abstractions.PixelFormat format, Sdcb.SimdCodecs.Bmp.BmpEncodeOptions? options = null, int stride = 0) -> byte[]! +static Sdcb.SimdCodecs.Bmp.BmpEncoder.Encode(System.ReadOnlySpan pixels, int width, int height, Sdcb.SimdCodecs.Abstractions.PixelFormat format, System.IO.Stream! output, Sdcb.SimdCodecs.Bmp.BmpEncodeOptions? options = null, int stride = 0) -> void +static Sdcb.SimdCodecs.Bmp.BmpEncoder.Encode(System.ReadOnlySpan pixels, int width, int height, int channels, Sdcb.SimdCodecs.Bmp.BmpEncodeOptions? options = null) -> byte[]! +static Sdcb.SimdCodecs.Bmp.BmpEncoder.EncodeDib(System.ReadOnlySpan pixels, int width, int height, Sdcb.SimdCodecs.Abstractions.PixelFormat format, Sdcb.SimdCodecs.Bmp.BmpEncodeOptions? options = null, int stride = 0, bool iconImage = false) -> byte[]! +static Sdcb.SimdCodecs.Bmp.BmpImageDecoder.CanDecode(System.ReadOnlySpan header) -> bool +static Sdcb.SimdCodecs.Bmp.BmpImageDecoder.Registration.get -> Sdcb.SimdCodecs.Abstractions.ImageDecoderRegistration! +static Sdcb.SimdCodecs.Bmp.BmpImageDecoder.SignatureLength.get -> int +static Sdcb.SimdCodecs.Bmp.BmpImageDecoder.TryDecode(System.ReadOnlySpan data, out Sdcb.SimdCodecs.Abstractions.IDecodedImage? image, Sdcb.SimdCodecs.Abstractions.DecodeOptions? options = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> bool +static Sdcb.SimdCodecs.Bmp.BmpImageDecoder.TryDecodeInto(System.ReadOnlySpan data, System.Span destination, int stride, Sdcb.SimdCodecs.Abstractions.PixelFormat format, Sdcb.SimdCodecs.Abstractions.DecodeOptions? options = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> bool +static Sdcb.SimdCodecs.Bmp.BmpImageDecoder.TryDecodeIntoRgba8(System.ReadOnlySpan data, System.Span rgbaDestination) -> bool +static Sdcb.SimdCodecs.Bmp.BmpImageDecoder.TryDecodeThumbnail(System.ReadOnlySpan data, out Sdcb.SimdCodecs.Abstractions.IDecodedImage? thumbnail) -> bool +static Sdcb.SimdCodecs.Bmp.BmpImageDecoder.TryGetClosestSize(System.ReadOnlySpan data, int requestedWidth, int requestedHeight, out int width, out int height, out int scaleDenominator) -> bool +static Sdcb.SimdCodecs.Bmp.BmpImageDecoder.TryReadInfo(System.ReadOnlySpan data, out Sdcb.SimdCodecs.Abstractions.ImageInfo info) -> bool +static Sdcb.SimdCodecs.Bmp.BmpImageDecoder.TryReadMetadata(System.ReadOnlySpan data, out Sdcb.SimdCodecs.Abstractions.ImageMetadata? metadata) -> bool +static Sdcb.SimdCodecs.Bmp.BmpImageEncoder.Create(System.Buffers.IBufferWriter! output, Sdcb.SimdCodecs.Abstractions.EncodeOptions? options = null) -> Sdcb.SimdCodecs.Abstractions.IImageEncoderSession! +static Sdcb.SimdCodecs.Bmp.BmpImageEncoder.Format.get -> Sdcb.SimdCodecs.Abstractions.ImageFormat +static Sdcb.SimdCodecs.Bmp.BmpImageEncoder.GetClosestInputFormat(Sdcb.SimdCodecs.Abstractions.PixelFormat requested) -> Sdcb.SimdCodecs.Abstractions.PixelFormat +static Sdcb.SimdCodecs.Bmp.BmpImageEncoder.Registration.get -> Sdcb.SimdCodecs.Abstractions.ImageEncoderRegistration! +static Sdcb.SimdCodecs.Bmp.BmpInfo.operator !=(Sdcb.SimdCodecs.Bmp.BmpInfo left, Sdcb.SimdCodecs.Bmp.BmpInfo right) -> bool +static Sdcb.SimdCodecs.Bmp.BmpInfo.operator ==(Sdcb.SimdCodecs.Bmp.BmpInfo left, Sdcb.SimdCodecs.Bmp.BmpInfo right) -> bool +~override Sdcb.SimdCodecs.Bmp.BmpInfo.Equals(object obj) -> bool +~override Sdcb.SimdCodecs.Bmp.BmpInfo.ToString() -> string diff --git a/src/Sdcb.SimdCodecs.Bmp/PublicAPI.Unshipped.txt b/src/Sdcb.SimdCodecs.Bmp/PublicAPI.Unshipped.txt new file mode 100644 index 0000000..7dc5c58 --- /dev/null +++ b/src/Sdcb.SimdCodecs.Bmp/PublicAPI.Unshipped.txt @@ -0,0 +1 @@ +#nullable enable diff --git a/src/Sdcb.SimdCodecs.Color.Icc/PublicAPI.Shipped.txt b/src/Sdcb.SimdCodecs.Color.Icc/PublicAPI.Shipped.txt new file mode 100644 index 0000000..90f5e0b --- /dev/null +++ b/src/Sdcb.SimdCodecs.Color.Icc/PublicAPI.Shipped.txt @@ -0,0 +1,6 @@ +#nullable enable +Sdcb.SimdCodecs.Color.Icc.IccProfiles +static Sdcb.SimdCodecs.Color.Icc.IccProfiles.Describe(System.ReadOnlySpan profile) -> string? +static Sdcb.SimdCodecs.Color.Icc.IccProfiles.SRgbV4.get -> System.ReadOnlyMemory +static Sdcb.SimdCodecs.Color.Icc.IccProfiles.TryGetPrimaries(System.ReadOnlySpan profile, out Sdcb.SimdCodecs.Abstractions.ColorPrimaries primaries) -> bool +static Sdcb.SimdCodecs.Color.Icc.IccProfiles.WithCicp(System.ReadOnlySpan baseProfile, Sdcb.SimdCodecs.Abstractions.ColorPrimaries primaries, Sdcb.SimdCodecs.Abstractions.TransferFunction transfer, Sdcb.SimdCodecs.Abstractions.MatrixCoefficients matrix = Sdcb.SimdCodecs.Abstractions.MatrixCoefficients.Identity, bool videoFullRange = true) -> byte[]! diff --git a/src/Sdcb.SimdCodecs.Color.Icc/PublicAPI.Unshipped.txt b/src/Sdcb.SimdCodecs.Color.Icc/PublicAPI.Unshipped.txt new file mode 100644 index 0000000..7dc5c58 --- /dev/null +++ b/src/Sdcb.SimdCodecs.Color.Icc/PublicAPI.Unshipped.txt @@ -0,0 +1 @@ +#nullable enable diff --git a/src/Sdcb.SimdCodecs.Exif/PublicAPI.Shipped.txt b/src/Sdcb.SimdCodecs.Exif/PublicAPI.Shipped.txt new file mode 100644 index 0000000..ba6a3c2 --- /dev/null +++ b/src/Sdcb.SimdCodecs.Exif/PublicAPI.Shipped.txt @@ -0,0 +1,142 @@ +#nullable enable +Sdcb.SimdCodecs.Exif.ExifMetadata +Sdcb.SimdCodecs.Exif.ExifMetadata.$() -> Sdcb.SimdCodecs.Exif.ExifMetadata! +Sdcb.SimdCodecs.Exif.ExifMetadata.Artist.get -> string? +Sdcb.SimdCodecs.Exif.ExifMetadata.Artist.init -> void +Sdcb.SimdCodecs.Exif.ExifMetadata.CaptureTime.get -> System.DateTime? +Sdcb.SimdCodecs.Exif.ExifMetadata.CaptureTime.init -> void +Sdcb.SimdCodecs.Exif.ExifMetadata.Copyright.get -> string? +Sdcb.SimdCodecs.Exif.ExifMetadata.Copyright.init -> void +Sdcb.SimdCodecs.Exif.ExifMetadata.Deconstruct(out string? Make, out string? Model, out System.DateTime? CaptureTime, out System.DateTime? FileTime, out Sdcb.SimdCodecs.Exif.Rational? ExposureTime, out Sdcb.SimdCodecs.Exif.Rational? FNumber, out int? Iso, out Sdcb.SimdCodecs.Exif.Rational? FocalLength, out int? FocalLengthIn35mm, out string? Software, out string? Artist, out string? Copyright, out ushort? Orientation, out int? PixelWidth, out int? PixelHeight, out Sdcb.SimdCodecs.Exif.GpsCoordinates? Gps, out System.Collections.Generic.IReadOnlyDictionary! RawTags) -> void +Sdcb.SimdCodecs.Exif.ExifMetadata.Equals(Sdcb.SimdCodecs.Exif.ExifMetadata? other) -> bool +Sdcb.SimdCodecs.Exif.ExifMetadata.ExifMetadata(string? Make, string? Model, System.DateTime? CaptureTime, System.DateTime? FileTime, Sdcb.SimdCodecs.Exif.Rational? ExposureTime, Sdcb.SimdCodecs.Exif.Rational? FNumber, int? Iso, Sdcb.SimdCodecs.Exif.Rational? FocalLength, int? FocalLengthIn35mm, string? Software, string? Artist, string? Copyright, ushort? Orientation, int? PixelWidth, int? PixelHeight, Sdcb.SimdCodecs.Exif.GpsCoordinates? Gps, System.Collections.Generic.IReadOnlyDictionary! RawTags) -> void +Sdcb.SimdCodecs.Exif.ExifMetadata.ExposureTime.get -> Sdcb.SimdCodecs.Exif.Rational? +Sdcb.SimdCodecs.Exif.ExifMetadata.ExposureTime.init -> void +Sdcb.SimdCodecs.Exif.ExifMetadata.FNumber.get -> Sdcb.SimdCodecs.Exif.Rational? +Sdcb.SimdCodecs.Exif.ExifMetadata.FNumber.init -> void +Sdcb.SimdCodecs.Exif.ExifMetadata.FileTime.get -> System.DateTime? +Sdcb.SimdCodecs.Exif.ExifMetadata.FileTime.init -> void +Sdcb.SimdCodecs.Exif.ExifMetadata.FocalLength.get -> Sdcb.SimdCodecs.Exif.Rational? +Sdcb.SimdCodecs.Exif.ExifMetadata.FocalLength.init -> void +Sdcb.SimdCodecs.Exif.ExifMetadata.FocalLengthIn35mm.get -> int? +Sdcb.SimdCodecs.Exif.ExifMetadata.FocalLengthIn35mm.init -> void +Sdcb.SimdCodecs.Exif.ExifMetadata.Gps.get -> Sdcb.SimdCodecs.Exif.GpsCoordinates? +Sdcb.SimdCodecs.Exif.ExifMetadata.Gps.init -> void +Sdcb.SimdCodecs.Exif.ExifMetadata.Iso.get -> int? +Sdcb.SimdCodecs.Exif.ExifMetadata.Iso.init -> void +Sdcb.SimdCodecs.Exif.ExifMetadata.Make.get -> string? +Sdcb.SimdCodecs.Exif.ExifMetadata.Make.init -> void +Sdcb.SimdCodecs.Exif.ExifMetadata.Model.get -> string? +Sdcb.SimdCodecs.Exif.ExifMetadata.Model.init -> void +Sdcb.SimdCodecs.Exif.ExifMetadata.Orientation.get -> ushort? +Sdcb.SimdCodecs.Exif.ExifMetadata.Orientation.init -> void +Sdcb.SimdCodecs.Exif.ExifMetadata.PixelHeight.get -> int? +Sdcb.SimdCodecs.Exif.ExifMetadata.PixelHeight.init -> void +Sdcb.SimdCodecs.Exif.ExifMetadata.PixelWidth.get -> int? +Sdcb.SimdCodecs.Exif.ExifMetadata.PixelWidth.init -> void +Sdcb.SimdCodecs.Exif.ExifMetadata.RawTags.get -> System.Collections.Generic.IReadOnlyDictionary! +Sdcb.SimdCodecs.Exif.ExifMetadata.RawTags.init -> void +Sdcb.SimdCodecs.Exif.ExifMetadata.Software.get -> string? +Sdcb.SimdCodecs.Exif.ExifMetadata.Software.init -> void +Sdcb.SimdCodecs.Exif.ExifReader +Sdcb.SimdCodecs.Exif.ExifTagValue +Sdcb.SimdCodecs.Exif.ExifTagValue.$() -> Sdcb.SimdCodecs.Exif.ExifTagValue! +Sdcb.SimdCodecs.Exif.ExifTagValue.Bytes.get -> byte[]! +Sdcb.SimdCodecs.Exif.ExifTagValue.Bytes.init -> void +Sdcb.SimdCodecs.Exif.ExifTagValue.Count.get -> int +Sdcb.SimdCodecs.Exif.ExifTagValue.Count.init -> void +Sdcb.SimdCodecs.Exif.ExifTagValue.Deconstruct(out ushort Tag, out Sdcb.SimdCodecs.Tiff.TiffFieldType Type, out int Count, out byte[]! Bytes) -> void +Sdcb.SimdCodecs.Exif.ExifTagValue.Equals(Sdcb.SimdCodecs.Exif.ExifTagValue? other) -> bool +Sdcb.SimdCodecs.Exif.ExifTagValue.ExifTagValue(ushort Tag, Sdcb.SimdCodecs.Tiff.TiffFieldType Type, int Count, byte[]! Bytes) -> void +Sdcb.SimdCodecs.Exif.ExifTagValue.Tag.get -> ushort +Sdcb.SimdCodecs.Exif.ExifTagValue.Tag.init -> void +Sdcb.SimdCodecs.Exif.ExifTagValue.Type.get -> Sdcb.SimdCodecs.Tiff.TiffFieldType +Sdcb.SimdCodecs.Exif.ExifTagValue.Type.init -> void +Sdcb.SimdCodecs.Exif.ExifWriteData +Sdcb.SimdCodecs.Exif.ExifWriteData.$() -> Sdcb.SimdCodecs.Exif.ExifWriteData! +Sdcb.SimdCodecs.Exif.ExifWriteData.Artist.get -> string? +Sdcb.SimdCodecs.Exif.ExifWriteData.Artist.init -> void +Sdcb.SimdCodecs.Exif.ExifWriteData.DateTime.get -> System.DateTime? +Sdcb.SimdCodecs.Exif.ExifWriteData.DateTime.init -> void +Sdcb.SimdCodecs.Exif.ExifWriteData.Deconstruct(out string? Software, out string? ImageDescription, out string? Artist, out System.DateTime? DateTime, out string? UserComment) -> void +Sdcb.SimdCodecs.Exif.ExifWriteData.Equals(Sdcb.SimdCodecs.Exif.ExifWriteData? other) -> bool +Sdcb.SimdCodecs.Exif.ExifWriteData.ExifWriteData(string? Software = null, string? ImageDescription = null, string? Artist = null, System.DateTime? DateTime = null, string? UserComment = null) -> void +Sdcb.SimdCodecs.Exif.ExifWriteData.ImageDescription.get -> string? +Sdcb.SimdCodecs.Exif.ExifWriteData.ImageDescription.init -> void +Sdcb.SimdCodecs.Exif.ExifWriteData.Software.get -> string? +Sdcb.SimdCodecs.Exif.ExifWriteData.Software.init -> void +Sdcb.SimdCodecs.Exif.ExifWriteData.UserComment.get -> string? +Sdcb.SimdCodecs.Exif.ExifWriteData.UserComment.init -> void +Sdcb.SimdCodecs.Exif.ExifWriter +Sdcb.SimdCodecs.Exif.GpsCoordinates +Sdcb.SimdCodecs.Exif.GpsCoordinates.$() -> Sdcb.SimdCodecs.Exif.GpsCoordinates! +Sdcb.SimdCodecs.Exif.GpsCoordinates.Altitude.get -> double? +Sdcb.SimdCodecs.Exif.GpsCoordinates.Altitude.init -> void +Sdcb.SimdCodecs.Exif.GpsCoordinates.Deconstruct(out double Latitude, out double Longitude, out double? Altitude, out System.DateTime? Timestamp) -> void +Sdcb.SimdCodecs.Exif.GpsCoordinates.Equals(Sdcb.SimdCodecs.Exif.GpsCoordinates? other) -> bool +Sdcb.SimdCodecs.Exif.GpsCoordinates.GpsCoordinates(double Latitude, double Longitude, double? Altitude, System.DateTime? Timestamp) -> void +Sdcb.SimdCodecs.Exif.GpsCoordinates.Latitude.get -> double +Sdcb.SimdCodecs.Exif.GpsCoordinates.Latitude.init -> void +Sdcb.SimdCodecs.Exif.GpsCoordinates.Longitude.get -> double +Sdcb.SimdCodecs.Exif.GpsCoordinates.Longitude.init -> void +Sdcb.SimdCodecs.Exif.GpsCoordinates.Timestamp.get -> System.DateTime? +Sdcb.SimdCodecs.Exif.GpsCoordinates.Timestamp.init -> void +Sdcb.SimdCodecs.Exif.Rational +Sdcb.SimdCodecs.Exif.Rational.Deconstruct(out uint Numerator, out uint Denominator) -> void +Sdcb.SimdCodecs.Exif.Rational.Denominator.get -> uint +Sdcb.SimdCodecs.Exif.Rational.Denominator.init -> void +Sdcb.SimdCodecs.Exif.Rational.Equals(Sdcb.SimdCodecs.Exif.Rational other) -> bool +Sdcb.SimdCodecs.Exif.Rational.Numerator.get -> uint +Sdcb.SimdCodecs.Exif.Rational.Numerator.init -> void +Sdcb.SimdCodecs.Exif.Rational.Rational() -> void +Sdcb.SimdCodecs.Exif.Rational.Rational(uint Numerator, uint Denominator) -> void +Sdcb.SimdCodecs.Exif.Rational.ToDouble() -> double +Sdcb.SimdCodecs.Exif.SRational +Sdcb.SimdCodecs.Exif.SRational.Deconstruct(out int Numerator, out int Denominator) -> void +Sdcb.SimdCodecs.Exif.SRational.Denominator.get -> int +Sdcb.SimdCodecs.Exif.SRational.Denominator.init -> void +Sdcb.SimdCodecs.Exif.SRational.Equals(Sdcb.SimdCodecs.Exif.SRational other) -> bool +Sdcb.SimdCodecs.Exif.SRational.Numerator.get -> int +Sdcb.SimdCodecs.Exif.SRational.Numerator.init -> void +Sdcb.SimdCodecs.Exif.SRational.SRational() -> void +Sdcb.SimdCodecs.Exif.SRational.SRational(int Numerator, int Denominator) -> void +Sdcb.SimdCodecs.Exif.SRational.ToDouble() -> double +override Sdcb.SimdCodecs.Exif.ExifMetadata.Equals(object? obj) -> bool +override Sdcb.SimdCodecs.Exif.ExifMetadata.GetHashCode() -> int +override Sdcb.SimdCodecs.Exif.ExifMetadata.ToString() -> string! +override Sdcb.SimdCodecs.Exif.ExifTagValue.Equals(object? obj) -> bool +override Sdcb.SimdCodecs.Exif.ExifTagValue.GetHashCode() -> int +override Sdcb.SimdCodecs.Exif.ExifTagValue.ToString() -> string! +override Sdcb.SimdCodecs.Exif.ExifWriteData.Equals(object? obj) -> bool +override Sdcb.SimdCodecs.Exif.ExifWriteData.GetHashCode() -> int +override Sdcb.SimdCodecs.Exif.ExifWriteData.ToString() -> string! +override Sdcb.SimdCodecs.Exif.GpsCoordinates.Equals(object? obj) -> bool +override Sdcb.SimdCodecs.Exif.GpsCoordinates.GetHashCode() -> int +override Sdcb.SimdCodecs.Exif.GpsCoordinates.ToString() -> string! +override Sdcb.SimdCodecs.Exif.Rational.GetHashCode() -> int +override Sdcb.SimdCodecs.Exif.Rational.ToString() -> string! +override Sdcb.SimdCodecs.Exif.SRational.GetHashCode() -> int +override Sdcb.SimdCodecs.Exif.SRational.ToString() -> string! +static Sdcb.SimdCodecs.Exif.ExifMetadata.operator !=(Sdcb.SimdCodecs.Exif.ExifMetadata? left, Sdcb.SimdCodecs.Exif.ExifMetadata? right) -> bool +static Sdcb.SimdCodecs.Exif.ExifMetadata.operator ==(Sdcb.SimdCodecs.Exif.ExifMetadata? left, Sdcb.SimdCodecs.Exif.ExifMetadata? right) -> bool +static Sdcb.SimdCodecs.Exif.ExifReader.FromBytes(System.ReadOnlySpan bytes) -> Sdcb.SimdCodecs.Exif.ExifMetadata? +static Sdcb.SimdCodecs.Exif.ExifReader.FromIfd(System.ReadOnlySpan tiff, int ifdOffset, bool fileIsLittleEndian) -> Sdcb.SimdCodecs.Exif.ExifMetadata! +static Sdcb.SimdCodecs.Exif.ExifReader.FromJpeg(System.ReadOnlySpan jpeg) -> Sdcb.SimdCodecs.Exif.ExifMetadata? +static Sdcb.SimdCodecs.Exif.ExifReader.FromPng(System.ReadOnlySpan png) -> Sdcb.SimdCodecs.Exif.ExifMetadata? +static Sdcb.SimdCodecs.Exif.ExifReader.FromTiff(System.ReadOnlySpan tiff) -> Sdcb.SimdCodecs.Exif.ExifMetadata? +static Sdcb.SimdCodecs.Exif.ExifReader.FromWebp(System.ReadOnlySpan webp) -> Sdcb.SimdCodecs.Exif.ExifMetadata? +static Sdcb.SimdCodecs.Exif.ExifTagValue.operator !=(Sdcb.SimdCodecs.Exif.ExifTagValue? left, Sdcb.SimdCodecs.Exif.ExifTagValue? right) -> bool +static Sdcb.SimdCodecs.Exif.ExifTagValue.operator ==(Sdcb.SimdCodecs.Exif.ExifTagValue? left, Sdcb.SimdCodecs.Exif.ExifTagValue? right) -> bool +static Sdcb.SimdCodecs.Exif.ExifWriteData.operator !=(Sdcb.SimdCodecs.Exif.ExifWriteData? left, Sdcb.SimdCodecs.Exif.ExifWriteData? right) -> bool +static Sdcb.SimdCodecs.Exif.ExifWriteData.operator ==(Sdcb.SimdCodecs.Exif.ExifWriteData? left, Sdcb.SimdCodecs.Exif.ExifWriteData? right) -> bool +static Sdcb.SimdCodecs.Exif.ExifWriter.AsciiCharacterCode.get -> System.ReadOnlySpan +static Sdcb.SimdCodecs.Exif.ExifWriter.Build(Sdcb.SimdCodecs.Exif.ExifWriteData! data) -> byte[]! +static Sdcb.SimdCodecs.Exif.ExifWriter.UnicodeCharacterCode.get -> System.ReadOnlySpan +static Sdcb.SimdCodecs.Exif.GpsCoordinates.operator !=(Sdcb.SimdCodecs.Exif.GpsCoordinates? left, Sdcb.SimdCodecs.Exif.GpsCoordinates? right) -> bool +static Sdcb.SimdCodecs.Exif.GpsCoordinates.operator ==(Sdcb.SimdCodecs.Exif.GpsCoordinates? left, Sdcb.SimdCodecs.Exif.GpsCoordinates? right) -> bool +static Sdcb.SimdCodecs.Exif.Rational.operator !=(Sdcb.SimdCodecs.Exif.Rational left, Sdcb.SimdCodecs.Exif.Rational right) -> bool +static Sdcb.SimdCodecs.Exif.Rational.operator ==(Sdcb.SimdCodecs.Exif.Rational left, Sdcb.SimdCodecs.Exif.Rational right) -> bool +static Sdcb.SimdCodecs.Exif.SRational.operator !=(Sdcb.SimdCodecs.Exif.SRational left, Sdcb.SimdCodecs.Exif.SRational right) -> bool +static Sdcb.SimdCodecs.Exif.SRational.operator ==(Sdcb.SimdCodecs.Exif.SRational left, Sdcb.SimdCodecs.Exif.SRational right) -> bool +~override Sdcb.SimdCodecs.Exif.Rational.Equals(object obj) -> bool +~override Sdcb.SimdCodecs.Exif.SRational.Equals(object obj) -> bool diff --git a/src/Sdcb.SimdCodecs.Exif/PublicAPI.Unshipped.txt b/src/Sdcb.SimdCodecs.Exif/PublicAPI.Unshipped.txt new file mode 100644 index 0000000..7dc5c58 --- /dev/null +++ b/src/Sdcb.SimdCodecs.Exif/PublicAPI.Unshipped.txt @@ -0,0 +1 @@ +#nullable enable diff --git a/src/Sdcb.SimdCodecs.Gif/PublicAPI.Shipped.txt b/src/Sdcb.SimdCodecs.Gif/PublicAPI.Shipped.txt new file mode 100644 index 0000000..f7281fd --- /dev/null +++ b/src/Sdcb.SimdCodecs.Gif/PublicAPI.Shipped.txt @@ -0,0 +1,80 @@ +#nullable enable +Sdcb.SimdCodecs.Gif.GifAnimationFrame +Sdcb.SimdCodecs.Gif.GifAnimationFrame.Deconstruct(out System.ReadOnlyMemory Pixels, out System.TimeSpan Duration) -> void +Sdcb.SimdCodecs.Gif.GifAnimationFrame.Duration.get -> System.TimeSpan +Sdcb.SimdCodecs.Gif.GifAnimationFrame.Duration.init -> void +Sdcb.SimdCodecs.Gif.GifAnimationFrame.Equals(Sdcb.SimdCodecs.Gif.GifAnimationFrame other) -> bool +Sdcb.SimdCodecs.Gif.GifAnimationFrame.GifAnimationFrame() -> void +Sdcb.SimdCodecs.Gif.GifAnimationFrame.GifAnimationFrame(System.ReadOnlyMemory Pixels, System.TimeSpan Duration) -> void +Sdcb.SimdCodecs.Gif.GifAnimationFrame.Pixels.get -> System.ReadOnlyMemory +Sdcb.SimdCodecs.Gif.GifAnimationFrame.Pixels.init -> void +Sdcb.SimdCodecs.Gif.GifDecoder +Sdcb.SimdCodecs.Gif.GifEncodeOptions +Sdcb.SimdCodecs.Gif.GifEncodeOptions.Dither.get -> bool +Sdcb.SimdCodecs.Gif.GifEncodeOptions.Dither.init -> void +Sdcb.SimdCodecs.Gif.GifEncodeOptions.Equals(Sdcb.SimdCodecs.Gif.GifEncodeOptions? other) -> bool +Sdcb.SimdCodecs.Gif.GifEncodeOptions.GifEncodeOptions() -> void +Sdcb.SimdCodecs.Gif.GifEncodeOptions.LoopCount.get -> int +Sdcb.SimdCodecs.Gif.GifEncodeOptions.LoopCount.init -> void +Sdcb.SimdCodecs.Gif.GifEncoder +Sdcb.SimdCodecs.Gif.GifImage +Sdcb.SimdCodecs.Gif.GifImage.Height.get -> int +Sdcb.SimdCodecs.Gif.GifImage.Rgba.get -> byte[]! +Sdcb.SimdCodecs.Gif.GifImage.Width.get -> int +Sdcb.SimdCodecs.Gif.GifImageDecoder +Sdcb.SimdCodecs.Gif.GifImageDecoder.GifImageDecoder() -> void +Sdcb.SimdCodecs.Gif.GifImageEncoder +Sdcb.SimdCodecs.Gif.GifImageEncoder.GifImageEncoder() -> void +Sdcb.SimdCodecs.Gif.GifInfo +Sdcb.SimdCodecs.Gif.GifInfo.Deconstruct(out int Width, out int Height, out int FrameCount, out bool HasAlpha, out int? LoopCount) -> void +Sdcb.SimdCodecs.Gif.GifInfo.Equals(Sdcb.SimdCodecs.Gif.GifInfo other) -> bool +Sdcb.SimdCodecs.Gif.GifInfo.FrameCount.get -> int +Sdcb.SimdCodecs.Gif.GifInfo.FrameCount.init -> void +Sdcb.SimdCodecs.Gif.GifInfo.GifInfo() -> void +Sdcb.SimdCodecs.Gif.GifInfo.GifInfo(int Width, int Height, int FrameCount, bool HasAlpha, int? LoopCount) -> void +Sdcb.SimdCodecs.Gif.GifInfo.HasAlpha.get -> bool +Sdcb.SimdCodecs.Gif.GifInfo.HasAlpha.init -> void +Sdcb.SimdCodecs.Gif.GifInfo.Height.get -> int +Sdcb.SimdCodecs.Gif.GifInfo.Height.init -> void +Sdcb.SimdCodecs.Gif.GifInfo.LoopCount.get -> int? +Sdcb.SimdCodecs.Gif.GifInfo.LoopCount.init -> void +Sdcb.SimdCodecs.Gif.GifInfo.Width.get -> int +Sdcb.SimdCodecs.Gif.GifInfo.Width.init -> void +override Sdcb.SimdCodecs.Gif.GifAnimationFrame.GetHashCode() -> int +override Sdcb.SimdCodecs.Gif.GifEncodeOptions.$() -> Sdcb.SimdCodecs.Gif.GifEncodeOptions! +override Sdcb.SimdCodecs.Gif.GifEncodeOptions.Equals(object? obj) -> bool +override Sdcb.SimdCodecs.Gif.GifEncodeOptions.GetHashCode() -> int +override Sdcb.SimdCodecs.Gif.GifEncodeOptions.ToString() -> string! +override Sdcb.SimdCodecs.Gif.GifInfo.GetHashCode() -> int +override sealed Sdcb.SimdCodecs.Gif.GifEncodeOptions.Equals(Sdcb.SimdCodecs.Abstractions.EncodeOptions? other) -> bool +static Sdcb.SimdCodecs.Gif.GifAnimationFrame.operator !=(Sdcb.SimdCodecs.Gif.GifAnimationFrame left, Sdcb.SimdCodecs.Gif.GifAnimationFrame right) -> bool +static Sdcb.SimdCodecs.Gif.GifAnimationFrame.operator ==(Sdcb.SimdCodecs.Gif.GifAnimationFrame left, Sdcb.SimdCodecs.Gif.GifAnimationFrame right) -> bool +static Sdcb.SimdCodecs.Gif.GifDecoder.Decode(System.ReadOnlySpan data) -> Sdcb.SimdCodecs.Gif.GifImage! +static Sdcb.SimdCodecs.Gif.GifDecoder.DecodeTo(System.ReadOnlySpan data, System.Span rgba, int stride = 0) -> void +static Sdcb.SimdCodecs.Gif.GifDecoder.ReadInfo(System.ReadOnlySpan data) -> Sdcb.SimdCodecs.Gif.GifInfo +static Sdcb.SimdCodecs.Gif.GifDecoder.TryReadInfo(System.ReadOnlySpan data, out Sdcb.SimdCodecs.Gif.GifInfo info) -> bool +static Sdcb.SimdCodecs.Gif.GifEncodeOptions.operator !=(Sdcb.SimdCodecs.Gif.GifEncodeOptions? left, Sdcb.SimdCodecs.Gif.GifEncodeOptions? right) -> bool +static Sdcb.SimdCodecs.Gif.GifEncodeOptions.operator ==(Sdcb.SimdCodecs.Gif.GifEncodeOptions? left, Sdcb.SimdCodecs.Gif.GifEncodeOptions? right) -> bool +static Sdcb.SimdCodecs.Gif.GifEncoder.Encode(System.ReadOnlySpan pixels, int width, int height, int channels, Sdcb.SimdCodecs.Gif.GifEncodeOptions? options = null) -> byte[]! +static Sdcb.SimdCodecs.Gif.GifEncoder.EncodeAnimation(System.Collections.Generic.IReadOnlyList! frames, int width, int height, int channels, Sdcb.SimdCodecs.Gif.GifEncodeOptions? options = null) -> byte[]! +static Sdcb.SimdCodecs.Gif.GifImageDecoder.CanDecode(System.ReadOnlySpan header) -> bool +static Sdcb.SimdCodecs.Gif.GifImageDecoder.Registration.get -> Sdcb.SimdCodecs.Abstractions.ImageDecoderRegistration! +static Sdcb.SimdCodecs.Gif.GifImageDecoder.SignatureLength.get -> int +static Sdcb.SimdCodecs.Gif.GifImageDecoder.TryDecode(System.ReadOnlySpan data, out Sdcb.SimdCodecs.Abstractions.IDecodedImage? image, Sdcb.SimdCodecs.Abstractions.DecodeOptions? options = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> bool +static Sdcb.SimdCodecs.Gif.GifImageDecoder.TryDecodeInto(System.ReadOnlySpan data, System.Span destination, int stride, Sdcb.SimdCodecs.Abstractions.PixelFormat format, Sdcb.SimdCodecs.Abstractions.DecodeOptions? options = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> bool +static Sdcb.SimdCodecs.Gif.GifImageDecoder.TryDecodeIntoRgba8(System.ReadOnlySpan data, System.Span rgbaDestination) -> bool +static Sdcb.SimdCodecs.Gif.GifImageDecoder.TryDecodeThumbnail(System.ReadOnlySpan data, out Sdcb.SimdCodecs.Abstractions.IDecodedImage? thumbnail) -> bool +static Sdcb.SimdCodecs.Gif.GifImageDecoder.TryGetClosestSize(System.ReadOnlySpan data, int requestedWidth, int requestedHeight, out int width, out int height, out int scaleDenominator) -> bool +static Sdcb.SimdCodecs.Gif.GifImageDecoder.TryOpenFrames(System.ReadOnlyMemory data, out Sdcb.SimdCodecs.Abstractions.IImageFrameReader? reader) -> bool +static Sdcb.SimdCodecs.Gif.GifImageDecoder.TryReadInfo(System.ReadOnlySpan data, out Sdcb.SimdCodecs.Abstractions.ImageInfo info) -> bool +static Sdcb.SimdCodecs.Gif.GifImageDecoder.TryReadMetadata(System.ReadOnlySpan data, out Sdcb.SimdCodecs.Abstractions.ImageMetadata? metadata) -> bool +static Sdcb.SimdCodecs.Gif.GifImageEncoder.Create(System.Buffers.IBufferWriter! output, Sdcb.SimdCodecs.Abstractions.EncodeOptions? options = null) -> Sdcb.SimdCodecs.Abstractions.IImageEncoderSession! +static Sdcb.SimdCodecs.Gif.GifImageEncoder.Format.get -> Sdcb.SimdCodecs.Abstractions.ImageFormat +static Sdcb.SimdCodecs.Gif.GifImageEncoder.GetClosestInputFormat(Sdcb.SimdCodecs.Abstractions.PixelFormat requested) -> Sdcb.SimdCodecs.Abstractions.PixelFormat +static Sdcb.SimdCodecs.Gif.GifImageEncoder.Registration.get -> Sdcb.SimdCodecs.Abstractions.ImageEncoderRegistration! +static Sdcb.SimdCodecs.Gif.GifInfo.operator !=(Sdcb.SimdCodecs.Gif.GifInfo left, Sdcb.SimdCodecs.Gif.GifInfo right) -> bool +static Sdcb.SimdCodecs.Gif.GifInfo.operator ==(Sdcb.SimdCodecs.Gif.GifInfo left, Sdcb.SimdCodecs.Gif.GifInfo right) -> bool +~override Sdcb.SimdCodecs.Gif.GifAnimationFrame.Equals(object obj) -> bool +~override Sdcb.SimdCodecs.Gif.GifAnimationFrame.ToString() -> string +~override Sdcb.SimdCodecs.Gif.GifInfo.Equals(object obj) -> bool +~override Sdcb.SimdCodecs.Gif.GifInfo.ToString() -> string diff --git a/src/Sdcb.SimdCodecs.Gif/PublicAPI.Unshipped.txt b/src/Sdcb.SimdCodecs.Gif/PublicAPI.Unshipped.txt new file mode 100644 index 0000000..7dc5c58 --- /dev/null +++ b/src/Sdcb.SimdCodecs.Gif/PublicAPI.Unshipped.txt @@ -0,0 +1 @@ +#nullable enable diff --git a/src/Sdcb.SimdCodecs.Heif/PublicAPI.Shipped.txt b/src/Sdcb.SimdCodecs.Heif/PublicAPI.Shipped.txt new file mode 100644 index 0000000..e573771 --- /dev/null +++ b/src/Sdcb.SimdCodecs.Heif/PublicAPI.Shipped.txt @@ -0,0 +1,39 @@ +#nullable enable +Sdcb.SimdCodecs.Heif.HeifDecoder +Sdcb.SimdCodecs.Heif.HeifImage +Sdcb.SimdCodecs.Heif.HeifImage.BitDepth.get -> int +Sdcb.SimdCodecs.Heif.HeifImage.Dispose() -> void +Sdcb.SimdCodecs.Heif.HeifImage.Height.get -> int +Sdcb.SimdCodecs.Heif.HeifImage.IccProfile.get -> byte[]? +Sdcb.SimdCodecs.Heif.HeifImage.Rgba.get -> System.ReadOnlySpan +Sdcb.SimdCodecs.Heif.HeifImage.Width.get -> int +Sdcb.SimdCodecs.Heif.HeifImageDecoder +Sdcb.SimdCodecs.Heif.HeifImageDecoder.HeifImageDecoder() -> void +Sdcb.SimdCodecs.Heif.HeifInfo +Sdcb.SimdCodecs.Heif.HeifInfo.BitDepth.get -> int +Sdcb.SimdCodecs.Heif.HeifInfo.BitDepth.init -> void +Sdcb.SimdCodecs.Heif.HeifInfo.HeifInfo() -> void +Sdcb.SimdCodecs.Heif.HeifInfo.Height.get -> int +Sdcb.SimdCodecs.Heif.HeifInfo.Height.init -> void +Sdcb.SimdCodecs.Heif.HeifInfo.IccProfile.get -> byte[]? +Sdcb.SimdCodecs.Heif.HeifInfo.IccProfile.init -> void +Sdcb.SimdCodecs.Heif.HeifInfo.Orientation.get -> Sdcb.SimdCodecs.Abstractions.ImageOrientation +Sdcb.SimdCodecs.Heif.HeifInfo.Orientation.init -> void +Sdcb.SimdCodecs.Heif.HeifInfo.TileCount.get -> int +Sdcb.SimdCodecs.Heif.HeifInfo.TileCount.init -> void +Sdcb.SimdCodecs.Heif.HeifInfo.Width.get -> int +Sdcb.SimdCodecs.Heif.HeifInfo.Width.init -> void +static Sdcb.SimdCodecs.Heif.HeifDecoder.Decode(System.ReadOnlySpan data) -> Sdcb.SimdCodecs.Heif.HeifImage! +static Sdcb.SimdCodecs.Heif.HeifDecoder.DecodeTo(System.ReadOnlySpan data, System.Span rgbaDestination) -> (int Width, int Height) +static Sdcb.SimdCodecs.Heif.HeifDecoder.ReadInfo(System.ReadOnlySpan data) -> Sdcb.SimdCodecs.Heif.HeifInfo! +static Sdcb.SimdCodecs.Heif.HeifImageDecoder.CanDecode(System.ReadOnlySpan header) -> bool +static Sdcb.SimdCodecs.Heif.HeifImageDecoder.Registration.get -> Sdcb.SimdCodecs.Abstractions.ImageDecoderRegistration! +static Sdcb.SimdCodecs.Heif.HeifImageDecoder.SignatureLength.get -> int +static Sdcb.SimdCodecs.Heif.HeifImageDecoder.TryDecode(System.ReadOnlySpan data, out Sdcb.SimdCodecs.Abstractions.IDecodedImage? image, Sdcb.SimdCodecs.Abstractions.DecodeOptions? options = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> bool +static Sdcb.SimdCodecs.Heif.HeifImageDecoder.TryDecodeInto(System.ReadOnlySpan data, System.Span destination, int stride, Sdcb.SimdCodecs.Abstractions.PixelFormat format, Sdcb.SimdCodecs.Abstractions.DecodeOptions? options = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> bool +static Sdcb.SimdCodecs.Heif.HeifImageDecoder.TryDecodePlanes(System.ReadOnlySpan data, System.Span y, System.Span cb, System.Span cr, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> bool +static Sdcb.SimdCodecs.Heif.HeifImageDecoder.TryDecodeThumbnail(System.ReadOnlySpan data, out Sdcb.SimdCodecs.Abstractions.IDecodedImage? thumbnail) -> bool +static Sdcb.SimdCodecs.Heif.HeifImageDecoder.TryGetClosestSize(System.ReadOnlySpan data, int requestedWidth, int requestedHeight, out int width, out int height, out int scaleDenominator) -> bool +static Sdcb.SimdCodecs.Heif.HeifImageDecoder.TryReadInfo(System.ReadOnlySpan data, out Sdcb.SimdCodecs.Abstractions.ImageInfo info) -> bool +static Sdcb.SimdCodecs.Heif.HeifImageDecoder.TryReadMetadata(System.ReadOnlySpan data, out Sdcb.SimdCodecs.Abstractions.ImageMetadata? metadata) -> bool +static Sdcb.SimdCodecs.Heif.HeifImageDecoder.TryReadPlanarInfo(System.ReadOnlySpan data, out Sdcb.SimdCodecs.Abstractions.PlanarInfo info) -> bool diff --git a/src/Sdcb.SimdCodecs.Heif/PublicAPI.Unshipped.txt b/src/Sdcb.SimdCodecs.Heif/PublicAPI.Unshipped.txt new file mode 100644 index 0000000..7dc5c58 --- /dev/null +++ b/src/Sdcb.SimdCodecs.Heif/PublicAPI.Unshipped.txt @@ -0,0 +1 @@ +#nullable enable diff --git a/src/Sdcb.SimdCodecs.Ico/PublicAPI.Shipped.txt b/src/Sdcb.SimdCodecs.Ico/PublicAPI.Shipped.txt new file mode 100644 index 0000000..26bfe7b --- /dev/null +++ b/src/Sdcb.SimdCodecs.Ico/PublicAPI.Shipped.txt @@ -0,0 +1,119 @@ +#nullable enable +Sdcb.SimdCodecs.Ico.CurImageDecoder +Sdcb.SimdCodecs.Ico.CurImageDecoder.CurImageDecoder() -> void +Sdcb.SimdCodecs.Ico.IcoDecoder +Sdcb.SimdCodecs.Ico.IcoEncoder +Sdcb.SimdCodecs.Ico.IcoEntry +Sdcb.SimdCodecs.Ico.IcoEntry.BitsPerPixel.get -> int +Sdcb.SimdCodecs.Ico.IcoEntry.BitsPerPixel.init -> void +Sdcb.SimdCodecs.Ico.IcoEntry.Deconstruct(out int Width, out int Height, out int BitsPerPixel, out bool IsPng, out int HotspotX, out int HotspotY) -> void +Sdcb.SimdCodecs.Ico.IcoEntry.Equals(Sdcb.SimdCodecs.Ico.IcoEntry other) -> bool +Sdcb.SimdCodecs.Ico.IcoEntry.Height.get -> int +Sdcb.SimdCodecs.Ico.IcoEntry.Height.init -> void +Sdcb.SimdCodecs.Ico.IcoEntry.HotspotX.get -> int +Sdcb.SimdCodecs.Ico.IcoEntry.HotspotX.init -> void +Sdcb.SimdCodecs.Ico.IcoEntry.HotspotY.get -> int +Sdcb.SimdCodecs.Ico.IcoEntry.HotspotY.init -> void +Sdcb.SimdCodecs.Ico.IcoEntry.IcoEntry() -> void +Sdcb.SimdCodecs.Ico.IcoEntry.IcoEntry(int Width, int Height, int BitsPerPixel, bool IsPng, int HotspotX, int HotspotY) -> void +Sdcb.SimdCodecs.Ico.IcoEntry.IsPng.get -> bool +Sdcb.SimdCodecs.Ico.IcoEntry.IsPng.init -> void +Sdcb.SimdCodecs.Ico.IcoEntry.Width.get -> int +Sdcb.SimdCodecs.Ico.IcoEntry.Width.init -> void +Sdcb.SimdCodecs.Ico.IcoFrame +Sdcb.SimdCodecs.Ico.IcoFrame.Deconstruct(out System.ReadOnlyMemory Pixels, out int Width, out int Height, out Sdcb.SimdCodecs.Abstractions.PixelFormat Format, out Sdcb.SimdCodecs.Ico.IcoImageEncoding Encoding, out int HotspotX, out int HotspotY) -> void +Sdcb.SimdCodecs.Ico.IcoFrame.Encoding.get -> Sdcb.SimdCodecs.Ico.IcoImageEncoding +Sdcb.SimdCodecs.Ico.IcoFrame.Encoding.init -> void +Sdcb.SimdCodecs.Ico.IcoFrame.Equals(Sdcb.SimdCodecs.Ico.IcoFrame other) -> bool +Sdcb.SimdCodecs.Ico.IcoFrame.Format.get -> Sdcb.SimdCodecs.Abstractions.PixelFormat +Sdcb.SimdCodecs.Ico.IcoFrame.Format.init -> void +Sdcb.SimdCodecs.Ico.IcoFrame.Height.get -> int +Sdcb.SimdCodecs.Ico.IcoFrame.Height.init -> void +Sdcb.SimdCodecs.Ico.IcoFrame.HotspotX.get -> int +Sdcb.SimdCodecs.Ico.IcoFrame.HotspotX.init -> void +Sdcb.SimdCodecs.Ico.IcoFrame.HotspotY.get -> int +Sdcb.SimdCodecs.Ico.IcoFrame.HotspotY.init -> void +Sdcb.SimdCodecs.Ico.IcoFrame.IcoFrame() -> void +Sdcb.SimdCodecs.Ico.IcoFrame.IcoFrame(System.ReadOnlyMemory Pixels, int Width, int Height, Sdcb.SimdCodecs.Abstractions.PixelFormat Format = default(Sdcb.SimdCodecs.Abstractions.PixelFormat), Sdcb.SimdCodecs.Ico.IcoImageEncoding Encoding = Sdcb.SimdCodecs.Ico.IcoImageEncoding.Auto, int HotspotX = 0, int HotspotY = 0) -> void +Sdcb.SimdCodecs.Ico.IcoFrame.Pixels.get -> System.ReadOnlyMemory +Sdcb.SimdCodecs.Ico.IcoFrame.Pixels.init -> void +Sdcb.SimdCodecs.Ico.IcoFrame.Width.get -> int +Sdcb.SimdCodecs.Ico.IcoFrame.Width.init -> void +Sdcb.SimdCodecs.Ico.IcoImage +Sdcb.SimdCodecs.Ico.IcoImage.Entry.get -> Sdcb.SimdCodecs.Ico.IcoEntry +Sdcb.SimdCodecs.Ico.IcoImage.Height.get -> int +Sdcb.SimdCodecs.Ico.IcoImage.Rgba.get -> byte[]! +Sdcb.SimdCodecs.Ico.IcoImage.Width.get -> int +Sdcb.SimdCodecs.Ico.IcoImageDecoder +Sdcb.SimdCodecs.Ico.IcoImageDecoder.IcoImageDecoder() -> void +Sdcb.SimdCodecs.Ico.IcoImageEncoder +Sdcb.SimdCodecs.Ico.IcoImageEncoder.IcoImageEncoder() -> void +Sdcb.SimdCodecs.Ico.IcoImageEncoding +Sdcb.SimdCodecs.Ico.IcoImageEncoding.Auto = 0 -> Sdcb.SimdCodecs.Ico.IcoImageEncoding +Sdcb.SimdCodecs.Ico.IcoImageEncoding.Bmp1 = 6 -> Sdcb.SimdCodecs.Ico.IcoImageEncoding +Sdcb.SimdCodecs.Ico.IcoImageEncoding.Bmp24 = 3 -> Sdcb.SimdCodecs.Ico.IcoImageEncoding +Sdcb.SimdCodecs.Ico.IcoImageEncoding.Bmp32 = 2 -> Sdcb.SimdCodecs.Ico.IcoImageEncoding +Sdcb.SimdCodecs.Ico.IcoImageEncoding.Bmp4 = 5 -> Sdcb.SimdCodecs.Ico.IcoImageEncoding +Sdcb.SimdCodecs.Ico.IcoImageEncoding.Bmp8 = 4 -> Sdcb.SimdCodecs.Ico.IcoImageEncoding +Sdcb.SimdCodecs.Ico.IcoImageEncoding.Png = 1 -> Sdcb.SimdCodecs.Ico.IcoImageEncoding +Sdcb.SimdCodecs.Ico.IcoInfo +Sdcb.SimdCodecs.Ico.IcoInfo.$() -> Sdcb.SimdCodecs.Ico.IcoInfo! +Sdcb.SimdCodecs.Ico.IcoInfo.Best.get -> int +Sdcb.SimdCodecs.Ico.IcoInfo.Best.init -> void +Sdcb.SimdCodecs.Ico.IcoInfo.Deconstruct(out Sdcb.SimdCodecs.Ico.IcoKind Kind, out System.Collections.Generic.IReadOnlyList! Entries, out int Best) -> void +Sdcb.SimdCodecs.Ico.IcoInfo.Entries.get -> System.Collections.Generic.IReadOnlyList! +Sdcb.SimdCodecs.Ico.IcoInfo.Entries.init -> void +Sdcb.SimdCodecs.Ico.IcoInfo.Equals(Sdcb.SimdCodecs.Ico.IcoInfo? other) -> bool +Sdcb.SimdCodecs.Ico.IcoInfo.IcoInfo(Sdcb.SimdCodecs.Ico.IcoKind Kind, System.Collections.Generic.IReadOnlyList! Entries, int Best) -> void +Sdcb.SimdCodecs.Ico.IcoInfo.Kind.get -> Sdcb.SimdCodecs.Ico.IcoKind +Sdcb.SimdCodecs.Ico.IcoInfo.Kind.init -> void +Sdcb.SimdCodecs.Ico.IcoKind +Sdcb.SimdCodecs.Ico.IcoKind.Cursor = 2 -> Sdcb.SimdCodecs.Ico.IcoKind +Sdcb.SimdCodecs.Ico.IcoKind.Icon = 1 -> Sdcb.SimdCodecs.Ico.IcoKind +override Sdcb.SimdCodecs.Ico.IcoEntry.GetHashCode() -> int +override Sdcb.SimdCodecs.Ico.IcoFrame.GetHashCode() -> int +override Sdcb.SimdCodecs.Ico.IcoInfo.Equals(object? obj) -> bool +override Sdcb.SimdCodecs.Ico.IcoInfo.GetHashCode() -> int +override Sdcb.SimdCodecs.Ico.IcoInfo.ToString() -> string! +static Sdcb.SimdCodecs.Ico.CurImageDecoder.CanDecode(System.ReadOnlySpan header) -> bool +static Sdcb.SimdCodecs.Ico.CurImageDecoder.Registration.get -> Sdcb.SimdCodecs.Abstractions.ImageDecoderRegistration! +static Sdcb.SimdCodecs.Ico.CurImageDecoder.SignatureLength.get -> int +static Sdcb.SimdCodecs.Ico.CurImageDecoder.TryDecode(System.ReadOnlySpan data, out Sdcb.SimdCodecs.Abstractions.IDecodedImage? image, Sdcb.SimdCodecs.Abstractions.DecodeOptions? options = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> bool +static Sdcb.SimdCodecs.Ico.CurImageDecoder.TryDecodeInto(System.ReadOnlySpan data, System.Span destination, int stride, Sdcb.SimdCodecs.Abstractions.PixelFormat format, Sdcb.SimdCodecs.Abstractions.DecodeOptions? options = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> bool +static Sdcb.SimdCodecs.Ico.CurImageDecoder.TryDecodeThumbnail(System.ReadOnlySpan data, out Sdcb.SimdCodecs.Abstractions.IDecodedImage? thumbnail) -> bool +static Sdcb.SimdCodecs.Ico.CurImageDecoder.TryGetClosestSize(System.ReadOnlySpan data, int requestedWidth, int requestedHeight, out int width, out int height, out int scaleDenominator) -> bool +static Sdcb.SimdCodecs.Ico.CurImageDecoder.TryOpenFrames(System.ReadOnlyMemory data, out Sdcb.SimdCodecs.Abstractions.IImageFrameReader? reader) -> bool +static Sdcb.SimdCodecs.Ico.CurImageDecoder.TryReadInfo(System.ReadOnlySpan data, out Sdcb.SimdCodecs.Abstractions.ImageInfo info) -> bool +static Sdcb.SimdCodecs.Ico.CurImageDecoder.TryReadMetadata(System.ReadOnlySpan data, out Sdcb.SimdCodecs.Abstractions.ImageMetadata? metadata) -> bool +static Sdcb.SimdCodecs.Ico.IcoDecoder.Decode(System.ReadOnlySpan data) -> Sdcb.SimdCodecs.Ico.IcoImage! +static Sdcb.SimdCodecs.Ico.IcoDecoder.Decode(System.ReadOnlySpan data, int index) -> Sdcb.SimdCodecs.Ico.IcoImage! +static Sdcb.SimdCodecs.Ico.IcoDecoder.DecodeTo(System.ReadOnlySpan data, int index, System.Span destination, Sdcb.SimdCodecs.Abstractions.PixelFormat? format = null, int stride = 0) -> void +static Sdcb.SimdCodecs.Ico.IcoDecoder.ReadInfo(System.ReadOnlySpan data) -> Sdcb.SimdCodecs.Ico.IcoInfo! +static Sdcb.SimdCodecs.Ico.IcoDecoder.TryReadInfo(System.ReadOnlySpan data, out Sdcb.SimdCodecs.Ico.IcoInfo? info) -> bool +static Sdcb.SimdCodecs.Ico.IcoEncoder.Encode(System.Collections.Generic.IReadOnlyList! images) -> byte[]! +static Sdcb.SimdCodecs.Ico.IcoEncoder.Encode(System.ReadOnlySpan pixels, int width, int height, Sdcb.SimdCodecs.Abstractions.PixelFormat? format = null, Sdcb.SimdCodecs.Ico.IcoImageEncoding encoding = Sdcb.SimdCodecs.Ico.IcoImageEncoding.Auto) -> byte[]! +static Sdcb.SimdCodecs.Ico.IcoEncoder.EncodeCursor(System.Collections.Generic.IReadOnlyList! images) -> byte[]! +static Sdcb.SimdCodecs.Ico.IcoEntry.operator !=(Sdcb.SimdCodecs.Ico.IcoEntry left, Sdcb.SimdCodecs.Ico.IcoEntry right) -> bool +static Sdcb.SimdCodecs.Ico.IcoEntry.operator ==(Sdcb.SimdCodecs.Ico.IcoEntry left, Sdcb.SimdCodecs.Ico.IcoEntry right) -> bool +static Sdcb.SimdCodecs.Ico.IcoFrame.operator !=(Sdcb.SimdCodecs.Ico.IcoFrame left, Sdcb.SimdCodecs.Ico.IcoFrame right) -> bool +static Sdcb.SimdCodecs.Ico.IcoFrame.operator ==(Sdcb.SimdCodecs.Ico.IcoFrame left, Sdcb.SimdCodecs.Ico.IcoFrame right) -> bool +static Sdcb.SimdCodecs.Ico.IcoImageDecoder.CanDecode(System.ReadOnlySpan header) -> bool +static Sdcb.SimdCodecs.Ico.IcoImageDecoder.Registration.get -> Sdcb.SimdCodecs.Abstractions.ImageDecoderRegistration! +static Sdcb.SimdCodecs.Ico.IcoImageDecoder.SignatureLength.get -> int +static Sdcb.SimdCodecs.Ico.IcoImageDecoder.TryDecode(System.ReadOnlySpan data, out Sdcb.SimdCodecs.Abstractions.IDecodedImage? image, Sdcb.SimdCodecs.Abstractions.DecodeOptions? options = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> bool +static Sdcb.SimdCodecs.Ico.IcoImageDecoder.TryDecodeInto(System.ReadOnlySpan data, System.Span destination, int stride, Sdcb.SimdCodecs.Abstractions.PixelFormat format, Sdcb.SimdCodecs.Abstractions.DecodeOptions? options = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> bool +static Sdcb.SimdCodecs.Ico.IcoImageDecoder.TryDecodeThumbnail(System.ReadOnlySpan data, out Sdcb.SimdCodecs.Abstractions.IDecodedImage? thumbnail) -> bool +static Sdcb.SimdCodecs.Ico.IcoImageDecoder.TryGetClosestSize(System.ReadOnlySpan data, int requestedWidth, int requestedHeight, out int width, out int height, out int scaleDenominator) -> bool +static Sdcb.SimdCodecs.Ico.IcoImageDecoder.TryOpenFrames(System.ReadOnlyMemory data, out Sdcb.SimdCodecs.Abstractions.IImageFrameReader? reader) -> bool +static Sdcb.SimdCodecs.Ico.IcoImageDecoder.TryReadInfo(System.ReadOnlySpan data, out Sdcb.SimdCodecs.Abstractions.ImageInfo info) -> bool +static Sdcb.SimdCodecs.Ico.IcoImageDecoder.TryReadMetadata(System.ReadOnlySpan data, out Sdcb.SimdCodecs.Abstractions.ImageMetadata? metadata) -> bool +static Sdcb.SimdCodecs.Ico.IcoImageEncoder.Create(System.Buffers.IBufferWriter! output, Sdcb.SimdCodecs.Abstractions.EncodeOptions? options = null) -> Sdcb.SimdCodecs.Abstractions.IImageEncoderSession! +static Sdcb.SimdCodecs.Ico.IcoImageEncoder.Format.get -> Sdcb.SimdCodecs.Abstractions.ImageFormat +static Sdcb.SimdCodecs.Ico.IcoImageEncoder.GetClosestInputFormat(Sdcb.SimdCodecs.Abstractions.PixelFormat requested) -> Sdcb.SimdCodecs.Abstractions.PixelFormat +static Sdcb.SimdCodecs.Ico.IcoImageEncoder.Registration.get -> Sdcb.SimdCodecs.Abstractions.ImageEncoderRegistration! +static Sdcb.SimdCodecs.Ico.IcoInfo.operator !=(Sdcb.SimdCodecs.Ico.IcoInfo? left, Sdcb.SimdCodecs.Ico.IcoInfo? right) -> bool +static Sdcb.SimdCodecs.Ico.IcoInfo.operator ==(Sdcb.SimdCodecs.Ico.IcoInfo? left, Sdcb.SimdCodecs.Ico.IcoInfo? right) -> bool +~override Sdcb.SimdCodecs.Ico.IcoEntry.Equals(object obj) -> bool +~override Sdcb.SimdCodecs.Ico.IcoEntry.ToString() -> string +~override Sdcb.SimdCodecs.Ico.IcoFrame.Equals(object obj) -> bool +~override Sdcb.SimdCodecs.Ico.IcoFrame.ToString() -> string diff --git a/src/Sdcb.SimdCodecs.Ico/PublicAPI.Unshipped.txt b/src/Sdcb.SimdCodecs.Ico/PublicAPI.Unshipped.txt new file mode 100644 index 0000000..7dc5c58 --- /dev/null +++ b/src/Sdcb.SimdCodecs.Ico/PublicAPI.Unshipped.txt @@ -0,0 +1 @@ +#nullable enable diff --git a/src/Sdcb.SimdCodecs.Jbig2/PublicAPI.Shipped.txt b/src/Sdcb.SimdCodecs.Jbig2/PublicAPI.Shipped.txt new file mode 100644 index 0000000..9e5cd0c --- /dev/null +++ b/src/Sdcb.SimdCodecs.Jbig2/PublicAPI.Shipped.txt @@ -0,0 +1,26 @@ +#nullable enable +Sdcb.SimdCodecs.Jbig2.Jbig2Decoder +Sdcb.SimdCodecs.Jbig2.Jbig2Image +Sdcb.SimdCodecs.Jbig2.Jbig2Image.Bits.get -> System.ReadOnlySpan +Sdcb.SimdCodecs.Jbig2.Jbig2Image.ExpandToGray8(System.Span destination) -> void +Sdcb.SimdCodecs.Jbig2.Jbig2Image.Height.get -> int +Sdcb.SimdCodecs.Jbig2.Jbig2Image.ToGray8() -> byte[]! +Sdcb.SimdCodecs.Jbig2.Jbig2Image.ToRaster(System.Buffers.ArrayPool? pool = null) -> Sdcb.SimdCodecs.Abstractions.RasterImage! +Sdcb.SimdCodecs.Jbig2.Jbig2Image.Width.get -> int +Sdcb.SimdCodecs.Jbig2.Jbig2ImageDecoder +Sdcb.SimdCodecs.Jbig2.Jbig2ImageDecoder.Jbig2ImageDecoder() -> void +static Sdcb.SimdCodecs.Jbig2.Jbig2Decoder.Decode(System.ReadOnlySpan embedded, System.ReadOnlySpan globals, int width, int height, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> Sdcb.SimdCodecs.Jbig2.Jbig2Image! +static Sdcb.SimdCodecs.Jbig2.Jbig2Decoder.Decode(System.ReadOnlySpan embedded, int width, int height, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> Sdcb.SimdCodecs.Jbig2.Jbig2Image! +static Sdcb.SimdCodecs.Jbig2.Jbig2Decoder.DecodeFile(System.ReadOnlySpan file, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> Sdcb.SimdCodecs.Jbig2.Jbig2Image! +static Sdcb.SimdCodecs.Jbig2.Jbig2Decoder.FileSignature.get -> System.ReadOnlySpan +static Sdcb.SimdCodecs.Jbig2.Jbig2Decoder.TryReadFileInfo(System.ReadOnlySpan file, out int width, out int height) -> bool +static Sdcb.SimdCodecs.Jbig2.Jbig2ImageDecoder.CanDecode(System.ReadOnlySpan header) -> bool +static Sdcb.SimdCodecs.Jbig2.Jbig2ImageDecoder.Registration.get -> Sdcb.SimdCodecs.Abstractions.ImageDecoderRegistration! +static Sdcb.SimdCodecs.Jbig2.Jbig2ImageDecoder.SignatureLength.get -> int +static Sdcb.SimdCodecs.Jbig2.Jbig2ImageDecoder.TryDecode(System.ReadOnlySpan data, out Sdcb.SimdCodecs.Abstractions.IDecodedImage? image, Sdcb.SimdCodecs.Abstractions.DecodeOptions? options = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> bool +static Sdcb.SimdCodecs.Jbig2.Jbig2ImageDecoder.TryDecodeInto(System.ReadOnlySpan data, System.Span destination, int stride, Sdcb.SimdCodecs.Abstractions.PixelFormat format, Sdcb.SimdCodecs.Abstractions.DecodeOptions? options = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> bool +static Sdcb.SimdCodecs.Jbig2.Jbig2ImageDecoder.TryDecodeIntoRgba8(System.ReadOnlySpan data, System.Span rgbaDestination) -> bool +static Sdcb.SimdCodecs.Jbig2.Jbig2ImageDecoder.TryDecodeThumbnail(System.ReadOnlySpan data, out Sdcb.SimdCodecs.Abstractions.IDecodedImage? thumbnail) -> bool +static Sdcb.SimdCodecs.Jbig2.Jbig2ImageDecoder.TryGetClosestSize(System.ReadOnlySpan data, int requestedWidth, int requestedHeight, out int width, out int height, out int scaleDenominator) -> bool +static Sdcb.SimdCodecs.Jbig2.Jbig2ImageDecoder.TryReadInfo(System.ReadOnlySpan data, out Sdcb.SimdCodecs.Abstractions.ImageInfo info) -> bool +static Sdcb.SimdCodecs.Jbig2.Jbig2ImageDecoder.TryReadMetadata(System.ReadOnlySpan data, out Sdcb.SimdCodecs.Abstractions.ImageMetadata? metadata) -> bool diff --git a/src/Sdcb.SimdCodecs.Jbig2/PublicAPI.Unshipped.txt b/src/Sdcb.SimdCodecs.Jbig2/PublicAPI.Unshipped.txt new file mode 100644 index 0000000..7dc5c58 --- /dev/null +++ b/src/Sdcb.SimdCodecs.Jbig2/PublicAPI.Unshipped.txt @@ -0,0 +1 @@ +#nullable enable diff --git a/src/Sdcb.SimdCodecs.Jpeg.GainMap/PublicAPI.Shipped.txt b/src/Sdcb.SimdCodecs.Jpeg.GainMap/PublicAPI.Shipped.txt new file mode 100644 index 0000000..656e399 --- /dev/null +++ b/src/Sdcb.SimdCodecs.Jpeg.GainMap/PublicAPI.Shipped.txt @@ -0,0 +1,114 @@ +#nullable enable +Sdcb.SimdCodecs.Jpeg.GainMapComputeResult +Sdcb.SimdCodecs.Jpeg.GainMapComputeResult.$() -> Sdcb.SimdCodecs.Jpeg.GainMapComputeResult! +Sdcb.SimdCodecs.Jpeg.GainMapComputeResult.Deconstruct(out byte[]! GainMapGray8, out int Width, out int Height, out Sdcb.SimdCodecs.Jpeg.GainMapMetadata! Metadata) -> void +Sdcb.SimdCodecs.Jpeg.GainMapComputeResult.Equals(Sdcb.SimdCodecs.Jpeg.GainMapComputeResult? other) -> bool +Sdcb.SimdCodecs.Jpeg.GainMapComputeResult.GainMapComputeResult(byte[]! GainMapGray8, int Width, int Height, Sdcb.SimdCodecs.Jpeg.GainMapMetadata! Metadata) -> void +Sdcb.SimdCodecs.Jpeg.GainMapComputeResult.GainMapGray8.get -> byte[]! +Sdcb.SimdCodecs.Jpeg.GainMapComputeResult.GainMapGray8.init -> void +Sdcb.SimdCodecs.Jpeg.GainMapComputeResult.Height.get -> int +Sdcb.SimdCodecs.Jpeg.GainMapComputeResult.Height.init -> void +Sdcb.SimdCodecs.Jpeg.GainMapComputeResult.Metadata.get -> Sdcb.SimdCodecs.Jpeg.GainMapMetadata! +Sdcb.SimdCodecs.Jpeg.GainMapComputeResult.Metadata.init -> void +Sdcb.SimdCodecs.Jpeg.GainMapComputeResult.Width.get -> int +Sdcb.SimdCodecs.Jpeg.GainMapComputeResult.Width.init -> void +Sdcb.SimdCodecs.Jpeg.GainMapDecodedImage +Sdcb.SimdCodecs.Jpeg.GainMapDecodedImage.Channels.get -> int +Sdcb.SimdCodecs.Jpeg.GainMapDecodedImage.ColorEncoding.get -> Sdcb.SimdCodecs.Abstractions.ColorEncoding! +Sdcb.SimdCodecs.Jpeg.GainMapDecodedImage.Dispose() -> void +Sdcb.SimdCodecs.Jpeg.GainMapDecodedImage.GainMapDecodedImage(Sdcb.SimdCodecs.Jpeg.GainMapImage! source, double displayHeadroom, Sdcb.SimdCodecs.Abstractions.ColorPrimaries primaries = Sdcb.SimdCodecs.Abstractions.ColorPrimaries.BT709) -> void +Sdcb.SimdCodecs.Jpeg.GainMapDecodedImage.Height.get -> int +Sdcb.SimdCodecs.Jpeg.GainMapDecodedImage.IccProfile.get -> System.ReadOnlySpan +Sdcb.SimdCodecs.Jpeg.GainMapDecodedImage.Metadata.get -> Sdcb.SimdCodecs.Abstractions.ImageMetadata! +Sdcb.SimdCodecs.Jpeg.GainMapDecodedImage.Metadata.init -> void +Sdcb.SimdCodecs.Jpeg.GainMapDecodedImage.Pixels.get -> System.ReadOnlySpan +Sdcb.SimdCodecs.Jpeg.GainMapDecodedImage.SampleFormat.get -> Sdcb.SimdCodecs.Abstractions.SampleFormat +Sdcb.SimdCodecs.Jpeg.GainMapDecodedImage.Source.get -> Sdcb.SimdCodecs.Jpeg.GainMapImage! +Sdcb.SimdCodecs.Jpeg.GainMapDecodedImage.ToFloats() -> float[]! +Sdcb.SimdCodecs.Jpeg.GainMapDecodedImage.ToRgba16() -> ushort[]! +Sdcb.SimdCodecs.Jpeg.GainMapDecodedImage.ToRgba8() -> byte[]! +Sdcb.SimdCodecs.Jpeg.GainMapDecodedImage.TryCopyTo(System.Span destination, int stride, Sdcb.SimdCodecs.Abstractions.PixelFormat format) -> bool +Sdcb.SimdCodecs.Jpeg.GainMapDecodedImage.Width.get -> int +Sdcb.SimdCodecs.Jpeg.GainMapImage +Sdcb.SimdCodecs.Jpeg.GainMapImage.Base.get -> Sdcb.SimdCodecs.Abstractions.RasterImage! +Sdcb.SimdCodecs.Jpeg.GainMapImage.GainMap.get -> Sdcb.SimdCodecs.Abstractions.RasterImage! +Sdcb.SimdCodecs.Jpeg.GainMapImage.GainMapImage(Sdcb.SimdCodecs.Abstractions.RasterImage! baseImage, Sdcb.SimdCodecs.Abstractions.RasterImage! gainMap, Sdcb.SimdCodecs.Jpeg.GainMapMetadata! metadata) -> void +Sdcb.SimdCodecs.Jpeg.GainMapImage.Metadata.get -> Sdcb.SimdCodecs.Jpeg.GainMapMetadata! +Sdcb.SimdCodecs.Jpeg.GainMapImage.ReconstructHdr(double displayHeadroom) -> Sdcb.SimdCodecs.Abstractions.RasterImage! +Sdcb.SimdCodecs.Jpeg.GainMapImage.Weight(double displayHeadroom) -> double +Sdcb.SimdCodecs.Jpeg.GainMapImageDecoder +Sdcb.SimdCodecs.Jpeg.GainMapImageDecoder.GainMapImageDecoder() -> void +Sdcb.SimdCodecs.Jpeg.GainMapMetadata +Sdcb.SimdCodecs.Jpeg.GainMapMetadata.$() -> Sdcb.SimdCodecs.Jpeg.GainMapMetadata! +Sdcb.SimdCodecs.Jpeg.GainMapMetadata.BaseRenditionIsHdr.get -> bool +Sdcb.SimdCodecs.Jpeg.GainMapMetadata.BaseRenditionIsHdr.init -> void +Sdcb.SimdCodecs.Jpeg.GainMapMetadata.Equals(Sdcb.SimdCodecs.Jpeg.GainMapMetadata? other) -> bool +Sdcb.SimdCodecs.Jpeg.GainMapMetadata.GainMapMax.get -> double +Sdcb.SimdCodecs.Jpeg.GainMapMetadata.GainMapMax.init -> void +Sdcb.SimdCodecs.Jpeg.GainMapMetadata.GainMapMetadata() -> void +Sdcb.SimdCodecs.Jpeg.GainMapMetadata.GainMapMin.get -> double +Sdcb.SimdCodecs.Jpeg.GainMapMetadata.GainMapMin.init -> void +Sdcb.SimdCodecs.Jpeg.GainMapMetadata.Gamma.get -> double +Sdcb.SimdCodecs.Jpeg.GainMapMetadata.Gamma.init -> void +Sdcb.SimdCodecs.Jpeg.GainMapMetadata.HdrCapacityMax.get -> double +Sdcb.SimdCodecs.Jpeg.GainMapMetadata.HdrCapacityMax.init -> void +Sdcb.SimdCodecs.Jpeg.GainMapMetadata.HdrCapacityMin.get -> double +Sdcb.SimdCodecs.Jpeg.GainMapMetadata.HdrCapacityMin.init -> void +Sdcb.SimdCodecs.Jpeg.GainMapMetadata.OffsetHdr.get -> double +Sdcb.SimdCodecs.Jpeg.GainMapMetadata.OffsetHdr.init -> void +Sdcb.SimdCodecs.Jpeg.GainMapMetadata.OffsetSdr.get -> double +Sdcb.SimdCodecs.Jpeg.GainMapMetadata.OffsetSdr.init -> void +Sdcb.SimdCodecs.Jpeg.GainMapMetadata.Validate() -> void +Sdcb.SimdCodecs.Jpeg.GainMapXmp +Sdcb.SimdCodecs.Jpeg.JpegGainMap +Sdcb.SimdCodecs.Jpeg.MpfSegment +Sdcb.SimdCodecs.Jpeg.MpfSegment.Entry +Sdcb.SimdCodecs.Jpeg.MpfSegment.Entry.Attribute.get -> uint +Sdcb.SimdCodecs.Jpeg.MpfSegment.Entry.Attribute.init -> void +Sdcb.SimdCodecs.Jpeg.MpfSegment.Entry.Deconstruct(out uint Attribute, out uint ImageLength, out long ImageOffset) -> void +Sdcb.SimdCodecs.Jpeg.MpfSegment.Entry.Entry() -> void +Sdcb.SimdCodecs.Jpeg.MpfSegment.Entry.Entry(uint Attribute, uint ImageLength, long ImageOffset) -> void +Sdcb.SimdCodecs.Jpeg.MpfSegment.Entry.Equals(Sdcb.SimdCodecs.Jpeg.MpfSegment.Entry other) -> bool +Sdcb.SimdCodecs.Jpeg.MpfSegment.Entry.ImageLength.get -> uint +Sdcb.SimdCodecs.Jpeg.MpfSegment.Entry.ImageLength.init -> void +Sdcb.SimdCodecs.Jpeg.MpfSegment.Entry.ImageOffset.get -> long +Sdcb.SimdCodecs.Jpeg.MpfSegment.Entry.ImageOffset.init -> void +const Sdcb.SimdCodecs.Jpeg.MpfSegment.TotalLength = 90 -> int +override Sdcb.SimdCodecs.Jpeg.GainMapComputeResult.Equals(object? obj) -> bool +override Sdcb.SimdCodecs.Jpeg.GainMapComputeResult.GetHashCode() -> int +override Sdcb.SimdCodecs.Jpeg.GainMapComputeResult.ToString() -> string! +override Sdcb.SimdCodecs.Jpeg.GainMapMetadata.Equals(object? obj) -> bool +override Sdcb.SimdCodecs.Jpeg.GainMapMetadata.GetHashCode() -> int +override Sdcb.SimdCodecs.Jpeg.GainMapMetadata.ToString() -> string! +override Sdcb.SimdCodecs.Jpeg.MpfSegment.Entry.GetHashCode() -> int +static Sdcb.SimdCodecs.Jpeg.GainMapComputeResult.operator !=(Sdcb.SimdCodecs.Jpeg.GainMapComputeResult? left, Sdcb.SimdCodecs.Jpeg.GainMapComputeResult? right) -> bool +static Sdcb.SimdCodecs.Jpeg.GainMapComputeResult.operator ==(Sdcb.SimdCodecs.Jpeg.GainMapComputeResult? left, Sdcb.SimdCodecs.Jpeg.GainMapComputeResult? right) -> bool +static Sdcb.SimdCodecs.Jpeg.GainMapImageDecoder.CanDecode(System.ReadOnlySpan header) -> bool +static Sdcb.SimdCodecs.Jpeg.GainMapImageDecoder.Registration.get -> Sdcb.SimdCodecs.Abstractions.ImageDecoderRegistration! +static Sdcb.SimdCodecs.Jpeg.GainMapImageDecoder.SignatureLength.get -> int +static Sdcb.SimdCodecs.Jpeg.GainMapImageDecoder.TryDecode(System.ReadOnlySpan data, out Sdcb.SimdCodecs.Abstractions.IDecodedImage? image, Sdcb.SimdCodecs.Abstractions.DecodeOptions? options = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> bool +static Sdcb.SimdCodecs.Jpeg.GainMapImageDecoder.TryDecodeInto(System.ReadOnlySpan data, System.Span destination, int stride, Sdcb.SimdCodecs.Abstractions.PixelFormat format, Sdcb.SimdCodecs.Abstractions.DecodeOptions? options = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> bool +static Sdcb.SimdCodecs.Jpeg.GainMapImageDecoder.TryDecodeIntoRgba8(System.ReadOnlySpan data, System.Span rgbaDestination) -> bool +static Sdcb.SimdCodecs.Jpeg.GainMapImageDecoder.TryDecodeThumbnail(System.ReadOnlySpan data, out Sdcb.SimdCodecs.Abstractions.IDecodedImage? thumbnail) -> bool +static Sdcb.SimdCodecs.Jpeg.GainMapImageDecoder.TryGetClosestSize(System.ReadOnlySpan data, int requestedWidth, int requestedHeight, out int width, out int height, out int scaleDenominator) -> bool +static Sdcb.SimdCodecs.Jpeg.GainMapImageDecoder.TryReadInfo(System.ReadOnlySpan data, out Sdcb.SimdCodecs.Abstractions.ImageInfo info) -> bool +static Sdcb.SimdCodecs.Jpeg.GainMapImageDecoder.TryReadMetadata(System.ReadOnlySpan data, out Sdcb.SimdCodecs.Abstractions.ImageMetadata? metadata) -> bool +static Sdcb.SimdCodecs.Jpeg.GainMapMetadata.operator !=(Sdcb.SimdCodecs.Jpeg.GainMapMetadata? left, Sdcb.SimdCodecs.Jpeg.GainMapMetadata? right) -> bool +static Sdcb.SimdCodecs.Jpeg.GainMapMetadata.operator ==(Sdcb.SimdCodecs.Jpeg.GainMapMetadata? left, Sdcb.SimdCodecs.Jpeg.GainMapMetadata? right) -> bool +static Sdcb.SimdCodecs.Jpeg.GainMapXmp.App1Identifier.get -> System.ReadOnlySpan +static Sdcb.SimdCodecs.Jpeg.GainMapXmp.TryParseContainerGainMapLength(System.ReadOnlySpan xmpPacket, out int gainMapLength) -> bool +static Sdcb.SimdCodecs.Jpeg.GainMapXmp.TryParseGainMapMetadata(System.ReadOnlySpan xmpPacket, out Sdcb.SimdCodecs.Jpeg.GainMapMetadata? metadata) -> bool +static Sdcb.SimdCodecs.Jpeg.GainMapXmp.WriteGainMapApp1(Sdcb.SimdCodecs.Jpeg.GainMapMetadata! metadata) -> byte[]! +static Sdcb.SimdCodecs.Jpeg.GainMapXmp.WritePrimaryApp1(int gainMapLength) -> byte[]! +static Sdcb.SimdCodecs.Jpeg.JpegGainMap.Assemble(System.ReadOnlySpan sdrBaseJpeg, System.ReadOnlySpan gainMapJpeg, Sdcb.SimdCodecs.Jpeg.GainMapMetadata! metadata) -> byte[]! +static Sdcb.SimdCodecs.Jpeg.JpegGainMap.Compute(System.ReadOnlySpan hdrLinearRgb, System.ReadOnlySpan sdrRgb8, int width, int height, int downscale = 4) -> Sdcb.SimdCodecs.Jpeg.GainMapComputeResult! +static Sdcb.SimdCodecs.Jpeg.JpegGainMap.RemoveGainMapMetadata(System.ReadOnlySpan jpeg) -> byte[]! +static Sdcb.SimdCodecs.Jpeg.JpegGainMap.TryRead(System.ReadOnlySpan jpeg, out Sdcb.SimdCodecs.Jpeg.GainMapImage? image) -> bool +static Sdcb.SimdCodecs.Jpeg.JpegGainMap.TrySplit(System.ReadOnlySpan jpeg, out System.Range baseJpeg, out System.Range gainMapJpeg, out Sdcb.SimdCodecs.Jpeg.GainMapMetadata? metadata) -> bool +static Sdcb.SimdCodecs.Jpeg.MpfSegment.Entry.operator !=(Sdcb.SimdCodecs.Jpeg.MpfSegment.Entry left, Sdcb.SimdCodecs.Jpeg.MpfSegment.Entry right) -> bool +static Sdcb.SimdCodecs.Jpeg.MpfSegment.Entry.operator ==(Sdcb.SimdCodecs.Jpeg.MpfSegment.Entry left, Sdcb.SimdCodecs.Jpeg.MpfSegment.Entry right) -> bool +static Sdcb.SimdCodecs.Jpeg.MpfSegment.Identifier.get -> System.ReadOnlySpan +static Sdcb.SimdCodecs.Jpeg.MpfSegment.TryParse(System.ReadOnlySpan payload, long payloadOffset, out Sdcb.SimdCodecs.Jpeg.MpfSegment.Entry[]! entries) -> bool +static Sdcb.SimdCodecs.Jpeg.MpfSegment.Write(int segmentOffset, int primaryImageLength, int gainMapImageLength) -> byte[]! +~override Sdcb.SimdCodecs.Jpeg.MpfSegment.Entry.Equals(object obj) -> bool +~override Sdcb.SimdCodecs.Jpeg.MpfSegment.Entry.ToString() -> string diff --git a/src/Sdcb.SimdCodecs.Jpeg.GainMap/PublicAPI.Unshipped.txt b/src/Sdcb.SimdCodecs.Jpeg.GainMap/PublicAPI.Unshipped.txt new file mode 100644 index 0000000..7dc5c58 --- /dev/null +++ b/src/Sdcb.SimdCodecs.Jpeg.GainMap/PublicAPI.Unshipped.txt @@ -0,0 +1 @@ +#nullable enable diff --git a/src/Sdcb.SimdCodecs.Jpeg.IccInjector/PublicAPI.Shipped.txt b/src/Sdcb.SimdCodecs.Jpeg.IccInjector/PublicAPI.Shipped.txt new file mode 100644 index 0000000..eed8e1d --- /dev/null +++ b/src/Sdcb.SimdCodecs.Jpeg.IccInjector/PublicAPI.Shipped.txt @@ -0,0 +1,3 @@ +#nullable enable +Sdcb.SimdCodecs.Jpeg.JpegIccInjector +static Sdcb.SimdCodecs.Jpeg.JpegIccInjector.EmbedIccProfile(System.ReadOnlySpan jpeg, System.ReadOnlyMemory profile) -> byte[]! diff --git a/src/Sdcb.SimdCodecs.Jpeg.IccInjector/PublicAPI.Unshipped.txt b/src/Sdcb.SimdCodecs.Jpeg.IccInjector/PublicAPI.Unshipped.txt new file mode 100644 index 0000000..7dc5c58 --- /dev/null +++ b/src/Sdcb.SimdCodecs.Jpeg.IccInjector/PublicAPI.Unshipped.txt @@ -0,0 +1 @@ +#nullable enable diff --git a/src/Sdcb.SimdCodecs.Jpeg/PublicAPI.Shipped.txt b/src/Sdcb.SimdCodecs.Jpeg/PublicAPI.Shipped.txt new file mode 100644 index 0000000..af0bf9f --- /dev/null +++ b/src/Sdcb.SimdCodecs.Jpeg/PublicAPI.Shipped.txt @@ -0,0 +1,188 @@ +#nullable enable +Sdcb.SimdCodecs.Jpeg.JpegComponentInfo +Sdcb.SimdCodecs.Jpeg.JpegComponentInfo.Deconstruct(out int Id, out int HorizontalSampling, out int VerticalSampling) -> void +Sdcb.SimdCodecs.Jpeg.JpegComponentInfo.Equals(Sdcb.SimdCodecs.Jpeg.JpegComponentInfo other) -> bool +Sdcb.SimdCodecs.Jpeg.JpegComponentInfo.HorizontalSampling.get -> int +Sdcb.SimdCodecs.Jpeg.JpegComponentInfo.HorizontalSampling.init -> void +Sdcb.SimdCodecs.Jpeg.JpegComponentInfo.Id.get -> int +Sdcb.SimdCodecs.Jpeg.JpegComponentInfo.Id.init -> void +Sdcb.SimdCodecs.Jpeg.JpegComponentInfo.JpegComponentInfo() -> void +Sdcb.SimdCodecs.Jpeg.JpegComponentInfo.JpegComponentInfo(int Id, int HorizontalSampling, int VerticalSampling) -> void +Sdcb.SimdCodecs.Jpeg.JpegComponentInfo.VerticalSampling.get -> int +Sdcb.SimdCodecs.Jpeg.JpegComponentInfo.VerticalSampling.init -> void +Sdcb.SimdCodecs.Jpeg.JpegDecoder +Sdcb.SimdCodecs.Jpeg.JpegEncodeOptions +Sdcb.SimdCodecs.Jpeg.JpegEncodeOptions.Equals(Sdcb.SimdCodecs.Jpeg.JpegEncodeOptions? other) -> bool +Sdcb.SimdCodecs.Jpeg.JpegEncodeOptions.Exif.get -> System.ReadOnlyMemory? +Sdcb.SimdCodecs.Jpeg.JpegEncodeOptions.Exif.init -> void +Sdcb.SimdCodecs.Jpeg.JpegEncodeOptions.IccProfile.get -> System.ReadOnlyMemory? +Sdcb.SimdCodecs.Jpeg.JpegEncodeOptions.IccProfile.init -> void +Sdcb.SimdCodecs.Jpeg.JpegEncodeOptions.JpegEncodeOptions() -> void +Sdcb.SimdCodecs.Jpeg.JpegEncodeOptions.OptimizeHuffman.get -> bool +Sdcb.SimdCodecs.Jpeg.JpegEncodeOptions.OptimizeHuffman.init -> void +Sdcb.SimdCodecs.Jpeg.JpegEncodeOptions.Progressive.get -> bool +Sdcb.SimdCodecs.Jpeg.JpegEncodeOptions.Progressive.init -> void +Sdcb.SimdCodecs.Jpeg.JpegEncodeOptions.Quality.get -> int +Sdcb.SimdCodecs.Jpeg.JpegEncodeOptions.Quality.init -> void +Sdcb.SimdCodecs.Jpeg.JpegEncodeOptions.Subsampling.get -> Sdcb.SimdCodecs.Jpeg.JpegSubsampling +Sdcb.SimdCodecs.Jpeg.JpegEncodeOptions.Subsampling.init -> void +Sdcb.SimdCodecs.Jpeg.JpegEncodeOptions.Xmp.get -> Sdcb.SimdCodecs.Jpeg.JpegXmp? +Sdcb.SimdCodecs.Jpeg.JpegEncodeOptions.Xmp.init -> void +Sdcb.SimdCodecs.Jpeg.JpegEncoder +Sdcb.SimdCodecs.Jpeg.JpegImage +Sdcb.SimdCodecs.Jpeg.JpegImage.Height.get -> int +Sdcb.SimdCodecs.Jpeg.JpegImage.Pixels.get -> byte[]! +Sdcb.SimdCodecs.Jpeg.JpegImage.Width.get -> int +Sdcb.SimdCodecs.Jpeg.JpegImageDecoder +Sdcb.SimdCodecs.Jpeg.JpegImageDecoder.JpegImageDecoder() -> void +Sdcb.SimdCodecs.Jpeg.JpegImageEncoder +Sdcb.SimdCodecs.Jpeg.JpegImageEncoder.JpegImageEncoder() -> void +Sdcb.SimdCodecs.Jpeg.JpegInfo +Sdcb.SimdCodecs.Jpeg.JpegInfo.$() -> Sdcb.SimdCodecs.Jpeg.JpegInfo! +Sdcb.SimdCodecs.Jpeg.JpegInfo.ChromaSubsampled.get -> bool +Sdcb.SimdCodecs.Jpeg.JpegInfo.ChromaSubsampled.init -> void +Sdcb.SimdCodecs.Jpeg.JpegInfo.ChromaSubsamplingRatio.get -> string? +Sdcb.SimdCodecs.Jpeg.JpegInfo.ComponentInfo.get -> System.Collections.Generic.IReadOnlyList! +Sdcb.SimdCodecs.Jpeg.JpegInfo.ComponentInfo.init -> void +Sdcb.SimdCodecs.Jpeg.JpegInfo.Components.get -> int +Sdcb.SimdCodecs.Jpeg.JpegInfo.Components.init -> void +Sdcb.SimdCodecs.Jpeg.JpegInfo.Deconstruct(out int Width, out int Height, out int Components, out bool Progressive) -> void +Sdcb.SimdCodecs.Jpeg.JpegInfo.Equals(Sdcb.SimdCodecs.Jpeg.JpegInfo? other) -> bool +Sdcb.SimdCodecs.Jpeg.JpegInfo.Height.get -> int +Sdcb.SimdCodecs.Jpeg.JpegInfo.Height.init -> void +Sdcb.SimdCodecs.Jpeg.JpegInfo.JpegInfo(int Width, int Height, int Components, bool Progressive) -> void +Sdcb.SimdCodecs.Jpeg.JpegInfo.Orientation.get -> Sdcb.SimdCodecs.Abstractions.ImageOrientation +Sdcb.SimdCodecs.Jpeg.JpegInfo.Orientation.init -> void +Sdcb.SimdCodecs.Jpeg.JpegInfo.Progressive.get -> bool +Sdcb.SimdCodecs.Jpeg.JpegInfo.Progressive.init -> void +Sdcb.SimdCodecs.Jpeg.JpegInfo.ScaledSize(Sdcb.SimdCodecs.Jpeg.JpegScale scale) -> (int Width, int Height) +Sdcb.SimdCodecs.Jpeg.JpegInfo.Width.get -> int +Sdcb.SimdCodecs.Jpeg.JpegInfo.Width.init -> void +Sdcb.SimdCodecs.Jpeg.JpegPixelFormat +Sdcb.SimdCodecs.Jpeg.JpegPixelFormat.Bgr24 = 3 -> Sdcb.SimdCodecs.Jpeg.JpegPixelFormat +Sdcb.SimdCodecs.Jpeg.JpegPixelFormat.Bgra32 = 1 -> Sdcb.SimdCodecs.Jpeg.JpegPixelFormat +Sdcb.SimdCodecs.Jpeg.JpegPixelFormat.Gray8 = 4 -> Sdcb.SimdCodecs.Jpeg.JpegPixelFormat +Sdcb.SimdCodecs.Jpeg.JpegPixelFormat.Rgb24 = 2 -> Sdcb.SimdCodecs.Jpeg.JpegPixelFormat +Sdcb.SimdCodecs.Jpeg.JpegPixelFormat.Rgba32 = 0 -> Sdcb.SimdCodecs.Jpeg.JpegPixelFormat +Sdcb.SimdCodecs.Jpeg.JpegScale +Sdcb.SimdCodecs.Jpeg.JpegScale.Eighth = 8 -> Sdcb.SimdCodecs.Jpeg.JpegScale +Sdcb.SimdCodecs.Jpeg.JpegScale.Full = 1 -> Sdcb.SimdCodecs.Jpeg.JpegScale +Sdcb.SimdCodecs.Jpeg.JpegScale.Half = 2 -> Sdcb.SimdCodecs.Jpeg.JpegScale +Sdcb.SimdCodecs.Jpeg.JpegScale.Quarter = 4 -> Sdcb.SimdCodecs.Jpeg.JpegScale +Sdcb.SimdCodecs.Jpeg.JpegSegment +Sdcb.SimdCodecs.Jpeg.JpegSegment.Deconstruct(out byte Marker, out int SegmentOffset, out int PayloadOffset, out int PayloadLength) -> void +Sdcb.SimdCodecs.Jpeg.JpegSegment.Equals(Sdcb.SimdCodecs.Jpeg.JpegSegment other) -> bool +Sdcb.SimdCodecs.Jpeg.JpegSegment.JpegSegment() -> void +Sdcb.SimdCodecs.Jpeg.JpegSegment.JpegSegment(byte Marker, int SegmentOffset, int PayloadOffset, int PayloadLength) -> void +Sdcb.SimdCodecs.Jpeg.JpegSegment.Marker.get -> byte +Sdcb.SimdCodecs.Jpeg.JpegSegment.Marker.init -> void +Sdcb.SimdCodecs.Jpeg.JpegSegment.Payload(System.ReadOnlySpan jpeg) -> System.ReadOnlySpan +Sdcb.SimdCodecs.Jpeg.JpegSegment.PayloadLength.get -> int +Sdcb.SimdCodecs.Jpeg.JpegSegment.PayloadLength.init -> void +Sdcb.SimdCodecs.Jpeg.JpegSegment.PayloadOffset.get -> int +Sdcb.SimdCodecs.Jpeg.JpegSegment.PayloadOffset.init -> void +Sdcb.SimdCodecs.Jpeg.JpegSegment.SegmentOffset.get -> int +Sdcb.SimdCodecs.Jpeg.JpegSegment.SegmentOffset.init -> void +Sdcb.SimdCodecs.Jpeg.JpegSegment.TotalLength.get -> int +Sdcb.SimdCodecs.Jpeg.JpegSegmentScanner +Sdcb.SimdCodecs.Jpeg.JpegSubsampling +Sdcb.SimdCodecs.Jpeg.JpegSubsampling.Auto = 0 -> Sdcb.SimdCodecs.Jpeg.JpegSubsampling +Sdcb.SimdCodecs.Jpeg.JpegSubsampling.Chroma420 = 2 -> Sdcb.SimdCodecs.Jpeg.JpegSubsampling +Sdcb.SimdCodecs.Jpeg.JpegSubsampling.Chroma444 = 1 -> Sdcb.SimdCodecs.Jpeg.JpegSubsampling +Sdcb.SimdCodecs.Jpeg.JpegXmp +Sdcb.SimdCodecs.Jpeg.JpegXmp.$() -> Sdcb.SimdCodecs.Jpeg.JpegXmp! +Sdcb.SimdCodecs.Jpeg.JpegXmp.BuildPacket() -> byte[]! +Sdcb.SimdCodecs.Jpeg.JpegXmp.CreatorTool.get -> string? +Sdcb.SimdCodecs.Jpeg.JpegXmp.CreatorTool.init -> void +Sdcb.SimdCodecs.Jpeg.JpegXmp.CustomNamespaceUri.get -> string? +Sdcb.SimdCodecs.Jpeg.JpegXmp.CustomNamespaceUri.init -> void +Sdcb.SimdCodecs.Jpeg.JpegXmp.CustomPrefix.get -> string? +Sdcb.SimdCodecs.Jpeg.JpegXmp.CustomPrefix.init -> void +Sdcb.SimdCodecs.Jpeg.JpegXmp.CustomProperties.get -> System.Collections.Generic.IReadOnlyList>? +Sdcb.SimdCodecs.Jpeg.JpegXmp.CustomProperties.init -> void +Sdcb.SimdCodecs.Jpeg.JpegXmp.Description.get -> string? +Sdcb.SimdCodecs.Jpeg.JpegXmp.Description.init -> void +Sdcb.SimdCodecs.Jpeg.JpegXmp.Equals(Sdcb.SimdCodecs.Jpeg.JpegXmp? other) -> bool +Sdcb.SimdCodecs.Jpeg.JpegXmp.JpegXmp() -> void +Sdcb.SimdCodecs.Jpeg.LosslessJpeg +Sdcb.SimdCodecs.Jpeg.LosslessJpegResult +Sdcb.SimdCodecs.Jpeg.LosslessJpegResult.$() -> Sdcb.SimdCodecs.Jpeg.LosslessJpegResult! +Sdcb.SimdCodecs.Jpeg.LosslessJpegResult.Components.get -> int +Sdcb.SimdCodecs.Jpeg.LosslessJpegResult.Components.init -> void +Sdcb.SimdCodecs.Jpeg.LosslessJpegResult.Deconstruct(out int Width, out int Height, out int Precision, out int Components, out ushort[]! Samples) -> void +Sdcb.SimdCodecs.Jpeg.LosslessJpegResult.Equals(Sdcb.SimdCodecs.Jpeg.LosslessJpegResult? other) -> bool +Sdcb.SimdCodecs.Jpeg.LosslessJpegResult.Height.get -> int +Sdcb.SimdCodecs.Jpeg.LosslessJpegResult.Height.init -> void +Sdcb.SimdCodecs.Jpeg.LosslessJpegResult.LosslessJpegResult(int Width, int Height, int Precision, int Components, ushort[]! Samples) -> void +Sdcb.SimdCodecs.Jpeg.LosslessJpegResult.Precision.get -> int +Sdcb.SimdCodecs.Jpeg.LosslessJpegResult.Precision.init -> void +Sdcb.SimdCodecs.Jpeg.LosslessJpegResult.Samples.get -> ushort[]! +Sdcb.SimdCodecs.Jpeg.LosslessJpegResult.Samples.init -> void +Sdcb.SimdCodecs.Jpeg.LosslessJpegResult.Width.get -> int +Sdcb.SimdCodecs.Jpeg.LosslessJpegResult.Width.init -> void +const Sdcb.SimdCodecs.Jpeg.JpegEncodeOptions.MaxExifBytes = 65527 -> int +const Sdcb.SimdCodecs.Jpeg.JpegEncodeOptions.MaxIccChunkBytes = 65519 -> int +const Sdcb.SimdCodecs.Jpeg.JpegEncodeOptions.MaxIccProfileBytes = 16707345 -> int +const Sdcb.SimdCodecs.Jpeg.JpegEncodeOptions.MaxXmpPacketBytes = 65504 -> int +const Sdcb.SimdCodecs.Jpeg.JpegSegmentScanner.Sos = 218 -> byte +const Sdcb.SimdCodecs.Jpeg.JpegXmp.DublinCoreNamespaceUri = "http://purl.org/dc/elements/1.1/" -> string! +const Sdcb.SimdCodecs.Jpeg.JpegXmp.XmpNamespaceUri = "http://ns.adobe.com/xap/1.0/" -> string! +override Sdcb.SimdCodecs.Jpeg.JpegComponentInfo.GetHashCode() -> int +override Sdcb.SimdCodecs.Jpeg.JpegEncodeOptions.$() -> Sdcb.SimdCodecs.Jpeg.JpegEncodeOptions! +override Sdcb.SimdCodecs.Jpeg.JpegEncodeOptions.Equals(object? obj) -> bool +override Sdcb.SimdCodecs.Jpeg.JpegEncodeOptions.GetHashCode() -> int +override Sdcb.SimdCodecs.Jpeg.JpegEncodeOptions.ToString() -> string! +override Sdcb.SimdCodecs.Jpeg.JpegInfo.Equals(object? obj) -> bool +override Sdcb.SimdCodecs.Jpeg.JpegInfo.GetHashCode() -> int +override Sdcb.SimdCodecs.Jpeg.JpegInfo.ToString() -> string! +override Sdcb.SimdCodecs.Jpeg.JpegSegment.GetHashCode() -> int +override Sdcb.SimdCodecs.Jpeg.JpegXmp.Equals(object? obj) -> bool +override Sdcb.SimdCodecs.Jpeg.JpegXmp.GetHashCode() -> int +override Sdcb.SimdCodecs.Jpeg.JpegXmp.ToString() -> string! +override Sdcb.SimdCodecs.Jpeg.LosslessJpegResult.Equals(object? obj) -> bool +override Sdcb.SimdCodecs.Jpeg.LosslessJpegResult.GetHashCode() -> int +override Sdcb.SimdCodecs.Jpeg.LosslessJpegResult.ToString() -> string! +override sealed Sdcb.SimdCodecs.Jpeg.JpegEncodeOptions.Equals(Sdcb.SimdCodecs.Abstractions.EncodeOptions? other) -> bool +static Sdcb.SimdCodecs.Jpeg.JpegComponentInfo.operator !=(Sdcb.SimdCodecs.Jpeg.JpegComponentInfo left, Sdcb.SimdCodecs.Jpeg.JpegComponentInfo right) -> bool +static Sdcb.SimdCodecs.Jpeg.JpegComponentInfo.operator ==(Sdcb.SimdCodecs.Jpeg.JpegComponentInfo left, Sdcb.SimdCodecs.Jpeg.JpegComponentInfo right) -> bool +static Sdcb.SimdCodecs.Jpeg.JpegDecoder.Decode(System.ReadOnlySpan data, Sdcb.SimdCodecs.Jpeg.JpegScale scale = Sdcb.SimdCodecs.Jpeg.JpegScale.Full) -> Sdcb.SimdCodecs.Jpeg.JpegImage! +static Sdcb.SimdCodecs.Jpeg.JpegDecoder.DecodeTo(System.ReadOnlySpan data, System.Span destination, int stride, Sdcb.SimdCodecs.Jpeg.JpegPixelFormat format, Sdcb.SimdCodecs.Jpeg.JpegScale scale = Sdcb.SimdCodecs.Jpeg.JpegScale.Full) -> (int Width, int Height) +static Sdcb.SimdCodecs.Jpeg.JpegDecoder.DecodeTo(System.ReadOnlySpan data, System.Span destination, int stride, Sdcb.SimdCodecs.Jpeg.JpegPixelFormat format, Sdcb.SimdCodecs.Jpeg.JpegScale scale, System.Threading.CancellationToken cancellationToken) -> (int Width, int Height) +static Sdcb.SimdCodecs.Jpeg.JpegDecoder.DecodeTo(System.ReadOnlySpan data, System.Span rgbaDestination, Sdcb.SimdCodecs.Jpeg.JpegScale scale = Sdcb.SimdCodecs.Jpeg.JpegScale.Full) -> (int Width, int Height) +static Sdcb.SimdCodecs.Jpeg.JpegDecoder.ReadInfo(System.ReadOnlySpan data) -> Sdcb.SimdCodecs.Jpeg.JpegInfo! +static Sdcb.SimdCodecs.Jpeg.JpegDecoder.TryReadIccProfile(System.ReadOnlySpan data, out byte[]? profile) -> bool +static Sdcb.SimdCodecs.Jpeg.JpegDecoder.TryReadInfo(System.ReadOnlySpan data, out Sdcb.SimdCodecs.Jpeg.JpegInfo? info) -> bool +static Sdcb.SimdCodecs.Jpeg.JpegEncodeOptions.operator !=(Sdcb.SimdCodecs.Jpeg.JpegEncodeOptions? left, Sdcb.SimdCodecs.Jpeg.JpegEncodeOptions? right) -> bool +static Sdcb.SimdCodecs.Jpeg.JpegEncodeOptions.operator ==(Sdcb.SimdCodecs.Jpeg.JpegEncodeOptions? left, Sdcb.SimdCodecs.Jpeg.JpegEncodeOptions? right) -> bool +static Sdcb.SimdCodecs.Jpeg.JpegEncoder.Encode(System.ReadOnlySpan pixels, int width, int height, int channels, Sdcb.SimdCodecs.Jpeg.JpegEncodeOptions? options = null) -> byte[]! +static Sdcb.SimdCodecs.Jpeg.JpegImageDecoder.CanDecode(System.ReadOnlySpan header) -> bool +static Sdcb.SimdCodecs.Jpeg.JpegImageDecoder.Registration.get -> Sdcb.SimdCodecs.Abstractions.ImageDecoderRegistration! +static Sdcb.SimdCodecs.Jpeg.JpegImageDecoder.SignatureLength.get -> int +static Sdcb.SimdCodecs.Jpeg.JpegImageDecoder.TryDecode(System.ReadOnlySpan data, out Sdcb.SimdCodecs.Abstractions.IDecodedImage? image, Sdcb.SimdCodecs.Abstractions.DecodeOptions? options = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> bool +static Sdcb.SimdCodecs.Jpeg.JpegImageDecoder.TryDecodeInto(System.ReadOnlySpan data, System.Span destination, int stride, Sdcb.SimdCodecs.Abstractions.PixelFormat format, Sdcb.SimdCodecs.Abstractions.DecodeOptions? options = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> bool +static Sdcb.SimdCodecs.Jpeg.JpegImageDecoder.TryDecodeIntoRgba8(System.ReadOnlySpan data, System.Span rgbaDestination) -> bool +static Sdcb.SimdCodecs.Jpeg.JpegImageDecoder.TryDecodeThumbnail(System.ReadOnlySpan data, out Sdcb.SimdCodecs.Abstractions.IDecodedImage? thumbnail) -> bool +static Sdcb.SimdCodecs.Jpeg.JpegImageDecoder.TryGetClosestSize(System.ReadOnlySpan data, int requestedWidth, int requestedHeight, out int width, out int height, out int scaleDenominator) -> bool +static Sdcb.SimdCodecs.Jpeg.JpegImageDecoder.TryReadInfo(System.ReadOnlySpan data, out Sdcb.SimdCodecs.Abstractions.ImageInfo info) -> bool +static Sdcb.SimdCodecs.Jpeg.JpegImageDecoder.TryReadMetadata(System.ReadOnlySpan data, out Sdcb.SimdCodecs.Abstractions.ImageMetadata? metadata) -> bool +static Sdcb.SimdCodecs.Jpeg.JpegImageEncoder.Create(System.Buffers.IBufferWriter! output, Sdcb.SimdCodecs.Abstractions.EncodeOptions? options = null) -> Sdcb.SimdCodecs.Abstractions.IImageEncoderSession! +static Sdcb.SimdCodecs.Jpeg.JpegImageEncoder.Format.get -> Sdcb.SimdCodecs.Abstractions.ImageFormat +static Sdcb.SimdCodecs.Jpeg.JpegImageEncoder.GetClosestInputFormat(Sdcb.SimdCodecs.Abstractions.PixelFormat requested) -> Sdcb.SimdCodecs.Abstractions.PixelFormat +static Sdcb.SimdCodecs.Jpeg.JpegImageEncoder.Registration.get -> Sdcb.SimdCodecs.Abstractions.ImageEncoderRegistration! +static Sdcb.SimdCodecs.Jpeg.JpegInfo.operator !=(Sdcb.SimdCodecs.Jpeg.JpegInfo? left, Sdcb.SimdCodecs.Jpeg.JpegInfo? right) -> bool +static Sdcb.SimdCodecs.Jpeg.JpegInfo.operator ==(Sdcb.SimdCodecs.Jpeg.JpegInfo? left, Sdcb.SimdCodecs.Jpeg.JpegInfo? right) -> bool +static Sdcb.SimdCodecs.Jpeg.JpegSegment.operator !=(Sdcb.SimdCodecs.Jpeg.JpegSegment left, Sdcb.SimdCodecs.Jpeg.JpegSegment right) -> bool +static Sdcb.SimdCodecs.Jpeg.JpegSegment.operator ==(Sdcb.SimdCodecs.Jpeg.JpegSegment left, Sdcb.SimdCodecs.Jpeg.JpegSegment right) -> bool +static Sdcb.SimdCodecs.Jpeg.JpegSegmentScanner.Scan(System.ReadOnlySpan jpeg) -> System.Collections.Generic.List! +static Sdcb.SimdCodecs.Jpeg.JpegSegmentScanner.TryFindAppPayload(System.ReadOnlySpan jpeg, byte appMarker, System.ReadOnlySpan identifier, out System.Range payload) -> bool +static Sdcb.SimdCodecs.Jpeg.JpegXmp.operator !=(Sdcb.SimdCodecs.Jpeg.JpegXmp? left, Sdcb.SimdCodecs.Jpeg.JpegXmp? right) -> bool +static Sdcb.SimdCodecs.Jpeg.JpegXmp.operator ==(Sdcb.SimdCodecs.Jpeg.JpegXmp? left, Sdcb.SimdCodecs.Jpeg.JpegXmp? right) -> bool +static Sdcb.SimdCodecs.Jpeg.LosslessJpeg.FromMemory(System.ReadOnlySpan bytes) -> Sdcb.SimdCodecs.Jpeg.LosslessJpegResult! +static Sdcb.SimdCodecs.Jpeg.LosslessJpeg.FromMemory(byte[]! bytes) -> Sdcb.SimdCodecs.Jpeg.LosslessJpegResult! +static Sdcb.SimdCodecs.Jpeg.LosslessJpeg.FromStream(System.IO.Stream! stream) -> Sdcb.SimdCodecs.Jpeg.LosslessJpegResult! +static Sdcb.SimdCodecs.Jpeg.LosslessJpegResult.operator !=(Sdcb.SimdCodecs.Jpeg.LosslessJpegResult? left, Sdcb.SimdCodecs.Jpeg.LosslessJpegResult? right) -> bool +static Sdcb.SimdCodecs.Jpeg.LosslessJpegResult.operator ==(Sdcb.SimdCodecs.Jpeg.LosslessJpegResult? left, Sdcb.SimdCodecs.Jpeg.LosslessJpegResult? right) -> bool +~override Sdcb.SimdCodecs.Jpeg.JpegComponentInfo.Equals(object obj) -> bool +~override Sdcb.SimdCodecs.Jpeg.JpegComponentInfo.ToString() -> string +~override Sdcb.SimdCodecs.Jpeg.JpegSegment.Equals(object obj) -> bool +~override Sdcb.SimdCodecs.Jpeg.JpegSegment.ToString() -> string diff --git a/src/Sdcb.SimdCodecs.Jpeg/PublicAPI.Unshipped.txt b/src/Sdcb.SimdCodecs.Jpeg/PublicAPI.Unshipped.txt new file mode 100644 index 0000000..7dc5c58 --- /dev/null +++ b/src/Sdcb.SimdCodecs.Jpeg/PublicAPI.Unshipped.txt @@ -0,0 +1 @@ +#nullable enable diff --git a/src/Sdcb.SimdCodecs.Jpeg2000/PublicAPI.Shipped.txt b/src/Sdcb.SimdCodecs.Jpeg2000/PublicAPI.Shipped.txt new file mode 100644 index 0000000..eaa92db --- /dev/null +++ b/src/Sdcb.SimdCodecs.Jpeg2000/PublicAPI.Shipped.txt @@ -0,0 +1,87 @@ +#nullable enable +Sdcb.SimdCodecs.Jpeg2000.Jp2Colour +Sdcb.SimdCodecs.Jpeg2000.Jp2Colour.$() -> Sdcb.SimdCodecs.Jpeg2000.Jp2Colour! +Sdcb.SimdCodecs.Jpeg2000.Jp2Colour.Deconstruct(out int Method, out Sdcb.SimdCodecs.Jpeg2000.Jp2EnumeratedColourSpace? EnumeratedColourSpace, out byte[]? IccProfile) -> void +Sdcb.SimdCodecs.Jpeg2000.Jp2Colour.EnumeratedColourSpace.get -> Sdcb.SimdCodecs.Jpeg2000.Jp2EnumeratedColourSpace? +Sdcb.SimdCodecs.Jpeg2000.Jp2Colour.EnumeratedColourSpace.init -> void +Sdcb.SimdCodecs.Jpeg2000.Jp2Colour.Equals(Sdcb.SimdCodecs.Jpeg2000.Jp2Colour? other) -> bool +Sdcb.SimdCodecs.Jpeg2000.Jp2Colour.IccProfile.get -> byte[]? +Sdcb.SimdCodecs.Jpeg2000.Jp2Colour.IccProfile.init -> void +Sdcb.SimdCodecs.Jpeg2000.Jp2Colour.Jp2Colour(int Method, Sdcb.SimdCodecs.Jpeg2000.Jp2EnumeratedColourSpace? EnumeratedColourSpace, byte[]? IccProfile) -> void +Sdcb.SimdCodecs.Jpeg2000.Jp2Colour.Method.get -> int +Sdcb.SimdCodecs.Jpeg2000.Jp2Colour.Method.init -> void +Sdcb.SimdCodecs.Jpeg2000.Jp2EnumeratedColourSpace +Sdcb.SimdCodecs.Jpeg2000.Jp2EnumeratedColourSpace.Greyscale = 17 -> Sdcb.SimdCodecs.Jpeg2000.Jp2EnumeratedColourSpace +Sdcb.SimdCodecs.Jpeg2000.Jp2EnumeratedColourSpace.Srgb = 16 -> Sdcb.SimdCodecs.Jpeg2000.Jp2EnumeratedColourSpace +Sdcb.SimdCodecs.Jpeg2000.Jp2EnumeratedColourSpace.Sycc = 18 -> Sdcb.SimdCodecs.Jpeg2000.Jp2EnumeratedColourSpace +Sdcb.SimdCodecs.Jpeg2000.Jpeg2000Decoder +Sdcb.SimdCodecs.Jpeg2000.Jpeg2000Image +Sdcb.SimdCodecs.Jpeg2000.Jpeg2000Image.$() -> Sdcb.SimdCodecs.Jpeg2000.Jpeg2000Image! +Sdcb.SimdCodecs.Jpeg2000.Jpeg2000Image.BitDepth.get -> int +Sdcb.SimdCodecs.Jpeg2000.Jpeg2000Image.BitDepth.init -> void +Sdcb.SimdCodecs.Jpeg2000.Jpeg2000Image.Colour.get -> Sdcb.SimdCodecs.Jpeg2000.Jp2Colour? +Sdcb.SimdCodecs.Jpeg2000.Jpeg2000Image.Colour.init -> void +Sdcb.SimdCodecs.Jpeg2000.Jpeg2000Image.Components.get -> int +Sdcb.SimdCodecs.Jpeg2000.Jpeg2000Image.Components.init -> void +Sdcb.SimdCodecs.Jpeg2000.Jpeg2000Image.Deconstruct(out int Width, out int Height, out int BitDepth, out ushort[]! Samples, out int Components) -> void +Sdcb.SimdCodecs.Jpeg2000.Jpeg2000Image.Equals(Sdcb.SimdCodecs.Jpeg2000.Jpeg2000Image? other) -> bool +Sdcb.SimdCodecs.Jpeg2000.Jpeg2000Image.Height.get -> int +Sdcb.SimdCodecs.Jpeg2000.Jpeg2000Image.Height.init -> void +Sdcb.SimdCodecs.Jpeg2000.Jpeg2000Image.Jpeg2000Image(int Width, int Height, int BitDepth, ushort[]! Samples, int Components = 1) -> void +Sdcb.SimdCodecs.Jpeg2000.Jpeg2000Image.Samples.get -> ushort[]! +Sdcb.SimdCodecs.Jpeg2000.Jpeg2000Image.Samples.init -> void +Sdcb.SimdCodecs.Jpeg2000.Jpeg2000Image.To8Bit() -> byte[]! +Sdcb.SimdCodecs.Jpeg2000.Jpeg2000Image.ToGray8() -> byte[]! +Sdcb.SimdCodecs.Jpeg2000.Jpeg2000Image.Width.get -> int +Sdcb.SimdCodecs.Jpeg2000.Jpeg2000Image.Width.init -> void +Sdcb.SimdCodecs.Jpeg2000.Jpeg2000ImageDecoder +Sdcb.SimdCodecs.Jpeg2000.Jpeg2000ImageDecoder.Jpeg2000ImageDecoder() -> void +Sdcb.SimdCodecs.Jpeg2000.Jpeg2000Info +Sdcb.SimdCodecs.Jpeg2000.Jpeg2000Info.$() -> Sdcb.SimdCodecs.Jpeg2000.Jpeg2000Info! +Sdcb.SimdCodecs.Jpeg2000.Jpeg2000Info.BitDepth.get -> int +Sdcb.SimdCodecs.Jpeg2000.Jpeg2000Info.BitDepth.init -> void +Sdcb.SimdCodecs.Jpeg2000.Jpeg2000Info.Colour.get -> Sdcb.SimdCodecs.Jpeg2000.Jp2Colour? +Sdcb.SimdCodecs.Jpeg2000.Jpeg2000Info.Colour.init -> void +Sdcb.SimdCodecs.Jpeg2000.Jpeg2000Info.Components.get -> int +Sdcb.SimdCodecs.Jpeg2000.Jpeg2000Info.Components.init -> void +Sdcb.SimdCodecs.Jpeg2000.Jpeg2000Info.DecompositionLevels.get -> int +Sdcb.SimdCodecs.Jpeg2000.Jpeg2000Info.DecompositionLevels.init -> void +Sdcb.SimdCodecs.Jpeg2000.Jpeg2000Info.Deconstruct(out int Width, out int Height, out int Components, out int BitDepth, out int DecompositionLevels, out Sdcb.SimdCodecs.Jpeg2000.Jp2Colour? Colour) -> void +Sdcb.SimdCodecs.Jpeg2000.Jpeg2000Info.Equals(Sdcb.SimdCodecs.Jpeg2000.Jpeg2000Info? other) -> bool +Sdcb.SimdCodecs.Jpeg2000.Jpeg2000Info.Height.get -> int +Sdcb.SimdCodecs.Jpeg2000.Jpeg2000Info.Height.init -> void +Sdcb.SimdCodecs.Jpeg2000.Jpeg2000Info.Jpeg2000Info(int Width, int Height, int Components, int BitDepth, int DecompositionLevels, Sdcb.SimdCodecs.Jpeg2000.Jp2Colour? Colour) -> void +Sdcb.SimdCodecs.Jpeg2000.Jpeg2000Info.SizeAt(int reduce) -> (int Width, int Height) +Sdcb.SimdCodecs.Jpeg2000.Jpeg2000Info.Width.get -> int +Sdcb.SimdCodecs.Jpeg2000.Jpeg2000Info.Width.init -> void +override Sdcb.SimdCodecs.Jpeg2000.Jp2Colour.Equals(object? obj) -> bool +override Sdcb.SimdCodecs.Jpeg2000.Jp2Colour.GetHashCode() -> int +override Sdcb.SimdCodecs.Jpeg2000.Jp2Colour.ToString() -> string! +override Sdcb.SimdCodecs.Jpeg2000.Jpeg2000Image.Equals(object? obj) -> bool +override Sdcb.SimdCodecs.Jpeg2000.Jpeg2000Image.GetHashCode() -> int +override Sdcb.SimdCodecs.Jpeg2000.Jpeg2000Image.ToString() -> string! +override Sdcb.SimdCodecs.Jpeg2000.Jpeg2000Info.Equals(object? obj) -> bool +override Sdcb.SimdCodecs.Jpeg2000.Jpeg2000Info.GetHashCode() -> int +override Sdcb.SimdCodecs.Jpeg2000.Jpeg2000Info.ToString() -> string! +static Sdcb.SimdCodecs.Jpeg2000.Jp2Colour.operator !=(Sdcb.SimdCodecs.Jpeg2000.Jp2Colour? left, Sdcb.SimdCodecs.Jpeg2000.Jp2Colour? right) -> bool +static Sdcb.SimdCodecs.Jpeg2000.Jp2Colour.operator ==(Sdcb.SimdCodecs.Jpeg2000.Jp2Colour? left, Sdcb.SimdCodecs.Jpeg2000.Jp2Colour? right) -> bool +static Sdcb.SimdCodecs.Jpeg2000.Jpeg2000Decoder.Decode(System.ReadOnlySpan data, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> Sdcb.SimdCodecs.Jpeg2000.Jpeg2000Image! +static Sdcb.SimdCodecs.Jpeg2000.Jpeg2000Decoder.Decode(System.ReadOnlySpan data, int reduce, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> Sdcb.SimdCodecs.Jpeg2000.Jpeg2000Image! +static Sdcb.SimdCodecs.Jpeg2000.Jpeg2000Decoder.IsCodestream(System.ReadOnlySpan data) -> bool +static Sdcb.SimdCodecs.Jpeg2000.Jpeg2000Decoder.IsJp2(System.ReadOnlySpan data) -> bool +static Sdcb.SimdCodecs.Jpeg2000.Jpeg2000Decoder.ReadInfo(System.ReadOnlySpan data) -> Sdcb.SimdCodecs.Jpeg2000.Jpeg2000Info! +static Sdcb.SimdCodecs.Jpeg2000.Jpeg2000Decoder.ReductionFor(int width, int height, int minLongEdge) -> int +static Sdcb.SimdCodecs.Jpeg2000.Jpeg2000Image.operator !=(Sdcb.SimdCodecs.Jpeg2000.Jpeg2000Image? left, Sdcb.SimdCodecs.Jpeg2000.Jpeg2000Image? right) -> bool +static Sdcb.SimdCodecs.Jpeg2000.Jpeg2000Image.operator ==(Sdcb.SimdCodecs.Jpeg2000.Jpeg2000Image? left, Sdcb.SimdCodecs.Jpeg2000.Jpeg2000Image? right) -> bool +static Sdcb.SimdCodecs.Jpeg2000.Jpeg2000ImageDecoder.CanDecode(System.ReadOnlySpan header) -> bool +static Sdcb.SimdCodecs.Jpeg2000.Jpeg2000ImageDecoder.Registration.get -> Sdcb.SimdCodecs.Abstractions.ImageDecoderRegistration! +static Sdcb.SimdCodecs.Jpeg2000.Jpeg2000ImageDecoder.SignatureLength.get -> int +static Sdcb.SimdCodecs.Jpeg2000.Jpeg2000ImageDecoder.TryDecode(System.ReadOnlySpan data, out Sdcb.SimdCodecs.Abstractions.IDecodedImage? image, Sdcb.SimdCodecs.Abstractions.DecodeOptions? options = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> bool +static Sdcb.SimdCodecs.Jpeg2000.Jpeg2000ImageDecoder.TryDecodeInto(System.ReadOnlySpan data, System.Span destination, int stride, Sdcb.SimdCodecs.Abstractions.PixelFormat format, Sdcb.SimdCodecs.Abstractions.DecodeOptions? options = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> bool +static Sdcb.SimdCodecs.Jpeg2000.Jpeg2000ImageDecoder.TryDecodeIntoRgba8(System.ReadOnlySpan data, System.Span rgbaDestination) -> bool +static Sdcb.SimdCodecs.Jpeg2000.Jpeg2000ImageDecoder.TryDecodeThumbnail(System.ReadOnlySpan data, out Sdcb.SimdCodecs.Abstractions.IDecodedImage? thumbnail) -> bool +static Sdcb.SimdCodecs.Jpeg2000.Jpeg2000ImageDecoder.TryGetClosestSize(System.ReadOnlySpan data, int requestedWidth, int requestedHeight, out int width, out int height, out int scaleDenominator) -> bool +static Sdcb.SimdCodecs.Jpeg2000.Jpeg2000ImageDecoder.TryReadInfo(System.ReadOnlySpan data, out Sdcb.SimdCodecs.Abstractions.ImageInfo info) -> bool +static Sdcb.SimdCodecs.Jpeg2000.Jpeg2000ImageDecoder.TryReadMetadata(System.ReadOnlySpan data, out Sdcb.SimdCodecs.Abstractions.ImageMetadata? metadata) -> bool +static Sdcb.SimdCodecs.Jpeg2000.Jpeg2000Info.operator !=(Sdcb.SimdCodecs.Jpeg2000.Jpeg2000Info? left, Sdcb.SimdCodecs.Jpeg2000.Jpeg2000Info? right) -> bool +static Sdcb.SimdCodecs.Jpeg2000.Jpeg2000Info.operator ==(Sdcb.SimdCodecs.Jpeg2000.Jpeg2000Info? left, Sdcb.SimdCodecs.Jpeg2000.Jpeg2000Info? right) -> bool diff --git a/src/Sdcb.SimdCodecs.Jpeg2000/PublicAPI.Unshipped.txt b/src/Sdcb.SimdCodecs.Jpeg2000/PublicAPI.Unshipped.txt new file mode 100644 index 0000000..7dc5c58 --- /dev/null +++ b/src/Sdcb.SimdCodecs.Jpeg2000/PublicAPI.Unshipped.txt @@ -0,0 +1 @@ +#nullable enable diff --git a/src/Sdcb.SimdCodecs.Png/PublicAPI.Shipped.txt b/src/Sdcb.SimdCodecs.Png/PublicAPI.Shipped.txt new file mode 100644 index 0000000..459a25e --- /dev/null +++ b/src/Sdcb.SimdCodecs.Png/PublicAPI.Shipped.txt @@ -0,0 +1,274 @@ +#nullable enable +Sdcb.SimdCodecs.Png.ChromaticityChunk +Sdcb.SimdCodecs.Png.ChromaticityChunk.$() -> Sdcb.SimdCodecs.Png.ChromaticityChunk! +Sdcb.SimdCodecs.Png.ChromaticityChunk.BlueX.get -> double +Sdcb.SimdCodecs.Png.ChromaticityChunk.BlueX.init -> void +Sdcb.SimdCodecs.Png.ChromaticityChunk.BlueY.get -> double +Sdcb.SimdCodecs.Png.ChromaticityChunk.BlueY.init -> void +Sdcb.SimdCodecs.Png.ChromaticityChunk.ChromaticityChunk(double WhiteX, double WhiteY, double RedX, double RedY, double GreenX, double GreenY, double BlueX, double BlueY) -> void +Sdcb.SimdCodecs.Png.ChromaticityChunk.Deconstruct(out double WhiteX, out double WhiteY, out double RedX, out double RedY, out double GreenX, out double GreenY, out double BlueX, out double BlueY) -> void +Sdcb.SimdCodecs.Png.ChromaticityChunk.Equals(Sdcb.SimdCodecs.Png.ChromaticityChunk? other) -> bool +Sdcb.SimdCodecs.Png.ChromaticityChunk.GreenX.get -> double +Sdcb.SimdCodecs.Png.ChromaticityChunk.GreenX.init -> void +Sdcb.SimdCodecs.Png.ChromaticityChunk.GreenY.get -> double +Sdcb.SimdCodecs.Png.ChromaticityChunk.GreenY.init -> void +Sdcb.SimdCodecs.Png.ChromaticityChunk.RedX.get -> double +Sdcb.SimdCodecs.Png.ChromaticityChunk.RedX.init -> void +Sdcb.SimdCodecs.Png.ChromaticityChunk.RedY.get -> double +Sdcb.SimdCodecs.Png.ChromaticityChunk.RedY.init -> void +Sdcb.SimdCodecs.Png.ChromaticityChunk.WhiteX.get -> double +Sdcb.SimdCodecs.Png.ChromaticityChunk.WhiteX.init -> void +Sdcb.SimdCodecs.Png.ChromaticityChunk.WhiteY.get -> double +Sdcb.SimdCodecs.Png.ChromaticityChunk.WhiteY.init -> void +Sdcb.SimdCodecs.Png.CicpChunk +Sdcb.SimdCodecs.Png.CicpChunk.$() -> Sdcb.SimdCodecs.Png.CicpChunk! +Sdcb.SimdCodecs.Png.CicpChunk.CicpChunk(Sdcb.SimdCodecs.Abstractions.ColorPrimaries ColorPrimaries, Sdcb.SimdCodecs.Abstractions.TransferFunction TransferFunction, Sdcb.SimdCodecs.Abstractions.MatrixCoefficients MatrixCoefficients, bool VideoFullRangeFlag) -> void +Sdcb.SimdCodecs.Png.CicpChunk.ColorPrimaries.get -> Sdcb.SimdCodecs.Abstractions.ColorPrimaries +Sdcb.SimdCodecs.Png.CicpChunk.ColorPrimaries.init -> void +Sdcb.SimdCodecs.Png.CicpChunk.Deconstruct(out Sdcb.SimdCodecs.Abstractions.ColorPrimaries ColorPrimaries, out Sdcb.SimdCodecs.Abstractions.TransferFunction TransferFunction, out Sdcb.SimdCodecs.Abstractions.MatrixCoefficients MatrixCoefficients, out bool VideoFullRangeFlag) -> void +Sdcb.SimdCodecs.Png.CicpChunk.Equals(Sdcb.SimdCodecs.Png.CicpChunk? other) -> bool +Sdcb.SimdCodecs.Png.CicpChunk.MatrixCoefficients.get -> Sdcb.SimdCodecs.Abstractions.MatrixCoefficients +Sdcb.SimdCodecs.Png.CicpChunk.MatrixCoefficients.init -> void +Sdcb.SimdCodecs.Png.CicpChunk.TransferFunction.get -> Sdcb.SimdCodecs.Abstractions.TransferFunction +Sdcb.SimdCodecs.Png.CicpChunk.TransferFunction.init -> void +Sdcb.SimdCodecs.Png.CicpChunk.VideoFullRangeFlag.get -> bool +Sdcb.SimdCodecs.Png.CicpChunk.VideoFullRangeFlag.init -> void +Sdcb.SimdCodecs.Png.ClliChunk +Sdcb.SimdCodecs.Png.ClliChunk.$() -> Sdcb.SimdCodecs.Png.ClliChunk! +Sdcb.SimdCodecs.Png.ClliChunk.ClliChunk(uint MaxCllUnits, uint MaxFallUnits) -> void +Sdcb.SimdCodecs.Png.ClliChunk.Deconstruct(out uint MaxCllUnits, out uint MaxFallUnits) -> void +Sdcb.SimdCodecs.Png.ClliChunk.Equals(Sdcb.SimdCodecs.Png.ClliChunk? other) -> bool +Sdcb.SimdCodecs.Png.ClliChunk.MaxCllUnits.get -> uint +Sdcb.SimdCodecs.Png.ClliChunk.MaxCllUnits.init -> void +Sdcb.SimdCodecs.Png.ClliChunk.MaxFallUnits.get -> uint +Sdcb.SimdCodecs.Png.ClliChunk.MaxFallUnits.init -> void +Sdcb.SimdCodecs.Png.MdcvChunk +Sdcb.SimdCodecs.Png.MdcvChunk.$() -> Sdcb.SimdCodecs.Png.MdcvChunk! +Sdcb.SimdCodecs.Png.MdcvChunk.BlueX.get -> ushort +Sdcb.SimdCodecs.Png.MdcvChunk.BlueX.init -> void +Sdcb.SimdCodecs.Png.MdcvChunk.BlueY.get -> ushort +Sdcb.SimdCodecs.Png.MdcvChunk.BlueY.init -> void +Sdcb.SimdCodecs.Png.MdcvChunk.Deconstruct(out ushort RedX, out ushort RedY, out ushort GreenX, out ushort GreenY, out ushort BlueX, out ushort BlueY, out ushort WhitePointX, out ushort WhitePointY, out uint MaxLuminanceUnits, out uint MinLuminanceUnits) -> void +Sdcb.SimdCodecs.Png.MdcvChunk.Equals(Sdcb.SimdCodecs.Png.MdcvChunk? other) -> bool +Sdcb.SimdCodecs.Png.MdcvChunk.GreenX.get -> ushort +Sdcb.SimdCodecs.Png.MdcvChunk.GreenX.init -> void +Sdcb.SimdCodecs.Png.MdcvChunk.GreenY.get -> ushort +Sdcb.SimdCodecs.Png.MdcvChunk.GreenY.init -> void +Sdcb.SimdCodecs.Png.MdcvChunk.MaxLuminanceUnits.get -> uint +Sdcb.SimdCodecs.Png.MdcvChunk.MaxLuminanceUnits.init -> void +Sdcb.SimdCodecs.Png.MdcvChunk.MdcvChunk(ushort RedX, ushort RedY, ushort GreenX, ushort GreenY, ushort BlueX, ushort BlueY, ushort WhitePointX, ushort WhitePointY, uint MaxLuminanceUnits, uint MinLuminanceUnits) -> void +Sdcb.SimdCodecs.Png.MdcvChunk.MinLuminanceUnits.get -> uint +Sdcb.SimdCodecs.Png.MdcvChunk.MinLuminanceUnits.init -> void +Sdcb.SimdCodecs.Png.MdcvChunk.RedX.get -> ushort +Sdcb.SimdCodecs.Png.MdcvChunk.RedX.init -> void +Sdcb.SimdCodecs.Png.MdcvChunk.RedY.get -> ushort +Sdcb.SimdCodecs.Png.MdcvChunk.RedY.init -> void +Sdcb.SimdCodecs.Png.MdcvChunk.WhitePointX.get -> ushort +Sdcb.SimdCodecs.Png.MdcvChunk.WhitePointX.init -> void +Sdcb.SimdCodecs.Png.MdcvChunk.WhitePointY.get -> ushort +Sdcb.SimdCodecs.Png.MdcvChunk.WhitePointY.init -> void +Sdcb.SimdCodecs.Png.PngImage +Sdcb.SimdCodecs.Png.PngImage.$() -> Sdcb.SimdCodecs.Png.PngImage! +Sdcb.SimdCodecs.Png.PngImage.AsUInt16Samples() -> ushort[]! +Sdcb.SimdCodecs.Png.PngImage.BitDepth.get -> int +Sdcb.SimdCodecs.Png.PngImage.BitDepth.init -> void +Sdcb.SimdCodecs.Png.PngImage.Chromaticity.get -> Sdcb.SimdCodecs.Png.ChromaticityChunk? +Sdcb.SimdCodecs.Png.PngImage.Chromaticity.init -> void +Sdcb.SimdCodecs.Png.PngImage.Cicp.get -> Sdcb.SimdCodecs.Png.CicpChunk? +Sdcb.SimdCodecs.Png.PngImage.Cicp.init -> void +Sdcb.SimdCodecs.Png.PngImage.Clli.get -> Sdcb.SimdCodecs.Png.ClliChunk? +Sdcb.SimdCodecs.Png.PngImage.Clli.init -> void +Sdcb.SimdCodecs.Png.PngImage.ColorType.get -> int +Sdcb.SimdCodecs.Png.PngImage.ColorType.init -> void +Sdcb.SimdCodecs.Png.PngImage.Equals(Sdcb.SimdCodecs.Png.PngImage? other) -> bool +Sdcb.SimdCodecs.Png.PngImage.Exif.get -> byte[]? +Sdcb.SimdCodecs.Png.PngImage.Exif.init -> void +Sdcb.SimdCodecs.Png.PngImage.ExpandToRgba8(System.Span destination) -> void +Sdcb.SimdCodecs.Png.PngImage.Gamma.get -> double? +Sdcb.SimdCodecs.Png.PngImage.Gamma.init -> void +Sdcb.SimdCodecs.Png.PngImage.HasHdrSignaling.get -> bool +Sdcb.SimdCodecs.Png.PngImage.Height.get -> int +Sdcb.SimdCodecs.Png.PngImage.Height.init -> void +Sdcb.SimdCodecs.Png.PngImage.IccProfile.get -> byte[]? +Sdcb.SimdCodecs.Png.PngImage.IccProfile.init -> void +Sdcb.SimdCodecs.Png.PngImage.IccProfileName.get -> string? +Sdcb.SimdCodecs.Png.PngImage.IccProfileName.init -> void +Sdcb.SimdCodecs.Png.PngImage.Interlaced.get -> bool +Sdcb.SimdCodecs.Png.PngImage.Interlaced.init -> void +Sdcb.SimdCodecs.Png.PngImage.Mdcv.get -> Sdcb.SimdCodecs.Png.MdcvChunk? +Sdcb.SimdCodecs.Png.PngImage.Mdcv.init -> void +Sdcb.SimdCodecs.Png.PngImage.Palette.get -> byte[]? +Sdcb.SimdCodecs.Png.PngImage.Palette.init -> void +Sdcb.SimdCodecs.Png.PngImage.PaletteAlpha.get -> byte[]? +Sdcb.SimdCodecs.Png.PngImage.PaletteAlpha.init -> void +Sdcb.SimdCodecs.Png.PngImage.PhysicalDimensions.get -> Sdcb.SimdCodecs.Png.PngPhysicalDimensions? +Sdcb.SimdCodecs.Png.PngImage.PhysicalDimensions.init -> void +Sdcb.SimdCodecs.Png.PngImage.Pixels.get -> byte[]! +Sdcb.SimdCodecs.Png.PngImage.Pixels.init -> void +Sdcb.SimdCodecs.Png.PngImage.PngImage() -> void +Sdcb.SimdCodecs.Png.PngImage.SamplesPerPixel.get -> int +Sdcb.SimdCodecs.Png.PngImage.SourceBitDepth.get -> int +Sdcb.SimdCodecs.Png.PngImage.SourceBitDepth.init -> void +Sdcb.SimdCodecs.Png.PngImage.SrgbRenderingIntent.get -> byte? +Sdcb.SimdCodecs.Png.PngImage.SrgbRenderingIntent.init -> void +Sdcb.SimdCodecs.Png.PngImage.Text.get -> System.Collections.Generic.IReadOnlyList! +Sdcb.SimdCodecs.Png.PngImage.Text.init -> void +Sdcb.SimdCodecs.Png.PngImage.ToRgba8() -> byte[]! +Sdcb.SimdCodecs.Png.PngImage.TransparentColor.get -> ushort[]? +Sdcb.SimdCodecs.Png.PngImage.TransparentColor.init -> void +Sdcb.SimdCodecs.Png.PngImage.Width.get -> int +Sdcb.SimdCodecs.Png.PngImage.Width.init -> void +Sdcb.SimdCodecs.Png.PngImageDecoder +Sdcb.SimdCodecs.Png.PngImageDecoder.PngImageDecoder() -> void +Sdcb.SimdCodecs.Png.PngImageEncoder +Sdcb.SimdCodecs.Png.PngImageEncoder.PngImageEncoder() -> void +Sdcb.SimdCodecs.Png.PngPhysicalDimensions +Sdcb.SimdCodecs.Png.PngPhysicalDimensions.$() -> Sdcb.SimdCodecs.Png.PngPhysicalDimensions! +Sdcb.SimdCodecs.Png.PngPhysicalDimensions.Deconstruct(out uint PixelsPerUnitX, out uint PixelsPerUnitY, out bool UnitIsMetre) -> void +Sdcb.SimdCodecs.Png.PngPhysicalDimensions.DpiX.get -> double? +Sdcb.SimdCodecs.Png.PngPhysicalDimensions.DpiY.get -> double? +Sdcb.SimdCodecs.Png.PngPhysicalDimensions.Equals(Sdcb.SimdCodecs.Png.PngPhysicalDimensions? other) -> bool +Sdcb.SimdCodecs.Png.PngPhysicalDimensions.PixelsPerUnitX.get -> uint +Sdcb.SimdCodecs.Png.PngPhysicalDimensions.PixelsPerUnitX.init -> void +Sdcb.SimdCodecs.Png.PngPhysicalDimensions.PixelsPerUnitY.get -> uint +Sdcb.SimdCodecs.Png.PngPhysicalDimensions.PixelsPerUnitY.init -> void +Sdcb.SimdCodecs.Png.PngPhysicalDimensions.PngPhysicalDimensions(uint PixelsPerUnitX, uint PixelsPerUnitY, bool UnitIsMetre) -> void +Sdcb.SimdCodecs.Png.PngPhysicalDimensions.UnitIsMetre.get -> bool +Sdcb.SimdCodecs.Png.PngPhysicalDimensions.UnitIsMetre.init -> void +Sdcb.SimdCodecs.Png.PngPredictor +Sdcb.SimdCodecs.Png.PngReader +Sdcb.SimdCodecs.Png.PngText +Sdcb.SimdCodecs.Png.PngText.$() -> Sdcb.SimdCodecs.Png.PngText! +Sdcb.SimdCodecs.Png.PngText.Deconstruct(out string! Keyword, out string! Text) -> void +Sdcb.SimdCodecs.Png.PngText.Equals(Sdcb.SimdCodecs.Png.PngText? other) -> bool +Sdcb.SimdCodecs.Png.PngText.Keyword.get -> string! +Sdcb.SimdCodecs.Png.PngText.Keyword.init -> void +Sdcb.SimdCodecs.Png.PngText.PngText(string! Keyword, string! Text) -> void +Sdcb.SimdCodecs.Png.PngText.Text.get -> string! +Sdcb.SimdCodecs.Png.PngText.Text.init -> void +Sdcb.SimdCodecs.Png.PngWriteOptions +Sdcb.SimdCodecs.Png.PngWriteOptions.Chromaticity.get -> Sdcb.SimdCodecs.Png.ChromaticityChunk? +Sdcb.SimdCodecs.Png.PngWriteOptions.Chromaticity.init -> void +Sdcb.SimdCodecs.Png.PngWriteOptions.Cicp.get -> Sdcb.SimdCodecs.Png.CicpChunk? +Sdcb.SimdCodecs.Png.PngWriteOptions.Cicp.init -> void +Sdcb.SimdCodecs.Png.PngWriteOptions.Clli.get -> Sdcb.SimdCodecs.Png.ClliChunk? +Sdcb.SimdCodecs.Png.PngWriteOptions.Clli.init -> void +Sdcb.SimdCodecs.Png.PngWriteOptions.CompressionLevel.get -> System.IO.Compression.CompressionLevel +Sdcb.SimdCodecs.Png.PngWriteOptions.CompressionLevel.init -> void +Sdcb.SimdCodecs.Png.PngWriteOptions.DiscardAlpha.get -> bool +Sdcb.SimdCodecs.Png.PngWriteOptions.DiscardAlpha.init -> void +Sdcb.SimdCodecs.Png.PngWriteOptions.Equals(Sdcb.SimdCodecs.Png.PngWriteOptions? other) -> bool +Sdcb.SimdCodecs.Png.PngWriteOptions.Exif.get -> byte[]? +Sdcb.SimdCodecs.Png.PngWriteOptions.Exif.init -> void +Sdcb.SimdCodecs.Png.PngWriteOptions.Gamma.get -> double? +Sdcb.SimdCodecs.Png.PngWriteOptions.Gamma.init -> void +Sdcb.SimdCodecs.Png.PngWriteOptions.IccProfile.get -> byte[]? +Sdcb.SimdCodecs.Png.PngWriteOptions.IccProfile.init -> void +Sdcb.SimdCodecs.Png.PngWriteOptions.IccProfileName.get -> string! +Sdcb.SimdCodecs.Png.PngWriteOptions.IccProfileName.init -> void +Sdcb.SimdCodecs.Png.PngWriteOptions.LosslessReduction.get -> bool +Sdcb.SimdCodecs.Png.PngWriteOptions.LosslessReduction.init -> void +Sdcb.SimdCodecs.Png.PngWriteOptions.Mdcv.get -> Sdcb.SimdCodecs.Png.MdcvChunk? +Sdcb.SimdCodecs.Png.PngWriteOptions.Mdcv.init -> void +Sdcb.SimdCodecs.Png.PngWriteOptions.ParallelFragments.get -> int +Sdcb.SimdCodecs.Png.PngWriteOptions.ParallelFragments.init -> void +Sdcb.SimdCodecs.Png.PngWriteOptions.PhysicalDimensions.get -> Sdcb.SimdCodecs.Png.PngPhysicalDimensions? +Sdcb.SimdCodecs.Png.PngWriteOptions.PhysicalDimensions.init -> void +Sdcb.SimdCodecs.Png.PngWriteOptions.PngWriteOptions() -> void +Sdcb.SimdCodecs.Png.PngWriteOptions.SrgbRenderingIntent.get -> byte? +Sdcb.SimdCodecs.Png.PngWriteOptions.SrgbRenderingIntent.init -> void +Sdcb.SimdCodecs.Png.PngWriteOptions.Text.get -> System.Collections.Generic.IReadOnlyList? +Sdcb.SimdCodecs.Png.PngWriteOptions.Text.init -> void +Sdcb.SimdCodecs.Png.PngWriteOptions.TransparentColor.get -> ushort[]? +Sdcb.SimdCodecs.Png.PngWriteOptions.TransparentColor.init -> void +Sdcb.SimdCodecs.Png.PngWriter +const Sdcb.SimdCodecs.Png.PngReader.MaxInflatedIccProfileBytes = 16777216 -> int +const Sdcb.SimdCodecs.Png.PngReader.MaxInflatedTextBytes = 8388608 -> int +const Sdcb.SimdCodecs.Png.PngText.MaxKeywordLength = 79 -> int +const Sdcb.SimdCodecs.Png.PngWriter.MinimumParallelFragmentBytes = 262144 -> int +const Sdcb.SimdCodecs.Png.PngWriter.TextCompressionThreshold = 1024 -> int +override Sdcb.SimdCodecs.Png.ChromaticityChunk.Equals(object? obj) -> bool +override Sdcb.SimdCodecs.Png.ChromaticityChunk.GetHashCode() -> int +override Sdcb.SimdCodecs.Png.ChromaticityChunk.ToString() -> string! +override Sdcb.SimdCodecs.Png.CicpChunk.Equals(object? obj) -> bool +override Sdcb.SimdCodecs.Png.CicpChunk.GetHashCode() -> int +override Sdcb.SimdCodecs.Png.CicpChunk.ToString() -> string! +override Sdcb.SimdCodecs.Png.ClliChunk.Equals(object? obj) -> bool +override Sdcb.SimdCodecs.Png.ClliChunk.GetHashCode() -> int +override Sdcb.SimdCodecs.Png.ClliChunk.ToString() -> string! +override Sdcb.SimdCodecs.Png.MdcvChunk.Equals(object? obj) -> bool +override Sdcb.SimdCodecs.Png.MdcvChunk.GetHashCode() -> int +override Sdcb.SimdCodecs.Png.MdcvChunk.ToString() -> string! +override Sdcb.SimdCodecs.Png.PngImage.Equals(object? obj) -> bool +override Sdcb.SimdCodecs.Png.PngImage.GetHashCode() -> int +override Sdcb.SimdCodecs.Png.PngImage.ToString() -> string! +override Sdcb.SimdCodecs.Png.PngPhysicalDimensions.Equals(object? obj) -> bool +override Sdcb.SimdCodecs.Png.PngPhysicalDimensions.GetHashCode() -> int +override Sdcb.SimdCodecs.Png.PngPhysicalDimensions.ToString() -> string! +override Sdcb.SimdCodecs.Png.PngText.Equals(object? obj) -> bool +override Sdcb.SimdCodecs.Png.PngText.GetHashCode() -> int +override Sdcb.SimdCodecs.Png.PngText.ToString() -> string! +override Sdcb.SimdCodecs.Png.PngWriteOptions.$() -> Sdcb.SimdCodecs.Png.PngWriteOptions! +override Sdcb.SimdCodecs.Png.PngWriteOptions.Equals(object? obj) -> bool +override Sdcb.SimdCodecs.Png.PngWriteOptions.GetHashCode() -> int +override Sdcb.SimdCodecs.Png.PngWriteOptions.ToString() -> string! +override sealed Sdcb.SimdCodecs.Png.PngWriteOptions.Equals(Sdcb.SimdCodecs.Abstractions.EncodeOptions? other) -> bool +static Sdcb.SimdCodecs.Png.ChromaticityChunk.operator !=(Sdcb.SimdCodecs.Png.ChromaticityChunk? left, Sdcb.SimdCodecs.Png.ChromaticityChunk? right) -> bool +static Sdcb.SimdCodecs.Png.ChromaticityChunk.operator ==(Sdcb.SimdCodecs.Png.ChromaticityChunk? left, Sdcb.SimdCodecs.Png.ChromaticityChunk? right) -> bool +static Sdcb.SimdCodecs.Png.CicpChunk.Bt2020Hlg.get -> Sdcb.SimdCodecs.Png.CicpChunk! +static Sdcb.SimdCodecs.Png.CicpChunk.Hdr10Pq.get -> Sdcb.SimdCodecs.Png.CicpChunk! +static Sdcb.SimdCodecs.Png.CicpChunk.Srgb.get -> Sdcb.SimdCodecs.Png.CicpChunk! +static Sdcb.SimdCodecs.Png.CicpChunk.SrgbPq.get -> Sdcb.SimdCodecs.Png.CicpChunk! +static Sdcb.SimdCodecs.Png.CicpChunk.operator !=(Sdcb.SimdCodecs.Png.CicpChunk? left, Sdcb.SimdCodecs.Png.CicpChunk? right) -> bool +static Sdcb.SimdCodecs.Png.CicpChunk.operator ==(Sdcb.SimdCodecs.Png.CicpChunk? left, Sdcb.SimdCodecs.Png.CicpChunk? right) -> bool +static Sdcb.SimdCodecs.Png.ClliChunk.operator !=(Sdcb.SimdCodecs.Png.ClliChunk? left, Sdcb.SimdCodecs.Png.ClliChunk? right) -> bool +static Sdcb.SimdCodecs.Png.ClliChunk.operator ==(Sdcb.SimdCodecs.Png.ClliChunk? left, Sdcb.SimdCodecs.Png.ClliChunk? right) -> bool +static Sdcb.SimdCodecs.Png.MdcvChunk.operator !=(Sdcb.SimdCodecs.Png.MdcvChunk? left, Sdcb.SimdCodecs.Png.MdcvChunk? right) -> bool +static Sdcb.SimdCodecs.Png.MdcvChunk.operator ==(Sdcb.SimdCodecs.Png.MdcvChunk? left, Sdcb.SimdCodecs.Png.MdcvChunk? right) -> bool +static Sdcb.SimdCodecs.Png.PngImage.operator !=(Sdcb.SimdCodecs.Png.PngImage? left, Sdcb.SimdCodecs.Png.PngImage? right) -> bool +static Sdcb.SimdCodecs.Png.PngImage.operator ==(Sdcb.SimdCodecs.Png.PngImage? left, Sdcb.SimdCodecs.Png.PngImage? right) -> bool +static Sdcb.SimdCodecs.Png.PngImageDecoder.CanDecode(System.ReadOnlySpan header) -> bool +static Sdcb.SimdCodecs.Png.PngImageDecoder.Registration.get -> Sdcb.SimdCodecs.Abstractions.ImageDecoderRegistration! +static Sdcb.SimdCodecs.Png.PngImageDecoder.SignatureLength.get -> int +static Sdcb.SimdCodecs.Png.PngImageDecoder.TryDecode(System.ReadOnlySpan data, out Sdcb.SimdCodecs.Abstractions.IDecodedImage? image, Sdcb.SimdCodecs.Abstractions.DecodeOptions? options = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> bool +static Sdcb.SimdCodecs.Png.PngImageDecoder.TryDecodeInto(System.ReadOnlySpan data, System.Span destination, int stride, Sdcb.SimdCodecs.Abstractions.PixelFormat format, Sdcb.SimdCodecs.Abstractions.DecodeOptions? options = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> bool +static Sdcb.SimdCodecs.Png.PngImageDecoder.TryDecodeIntoRgba8(System.ReadOnlySpan data, System.Span rgbaDestination) -> bool +static Sdcb.SimdCodecs.Png.PngImageDecoder.TryDecodeRgba8(System.ReadOnlySpan data, out byte[]? rgba, out int width, out int height) -> bool +static Sdcb.SimdCodecs.Png.PngImageDecoder.TryDecodeThumbnail(System.ReadOnlySpan data, out Sdcb.SimdCodecs.Abstractions.IDecodedImage? thumbnail) -> bool +static Sdcb.SimdCodecs.Png.PngImageDecoder.TryGetClosestSize(System.ReadOnlySpan data, int requestedWidth, int requestedHeight, out int width, out int height, out int scaleDenominator) -> bool +static Sdcb.SimdCodecs.Png.PngImageDecoder.TryReadInfo(System.ReadOnlySpan data, out Sdcb.SimdCodecs.Abstractions.ImageInfo info) -> bool +static Sdcb.SimdCodecs.Png.PngImageDecoder.TryReadMetadata(System.ReadOnlySpan data, out Sdcb.SimdCodecs.Abstractions.ImageMetadata? metadata) -> bool +static Sdcb.SimdCodecs.Png.PngImageEncoder.Create(System.Buffers.IBufferWriter! output, Sdcb.SimdCodecs.Abstractions.EncodeOptions? options = null) -> Sdcb.SimdCodecs.Abstractions.IImageEncoderSession! +static Sdcb.SimdCodecs.Png.PngImageEncoder.Format.get -> Sdcb.SimdCodecs.Abstractions.ImageFormat +static Sdcb.SimdCodecs.Png.PngImageEncoder.GetClosestInputFormat(Sdcb.SimdCodecs.Abstractions.PixelFormat requested) -> Sdcb.SimdCodecs.Abstractions.PixelFormat +static Sdcb.SimdCodecs.Png.PngImageEncoder.Registration.get -> Sdcb.SimdCodecs.Abstractions.ImageEncoderRegistration! +static Sdcb.SimdCodecs.Png.PngPhysicalDimensions.FromDpi(double dpi) -> Sdcb.SimdCodecs.Png.PngPhysicalDimensions! +static Sdcb.SimdCodecs.Png.PngPhysicalDimensions.operator !=(Sdcb.SimdCodecs.Png.PngPhysicalDimensions? left, Sdcb.SimdCodecs.Png.PngPhysicalDimensions? right) -> bool +static Sdcb.SimdCodecs.Png.PngPhysicalDimensions.operator ==(Sdcb.SimdCodecs.Png.PngPhysicalDimensions? left, Sdcb.SimdCodecs.Png.PngPhysicalDimensions? right) -> bool +static Sdcb.SimdCodecs.Png.PngPredictor.Unfilter(System.ReadOnlySpan input, int columns, int bytesPerComponent = 1) -> byte[]! +static Sdcb.SimdCodecs.Png.PngReader.Decode(System.ReadOnlySpan data, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> Sdcb.SimdCodecs.Png.PngImage! +static Sdcb.SimdCodecs.Png.PngReader.TryDecode(System.ReadOnlySpan data, out Sdcb.SimdCodecs.Png.PngImage? image, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> bool +static Sdcb.SimdCodecs.Png.PngText.IsValidKeyword(string! keyword) -> bool +static Sdcb.SimdCodecs.Png.PngText.operator !=(Sdcb.SimdCodecs.Png.PngText? left, Sdcb.SimdCodecs.Png.PngText? right) -> bool +static Sdcb.SimdCodecs.Png.PngText.operator ==(Sdcb.SimdCodecs.Png.PngText? left, Sdcb.SimdCodecs.Png.PngText? right) -> bool +static Sdcb.SimdCodecs.Png.PngWriteOptions.operator !=(Sdcb.SimdCodecs.Png.PngWriteOptions? left, Sdcb.SimdCodecs.Png.PngWriteOptions? right) -> bool +static Sdcb.SimdCodecs.Png.PngWriteOptions.operator ==(Sdcb.SimdCodecs.Png.PngWriteOptions? left, Sdcb.SimdCodecs.Png.PngWriteOptions? right) -> bool +static Sdcb.SimdCodecs.Png.PngWriter.Encode(System.ReadOnlySpan rgba, int width, int height) -> byte[]! +static Sdcb.SimdCodecs.Png.PngWriter.Encode(System.ReadOnlySpan rgba, int width, int height, Sdcb.SimdCodecs.Png.PngWriteOptions! options) -> byte[]! +static Sdcb.SimdCodecs.Png.PngWriter.Encode(System.ReadOnlySpan rgba, int width, int height, System.ReadOnlySpan iccProfile) -> byte[]! +static Sdcb.SimdCodecs.Png.PngWriter.EncodeGray16(System.ReadOnlySpan gray, int width, int height, Sdcb.SimdCodecs.Png.PngWriteOptions! options) -> byte[]! +static Sdcb.SimdCodecs.Png.PngWriter.EncodeGray16(System.ReadOnlySpan gray, int width, int height, System.ReadOnlySpan iccProfile = default(System.ReadOnlySpan)) -> byte[]! +static Sdcb.SimdCodecs.Png.PngWriter.EncodeGray8(System.ReadOnlySpan gray, int width, int height, Sdcb.SimdCodecs.Png.PngWriteOptions! options) -> byte[]! +static Sdcb.SimdCodecs.Png.PngWriter.EncodeGray8(System.ReadOnlySpan gray, int width, int height, System.ReadOnlySpan iccProfile = default(System.ReadOnlySpan)) -> byte[]! +static Sdcb.SimdCodecs.Png.PngWriter.EncodeGrayAlpha16(System.ReadOnlySpan grayAlpha, int width, int height, Sdcb.SimdCodecs.Png.PngWriteOptions! options) -> byte[]! +static Sdcb.SimdCodecs.Png.PngWriter.EncodeGrayAlpha16(System.ReadOnlySpan grayAlpha, int width, int height, System.ReadOnlySpan iccProfile = default(System.ReadOnlySpan)) -> byte[]! +static Sdcb.SimdCodecs.Png.PngWriter.EncodeGrayAlpha8(System.ReadOnlySpan grayAlpha, int width, int height, Sdcb.SimdCodecs.Png.PngWriteOptions! options) -> byte[]! +static Sdcb.SimdCodecs.Png.PngWriter.EncodeGrayAlpha8(System.ReadOnlySpan grayAlpha, int width, int height, System.ReadOnlySpan iccProfile = default(System.ReadOnlySpan)) -> byte[]! +static Sdcb.SimdCodecs.Png.PngWriter.EncodeRgb16(System.ReadOnlySpan rgb, int width, int height, Sdcb.SimdCodecs.Png.PngWriteOptions! options) -> byte[]! +static Sdcb.SimdCodecs.Png.PngWriter.EncodeRgb16(System.ReadOnlySpan rgb, int width, int height, System.ReadOnlySpan iccProfile = default(System.ReadOnlySpan)) -> byte[]! +static Sdcb.SimdCodecs.Png.PngWriter.EncodeRgb8(System.ReadOnlySpan rgb, int width, int height, Sdcb.SimdCodecs.Png.PngWriteOptions! options) -> byte[]! +static Sdcb.SimdCodecs.Png.PngWriter.EncodeRgb8(System.ReadOnlySpan rgb, int width, int height, System.ReadOnlySpan iccProfile = default(System.ReadOnlySpan)) -> byte[]! +static Sdcb.SimdCodecs.Png.PngWriter.EncodeRgba16(System.ReadOnlySpan rgba, int width, int height, Sdcb.SimdCodecs.Png.PngWriteOptions! options) -> byte[]! +static Sdcb.SimdCodecs.Png.PngWriter.EncodeRgba16(System.ReadOnlySpan rgba, int width, int height, System.ReadOnlySpan iccProfile = default(System.ReadOnlySpan)) -> byte[]! +static Sdcb.SimdCodecs.Png.PngWriter.Save(string! path, System.ReadOnlySpan rgba, int width, int height) -> void +static Sdcb.SimdCodecs.Png.PngWriter.Save(string! path, System.ReadOnlySpan rgba, int width, int height, System.ReadOnlySpan iccProfile) -> void diff --git a/src/Sdcb.SimdCodecs.Png/PublicAPI.Unshipped.txt b/src/Sdcb.SimdCodecs.Png/PublicAPI.Unshipped.txt new file mode 100644 index 0000000..7dc5c58 --- /dev/null +++ b/src/Sdcb.SimdCodecs.Png/PublicAPI.Unshipped.txt @@ -0,0 +1 @@ +#nullable enable diff --git a/src/Sdcb.SimdCodecs.Pnm/PublicAPI.Shipped.txt b/src/Sdcb.SimdCodecs.Pnm/PublicAPI.Shipped.txt new file mode 100644 index 0000000..647c9a2 --- /dev/null +++ b/src/Sdcb.SimdCodecs.Pnm/PublicAPI.Shipped.txt @@ -0,0 +1,103 @@ +#nullable enable +Sdcb.SimdCodecs.Pnm.PfmImageDecoder +Sdcb.SimdCodecs.Pnm.PfmImageDecoder.PfmImageDecoder() -> void +Sdcb.SimdCodecs.Pnm.PnmDecoder +Sdcb.SimdCodecs.Pnm.PnmEncodeOptions +Sdcb.SimdCodecs.Pnm.PnmEncodeOptions.Equals(Sdcb.SimdCodecs.Pnm.PnmEncodeOptions? other) -> bool +Sdcb.SimdCodecs.Pnm.PnmEncodeOptions.Format.get -> Sdcb.SimdCodecs.Pnm.PnmFormat +Sdcb.SimdCodecs.Pnm.PnmEncodeOptions.Format.init -> void +Sdcb.SimdCodecs.Pnm.PnmEncodeOptions.MaxValue.get -> int +Sdcb.SimdCodecs.Pnm.PnmEncodeOptions.MaxValue.init -> void +Sdcb.SimdCodecs.Pnm.PnmEncodeOptions.PnmEncodeOptions() -> void +Sdcb.SimdCodecs.Pnm.PnmEncodeOptions.TupleType.get -> string? +Sdcb.SimdCodecs.Pnm.PnmEncodeOptions.TupleType.init -> void +Sdcb.SimdCodecs.Pnm.PnmEncoder +Sdcb.SimdCodecs.Pnm.PnmFormat +Sdcb.SimdCodecs.Pnm.PnmFormat.Arbitrary = 7 -> Sdcb.SimdCodecs.Pnm.PnmFormat +Sdcb.SimdCodecs.Pnm.PnmFormat.Auto = 0 -> Sdcb.SimdCodecs.Pnm.PnmFormat +Sdcb.SimdCodecs.Pnm.PnmFormat.Bitmap = 4 -> Sdcb.SimdCodecs.Pnm.PnmFormat +Sdcb.SimdCodecs.Pnm.PnmFormat.FloatGraymap = 8 -> Sdcb.SimdCodecs.Pnm.PnmFormat +Sdcb.SimdCodecs.Pnm.PnmFormat.FloatPixmap = 9 -> Sdcb.SimdCodecs.Pnm.PnmFormat +Sdcb.SimdCodecs.Pnm.PnmFormat.Graymap = 5 -> Sdcb.SimdCodecs.Pnm.PnmFormat +Sdcb.SimdCodecs.Pnm.PnmFormat.Pixmap = 6 -> Sdcb.SimdCodecs.Pnm.PnmFormat +Sdcb.SimdCodecs.Pnm.PnmFormat.PlainBitmap = 1 -> Sdcb.SimdCodecs.Pnm.PnmFormat +Sdcb.SimdCodecs.Pnm.PnmFormat.PlainGraymap = 2 -> Sdcb.SimdCodecs.Pnm.PnmFormat +Sdcb.SimdCodecs.Pnm.PnmFormat.PlainPixmap = 3 -> Sdcb.SimdCodecs.Pnm.PnmFormat +Sdcb.SimdCodecs.Pnm.PnmImage +Sdcb.SimdCodecs.Pnm.PnmImage.Channels.get -> int +Sdcb.SimdCodecs.Pnm.PnmImage.Height.get -> int +Sdcb.SimdCodecs.Pnm.PnmImage.Info.get -> Sdcb.SimdCodecs.Pnm.PnmInfo +Sdcb.SimdCodecs.Pnm.PnmImage.Pixels.get -> byte[]! +Sdcb.SimdCodecs.Pnm.PnmImage.SampleFormat.get -> Sdcb.SimdCodecs.Abstractions.SampleFormat +Sdcb.SimdCodecs.Pnm.PnmImage.Width.get -> int +Sdcb.SimdCodecs.Pnm.PnmImageDecoder +Sdcb.SimdCodecs.Pnm.PnmImageDecoder.PnmImageDecoder() -> void +Sdcb.SimdCodecs.Pnm.PnmImageEncoder +Sdcb.SimdCodecs.Pnm.PnmImageEncoder.PnmImageEncoder() -> void +Sdcb.SimdCodecs.Pnm.PnmInfo +Sdcb.SimdCodecs.Pnm.PnmInfo.Channels.get -> int +Sdcb.SimdCodecs.Pnm.PnmInfo.Channels.init -> void +Sdcb.SimdCodecs.Pnm.PnmInfo.Deconstruct(out int Width, out int Height, out Sdcb.SimdCodecs.Pnm.PnmFormat Format, out int Channels, out int MaxValue, out string? TupleType, out float Scale) -> void +Sdcb.SimdCodecs.Pnm.PnmInfo.Equals(Sdcb.SimdCodecs.Pnm.PnmInfo other) -> bool +Sdcb.SimdCodecs.Pnm.PnmInfo.Format.get -> Sdcb.SimdCodecs.Pnm.PnmFormat +Sdcb.SimdCodecs.Pnm.PnmInfo.Format.init -> void +Sdcb.SimdCodecs.Pnm.PnmInfo.Height.get -> int +Sdcb.SimdCodecs.Pnm.PnmInfo.Height.init -> void +Sdcb.SimdCodecs.Pnm.PnmInfo.IsPlain.get -> bool +Sdcb.SimdCodecs.Pnm.PnmInfo.MaxValue.get -> int +Sdcb.SimdCodecs.Pnm.PnmInfo.MaxValue.init -> void +Sdcb.SimdCodecs.Pnm.PnmInfo.PnmInfo() -> void +Sdcb.SimdCodecs.Pnm.PnmInfo.PnmInfo(int Width, int Height, Sdcb.SimdCodecs.Pnm.PnmFormat Format, int Channels, int MaxValue, string? TupleType, float Scale) -> void +Sdcb.SimdCodecs.Pnm.PnmInfo.SampleFormat.get -> Sdcb.SimdCodecs.Abstractions.SampleFormat +Sdcb.SimdCodecs.Pnm.PnmInfo.Scale.get -> float +Sdcb.SimdCodecs.Pnm.PnmInfo.Scale.init -> void +Sdcb.SimdCodecs.Pnm.PnmInfo.TupleType.get -> string? +Sdcb.SimdCodecs.Pnm.PnmInfo.TupleType.init -> void +Sdcb.SimdCodecs.Pnm.PnmInfo.Width.get -> int +Sdcb.SimdCodecs.Pnm.PnmInfo.Width.init -> void +override Sdcb.SimdCodecs.Pnm.PnmEncodeOptions.$() -> Sdcb.SimdCodecs.Pnm.PnmEncodeOptions! +override Sdcb.SimdCodecs.Pnm.PnmEncodeOptions.Equals(object? obj) -> bool +override Sdcb.SimdCodecs.Pnm.PnmEncodeOptions.GetHashCode() -> int +override Sdcb.SimdCodecs.Pnm.PnmEncodeOptions.ToString() -> string! +override Sdcb.SimdCodecs.Pnm.PnmInfo.GetHashCode() -> int +override sealed Sdcb.SimdCodecs.Pnm.PnmEncodeOptions.Equals(Sdcb.SimdCodecs.Abstractions.EncodeOptions? other) -> bool +static Sdcb.SimdCodecs.Pnm.PfmImageDecoder.CanDecode(System.ReadOnlySpan header) -> bool +static Sdcb.SimdCodecs.Pnm.PfmImageDecoder.Registration.get -> Sdcb.SimdCodecs.Abstractions.ImageDecoderRegistration! +static Sdcb.SimdCodecs.Pnm.PfmImageDecoder.SignatureLength.get -> int +static Sdcb.SimdCodecs.Pnm.PfmImageDecoder.TryDecode(System.ReadOnlySpan data, out Sdcb.SimdCodecs.Abstractions.IDecodedImage? image, Sdcb.SimdCodecs.Abstractions.DecodeOptions? options = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> bool +static Sdcb.SimdCodecs.Pnm.PfmImageDecoder.TryDecodeInto(System.ReadOnlySpan data, System.Span destination, int stride, Sdcb.SimdCodecs.Abstractions.PixelFormat format, Sdcb.SimdCodecs.Abstractions.DecodeOptions? options = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> bool +static Sdcb.SimdCodecs.Pnm.PfmImageDecoder.TryDecodeThumbnail(System.ReadOnlySpan data, out Sdcb.SimdCodecs.Abstractions.IDecodedImage? thumbnail) -> bool +static Sdcb.SimdCodecs.Pnm.PfmImageDecoder.TryGetClosestSize(System.ReadOnlySpan data, int requestedWidth, int requestedHeight, out int width, out int height, out int scaleDenominator) -> bool +static Sdcb.SimdCodecs.Pnm.PfmImageDecoder.TryReadInfo(System.ReadOnlySpan data, out Sdcb.SimdCodecs.Abstractions.ImageInfo info) -> bool +static Sdcb.SimdCodecs.Pnm.PfmImageDecoder.TryReadMetadata(System.ReadOnlySpan data, out Sdcb.SimdCodecs.Abstractions.ImageMetadata? metadata) -> bool +static Sdcb.SimdCodecs.Pnm.PnmDecoder.Decode(System.ReadOnlySpan data) -> Sdcb.SimdCodecs.Pnm.PnmImage! +static Sdcb.SimdCodecs.Pnm.PnmDecoder.DecodeTo(System.ReadOnlySpan data, System.Span destination, Sdcb.SimdCodecs.Abstractions.PixelFormat? format = null, int stride = 0) -> void +static Sdcb.SimdCodecs.Pnm.PnmDecoder.ReadInfo(System.ReadOnlySpan data) -> Sdcb.SimdCodecs.Pnm.PnmInfo +static Sdcb.SimdCodecs.Pnm.PnmDecoder.TryReadInfo(System.ReadOnlySpan data, out Sdcb.SimdCodecs.Pnm.PnmInfo info) -> bool +static Sdcb.SimdCodecs.Pnm.PnmEncodeOptions.operator !=(Sdcb.SimdCodecs.Pnm.PnmEncodeOptions? left, Sdcb.SimdCodecs.Pnm.PnmEncodeOptions? right) -> bool +static Sdcb.SimdCodecs.Pnm.PnmEncodeOptions.operator ==(Sdcb.SimdCodecs.Pnm.PnmEncodeOptions? left, Sdcb.SimdCodecs.Pnm.PnmEncodeOptions? right) -> bool +static Sdcb.SimdCodecs.Pnm.PnmEncoder.Encode(System.ReadOnlySpan pixels, int width, int height, Sdcb.SimdCodecs.Abstractions.PixelFormat format, Sdcb.SimdCodecs.Pnm.PnmEncodeOptions? options = null, int stride = 0) -> byte[]! +static Sdcb.SimdCodecs.Pnm.PnmEncoder.Encode(System.ReadOnlySpan pixels, int width, int height, Sdcb.SimdCodecs.Abstractions.PixelFormat format, System.IO.Stream! output, Sdcb.SimdCodecs.Pnm.PnmEncodeOptions? options = null, int stride = 0) -> void +static Sdcb.SimdCodecs.Pnm.PnmEncoder.Encode(System.ReadOnlySpan samples, int width, int height, int channels, Sdcb.SimdCodecs.Pnm.PnmEncodeOptions? options = null) -> byte[]! +static Sdcb.SimdCodecs.Pnm.PnmEncoder.Encode(System.ReadOnlySpan samples, int width, int height, int channels, Sdcb.SimdCodecs.Pnm.PnmEncodeOptions? options = null) -> byte[]! +static Sdcb.SimdCodecs.Pnm.PnmEncoder.Encode(System.ReadOnlySpan samples, int width, int height, int channels, System.IO.Stream! output, Sdcb.SimdCodecs.Pnm.PnmEncodeOptions? options = null) -> void +static Sdcb.SimdCodecs.Pnm.PnmEncoder.EncodePfm(System.ReadOnlySpan samples, int width, int height, int channels) -> byte[]! +static Sdcb.SimdCodecs.Pnm.PnmEncoder.EncodePfm(System.ReadOnlySpan samples, int width, int height, int channels, System.IO.Stream! output) -> void +static Sdcb.SimdCodecs.Pnm.PnmImageDecoder.CanDecode(System.ReadOnlySpan header) -> bool +static Sdcb.SimdCodecs.Pnm.PnmImageDecoder.Registration.get -> Sdcb.SimdCodecs.Abstractions.ImageDecoderRegistration! +static Sdcb.SimdCodecs.Pnm.PnmImageDecoder.SignatureLength.get -> int +static Sdcb.SimdCodecs.Pnm.PnmImageDecoder.TryDecode(System.ReadOnlySpan data, out Sdcb.SimdCodecs.Abstractions.IDecodedImage? image, Sdcb.SimdCodecs.Abstractions.DecodeOptions? options = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> bool +static Sdcb.SimdCodecs.Pnm.PnmImageDecoder.TryDecodeInto(System.ReadOnlySpan data, System.Span destination, int stride, Sdcb.SimdCodecs.Abstractions.PixelFormat format, Sdcb.SimdCodecs.Abstractions.DecodeOptions? options = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> bool +static Sdcb.SimdCodecs.Pnm.PnmImageDecoder.TryDecodeIntoRgba8(System.ReadOnlySpan data, System.Span rgbaDestination) -> bool +static Sdcb.SimdCodecs.Pnm.PnmImageDecoder.TryDecodeThumbnail(System.ReadOnlySpan data, out Sdcb.SimdCodecs.Abstractions.IDecodedImage? thumbnail) -> bool +static Sdcb.SimdCodecs.Pnm.PnmImageDecoder.TryGetClosestSize(System.ReadOnlySpan data, int requestedWidth, int requestedHeight, out int width, out int height, out int scaleDenominator) -> bool +static Sdcb.SimdCodecs.Pnm.PnmImageDecoder.TryReadInfo(System.ReadOnlySpan data, out Sdcb.SimdCodecs.Abstractions.ImageInfo info) -> bool +static Sdcb.SimdCodecs.Pnm.PnmImageDecoder.TryReadMetadata(System.ReadOnlySpan data, out Sdcb.SimdCodecs.Abstractions.ImageMetadata? metadata) -> bool +static Sdcb.SimdCodecs.Pnm.PnmImageEncoder.Create(System.Buffers.IBufferWriter! output, Sdcb.SimdCodecs.Abstractions.EncodeOptions? options = null) -> Sdcb.SimdCodecs.Abstractions.IImageEncoderSession! +static Sdcb.SimdCodecs.Pnm.PnmImageEncoder.Format.get -> Sdcb.SimdCodecs.Abstractions.ImageFormat +static Sdcb.SimdCodecs.Pnm.PnmImageEncoder.GetClosestInputFormat(Sdcb.SimdCodecs.Abstractions.PixelFormat requested) -> Sdcb.SimdCodecs.Abstractions.PixelFormat +static Sdcb.SimdCodecs.Pnm.PnmImageEncoder.Registration.get -> Sdcb.SimdCodecs.Abstractions.ImageEncoderRegistration! +static Sdcb.SimdCodecs.Pnm.PnmInfo.operator !=(Sdcb.SimdCodecs.Pnm.PnmInfo left, Sdcb.SimdCodecs.Pnm.PnmInfo right) -> bool +static Sdcb.SimdCodecs.Pnm.PnmInfo.operator ==(Sdcb.SimdCodecs.Pnm.PnmInfo left, Sdcb.SimdCodecs.Pnm.PnmInfo right) -> bool +~override Sdcb.SimdCodecs.Pnm.PnmInfo.Equals(object obj) -> bool +~override Sdcb.SimdCodecs.Pnm.PnmInfo.ToString() -> string diff --git a/src/Sdcb.SimdCodecs.Pnm/PublicAPI.Unshipped.txt b/src/Sdcb.SimdCodecs.Pnm/PublicAPI.Unshipped.txt new file mode 100644 index 0000000..7dc5c58 --- /dev/null +++ b/src/Sdcb.SimdCodecs.Pnm/PublicAPI.Unshipped.txt @@ -0,0 +1 @@ +#nullable enable diff --git a/src/Sdcb.SimdCodecs.Qoi/PublicAPI.Shipped.txt b/src/Sdcb.SimdCodecs.Qoi/PublicAPI.Shipped.txt new file mode 100644 index 0000000..0602ff6 --- /dev/null +++ b/src/Sdcb.SimdCodecs.Qoi/PublicAPI.Shipped.txt @@ -0,0 +1,54 @@ +#nullable enable +Sdcb.SimdCodecs.Qoi.QoiColorSpace +Sdcb.SimdCodecs.Qoi.QoiColorSpace.Linear = 1 -> Sdcb.SimdCodecs.Qoi.QoiColorSpace +Sdcb.SimdCodecs.Qoi.QoiColorSpace.Srgb = 0 -> Sdcb.SimdCodecs.Qoi.QoiColorSpace +Sdcb.SimdCodecs.Qoi.QoiDecoder +Sdcb.SimdCodecs.Qoi.QoiEncoder +Sdcb.SimdCodecs.Qoi.QoiImage +Sdcb.SimdCodecs.Qoi.QoiImage.Channels.get -> int +Sdcb.SimdCodecs.Qoi.QoiImage.ColorSpace.get -> Sdcb.SimdCodecs.Qoi.QoiColorSpace +Sdcb.SimdCodecs.Qoi.QoiImage.Height.get -> int +Sdcb.SimdCodecs.Qoi.QoiImage.Pixels.get -> byte[]! +Sdcb.SimdCodecs.Qoi.QoiImage.Width.get -> int +Sdcb.SimdCodecs.Qoi.QoiImageDecoder +Sdcb.SimdCodecs.Qoi.QoiImageDecoder.QoiImageDecoder() -> void +Sdcb.SimdCodecs.Qoi.QoiImageEncoder +Sdcb.SimdCodecs.Qoi.QoiImageEncoder.QoiImageEncoder() -> void +Sdcb.SimdCodecs.Qoi.QoiInfo +Sdcb.SimdCodecs.Qoi.QoiInfo.Channels.get -> int +Sdcb.SimdCodecs.Qoi.QoiInfo.Channels.init -> void +Sdcb.SimdCodecs.Qoi.QoiInfo.ColorSpace.get -> Sdcb.SimdCodecs.Qoi.QoiColorSpace +Sdcb.SimdCodecs.Qoi.QoiInfo.ColorSpace.init -> void +Sdcb.SimdCodecs.Qoi.QoiInfo.Deconstruct(out int Width, out int Height, out int Channels, out Sdcb.SimdCodecs.Qoi.QoiColorSpace ColorSpace) -> void +Sdcb.SimdCodecs.Qoi.QoiInfo.Equals(Sdcb.SimdCodecs.Qoi.QoiInfo other) -> bool +Sdcb.SimdCodecs.Qoi.QoiInfo.Height.get -> int +Sdcb.SimdCodecs.Qoi.QoiInfo.Height.init -> void +Sdcb.SimdCodecs.Qoi.QoiInfo.QoiInfo() -> void +Sdcb.SimdCodecs.Qoi.QoiInfo.QoiInfo(int Width, int Height, int Channels, Sdcb.SimdCodecs.Qoi.QoiColorSpace ColorSpace) -> void +Sdcb.SimdCodecs.Qoi.QoiInfo.Width.get -> int +Sdcb.SimdCodecs.Qoi.QoiInfo.Width.init -> void +override Sdcb.SimdCodecs.Qoi.QoiInfo.GetHashCode() -> int +static Sdcb.SimdCodecs.Qoi.QoiDecoder.Decode(System.ReadOnlySpan data) -> Sdcb.SimdCodecs.Qoi.QoiImage! +static Sdcb.SimdCodecs.Qoi.QoiDecoder.DecodeTo(System.ReadOnlySpan data, System.Span destination, Sdcb.SimdCodecs.Abstractions.PixelFormat? format = null, int stride = 0) -> void +static Sdcb.SimdCodecs.Qoi.QoiDecoder.ReadInfo(System.ReadOnlySpan data) -> Sdcb.SimdCodecs.Qoi.QoiInfo +static Sdcb.SimdCodecs.Qoi.QoiDecoder.TryReadInfo(System.ReadOnlySpan data, out Sdcb.SimdCodecs.Qoi.QoiInfo info) -> bool +static Sdcb.SimdCodecs.Qoi.QoiEncoder.Encode(System.ReadOnlySpan pixels, int width, int height, Sdcb.SimdCodecs.Abstractions.PixelFormat format, Sdcb.SimdCodecs.Qoi.QoiColorSpace colorSpace = Sdcb.SimdCodecs.Qoi.QoiColorSpace.Srgb, int stride = 0) -> byte[]! +static Sdcb.SimdCodecs.Qoi.QoiEncoder.Encode(System.ReadOnlySpan pixels, int width, int height, Sdcb.SimdCodecs.Abstractions.PixelFormat format, System.IO.Stream! output, Sdcb.SimdCodecs.Qoi.QoiColorSpace colorSpace = Sdcb.SimdCodecs.Qoi.QoiColorSpace.Srgb, int stride = 0) -> void +static Sdcb.SimdCodecs.Qoi.QoiImageDecoder.CanDecode(System.ReadOnlySpan header) -> bool +static Sdcb.SimdCodecs.Qoi.QoiImageDecoder.Registration.get -> Sdcb.SimdCodecs.Abstractions.ImageDecoderRegistration! +static Sdcb.SimdCodecs.Qoi.QoiImageDecoder.SignatureLength.get -> int +static Sdcb.SimdCodecs.Qoi.QoiImageDecoder.TryDecode(System.ReadOnlySpan data, out Sdcb.SimdCodecs.Abstractions.IDecodedImage? image, Sdcb.SimdCodecs.Abstractions.DecodeOptions? options = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> bool +static Sdcb.SimdCodecs.Qoi.QoiImageDecoder.TryDecodeInto(System.ReadOnlySpan data, System.Span destination, int stride, Sdcb.SimdCodecs.Abstractions.PixelFormat format, Sdcb.SimdCodecs.Abstractions.DecodeOptions? options = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> bool +static Sdcb.SimdCodecs.Qoi.QoiImageDecoder.TryDecodeIntoRgba8(System.ReadOnlySpan data, System.Span rgbaDestination) -> bool +static Sdcb.SimdCodecs.Qoi.QoiImageDecoder.TryDecodeThumbnail(System.ReadOnlySpan data, out Sdcb.SimdCodecs.Abstractions.IDecodedImage? thumbnail) -> bool +static Sdcb.SimdCodecs.Qoi.QoiImageDecoder.TryGetClosestSize(System.ReadOnlySpan data, int requestedWidth, int requestedHeight, out int width, out int height, out int scaleDenominator) -> bool +static Sdcb.SimdCodecs.Qoi.QoiImageDecoder.TryReadInfo(System.ReadOnlySpan data, out Sdcb.SimdCodecs.Abstractions.ImageInfo info) -> bool +static Sdcb.SimdCodecs.Qoi.QoiImageDecoder.TryReadMetadata(System.ReadOnlySpan data, out Sdcb.SimdCodecs.Abstractions.ImageMetadata? metadata) -> bool +static Sdcb.SimdCodecs.Qoi.QoiImageEncoder.Create(System.Buffers.IBufferWriter! output, Sdcb.SimdCodecs.Abstractions.EncodeOptions? options = null) -> Sdcb.SimdCodecs.Abstractions.IImageEncoderSession! +static Sdcb.SimdCodecs.Qoi.QoiImageEncoder.Format.get -> Sdcb.SimdCodecs.Abstractions.ImageFormat +static Sdcb.SimdCodecs.Qoi.QoiImageEncoder.GetClosestInputFormat(Sdcb.SimdCodecs.Abstractions.PixelFormat requested) -> Sdcb.SimdCodecs.Abstractions.PixelFormat +static Sdcb.SimdCodecs.Qoi.QoiImageEncoder.Registration.get -> Sdcb.SimdCodecs.Abstractions.ImageEncoderRegistration! +static Sdcb.SimdCodecs.Qoi.QoiInfo.operator !=(Sdcb.SimdCodecs.Qoi.QoiInfo left, Sdcb.SimdCodecs.Qoi.QoiInfo right) -> bool +static Sdcb.SimdCodecs.Qoi.QoiInfo.operator ==(Sdcb.SimdCodecs.Qoi.QoiInfo left, Sdcb.SimdCodecs.Qoi.QoiInfo right) -> bool +~override Sdcb.SimdCodecs.Qoi.QoiInfo.Equals(object obj) -> bool +~override Sdcb.SimdCodecs.Qoi.QoiInfo.ToString() -> string diff --git a/src/Sdcb.SimdCodecs.Qoi/PublicAPI.Unshipped.txt b/src/Sdcb.SimdCodecs.Qoi/PublicAPI.Unshipped.txt new file mode 100644 index 0000000..7dc5c58 --- /dev/null +++ b/src/Sdcb.SimdCodecs.Qoi/PublicAPI.Unshipped.txt @@ -0,0 +1 @@ +#nullable enable diff --git a/src/Sdcb.SimdCodecs.Tiff/PublicAPI.Shipped.txt b/src/Sdcb.SimdCodecs.Tiff/PublicAPI.Shipped.txt new file mode 100644 index 0000000..382d2d3 --- /dev/null +++ b/src/Sdcb.SimdCodecs.Tiff/PublicAPI.Shipped.txt @@ -0,0 +1,322 @@ +#nullable enable +Sdcb.SimdCodecs.Tiff.IImageSource +Sdcb.SimdCodecs.Tiff.IImageSource.Compression.get -> Sdcb.SimdCodecs.Tiff.TiffCompression +Sdcb.SimdCodecs.Tiff.IImageSource.GetSegmentAsync(int index, System.Threading.CancellationToken ct = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.ValueTask> +Sdcb.SimdCodecs.Tiff.IImageSource.Height.get -> int +Sdcb.SimdCodecs.Tiff.IImageSource.IsPreCompressed.get -> bool +Sdcb.SimdCodecs.Tiff.IImageSource.Photometric.get -> Sdcb.SimdCodecs.Tiff.TiffPhotometric +Sdcb.SimdCodecs.Tiff.IImageSource.SegmentCount.get -> int +Sdcb.SimdCodecs.Tiff.IImageSource.Width.get -> int +Sdcb.SimdCodecs.Tiff.ITiffStripSink +Sdcb.SimdCodecs.Tiff.ITiffStripSink.BeginPage(int pageIndex, Sdcb.SimdCodecs.Tiff.TiffPage! description) -> bool +Sdcb.SimdCodecs.Tiff.ITiffStripSink.Strip(int pageIndex, int firstRow, int rowCount, System.ReadOnlySpan samples) -> void +Sdcb.SimdCodecs.Tiff.JpegPassthroughSource +Sdcb.SimdCodecs.Tiff.JpegPassthroughSource.Compression.get -> Sdcb.SimdCodecs.Tiff.TiffCompression +Sdcb.SimdCodecs.Tiff.JpegPassthroughSource.GetSegmentAsync(int index, System.Threading.CancellationToken ct = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.ValueTask> +Sdcb.SimdCodecs.Tiff.JpegPassthroughSource.Height.get -> int +Sdcb.SimdCodecs.Tiff.JpegPassthroughSource.IsPreCompressed.get -> bool +Sdcb.SimdCodecs.Tiff.JpegPassthroughSource.JpegPassthroughSource(System.ReadOnlyMemory jpegBytes, int width, int height) -> void +Sdcb.SimdCodecs.Tiff.JpegPassthroughSource.Photometric.get -> Sdcb.SimdCodecs.Tiff.TiffPhotometric +Sdcb.SimdCodecs.Tiff.JpegPassthroughSource.SegmentCount.get -> int +Sdcb.SimdCodecs.Tiff.JpegPassthroughSource.Width.get -> int +Sdcb.SimdCodecs.Tiff.PixelSource +Sdcb.SimdCodecs.Tiff.PixelSource.Compression.get -> Sdcb.SimdCodecs.Tiff.TiffCompression +Sdcb.SimdCodecs.Tiff.PixelSource.GetSegmentAsync(int index, System.Threading.CancellationToken ct = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.ValueTask> +Sdcb.SimdCodecs.Tiff.PixelSource.Height.get -> int +Sdcb.SimdCodecs.Tiff.PixelSource.IsPreCompressed.get -> bool +Sdcb.SimdCodecs.Tiff.PixelSource.Photometric.get -> Sdcb.SimdCodecs.Tiff.TiffPhotometric +Sdcb.SimdCodecs.Tiff.PixelSource.PixelSource(System.ReadOnlyMemory pixels, int width, int height, Sdcb.SimdCodecs.Tiff.TiffPageOptions! options) -> void +Sdcb.SimdCodecs.Tiff.PixelSource.SegmentCount.get -> int +Sdcb.SimdCodecs.Tiff.PixelSource.Width.get -> int +Sdcb.SimdCodecs.Tiff.PngDeflateSource +Sdcb.SimdCodecs.Tiff.PngDeflateSource.Compression.get -> Sdcb.SimdCodecs.Tiff.TiffCompression +Sdcb.SimdCodecs.Tiff.PngDeflateSource.Dispose() -> void +Sdcb.SimdCodecs.Tiff.PngDeflateSource.GetSegmentAsync(int index, System.Threading.CancellationToken ct = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.ValueTask> +Sdcb.SimdCodecs.Tiff.PngDeflateSource.Height.get -> int +Sdcb.SimdCodecs.Tiff.PngDeflateSource.IsPreCompressed.get -> bool +Sdcb.SimdCodecs.Tiff.PngDeflateSource.Photometric.get -> Sdcb.SimdCodecs.Tiff.TiffPhotometric +Sdcb.SimdCodecs.Tiff.PngDeflateSource.SegmentCount.get -> int +Sdcb.SimdCodecs.Tiff.PngDeflateSource.Width.get -> int +Sdcb.SimdCodecs.Tiff.TiffCompression +Sdcb.SimdCodecs.Tiff.TiffCompression.CcittRle = 2 -> Sdcb.SimdCodecs.Tiff.TiffCompression +Sdcb.SimdCodecs.Tiff.TiffCompression.CcittT4 = 3 -> Sdcb.SimdCodecs.Tiff.TiffCompression +Sdcb.SimdCodecs.Tiff.TiffCompression.CcittT6 = 4 -> Sdcb.SimdCodecs.Tiff.TiffCompression +Sdcb.SimdCodecs.Tiff.TiffCompression.Deflate = 8 -> Sdcb.SimdCodecs.Tiff.TiffCompression +Sdcb.SimdCodecs.Tiff.TiffCompression.Jpeg = 7 -> Sdcb.SimdCodecs.Tiff.TiffCompression +Sdcb.SimdCodecs.Tiff.TiffCompression.Lzw = 5 -> Sdcb.SimdCodecs.Tiff.TiffCompression +Sdcb.SimdCodecs.Tiff.TiffCompression.PackBits = 32773 -> Sdcb.SimdCodecs.Tiff.TiffCompression +Sdcb.SimdCodecs.Tiff.TiffCompression.Uncompressed = 1 -> Sdcb.SimdCodecs.Tiff.TiffCompression +Sdcb.SimdCodecs.Tiff.TiffCompression.ZlibPkzip = 32946 -> Sdcb.SimdCodecs.Tiff.TiffCompression +Sdcb.SimdCodecs.Tiff.TiffDocument +Sdcb.SimdCodecs.Tiff.TiffDocument.$() -> Sdcb.SimdCodecs.Tiff.TiffDocument! +Sdcb.SimdCodecs.Tiff.TiffDocument.Deconstruct(out System.Collections.Generic.IReadOnlyList! Pages) -> void +Sdcb.SimdCodecs.Tiff.TiffDocument.Equals(Sdcb.SimdCodecs.Tiff.TiffDocument? other) -> bool +Sdcb.SimdCodecs.Tiff.TiffDocument.Pages.get -> System.Collections.Generic.IReadOnlyList! +Sdcb.SimdCodecs.Tiff.TiffDocument.Pages.init -> void +Sdcb.SimdCodecs.Tiff.TiffDocument.TiffDocument(System.Collections.Generic.IReadOnlyList! Pages) -> void +Sdcb.SimdCodecs.Tiff.TiffEncodeOptions +Sdcb.SimdCodecs.Tiff.TiffEncodeOptions.Equals(Sdcb.SimdCodecs.Tiff.TiffEncodeOptions? other) -> bool +Sdcb.SimdCodecs.Tiff.TiffEncodeOptions.Page.get -> Sdcb.SimdCodecs.Tiff.TiffPageOptions? +Sdcb.SimdCodecs.Tiff.TiffEncodeOptions.Page.init -> void +Sdcb.SimdCodecs.Tiff.TiffEncodeOptions.TiffEncodeOptions() -> void +Sdcb.SimdCodecs.Tiff.TiffExtraSamples +Sdcb.SimdCodecs.Tiff.TiffExtraSamples.AssociatedAlpha = 1 -> Sdcb.SimdCodecs.Tiff.TiffExtraSamples +Sdcb.SimdCodecs.Tiff.TiffExtraSamples.UnassociatedAlpha = 2 -> Sdcb.SimdCodecs.Tiff.TiffExtraSamples +Sdcb.SimdCodecs.Tiff.TiffExtraSamples.Unspecified = 0 -> Sdcb.SimdCodecs.Tiff.TiffExtraSamples +Sdcb.SimdCodecs.Tiff.TiffFieldType +Sdcb.SimdCodecs.Tiff.TiffFieldType.Ascii = 2 -> Sdcb.SimdCodecs.Tiff.TiffFieldType +Sdcb.SimdCodecs.Tiff.TiffFieldType.Byte = 1 -> Sdcb.SimdCodecs.Tiff.TiffFieldType +Sdcb.SimdCodecs.Tiff.TiffFieldType.Double = 12 -> Sdcb.SimdCodecs.Tiff.TiffFieldType +Sdcb.SimdCodecs.Tiff.TiffFieldType.Float = 11 -> Sdcb.SimdCodecs.Tiff.TiffFieldType +Sdcb.SimdCodecs.Tiff.TiffFieldType.Long = 4 -> Sdcb.SimdCodecs.Tiff.TiffFieldType +Sdcb.SimdCodecs.Tiff.TiffFieldType.Rational = 5 -> Sdcb.SimdCodecs.Tiff.TiffFieldType +Sdcb.SimdCodecs.Tiff.TiffFieldType.SByte = 6 -> Sdcb.SimdCodecs.Tiff.TiffFieldType +Sdcb.SimdCodecs.Tiff.TiffFieldType.SLong = 9 -> Sdcb.SimdCodecs.Tiff.TiffFieldType +Sdcb.SimdCodecs.Tiff.TiffFieldType.SRational = 10 -> Sdcb.SimdCodecs.Tiff.TiffFieldType +Sdcb.SimdCodecs.Tiff.TiffFieldType.SShort = 8 -> Sdcb.SimdCodecs.Tiff.TiffFieldType +Sdcb.SimdCodecs.Tiff.TiffFieldType.Short = 3 -> Sdcb.SimdCodecs.Tiff.TiffFieldType +Sdcb.SimdCodecs.Tiff.TiffFieldType.Undefined = 7 -> Sdcb.SimdCodecs.Tiff.TiffFieldType +Sdcb.SimdCodecs.Tiff.TiffImageDecoder +Sdcb.SimdCodecs.Tiff.TiffImageDecoder.TiffImageDecoder() -> void +Sdcb.SimdCodecs.Tiff.TiffImageEncoder +Sdcb.SimdCodecs.Tiff.TiffImageEncoder.TiffImageEncoder() -> void +Sdcb.SimdCodecs.Tiff.TiffLayout +Sdcb.SimdCodecs.Tiff.TiffLayout.Strip = 0 -> Sdcb.SimdCodecs.Tiff.TiffLayout +Sdcb.SimdCodecs.Tiff.TiffLayout.Tiled = 1 -> Sdcb.SimdCodecs.Tiff.TiffLayout +Sdcb.SimdCodecs.Tiff.TiffPage +Sdcb.SimdCodecs.Tiff.TiffPage.$() -> Sdcb.SimdCodecs.Tiff.TiffPage! +Sdcb.SimdCodecs.Tiff.TiffPage.BitsPerSample.get -> int +Sdcb.SimdCodecs.Tiff.TiffPage.BitsPerSample.init -> void +Sdcb.SimdCodecs.Tiff.TiffPage.Compression.get -> Sdcb.SimdCodecs.Tiff.TiffCompression +Sdcb.SimdCodecs.Tiff.TiffPage.Compression.init -> void +Sdcb.SimdCodecs.Tiff.TiffPage.Deconstruct(out int Width, out int Height, out int SamplesPerPixel, out int BitsPerSample, out Sdcb.SimdCodecs.Tiff.TiffPhotometric Photometric, out Sdcb.SimdCodecs.Tiff.TiffSampleFormat SampleFormat, out Sdcb.SimdCodecs.Tiff.TiffCompression Compression, out int RowsPerStrip, out byte[]! Pixels, out float? SMinSampleValue, out float? SMaxSampleValue, out byte[]? IccProfile, out int? ExifIfdOffset, out int? GpsInfoIfdOffset, out bool FileIsLittleEndian, out int TileWidth, out int TileHeight, out int StoredBitsPerSample) -> void +Sdcb.SimdCodecs.Tiff.TiffPage.Equals(Sdcb.SimdCodecs.Tiff.TiffPage? other) -> bool +Sdcb.SimdCodecs.Tiff.TiffPage.ExifIfdOffset.get -> int? +Sdcb.SimdCodecs.Tiff.TiffPage.ExifIfdOffset.init -> void +Sdcb.SimdCodecs.Tiff.TiffPage.FileIsLittleEndian.get -> bool +Sdcb.SimdCodecs.Tiff.TiffPage.FileIsLittleEndian.init -> void +Sdcb.SimdCodecs.Tiff.TiffPage.GpsInfoIfdOffset.get -> int? +Sdcb.SimdCodecs.Tiff.TiffPage.GpsInfoIfdOffset.init -> void +Sdcb.SimdCodecs.Tiff.TiffPage.Height.get -> int +Sdcb.SimdCodecs.Tiff.TiffPage.Height.init -> void +Sdcb.SimdCodecs.Tiff.TiffPage.IccProfile.get -> byte[]? +Sdcb.SimdCodecs.Tiff.TiffPage.IccProfile.init -> void +Sdcb.SimdCodecs.Tiff.TiffPage.Photometric.get -> Sdcb.SimdCodecs.Tiff.TiffPhotometric +Sdcb.SimdCodecs.Tiff.TiffPage.Photometric.init -> void +Sdcb.SimdCodecs.Tiff.TiffPage.Pixels.get -> byte[]! +Sdcb.SimdCodecs.Tiff.TiffPage.Pixels.init -> void +Sdcb.SimdCodecs.Tiff.TiffPage.RowsPerStrip.get -> int +Sdcb.SimdCodecs.Tiff.TiffPage.RowsPerStrip.init -> void +Sdcb.SimdCodecs.Tiff.TiffPage.SMaxSampleValue.get -> float? +Sdcb.SimdCodecs.Tiff.TiffPage.SMaxSampleValue.init -> void +Sdcb.SimdCodecs.Tiff.TiffPage.SMinSampleValue.get -> float? +Sdcb.SimdCodecs.Tiff.TiffPage.SMinSampleValue.init -> void +Sdcb.SimdCodecs.Tiff.TiffPage.SampleFormat.get -> Sdcb.SimdCodecs.Tiff.TiffSampleFormat +Sdcb.SimdCodecs.Tiff.TiffPage.SampleFormat.init -> void +Sdcb.SimdCodecs.Tiff.TiffPage.SamplesPerPixel.get -> int +Sdcb.SimdCodecs.Tiff.TiffPage.SamplesPerPixel.init -> void +Sdcb.SimdCodecs.Tiff.TiffPage.StoredBitsPerSample.get -> int +Sdcb.SimdCodecs.Tiff.TiffPage.StoredBitsPerSample.init -> void +Sdcb.SimdCodecs.Tiff.TiffPage.TiffPage(int Width, int Height, int SamplesPerPixel, int BitsPerSample, Sdcb.SimdCodecs.Tiff.TiffPhotometric Photometric, Sdcb.SimdCodecs.Tiff.TiffSampleFormat SampleFormat, Sdcb.SimdCodecs.Tiff.TiffCompression Compression, int RowsPerStrip, byte[]! Pixels, float? SMinSampleValue, float? SMaxSampleValue, byte[]? IccProfile, int? ExifIfdOffset, int? GpsInfoIfdOffset, bool FileIsLittleEndian, int TileWidth = 0, int TileHeight = 0, int StoredBitsPerSample = 0) -> void +Sdcb.SimdCodecs.Tiff.TiffPage.TileHeight.get -> int +Sdcb.SimdCodecs.Tiff.TiffPage.TileHeight.init -> void +Sdcb.SimdCodecs.Tiff.TiffPage.TileWidth.get -> int +Sdcb.SimdCodecs.Tiff.TiffPage.TileWidth.init -> void +Sdcb.SimdCodecs.Tiff.TiffPage.Width.get -> int +Sdcb.SimdCodecs.Tiff.TiffPage.Width.init -> void +Sdcb.SimdCodecs.Tiff.TiffPageLayout +Sdcb.SimdCodecs.Tiff.TiffPageLayout.BitsPerSample.get -> int +Sdcb.SimdCodecs.Tiff.TiffPageLayout.BytesPerPixel.get -> int +Sdcb.SimdCodecs.Tiff.TiffPageLayout.Compression.get -> Sdcb.SimdCodecs.Tiff.TiffCompression +Sdcb.SimdCodecs.Tiff.TiffPageLayout.FileIsLittleEndian.get -> bool +Sdcb.SimdCodecs.Tiff.TiffPageLayout.Height.get -> int +Sdcb.SimdCodecs.Tiff.TiffPageLayout.IsPlanar.get -> bool +Sdcb.SimdCodecs.Tiff.TiffPageLayout.IsTiled.get -> bool +Sdcb.SimdCodecs.Tiff.TiffPageLayout.Orientation.get -> int +Sdcb.SimdCodecs.Tiff.TiffPageLayout.PageIndex.get -> int +Sdcb.SimdCodecs.Tiff.TiffPageLayout.Photometric.get -> Sdcb.SimdCodecs.Tiff.TiffPhotometric +Sdcb.SimdCodecs.Tiff.TiffPageLayout.Predictor.get -> Sdcb.SimdCodecs.Tiff.TiffPredictor +Sdcb.SimdCodecs.Tiff.TiffPageLayout.RowsPerStrip.get -> int +Sdcb.SimdCodecs.Tiff.TiffPageLayout.SampleFormat.get -> Sdcb.SimdCodecs.Tiff.TiffSampleFormat +Sdcb.SimdCodecs.Tiff.TiffPageLayout.SamplesPerPixel.get -> int +Sdcb.SimdCodecs.Tiff.TiffPageLayout.SegmentAt(int x, int y) -> int +Sdcb.SimdCodecs.Tiff.TiffPageLayout.SegmentBytes(int segmentIndex) -> int +Sdcb.SimdCodecs.Tiff.TiffPageLayout.SegmentCount.get -> int +Sdcb.SimdCodecs.Tiff.TiffPageLayout.SegmentRectangle(int segmentIndex) -> Sdcb.SimdCodecs.Tiff.TiffSegmentRect +Sdcb.SimdCodecs.Tiff.TiffPageLayout.SegmentsAcross.get -> int +Sdcb.SimdCodecs.Tiff.TiffPageLayout.SegmentsDown.get -> int +Sdcb.SimdCodecs.Tiff.TiffPageLayout.StoredBitsPerSample.get -> int +Sdcb.SimdCodecs.Tiff.TiffPageLayout.TileHeight.get -> int +Sdcb.SimdCodecs.Tiff.TiffPageLayout.TileWidth.get -> int +Sdcb.SimdCodecs.Tiff.TiffPageLayout.Width.get -> int +Sdcb.SimdCodecs.Tiff.TiffPageOptions +Sdcb.SimdCodecs.Tiff.TiffPageOptions.$() -> Sdcb.SimdCodecs.Tiff.TiffPageOptions! +Sdcb.SimdCodecs.Tiff.TiffPageOptions.Artist.get -> string? +Sdcb.SimdCodecs.Tiff.TiffPageOptions.Artist.init -> void +Sdcb.SimdCodecs.Tiff.TiffPageOptions.BitsPerSample.get -> int +Sdcb.SimdCodecs.Tiff.TiffPageOptions.BitsPerSample.init -> void +Sdcb.SimdCodecs.Tiff.TiffPageOptions.Compression.get -> Sdcb.SimdCodecs.Tiff.TiffCompression +Sdcb.SimdCodecs.Tiff.TiffPageOptions.Compression.init -> void +Sdcb.SimdCodecs.Tiff.TiffPageOptions.DpiX.get -> double +Sdcb.SimdCodecs.Tiff.TiffPageOptions.DpiX.init -> void +Sdcb.SimdCodecs.Tiff.TiffPageOptions.DpiY.get -> double +Sdcb.SimdCodecs.Tiff.TiffPageOptions.DpiY.init -> void +Sdcb.SimdCodecs.Tiff.TiffPageOptions.Equals(Sdcb.SimdCodecs.Tiff.TiffPageOptions? other) -> bool +Sdcb.SimdCodecs.Tiff.TiffPageOptions.ExtraSamples.get -> Sdcb.SimdCodecs.Tiff.TiffExtraSamples? +Sdcb.SimdCodecs.Tiff.TiffPageOptions.ExtraSamples.init -> void +Sdcb.SimdCodecs.Tiff.TiffPageOptions.IccProfile.get -> System.ReadOnlyMemory +Sdcb.SimdCodecs.Tiff.TiffPageOptions.IccProfile.init -> void +Sdcb.SimdCodecs.Tiff.TiffPageOptions.Layout.get -> Sdcb.SimdCodecs.Tiff.TiffLayout +Sdcb.SimdCodecs.Tiff.TiffPageOptions.Layout.init -> void +Sdcb.SimdCodecs.Tiff.TiffPageOptions.Photometric.get -> Sdcb.SimdCodecs.Tiff.TiffPhotometric +Sdcb.SimdCodecs.Tiff.TiffPageOptions.Photometric.init -> void +Sdcb.SimdCodecs.Tiff.TiffPageOptions.RowsPerStrip.get -> int +Sdcb.SimdCodecs.Tiff.TiffPageOptions.RowsPerStrip.init -> void +Sdcb.SimdCodecs.Tiff.TiffPageOptions.SMaxSampleValue.get -> float? +Sdcb.SimdCodecs.Tiff.TiffPageOptions.SMaxSampleValue.init -> void +Sdcb.SimdCodecs.Tiff.TiffPageOptions.SMinSampleValue.get -> float? +Sdcb.SimdCodecs.Tiff.TiffPageOptions.SMinSampleValue.init -> void +Sdcb.SimdCodecs.Tiff.TiffPageOptions.SampleFormat.get -> Sdcb.SimdCodecs.Tiff.TiffSampleFormat +Sdcb.SimdCodecs.Tiff.TiffPageOptions.SampleFormat.init -> void +Sdcb.SimdCodecs.Tiff.TiffPageOptions.SamplesPerPixel.get -> int +Sdcb.SimdCodecs.Tiff.TiffPageOptions.SamplesPerPixel.init -> void +Sdcb.SimdCodecs.Tiff.TiffPageOptions.Software.get -> string? +Sdcb.SimdCodecs.Tiff.TiffPageOptions.Software.init -> void +Sdcb.SimdCodecs.Tiff.TiffPageOptions.TiffPageOptions() -> void +Sdcb.SimdCodecs.Tiff.TiffPageOptions.TileHeight.get -> int +Sdcb.SimdCodecs.Tiff.TiffPageOptions.TileHeight.init -> void +Sdcb.SimdCodecs.Tiff.TiffPageOptions.TileWidth.get -> int +Sdcb.SimdCodecs.Tiff.TiffPageOptions.TileWidth.init -> void +Sdcb.SimdCodecs.Tiff.TiffPhotometric +Sdcb.SimdCodecs.Tiff.TiffPhotometric.CieLab = 8 -> Sdcb.SimdCodecs.Tiff.TiffPhotometric +Sdcb.SimdCodecs.Tiff.TiffPhotometric.Cmyk = 5 -> Sdcb.SimdCodecs.Tiff.TiffPhotometric +Sdcb.SimdCodecs.Tiff.TiffPhotometric.MinIsBlack = 1 -> Sdcb.SimdCodecs.Tiff.TiffPhotometric +Sdcb.SimdCodecs.Tiff.TiffPhotometric.MinIsWhite = 0 -> Sdcb.SimdCodecs.Tiff.TiffPhotometric +Sdcb.SimdCodecs.Tiff.TiffPhotometric.Palette = 3 -> Sdcb.SimdCodecs.Tiff.TiffPhotometric +Sdcb.SimdCodecs.Tiff.TiffPhotometric.Rgb = 2 -> Sdcb.SimdCodecs.Tiff.TiffPhotometric +Sdcb.SimdCodecs.Tiff.TiffPhotometric.TransparencyMask = 4 -> Sdcb.SimdCodecs.Tiff.TiffPhotometric +Sdcb.SimdCodecs.Tiff.TiffPhotometric.YCbCr = 6 -> Sdcb.SimdCodecs.Tiff.TiffPhotometric +Sdcb.SimdCodecs.Tiff.TiffPredictor +Sdcb.SimdCodecs.Tiff.TiffPredictor.FloatingPoint = 3 -> Sdcb.SimdCodecs.Tiff.TiffPredictor +Sdcb.SimdCodecs.Tiff.TiffPredictor.HorizontalDifferencing = 2 -> Sdcb.SimdCodecs.Tiff.TiffPredictor +Sdcb.SimdCodecs.Tiff.TiffPredictor.None = 1 -> Sdcb.SimdCodecs.Tiff.TiffPredictor +Sdcb.SimdCodecs.Tiff.TiffReader +Sdcb.SimdCodecs.Tiff.TiffSampleFormat +Sdcb.SimdCodecs.Tiff.TiffSampleFormat.IeeeFloat = 3 -> Sdcb.SimdCodecs.Tiff.TiffSampleFormat +Sdcb.SimdCodecs.Tiff.TiffSampleFormat.Int = 2 -> Sdcb.SimdCodecs.Tiff.TiffSampleFormat +Sdcb.SimdCodecs.Tiff.TiffSampleFormat.Uint = 1 -> Sdcb.SimdCodecs.Tiff.TiffSampleFormat +Sdcb.SimdCodecs.Tiff.TiffSampleFormat.Undefined = 4 -> Sdcb.SimdCodecs.Tiff.TiffSampleFormat +Sdcb.SimdCodecs.Tiff.TiffSegmentRect +Sdcb.SimdCodecs.Tiff.TiffSegmentRect.Deconstruct(out int X, out int Y, out int Width, out int Height) -> void +Sdcb.SimdCodecs.Tiff.TiffSegmentRect.Equals(Sdcb.SimdCodecs.Tiff.TiffSegmentRect other) -> bool +Sdcb.SimdCodecs.Tiff.TiffSegmentRect.Height.get -> int +Sdcb.SimdCodecs.Tiff.TiffSegmentRect.Height.init -> void +Sdcb.SimdCodecs.Tiff.TiffSegmentRect.TiffSegmentRect() -> void +Sdcb.SimdCodecs.Tiff.TiffSegmentRect.TiffSegmentRect(int X, int Y, int Width, int Height) -> void +Sdcb.SimdCodecs.Tiff.TiffSegmentRect.Width.get -> int +Sdcb.SimdCodecs.Tiff.TiffSegmentRect.Width.init -> void +Sdcb.SimdCodecs.Tiff.TiffSegmentRect.X.get -> int +Sdcb.SimdCodecs.Tiff.TiffSegmentRect.X.init -> void +Sdcb.SimdCodecs.Tiff.TiffSegmentRect.Y.get -> int +Sdcb.SimdCodecs.Tiff.TiffSegmentRect.Y.init -> void +Sdcb.SimdCodecs.Tiff.TiffTag +Sdcb.SimdCodecs.Tiff.TiffWriter +Sdcb.SimdCodecs.Tiff.TiffWriter.AddJpegPageAsync(System.ReadOnlyMemory jpegBytes, int width, int height, double dpi = 96, System.Threading.CancellationToken ct = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task! +Sdcb.SimdCodecs.Tiff.TiffWriter.AddPageAsync(Sdcb.SimdCodecs.Tiff.IImageSource! source, Sdcb.SimdCodecs.Tiff.TiffPageOptions? options = null, System.Threading.CancellationToken ct = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task! +Sdcb.SimdCodecs.Tiff.TiffWriter.AddPageAsync(System.ReadOnlyMemory pixels, int width, int height, Sdcb.SimdCodecs.Tiff.TiffPageOptions? options = null, System.Threading.CancellationToken ct = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task! +Sdcb.SimdCodecs.Tiff.TiffWriter.AddPngPageAsync(System.ReadOnlyMemory pngBytes, double dpi = 96, System.Threading.CancellationToken ct = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task! +Sdcb.SimdCodecs.Tiff.TiffWriter.DisposeAsync() -> System.Threading.Tasks.ValueTask +Sdcb.SimdCodecs.Tiff.TiffWriter.FlushAsync(System.Threading.CancellationToken ct = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task! +const Sdcb.SimdCodecs.Tiff.TiffTag.Artist = 315 -> ushort +const Sdcb.SimdCodecs.Tiff.TiffTag.BitsPerSample = 258 -> ushort +const Sdcb.SimdCodecs.Tiff.TiffTag.Compression = 259 -> ushort +const Sdcb.SimdCodecs.Tiff.TiffTag.ExifIfd = 34665 -> ushort +const Sdcb.SimdCodecs.Tiff.TiffTag.ExtraSamples = 338 -> ushort +const Sdcb.SimdCodecs.Tiff.TiffTag.FillOrder = 266 -> ushort +const Sdcb.SimdCodecs.Tiff.TiffTag.GpsInfoIfd = 34853 -> ushort +const Sdcb.SimdCodecs.Tiff.TiffTag.IccProfile = 34675 -> ushort +const Sdcb.SimdCodecs.Tiff.TiffTag.ImageLength = 257 -> ushort +const Sdcb.SimdCodecs.Tiff.TiffTag.ImageWidth = 256 -> ushort +const Sdcb.SimdCodecs.Tiff.TiffTag.Orientation = 274 -> ushort +const Sdcb.SimdCodecs.Tiff.TiffTag.PageNumber = 297 -> ushort +const Sdcb.SimdCodecs.Tiff.TiffTag.PhotometricInterp = 262 -> ushort +const Sdcb.SimdCodecs.Tiff.TiffTag.PlanarConfig = 284 -> ushort +const Sdcb.SimdCodecs.Tiff.TiffTag.Predictor = 317 -> ushort +const Sdcb.SimdCodecs.Tiff.TiffTag.ResolutionUnit = 296 -> ushort +const Sdcb.SimdCodecs.Tiff.TiffTag.RowsPerStrip = 278 -> ushort +const Sdcb.SimdCodecs.Tiff.TiffTag.SMaxSampleValue = 341 -> ushort +const Sdcb.SimdCodecs.Tiff.TiffTag.SMinSampleValue = 340 -> ushort +const Sdcb.SimdCodecs.Tiff.TiffTag.SampleFormat = 339 -> ushort +const Sdcb.SimdCodecs.Tiff.TiffTag.SamplesPerPixel = 277 -> ushort +const Sdcb.SimdCodecs.Tiff.TiffTag.Software = 305 -> ushort +const Sdcb.SimdCodecs.Tiff.TiffTag.StripByteCounts = 279 -> ushort +const Sdcb.SimdCodecs.Tiff.TiffTag.StripOffsets = 273 -> ushort +const Sdcb.SimdCodecs.Tiff.TiffTag.SubFileType = 254 -> ushort +const Sdcb.SimdCodecs.Tiff.TiffTag.T4Options = 292 -> ushort +const Sdcb.SimdCodecs.Tiff.TiffTag.T6Options = 293 -> ushort +const Sdcb.SimdCodecs.Tiff.TiffTag.TileByteCounts = 325 -> ushort +const Sdcb.SimdCodecs.Tiff.TiffTag.TileLength = 323 -> ushort +const Sdcb.SimdCodecs.Tiff.TiffTag.TileOffsets = 324 -> ushort +const Sdcb.SimdCodecs.Tiff.TiffTag.TileWidth = 322 -> ushort +const Sdcb.SimdCodecs.Tiff.TiffTag.XResolution = 282 -> ushort +const Sdcb.SimdCodecs.Tiff.TiffTag.XmpPacket = 700 -> ushort +const Sdcb.SimdCodecs.Tiff.TiffTag.YResolution = 283 -> ushort +override Sdcb.SimdCodecs.Tiff.TiffDocument.Equals(object? obj) -> bool +override Sdcb.SimdCodecs.Tiff.TiffDocument.GetHashCode() -> int +override Sdcb.SimdCodecs.Tiff.TiffDocument.ToString() -> string! +override Sdcb.SimdCodecs.Tiff.TiffEncodeOptions.$() -> Sdcb.SimdCodecs.Tiff.TiffEncodeOptions! +override Sdcb.SimdCodecs.Tiff.TiffEncodeOptions.Equals(object? obj) -> bool +override Sdcb.SimdCodecs.Tiff.TiffEncodeOptions.GetHashCode() -> int +override Sdcb.SimdCodecs.Tiff.TiffEncodeOptions.ToString() -> string! +override Sdcb.SimdCodecs.Tiff.TiffPage.Equals(object? obj) -> bool +override Sdcb.SimdCodecs.Tiff.TiffPage.GetHashCode() -> int +override Sdcb.SimdCodecs.Tiff.TiffPage.ToString() -> string! +override Sdcb.SimdCodecs.Tiff.TiffPageOptions.Equals(object? obj) -> bool +override Sdcb.SimdCodecs.Tiff.TiffPageOptions.GetHashCode() -> int +override Sdcb.SimdCodecs.Tiff.TiffPageOptions.ToString() -> string! +override Sdcb.SimdCodecs.Tiff.TiffSegmentRect.GetHashCode() -> int +override sealed Sdcb.SimdCodecs.Tiff.TiffEncodeOptions.Equals(Sdcb.SimdCodecs.Abstractions.EncodeOptions? other) -> bool +static Sdcb.SimdCodecs.Tiff.PngDeflateSource.Create(System.ReadOnlyMemory pngBytes) -> Sdcb.SimdCodecs.Tiff.PngDeflateSource! +static Sdcb.SimdCodecs.Tiff.TiffDocument.operator !=(Sdcb.SimdCodecs.Tiff.TiffDocument? left, Sdcb.SimdCodecs.Tiff.TiffDocument? right) -> bool +static Sdcb.SimdCodecs.Tiff.TiffDocument.operator ==(Sdcb.SimdCodecs.Tiff.TiffDocument? left, Sdcb.SimdCodecs.Tiff.TiffDocument? right) -> bool +static Sdcb.SimdCodecs.Tiff.TiffEncodeOptions.operator !=(Sdcb.SimdCodecs.Tiff.TiffEncodeOptions? left, Sdcb.SimdCodecs.Tiff.TiffEncodeOptions? right) -> bool +static Sdcb.SimdCodecs.Tiff.TiffEncodeOptions.operator ==(Sdcb.SimdCodecs.Tiff.TiffEncodeOptions? left, Sdcb.SimdCodecs.Tiff.TiffEncodeOptions? right) -> bool +static Sdcb.SimdCodecs.Tiff.TiffImageDecoder.CanDecode(System.ReadOnlySpan header) -> bool +static Sdcb.SimdCodecs.Tiff.TiffImageDecoder.Registration.get -> Sdcb.SimdCodecs.Abstractions.ImageDecoderRegistration! +static Sdcb.SimdCodecs.Tiff.TiffImageDecoder.SignatureLength.get -> int +static Sdcb.SimdCodecs.Tiff.TiffImageDecoder.TryDecode(System.ReadOnlySpan data, out Sdcb.SimdCodecs.Abstractions.IDecodedImage? image, Sdcb.SimdCodecs.Abstractions.DecodeOptions? options = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> bool +static Sdcb.SimdCodecs.Tiff.TiffImageDecoder.TryDecodeInto(System.ReadOnlySpan data, System.Span destination, int stride, Sdcb.SimdCodecs.Abstractions.PixelFormat format, Sdcb.SimdCodecs.Abstractions.DecodeOptions? options = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> bool +static Sdcb.SimdCodecs.Tiff.TiffImageDecoder.TryDecodeIntoRgba8(System.ReadOnlySpan data, System.Span rgbaDestination) -> bool +static Sdcb.SimdCodecs.Tiff.TiffImageDecoder.TryDecodeThumbnail(System.ReadOnlySpan data, out Sdcb.SimdCodecs.Abstractions.IDecodedImage? thumbnail) -> bool +static Sdcb.SimdCodecs.Tiff.TiffImageDecoder.TryGetClosestSize(System.ReadOnlySpan data, int requestedWidth, int requestedHeight, out int width, out int height, out int scaleDenominator) -> bool +static Sdcb.SimdCodecs.Tiff.TiffImageDecoder.TryOpenFrames(System.ReadOnlyMemory data, out Sdcb.SimdCodecs.Abstractions.IImageFrameReader? reader) -> bool +static Sdcb.SimdCodecs.Tiff.TiffImageDecoder.TryReadInfo(System.ReadOnlySpan data, out Sdcb.SimdCodecs.Abstractions.ImageInfo info) -> bool +static Sdcb.SimdCodecs.Tiff.TiffImageDecoder.TryReadMetadata(System.ReadOnlySpan data, out Sdcb.SimdCodecs.Abstractions.ImageMetadata? metadata) -> bool +static Sdcb.SimdCodecs.Tiff.TiffImageEncoder.Create(System.Buffers.IBufferWriter! output, Sdcb.SimdCodecs.Abstractions.EncodeOptions? options = null) -> Sdcb.SimdCodecs.Abstractions.IImageEncoderSession! +static Sdcb.SimdCodecs.Tiff.TiffImageEncoder.Format.get -> Sdcb.SimdCodecs.Abstractions.ImageFormat +static Sdcb.SimdCodecs.Tiff.TiffImageEncoder.GetClosestInputFormat(Sdcb.SimdCodecs.Abstractions.PixelFormat requested) -> Sdcb.SimdCodecs.Abstractions.PixelFormat +static Sdcb.SimdCodecs.Tiff.TiffImageEncoder.Registration.get -> Sdcb.SimdCodecs.Abstractions.ImageEncoderRegistration! +static Sdcb.SimdCodecs.Tiff.TiffPage.operator !=(Sdcb.SimdCodecs.Tiff.TiffPage? left, Sdcb.SimdCodecs.Tiff.TiffPage? right) -> bool +static Sdcb.SimdCodecs.Tiff.TiffPage.operator ==(Sdcb.SimdCodecs.Tiff.TiffPage? left, Sdcb.SimdCodecs.Tiff.TiffPage? right) -> bool +static Sdcb.SimdCodecs.Tiff.TiffPageOptions.Default.get -> Sdcb.SimdCodecs.Tiff.TiffPageOptions! +static Sdcb.SimdCodecs.Tiff.TiffPageOptions.operator !=(Sdcb.SimdCodecs.Tiff.TiffPageOptions? left, Sdcb.SimdCodecs.Tiff.TiffPageOptions? right) -> bool +static Sdcb.SimdCodecs.Tiff.TiffPageOptions.operator ==(Sdcb.SimdCodecs.Tiff.TiffPageOptions? left, Sdcb.SimdCodecs.Tiff.TiffPageOptions? right) -> bool +static Sdcb.SimdCodecs.Tiff.TiffReader.Read(System.IO.Stream! stream) -> Sdcb.SimdCodecs.Tiff.TiffDocument! +static Sdcb.SimdCodecs.Tiff.TiffReader.Read(System.ReadOnlySpan tiff) -> Sdcb.SimdCodecs.Tiff.TiffDocument! +static Sdcb.SimdCodecs.Tiff.TiffReader.ReadInto(System.ReadOnlySpan tiff, ref TSink sink) -> Sdcb.SimdCodecs.Tiff.TiffDocument! +static Sdcb.SimdCodecs.Tiff.TiffReader.ReadLayout(System.IO.Stream! stream, int pageIndex = 0) -> Sdcb.SimdCodecs.Tiff.TiffPageLayout! +static Sdcb.SimdCodecs.Tiff.TiffReader.ReadLayout(System.ReadOnlySpan tiff, int pageIndex = 0) -> Sdcb.SimdCodecs.Tiff.TiffPageLayout! +static Sdcb.SimdCodecs.Tiff.TiffReader.ReadLayout(string! path, int pageIndex = 0) -> Sdcb.SimdCodecs.Tiff.TiffPageLayout! +static Sdcb.SimdCodecs.Tiff.TiffReader.ReadPage(System.ReadOnlySpan tiff, int pageIndex = 0, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> Sdcb.SimdCodecs.Tiff.TiffPage! +static Sdcb.SimdCodecs.Tiff.TiffReader.ReadSegment(System.IO.Stream! stream, Sdcb.SimdCodecs.Tiff.TiffPageLayout! layout, int segmentIndex, System.Span destination) -> Sdcb.SimdCodecs.Tiff.TiffSegmentRect +static Sdcb.SimdCodecs.Tiff.TiffReader.ReadSegment(System.IO.Stream! stream, int pageIndex, int segmentIndex, System.Span destination) -> Sdcb.SimdCodecs.Tiff.TiffSegmentRect +static Sdcb.SimdCodecs.Tiff.TiffReader.ReadSegment(System.ReadOnlySpan tiff, Sdcb.SimdCodecs.Tiff.TiffPageLayout! layout, int segmentIndex, System.Span destination) -> Sdcb.SimdCodecs.Tiff.TiffSegmentRect +static Sdcb.SimdCodecs.Tiff.TiffReader.ReadSegment(System.ReadOnlySpan tiff, int pageIndex, int segmentIndex, System.Span destination) -> Sdcb.SimdCodecs.Tiff.TiffSegmentRect +static Sdcb.SimdCodecs.Tiff.TiffReader.ReadSegment(string! path, Sdcb.SimdCodecs.Tiff.TiffPageLayout! layout, int segmentIndex, System.Span destination) -> Sdcb.SimdCodecs.Tiff.TiffSegmentRect +static Sdcb.SimdCodecs.Tiff.TiffReader.ReadSegment(string! path, int pageIndex, int segmentIndex, System.Span destination) -> Sdcb.SimdCodecs.Tiff.TiffSegmentRect +static Sdcb.SimdCodecs.Tiff.TiffSegmentRect.operator !=(Sdcb.SimdCodecs.Tiff.TiffSegmentRect left, Sdcb.SimdCodecs.Tiff.TiffSegmentRect right) -> bool +static Sdcb.SimdCodecs.Tiff.TiffSegmentRect.operator ==(Sdcb.SimdCodecs.Tiff.TiffSegmentRect left, Sdcb.SimdCodecs.Tiff.TiffSegmentRect right) -> bool +static Sdcb.SimdCodecs.Tiff.TiffWriter.Create(System.IO.Stream! stream) -> Sdcb.SimdCodecs.Tiff.TiffWriter! +static Sdcb.SimdCodecs.Tiff.TiffWriter.Create(string! filePath) -> Sdcb.SimdCodecs.Tiff.TiffWriter! +~override Sdcb.SimdCodecs.Tiff.TiffSegmentRect.Equals(object obj) -> bool +~override Sdcb.SimdCodecs.Tiff.TiffSegmentRect.ToString() -> string diff --git a/src/Sdcb.SimdCodecs.Tiff/PublicAPI.Unshipped.txt b/src/Sdcb.SimdCodecs.Tiff/PublicAPI.Unshipped.txt new file mode 100644 index 0000000..7dc5c58 --- /dev/null +++ b/src/Sdcb.SimdCodecs.Tiff/PublicAPI.Unshipped.txt @@ -0,0 +1 @@ +#nullable enable diff --git a/src/Sdcb.SimdCodecs.Webp/PublicAPI.Shipped.txt b/src/Sdcb.SimdCodecs.Webp/PublicAPI.Shipped.txt new file mode 100644 index 0000000..9ca7a09 --- /dev/null +++ b/src/Sdcb.SimdCodecs.Webp/PublicAPI.Shipped.txt @@ -0,0 +1,302 @@ +#nullable enable +Sdcb.SimdCodecs.Webp.WebpAnimation +Sdcb.SimdCodecs.Webp.WebpAnimation.$() -> Sdcb.SimdCodecs.Webp.WebpAnimation! +Sdcb.SimdCodecs.Webp.WebpAnimation.BackgroundColor.get -> uint +Sdcb.SimdCodecs.Webp.WebpAnimation.BackgroundColor.init -> void +Sdcb.SimdCodecs.Webp.WebpAnimation.CanvasHeight.get -> int +Sdcb.SimdCodecs.Webp.WebpAnimation.CanvasHeight.init -> void +Sdcb.SimdCodecs.Webp.WebpAnimation.CanvasWidth.get -> int +Sdcb.SimdCodecs.Webp.WebpAnimation.CanvasWidth.init -> void +Sdcb.SimdCodecs.Webp.WebpAnimation.Deconstruct(out int CanvasWidth, out int CanvasHeight, out int LoopCount, out uint BackgroundColor, out System.Collections.Generic.IReadOnlyList! Frames) -> void +Sdcb.SimdCodecs.Webp.WebpAnimation.Equals(Sdcb.SimdCodecs.Webp.WebpAnimation? other) -> bool +Sdcb.SimdCodecs.Webp.WebpAnimation.Exif.get -> byte[]? +Sdcb.SimdCodecs.Webp.WebpAnimation.Exif.init -> void +Sdcb.SimdCodecs.Webp.WebpAnimation.Frames.get -> System.Collections.Generic.IReadOnlyList! +Sdcb.SimdCodecs.Webp.WebpAnimation.Frames.init -> void +Sdcb.SimdCodecs.Webp.WebpAnimation.IccProfile.get -> byte[]? +Sdcb.SimdCodecs.Webp.WebpAnimation.IccProfile.init -> void +Sdcb.SimdCodecs.Webp.WebpAnimation.LoopCount.get -> int +Sdcb.SimdCodecs.Webp.WebpAnimation.LoopCount.init -> void +Sdcb.SimdCodecs.Webp.WebpAnimation.WebpAnimation(int CanvasWidth, int CanvasHeight, int LoopCount, uint BackgroundColor, System.Collections.Generic.IReadOnlyList! Frames) -> void +Sdcb.SimdCodecs.Webp.WebpAnimation.Xmp.get -> byte[]? +Sdcb.SimdCodecs.Webp.WebpAnimation.Xmp.init -> void +Sdcb.SimdCodecs.Webp.WebpAnimationCanvasFrame +Sdcb.SimdCodecs.Webp.WebpAnimationCanvasFrame.Deconstruct(out System.ReadOnlyMemory Pixels, out System.TimeSpan Duration) -> void +Sdcb.SimdCodecs.Webp.WebpAnimationCanvasFrame.Duration.get -> System.TimeSpan +Sdcb.SimdCodecs.Webp.WebpAnimationCanvasFrame.Duration.init -> void +Sdcb.SimdCodecs.Webp.WebpAnimationCanvasFrame.Equals(Sdcb.SimdCodecs.Webp.WebpAnimationCanvasFrame other) -> bool +Sdcb.SimdCodecs.Webp.WebpAnimationCanvasFrame.Pixels.get -> System.ReadOnlyMemory +Sdcb.SimdCodecs.Webp.WebpAnimationCanvasFrame.Pixels.init -> void +Sdcb.SimdCodecs.Webp.WebpAnimationCanvasFrame.WebpAnimationCanvasFrame() -> void +Sdcb.SimdCodecs.Webp.WebpAnimationCanvasFrame.WebpAnimationCanvasFrame(System.ReadOnlyMemory Pixels, System.TimeSpan Duration) -> void +Sdcb.SimdCodecs.Webp.WebpAnimationDecoder +Sdcb.SimdCodecs.Webp.WebpAnimationDecoder.BackgroundColor.get -> uint +Sdcb.SimdCodecs.Webp.WebpAnimationDecoder.CanvasHeight.get -> int +Sdcb.SimdCodecs.Webp.WebpAnimationDecoder.CanvasWidth.get -> int +Sdcb.SimdCodecs.Webp.WebpAnimationDecoder.FrameCount.get -> int +Sdcb.SimdCodecs.Webp.WebpAnimationDecoder.FrameIndexAt(long timestampMs) -> int +Sdcb.SimdCodecs.Webp.WebpAnimationDecoder.Frames.get -> System.Collections.Generic.IReadOnlyList! +Sdcb.SimdCodecs.Webp.WebpAnimationDecoder.LoopCount.get -> int +Sdcb.SimdCodecs.Webp.WebpAnimationDecoder.NextFrameIndex.get -> int +Sdcb.SimdCodecs.Webp.WebpAnimationDecoder.Reset() -> void +Sdcb.SimdCodecs.Webp.WebpAnimationDecoder.Seek(int frameIndex, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> void +Sdcb.SimdCodecs.Webp.WebpAnimationDecoder.TryDecodeNextFrame(System.Span canvasRgba, out Sdcb.SimdCodecs.Webp.WebpFrameInfo frame, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> bool +Sdcb.SimdCodecs.Webp.WebpAnimationDecoder.WebpAnimationDecoder(System.ReadOnlyMemory data) -> void +Sdcb.SimdCodecs.Webp.WebpAnimationEncodeOptions +Sdcb.SimdCodecs.Webp.WebpAnimationEncodeOptions.AlphaQuality.get -> int +Sdcb.SimdCodecs.Webp.WebpAnimationEncodeOptions.AlphaQuality.init -> void +Sdcb.SimdCodecs.Webp.WebpAnimationEncodeOptions.BackgroundColor.get -> uint +Sdcb.SimdCodecs.Webp.WebpAnimationEncodeOptions.BackgroundColor.init -> void +Sdcb.SimdCodecs.Webp.WebpAnimationEncodeOptions.Equals(Sdcb.SimdCodecs.Webp.WebpAnimationEncodeOptions? other) -> bool +Sdcb.SimdCodecs.Webp.WebpAnimationEncodeOptions.Exif.get -> byte[]? +Sdcb.SimdCodecs.Webp.WebpAnimationEncodeOptions.Exif.init -> void +Sdcb.SimdCodecs.Webp.WebpAnimationEncodeOptions.IccProfile.get -> byte[]? +Sdcb.SimdCodecs.Webp.WebpAnimationEncodeOptions.IccProfile.init -> void +Sdcb.SimdCodecs.Webp.WebpAnimationEncodeOptions.LoopCount.get -> int +Sdcb.SimdCodecs.Webp.WebpAnimationEncodeOptions.LoopCount.init -> void +Sdcb.SimdCodecs.Webp.WebpAnimationEncodeOptions.LosslessEffort.get -> int +Sdcb.SimdCodecs.Webp.WebpAnimationEncodeOptions.LosslessEffort.init -> void +Sdcb.SimdCodecs.Webp.WebpAnimationEncodeOptions.LossyEffort.get -> int +Sdcb.SimdCodecs.Webp.WebpAnimationEncodeOptions.LossyEffort.init -> void +Sdcb.SimdCodecs.Webp.WebpAnimationEncodeOptions.MaxKeyframeDistance.get -> int +Sdcb.SimdCodecs.Webp.WebpAnimationEncodeOptions.MaxKeyframeDistance.init -> void +Sdcb.SimdCodecs.Webp.WebpAnimationEncodeOptions.Mode.get -> Sdcb.SimdCodecs.Webp.WebpAnimationMode +Sdcb.SimdCodecs.Webp.WebpAnimationEncodeOptions.Mode.init -> void +Sdcb.SimdCodecs.Webp.WebpAnimationEncodeOptions.Quality.get -> int +Sdcb.SimdCodecs.Webp.WebpAnimationEncodeOptions.Quality.init -> void +Sdcb.SimdCodecs.Webp.WebpAnimationEncodeOptions.WebpAnimationEncodeOptions() -> void +Sdcb.SimdCodecs.Webp.WebpAnimationEncodeOptions.Xmp.get -> byte[]? +Sdcb.SimdCodecs.Webp.WebpAnimationEncodeOptions.Xmp.init -> void +Sdcb.SimdCodecs.Webp.WebpAnimationEncoder +Sdcb.SimdCodecs.Webp.WebpAnimationEncoder.AddFrame(Sdcb.SimdCodecs.Webp.WebpAnimationFrame! frame) -> void +Sdcb.SimdCodecs.Webp.WebpAnimationEncoder.AddFrame(System.ReadOnlySpan canvas, Sdcb.SimdCodecs.Abstractions.PixelFormat format, System.TimeSpan duration, int stride = 0) -> void +Sdcb.SimdCodecs.Webp.WebpAnimationEncoder.Encode() -> byte[]! +Sdcb.SimdCodecs.Webp.WebpAnimationEncoder.Encode(System.IO.Stream! output) -> void +Sdcb.SimdCodecs.Webp.WebpAnimationEncoder.FrameCount.get -> int +Sdcb.SimdCodecs.Webp.WebpAnimationEncoder.WebpAnimationEncoder(int canvasWidth, int canvasHeight, Sdcb.SimdCodecs.Webp.WebpAnimationEncodeOptions? options = null) -> void +Sdcb.SimdCodecs.Webp.WebpAnimationFrame +Sdcb.SimdCodecs.Webp.WebpAnimationFrame.$() -> Sdcb.SimdCodecs.Webp.WebpAnimationFrame! +Sdcb.SimdCodecs.Webp.WebpAnimationFrame.Blend.get -> bool +Sdcb.SimdCodecs.Webp.WebpAnimationFrame.Blend.init -> void +Sdcb.SimdCodecs.Webp.WebpAnimationFrame.DisposeToBackground.get -> bool +Sdcb.SimdCodecs.Webp.WebpAnimationFrame.DisposeToBackground.init -> void +Sdcb.SimdCodecs.Webp.WebpAnimationFrame.Duration.get -> System.TimeSpan +Sdcb.SimdCodecs.Webp.WebpAnimationFrame.Duration.init -> void +Sdcb.SimdCodecs.Webp.WebpAnimationFrame.Equals(Sdcb.SimdCodecs.Webp.WebpAnimationFrame? other) -> bool +Sdcb.SimdCodecs.Webp.WebpAnimationFrame.Format.get -> Sdcb.SimdCodecs.Abstractions.PixelFormat +Sdcb.SimdCodecs.Webp.WebpAnimationFrame.Format.init -> void +Sdcb.SimdCodecs.Webp.WebpAnimationFrame.Height.get -> int +Sdcb.SimdCodecs.Webp.WebpAnimationFrame.Height.init -> void +Sdcb.SimdCodecs.Webp.WebpAnimationFrame.Lossless.get -> bool? +Sdcb.SimdCodecs.Webp.WebpAnimationFrame.Lossless.init -> void +Sdcb.SimdCodecs.Webp.WebpAnimationFrame.Pixels.get -> System.ReadOnlyMemory +Sdcb.SimdCodecs.Webp.WebpAnimationFrame.Pixels.init -> void +Sdcb.SimdCodecs.Webp.WebpAnimationFrame.Quality.get -> int? +Sdcb.SimdCodecs.Webp.WebpAnimationFrame.Quality.init -> void +Sdcb.SimdCodecs.Webp.WebpAnimationFrame.Stride.get -> int +Sdcb.SimdCodecs.Webp.WebpAnimationFrame.Stride.init -> void +Sdcb.SimdCodecs.Webp.WebpAnimationFrame.WebpAnimationFrame() -> void +Sdcb.SimdCodecs.Webp.WebpAnimationFrame.Width.get -> int +Sdcb.SimdCodecs.Webp.WebpAnimationFrame.Width.init -> void +Sdcb.SimdCodecs.Webp.WebpAnimationFrame.X.get -> int +Sdcb.SimdCodecs.Webp.WebpAnimationFrame.X.init -> void +Sdcb.SimdCodecs.Webp.WebpAnimationFrame.Y.get -> int +Sdcb.SimdCodecs.Webp.WebpAnimationFrame.Y.init -> void +Sdcb.SimdCodecs.Webp.WebpAnimationMode +Sdcb.SimdCodecs.Webp.WebpAnimationMode.Lossless = 1 -> Sdcb.SimdCodecs.Webp.WebpAnimationMode +Sdcb.SimdCodecs.Webp.WebpAnimationMode.Lossy = 0 -> Sdcb.SimdCodecs.Webp.WebpAnimationMode +Sdcb.SimdCodecs.Webp.WebpAnimationMode.Mixed = 2 -> Sdcb.SimdCodecs.Webp.WebpAnimationMode +Sdcb.SimdCodecs.Webp.WebpDecodeOptions +Sdcb.SimdCodecs.Webp.WebpDecodeOptions.$() -> Sdcb.SimdCodecs.Webp.WebpDecodeOptions! +Sdcb.SimdCodecs.Webp.WebpDecodeOptions.Equals(Sdcb.SimdCodecs.Webp.WebpDecodeOptions? other) -> bool +Sdcb.SimdCodecs.Webp.WebpDecodeOptions.Multithreaded.get -> bool +Sdcb.SimdCodecs.Webp.WebpDecodeOptions.Multithreaded.init -> void +Sdcb.SimdCodecs.Webp.WebpDecodeOptions.WebpDecodeOptions() -> void +Sdcb.SimdCodecs.Webp.WebpDecoder +Sdcb.SimdCodecs.Webp.WebpEncoder +Sdcb.SimdCodecs.Webp.WebpFormat +Sdcb.SimdCodecs.Webp.WebpFormat.Animated = 2 -> Sdcb.SimdCodecs.Webp.WebpFormat +Sdcb.SimdCodecs.Webp.WebpFormat.Lossless = 1 -> Sdcb.SimdCodecs.Webp.WebpFormat +Sdcb.SimdCodecs.Webp.WebpFormat.Lossy = 0 -> Sdcb.SimdCodecs.Webp.WebpFormat +Sdcb.SimdCodecs.Webp.WebpFrame +Sdcb.SimdCodecs.Webp.WebpFrame.$() -> Sdcb.SimdCodecs.Webp.WebpFrame! +Sdcb.SimdCodecs.Webp.WebpFrame.Deconstruct(out byte[]! Rgba, out int TimestampMs, out int DurationMs) -> void +Sdcb.SimdCodecs.Webp.WebpFrame.DurationMs.get -> int +Sdcb.SimdCodecs.Webp.WebpFrame.DurationMs.init -> void +Sdcb.SimdCodecs.Webp.WebpFrame.Equals(Sdcb.SimdCodecs.Webp.WebpFrame? other) -> bool +Sdcb.SimdCodecs.Webp.WebpFrame.Rgba.get -> byte[]! +Sdcb.SimdCodecs.Webp.WebpFrame.Rgba.init -> void +Sdcb.SimdCodecs.Webp.WebpFrame.TimestampMs.get -> int +Sdcb.SimdCodecs.Webp.WebpFrame.TimestampMs.init -> void +Sdcb.SimdCodecs.Webp.WebpFrame.WebpFrame(byte[]! Rgba, int TimestampMs, int DurationMs) -> void +Sdcb.SimdCodecs.Webp.WebpFrameInfo +Sdcb.SimdCodecs.Webp.WebpFrameInfo.Blend.get -> bool +Sdcb.SimdCodecs.Webp.WebpFrameInfo.Blend.init -> void +Sdcb.SimdCodecs.Webp.WebpFrameInfo.Deconstruct(out int Index, out int X, out int Y, out int Width, out int Height, out int TimestampMs, out int DurationMs, out bool Blend, out bool DisposeToBackground, out bool IsIndependent) -> void +Sdcb.SimdCodecs.Webp.WebpFrameInfo.DisposeToBackground.get -> bool +Sdcb.SimdCodecs.Webp.WebpFrameInfo.DisposeToBackground.init -> void +Sdcb.SimdCodecs.Webp.WebpFrameInfo.DurationMs.get -> int +Sdcb.SimdCodecs.Webp.WebpFrameInfo.DurationMs.init -> void +Sdcb.SimdCodecs.Webp.WebpFrameInfo.Equals(Sdcb.SimdCodecs.Webp.WebpFrameInfo other) -> bool +Sdcb.SimdCodecs.Webp.WebpFrameInfo.Height.get -> int +Sdcb.SimdCodecs.Webp.WebpFrameInfo.Height.init -> void +Sdcb.SimdCodecs.Webp.WebpFrameInfo.Index.get -> int +Sdcb.SimdCodecs.Webp.WebpFrameInfo.Index.init -> void +Sdcb.SimdCodecs.Webp.WebpFrameInfo.IsIndependent.get -> bool +Sdcb.SimdCodecs.Webp.WebpFrameInfo.IsIndependent.init -> void +Sdcb.SimdCodecs.Webp.WebpFrameInfo.TimestampMs.get -> int +Sdcb.SimdCodecs.Webp.WebpFrameInfo.TimestampMs.init -> void +Sdcb.SimdCodecs.Webp.WebpFrameInfo.WebpFrameInfo() -> void +Sdcb.SimdCodecs.Webp.WebpFrameInfo.WebpFrameInfo(int Index, int X, int Y, int Width, int Height, int TimestampMs, int DurationMs, bool Blend, bool DisposeToBackground, bool IsIndependent) -> void +Sdcb.SimdCodecs.Webp.WebpFrameInfo.Width.get -> int +Sdcb.SimdCodecs.Webp.WebpFrameInfo.Width.init -> void +Sdcb.SimdCodecs.Webp.WebpFrameInfo.X.get -> int +Sdcb.SimdCodecs.Webp.WebpFrameInfo.X.init -> void +Sdcb.SimdCodecs.Webp.WebpFrameInfo.Y.get -> int +Sdcb.SimdCodecs.Webp.WebpFrameInfo.Y.init -> void +Sdcb.SimdCodecs.Webp.WebpImage +Sdcb.SimdCodecs.Webp.WebpImage.Exif.get -> byte[]? +Sdcb.SimdCodecs.Webp.WebpImage.HasAlpha.get -> bool +Sdcb.SimdCodecs.Webp.WebpImage.Height.get -> int +Sdcb.SimdCodecs.Webp.WebpImage.IccProfile.get -> byte[]? +Sdcb.SimdCodecs.Webp.WebpImage.Rgba.get -> byte[]! +Sdcb.SimdCodecs.Webp.WebpImage.Width.get -> int +Sdcb.SimdCodecs.Webp.WebpImage.Xmp.get -> byte[]? +Sdcb.SimdCodecs.Webp.WebpImageDecoder +Sdcb.SimdCodecs.Webp.WebpImageDecoder.WebpImageDecoder() -> void +Sdcb.SimdCodecs.Webp.WebpImageEncoder +Sdcb.SimdCodecs.Webp.WebpImageEncoder.WebpImageEncoder() -> void +Sdcb.SimdCodecs.Webp.WebpInfo +Sdcb.SimdCodecs.Webp.WebpInfo.Deconstruct(out int Width, out int Height, out bool HasAlpha, out Sdcb.SimdCodecs.Webp.WebpFormat Format, out int FrameCount) -> void +Sdcb.SimdCodecs.Webp.WebpInfo.Equals(Sdcb.SimdCodecs.Webp.WebpInfo other) -> bool +Sdcb.SimdCodecs.Webp.WebpInfo.Format.get -> Sdcb.SimdCodecs.Webp.WebpFormat +Sdcb.SimdCodecs.Webp.WebpInfo.Format.init -> void +Sdcb.SimdCodecs.Webp.WebpInfo.FrameCount.get -> int +Sdcb.SimdCodecs.Webp.WebpInfo.FrameCount.init -> void +Sdcb.SimdCodecs.Webp.WebpInfo.HasAlpha.get -> bool +Sdcb.SimdCodecs.Webp.WebpInfo.HasAlpha.init -> void +Sdcb.SimdCodecs.Webp.WebpInfo.Height.get -> int +Sdcb.SimdCodecs.Webp.WebpInfo.Height.init -> void +Sdcb.SimdCodecs.Webp.WebpInfo.WebpInfo() -> void +Sdcb.SimdCodecs.Webp.WebpInfo.WebpInfo(int Width, int Height, bool HasAlpha, Sdcb.SimdCodecs.Webp.WebpFormat Format, int FrameCount) -> void +Sdcb.SimdCodecs.Webp.WebpInfo.Width.get -> int +Sdcb.SimdCodecs.Webp.WebpInfo.Width.init -> void +Sdcb.SimdCodecs.Webp.WebpLosslessEncodeOptions +Sdcb.SimdCodecs.Webp.WebpLosslessEncodeOptions.Effort.get -> int +Sdcb.SimdCodecs.Webp.WebpLosslessEncodeOptions.Effort.init -> void +Sdcb.SimdCodecs.Webp.WebpLosslessEncodeOptions.Equals(Sdcb.SimdCodecs.Webp.WebpLosslessEncodeOptions? other) -> bool +Sdcb.SimdCodecs.Webp.WebpLosslessEncodeOptions.Exact.get -> bool +Sdcb.SimdCodecs.Webp.WebpLosslessEncodeOptions.Exact.init -> void +Sdcb.SimdCodecs.Webp.WebpLosslessEncodeOptions.Exif.get -> byte[]? +Sdcb.SimdCodecs.Webp.WebpLosslessEncodeOptions.Exif.init -> void +Sdcb.SimdCodecs.Webp.WebpLosslessEncodeOptions.IccProfile.get -> byte[]? +Sdcb.SimdCodecs.Webp.WebpLosslessEncodeOptions.IccProfile.init -> void +Sdcb.SimdCodecs.Webp.WebpLosslessEncodeOptions.WebpLosslessEncodeOptions() -> void +Sdcb.SimdCodecs.Webp.WebpLosslessEncodeOptions.Xmp.get -> byte[]? +Sdcb.SimdCodecs.Webp.WebpLosslessEncodeOptions.Xmp.init -> void +Sdcb.SimdCodecs.Webp.WebpLossyEncodeOptions +Sdcb.SimdCodecs.Webp.WebpLossyEncodeOptions.AlphaQuality.get -> int +Sdcb.SimdCodecs.Webp.WebpLossyEncodeOptions.AlphaQuality.init -> void +Sdcb.SimdCodecs.Webp.WebpLossyEncodeOptions.Effort.get -> int +Sdcb.SimdCodecs.Webp.WebpLossyEncodeOptions.Effort.init -> void +Sdcb.SimdCodecs.Webp.WebpLossyEncodeOptions.Equals(Sdcb.SimdCodecs.Webp.WebpLossyEncodeOptions? other) -> bool +Sdcb.SimdCodecs.Webp.WebpLossyEncodeOptions.Exact.get -> bool +Sdcb.SimdCodecs.Webp.WebpLossyEncodeOptions.Exact.init -> void +Sdcb.SimdCodecs.Webp.WebpLossyEncodeOptions.Exif.get -> byte[]? +Sdcb.SimdCodecs.Webp.WebpLossyEncodeOptions.Exif.init -> void +Sdcb.SimdCodecs.Webp.WebpLossyEncodeOptions.IccProfile.get -> byte[]? +Sdcb.SimdCodecs.Webp.WebpLossyEncodeOptions.IccProfile.init -> void +Sdcb.SimdCodecs.Webp.WebpLossyEncodeOptions.Quality.get -> int +Sdcb.SimdCodecs.Webp.WebpLossyEncodeOptions.Quality.init -> void +Sdcb.SimdCodecs.Webp.WebpLossyEncodeOptions.WebpLossyEncodeOptions() -> void +Sdcb.SimdCodecs.Webp.WebpLossyEncodeOptions.Xmp.get -> byte[]? +Sdcb.SimdCodecs.Webp.WebpLossyEncodeOptions.Xmp.init -> void +const Sdcb.SimdCodecs.Webp.WebpDecoder.DefaultMaximumAnimationPixels = 268435456 -> long +const Sdcb.SimdCodecs.Webp.WebpEncoder.MaximumDimension = 16384 -> int +const Sdcb.SimdCodecs.Webp.WebpEncoder.MaximumLossyDimension = 16383 -> int +override Sdcb.SimdCodecs.Webp.WebpAnimation.Equals(object? obj) -> bool +override Sdcb.SimdCodecs.Webp.WebpAnimation.GetHashCode() -> int +override Sdcb.SimdCodecs.Webp.WebpAnimation.ToString() -> string! +override Sdcb.SimdCodecs.Webp.WebpAnimationCanvasFrame.GetHashCode() -> int +override Sdcb.SimdCodecs.Webp.WebpAnimationEncodeOptions.$() -> Sdcb.SimdCodecs.Webp.WebpAnimationEncodeOptions! +override Sdcb.SimdCodecs.Webp.WebpAnimationEncodeOptions.Equals(object? obj) -> bool +override Sdcb.SimdCodecs.Webp.WebpAnimationEncodeOptions.GetHashCode() -> int +override Sdcb.SimdCodecs.Webp.WebpAnimationEncodeOptions.ToString() -> string! +override Sdcb.SimdCodecs.Webp.WebpAnimationFrame.Equals(object? obj) -> bool +override Sdcb.SimdCodecs.Webp.WebpAnimationFrame.GetHashCode() -> int +override Sdcb.SimdCodecs.Webp.WebpAnimationFrame.ToString() -> string! +override Sdcb.SimdCodecs.Webp.WebpDecodeOptions.Equals(object? obj) -> bool +override Sdcb.SimdCodecs.Webp.WebpDecodeOptions.GetHashCode() -> int +override Sdcb.SimdCodecs.Webp.WebpDecodeOptions.ToString() -> string! +override Sdcb.SimdCodecs.Webp.WebpFrame.Equals(object? obj) -> bool +override Sdcb.SimdCodecs.Webp.WebpFrame.GetHashCode() -> int +override Sdcb.SimdCodecs.Webp.WebpFrame.ToString() -> string! +override Sdcb.SimdCodecs.Webp.WebpFrameInfo.GetHashCode() -> int +override Sdcb.SimdCodecs.Webp.WebpInfo.GetHashCode() -> int +override Sdcb.SimdCodecs.Webp.WebpLosslessEncodeOptions.$() -> Sdcb.SimdCodecs.Webp.WebpLosslessEncodeOptions! +override Sdcb.SimdCodecs.Webp.WebpLosslessEncodeOptions.Equals(object? obj) -> bool +override Sdcb.SimdCodecs.Webp.WebpLosslessEncodeOptions.GetHashCode() -> int +override Sdcb.SimdCodecs.Webp.WebpLosslessEncodeOptions.ToString() -> string! +override Sdcb.SimdCodecs.Webp.WebpLossyEncodeOptions.$() -> Sdcb.SimdCodecs.Webp.WebpLossyEncodeOptions! +override Sdcb.SimdCodecs.Webp.WebpLossyEncodeOptions.Equals(object? obj) -> bool +override Sdcb.SimdCodecs.Webp.WebpLossyEncodeOptions.GetHashCode() -> int +override Sdcb.SimdCodecs.Webp.WebpLossyEncodeOptions.ToString() -> string! +override sealed Sdcb.SimdCodecs.Webp.WebpAnimationEncodeOptions.Equals(Sdcb.SimdCodecs.Abstractions.EncodeOptions? other) -> bool +override sealed Sdcb.SimdCodecs.Webp.WebpLosslessEncodeOptions.Equals(Sdcb.SimdCodecs.Abstractions.EncodeOptions? other) -> bool +override sealed Sdcb.SimdCodecs.Webp.WebpLossyEncodeOptions.Equals(Sdcb.SimdCodecs.Abstractions.EncodeOptions? other) -> bool +static Sdcb.SimdCodecs.Webp.WebpAnimation.operator !=(Sdcb.SimdCodecs.Webp.WebpAnimation? left, Sdcb.SimdCodecs.Webp.WebpAnimation? right) -> bool +static Sdcb.SimdCodecs.Webp.WebpAnimation.operator ==(Sdcb.SimdCodecs.Webp.WebpAnimation? left, Sdcb.SimdCodecs.Webp.WebpAnimation? right) -> bool +static Sdcb.SimdCodecs.Webp.WebpAnimationCanvasFrame.operator !=(Sdcb.SimdCodecs.Webp.WebpAnimationCanvasFrame left, Sdcb.SimdCodecs.Webp.WebpAnimationCanvasFrame right) -> bool +static Sdcb.SimdCodecs.Webp.WebpAnimationCanvasFrame.operator ==(Sdcb.SimdCodecs.Webp.WebpAnimationCanvasFrame left, Sdcb.SimdCodecs.Webp.WebpAnimationCanvasFrame right) -> bool +static Sdcb.SimdCodecs.Webp.WebpAnimationEncodeOptions.operator !=(Sdcb.SimdCodecs.Webp.WebpAnimationEncodeOptions? left, Sdcb.SimdCodecs.Webp.WebpAnimationEncodeOptions? right) -> bool +static Sdcb.SimdCodecs.Webp.WebpAnimationEncodeOptions.operator ==(Sdcb.SimdCodecs.Webp.WebpAnimationEncodeOptions? left, Sdcb.SimdCodecs.Webp.WebpAnimationEncodeOptions? right) -> bool +static Sdcb.SimdCodecs.Webp.WebpAnimationFrame.operator !=(Sdcb.SimdCodecs.Webp.WebpAnimationFrame? left, Sdcb.SimdCodecs.Webp.WebpAnimationFrame? right) -> bool +static Sdcb.SimdCodecs.Webp.WebpAnimationFrame.operator ==(Sdcb.SimdCodecs.Webp.WebpAnimationFrame? left, Sdcb.SimdCodecs.Webp.WebpAnimationFrame? right) -> bool +static Sdcb.SimdCodecs.Webp.WebpDecodeOptions.operator !=(Sdcb.SimdCodecs.Webp.WebpDecodeOptions? left, Sdcb.SimdCodecs.Webp.WebpDecodeOptions? right) -> bool +static Sdcb.SimdCodecs.Webp.WebpDecodeOptions.operator ==(Sdcb.SimdCodecs.Webp.WebpDecodeOptions? left, Sdcb.SimdCodecs.Webp.WebpDecodeOptions? right) -> bool +static Sdcb.SimdCodecs.Webp.WebpDecoder.Decode(System.ReadOnlySpan data, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> Sdcb.SimdCodecs.Webp.WebpImage! +static Sdcb.SimdCodecs.Webp.WebpDecoder.DecodeAnimation(System.ReadOnlySpan data) -> Sdcb.SimdCodecs.Webp.WebpAnimation! +static Sdcb.SimdCodecs.Webp.WebpDecoder.DecodeAnimation(System.ReadOnlySpan data, long maximumTotalPixels, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> Sdcb.SimdCodecs.Webp.WebpAnimation! +static Sdcb.SimdCodecs.Webp.WebpDecoder.DecodeTo(System.ReadOnlySpan data, System.Span rgba, int stride = 0, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> void +static Sdcb.SimdCodecs.Webp.WebpDecoder.DecodeTo(System.ReadOnlySpan data, System.Span rgba, int stride, Sdcb.SimdCodecs.Webp.WebpDecodeOptions? options, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> void +static Sdcb.SimdCodecs.Webp.WebpDecoder.ReadInfo(System.ReadOnlySpan data) -> Sdcb.SimdCodecs.Webp.WebpInfo +static Sdcb.SimdCodecs.Webp.WebpDecoder.TryDecodeTo(System.ReadOnlySpan data, System.Span rgba, int stride = 0, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> bool +static Sdcb.SimdCodecs.Webp.WebpDecoder.TryDecodeTo(System.ReadOnlySpan data, System.Span rgba, int stride, Sdcb.SimdCodecs.Webp.WebpDecodeOptions? options, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> bool +static Sdcb.SimdCodecs.Webp.WebpDecoder.TryReadInfo(System.ReadOnlySpan data, out Sdcb.SimdCodecs.Webp.WebpInfo info) -> bool +static Sdcb.SimdCodecs.Webp.WebpEncoder.EncodeAnimation(System.Collections.Generic.IReadOnlyList! frames, int width, int height, Sdcb.SimdCodecs.Abstractions.PixelFormat format, Sdcb.SimdCodecs.Webp.WebpAnimationEncodeOptions? options = null) -> byte[]! +static Sdcb.SimdCodecs.Webp.WebpEncoder.EncodeAnimation(System.Collections.Generic.IReadOnlyList! frames, int width, int height, Sdcb.SimdCodecs.Abstractions.PixelFormat format, System.IO.Stream! output, Sdcb.SimdCodecs.Webp.WebpAnimationEncodeOptions? options = null) -> void +static Sdcb.SimdCodecs.Webp.WebpEncoder.EncodeLossless(System.ReadOnlySpan pixels, int width, int height, Sdcb.SimdCodecs.Abstractions.PixelFormat format, Sdcb.SimdCodecs.Webp.WebpLosslessEncodeOptions? options = null, int stride = 0) -> byte[]! +static Sdcb.SimdCodecs.Webp.WebpEncoder.EncodeLossless(System.ReadOnlySpan pixels, int width, int height, Sdcb.SimdCodecs.Abstractions.PixelFormat format, System.IO.Stream! output, Sdcb.SimdCodecs.Webp.WebpLosslessEncodeOptions? options = null, int stride = 0) -> void +static Sdcb.SimdCodecs.Webp.WebpEncoder.EncodeLossy(System.ReadOnlySpan pixels, int width, int height, Sdcb.SimdCodecs.Abstractions.PixelFormat format, Sdcb.SimdCodecs.Webp.WebpLossyEncodeOptions? options = null, int stride = 0) -> byte[]! +static Sdcb.SimdCodecs.Webp.WebpEncoder.EncodeLossy(System.ReadOnlySpan pixels, int width, int height, Sdcb.SimdCodecs.Abstractions.PixelFormat format, System.IO.Stream! output, Sdcb.SimdCodecs.Webp.WebpLossyEncodeOptions? options = null, int stride = 0) -> void +static Sdcb.SimdCodecs.Webp.WebpFrame.operator !=(Sdcb.SimdCodecs.Webp.WebpFrame? left, Sdcb.SimdCodecs.Webp.WebpFrame? right) -> bool +static Sdcb.SimdCodecs.Webp.WebpFrame.operator ==(Sdcb.SimdCodecs.Webp.WebpFrame? left, Sdcb.SimdCodecs.Webp.WebpFrame? right) -> bool +static Sdcb.SimdCodecs.Webp.WebpFrameInfo.operator !=(Sdcb.SimdCodecs.Webp.WebpFrameInfo left, Sdcb.SimdCodecs.Webp.WebpFrameInfo right) -> bool +static Sdcb.SimdCodecs.Webp.WebpFrameInfo.operator ==(Sdcb.SimdCodecs.Webp.WebpFrameInfo left, Sdcb.SimdCodecs.Webp.WebpFrameInfo right) -> bool +static Sdcb.SimdCodecs.Webp.WebpImageDecoder.CanDecode(System.ReadOnlySpan data) -> bool +static Sdcb.SimdCodecs.Webp.WebpImageDecoder.Registration.get -> Sdcb.SimdCodecs.Abstractions.ImageDecoderRegistration! +static Sdcb.SimdCodecs.Webp.WebpImageDecoder.SignatureLength.get -> int +static Sdcb.SimdCodecs.Webp.WebpImageDecoder.TryDecode(System.ReadOnlySpan data, out Sdcb.SimdCodecs.Abstractions.IDecodedImage? image, Sdcb.SimdCodecs.Abstractions.DecodeOptions? options = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> bool +static Sdcb.SimdCodecs.Webp.WebpImageDecoder.TryDecodeInto(System.ReadOnlySpan data, System.Span destination, int stride, Sdcb.SimdCodecs.Abstractions.PixelFormat format, Sdcb.SimdCodecs.Abstractions.DecodeOptions? options = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> bool +static Sdcb.SimdCodecs.Webp.WebpImageDecoder.TryDecodeIntoRgba8(System.ReadOnlySpan data, System.Span destination) -> bool +static Sdcb.SimdCodecs.Webp.WebpImageDecoder.TryDecodeThumbnail(System.ReadOnlySpan data, out Sdcb.SimdCodecs.Abstractions.IDecodedImage? thumbnail) -> bool +static Sdcb.SimdCodecs.Webp.WebpImageDecoder.TryGetClosestSize(System.ReadOnlySpan data, int requestedWidth, int requestedHeight, out int width, out int height, out int scaleDenominator) -> bool +static Sdcb.SimdCodecs.Webp.WebpImageDecoder.TryOpenFrames(System.ReadOnlyMemory data, out Sdcb.SimdCodecs.Abstractions.IImageFrameReader? reader) -> bool +static Sdcb.SimdCodecs.Webp.WebpImageDecoder.TryReadInfo(System.ReadOnlySpan data, out Sdcb.SimdCodecs.Abstractions.ImageInfo info) -> bool +static Sdcb.SimdCodecs.Webp.WebpImageDecoder.TryReadMetadata(System.ReadOnlySpan data, out Sdcb.SimdCodecs.Abstractions.ImageMetadata? metadata) -> bool +static Sdcb.SimdCodecs.Webp.WebpImageEncoder.Create(System.Buffers.IBufferWriter! output, Sdcb.SimdCodecs.Abstractions.EncodeOptions? options = null) -> Sdcb.SimdCodecs.Abstractions.IImageEncoderSession! +static Sdcb.SimdCodecs.Webp.WebpImageEncoder.Format.get -> Sdcb.SimdCodecs.Abstractions.ImageFormat +static Sdcb.SimdCodecs.Webp.WebpImageEncoder.GetClosestInputFormat(Sdcb.SimdCodecs.Abstractions.PixelFormat requested) -> Sdcb.SimdCodecs.Abstractions.PixelFormat +static Sdcb.SimdCodecs.Webp.WebpImageEncoder.Registration.get -> Sdcb.SimdCodecs.Abstractions.ImageEncoderRegistration! +static Sdcb.SimdCodecs.Webp.WebpInfo.operator !=(Sdcb.SimdCodecs.Webp.WebpInfo left, Sdcb.SimdCodecs.Webp.WebpInfo right) -> bool +static Sdcb.SimdCodecs.Webp.WebpInfo.operator ==(Sdcb.SimdCodecs.Webp.WebpInfo left, Sdcb.SimdCodecs.Webp.WebpInfo right) -> bool +static Sdcb.SimdCodecs.Webp.WebpLosslessEncodeOptions.operator !=(Sdcb.SimdCodecs.Webp.WebpLosslessEncodeOptions? left, Sdcb.SimdCodecs.Webp.WebpLosslessEncodeOptions? right) -> bool +static Sdcb.SimdCodecs.Webp.WebpLosslessEncodeOptions.operator ==(Sdcb.SimdCodecs.Webp.WebpLosslessEncodeOptions? left, Sdcb.SimdCodecs.Webp.WebpLosslessEncodeOptions? right) -> bool +static Sdcb.SimdCodecs.Webp.WebpLossyEncodeOptions.operator !=(Sdcb.SimdCodecs.Webp.WebpLossyEncodeOptions? left, Sdcb.SimdCodecs.Webp.WebpLossyEncodeOptions? right) -> bool +static Sdcb.SimdCodecs.Webp.WebpLossyEncodeOptions.operator ==(Sdcb.SimdCodecs.Webp.WebpLossyEncodeOptions? left, Sdcb.SimdCodecs.Webp.WebpLossyEncodeOptions? right) -> bool +~override Sdcb.SimdCodecs.Webp.WebpAnimationCanvasFrame.Equals(object obj) -> bool +~override Sdcb.SimdCodecs.Webp.WebpAnimationCanvasFrame.ToString() -> string +~override Sdcb.SimdCodecs.Webp.WebpFrameInfo.Equals(object obj) -> bool +~override Sdcb.SimdCodecs.Webp.WebpFrameInfo.ToString() -> string +~override Sdcb.SimdCodecs.Webp.WebpInfo.Equals(object obj) -> bool +~override Sdcb.SimdCodecs.Webp.WebpInfo.ToString() -> string diff --git a/src/Sdcb.SimdCodecs.Webp/PublicAPI.Unshipped.txt b/src/Sdcb.SimdCodecs.Webp/PublicAPI.Unshipped.txt new file mode 100644 index 0000000..7dc5c58 --- /dev/null +++ b/src/Sdcb.SimdCodecs.Webp/PublicAPI.Unshipped.txt @@ -0,0 +1 @@ +#nullable enable diff --git a/src/Sdcb.SimdCodecs/PublicAPI.Shipped.txt b/src/Sdcb.SimdCodecs/PublicAPI.Shipped.txt new file mode 100644 index 0000000..967ac41 --- /dev/null +++ b/src/Sdcb.SimdCodecs/PublicAPI.Shipped.txt @@ -0,0 +1,44 @@ +#nullable enable +Sdcb.SimdCodecs.ImageDecoder +Sdcb.SimdCodecs.ImageDecoder.Dispose() -> void +Sdcb.SimdCodecs.ImageDecoder.Format.get -> Sdcb.SimdCodecs.Abstractions.ImageFormat +Sdcb.SimdCodecs.ImageDecoder.FrameCount.get -> int +Sdcb.SimdCodecs.ImageDecoder.GetFrame(int index) -> Sdcb.SimdCodecs.ImageFrame! +Sdcb.SimdCodecs.ImageDecoder.LoopCount.get -> int? +Sdcb.SimdCodecs.ImageDecoder.Metadata.get -> Sdcb.SimdCodecs.Abstractions.ImageMetadata! +Sdcb.SimdCodecs.ImageFrame +Sdcb.SimdCodecs.ImageFrame.CopyPixels(Sdcb.SimdCodecs.Abstractions.PixelRect? region, Sdcb.SimdCodecs.Abstractions.PixelFormat format, System.Span destination, int stride, Sdcb.SimdCodecs.Abstractions.DecodeOptions? options = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> void +Sdcb.SimdCodecs.ImageFrame.Decode(Sdcb.SimdCodecs.Abstractions.DecodeOptions? options = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> Sdcb.SimdCodecs.Abstractions.IDecodedImage! +Sdcb.SimdCodecs.ImageFrame.Duration.get -> System.TimeSpan? +Sdcb.SimdCodecs.ImageFrame.Index.get -> int +Sdcb.SimdCodecs.ImageFrame.Info.get -> Sdcb.SimdCodecs.Abstractions.ImageInfo +Sdcb.SimdCodecs.ImageFrame.Metadata.get -> Sdcb.SimdCodecs.Abstractions.ImageMetadata! +Sdcb.SimdCodecs.ImageFrame.TryGetClosestSize(int width, int height, out int closestWidth, out int closestHeight, out int scaleDenominator) -> bool +Sdcb.SimdCodecs.ImageFrame.TryGetThumbnail(out Sdcb.SimdCodecs.Abstractions.IDecodedImage? thumbnail) -> bool +Sdcb.SimdCodecs.SimdCodecs +static Sdcb.SimdCodecs.ImageDecoder.Open(Sdcb.SimdCodecs.Abstractions.IByteSource! source) -> Sdcb.SimdCodecs.ImageDecoder! +static Sdcb.SimdCodecs.ImageDecoder.Open(System.IO.Stream! stream, bool leaveOpen = false) -> Sdcb.SimdCodecs.ImageDecoder! +static Sdcb.SimdCodecs.ImageDecoder.Open(System.ReadOnlyMemory data) -> Sdcb.SimdCodecs.ImageDecoder! +static Sdcb.SimdCodecs.ImageDecoder.Open(string! path) -> Sdcb.SimdCodecs.ImageDecoder! +static Sdcb.SimdCodecs.ImageDecoder.OpenAsync(System.IO.Stream! stream, bool leaveOpen = false, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.ValueTask +static Sdcb.SimdCodecs.SimdCodecs.CanDecode(System.ReadOnlySpan data) -> bool +static Sdcb.SimdCodecs.SimdCodecs.CreateEncoder(Sdcb.SimdCodecs.Abstractions.ImageFormat format, System.Buffers.IBufferWriter! output, Sdcb.SimdCodecs.Abstractions.EncodeOptions? options = null) -> Sdcb.SimdCodecs.Abstractions.IImageEncoderSession! +static Sdcb.SimdCodecs.SimdCodecs.DetectFormat(System.ReadOnlySpan data) -> Sdcb.SimdCodecs.Abstractions.ImageFormat +static Sdcb.SimdCodecs.SimdCodecs.Encode(Sdcb.SimdCodecs.Abstractions.IDecodedImage! image, Sdcb.SimdCodecs.Abstractions.ImageFormat format, System.Buffers.IBufferWriter! destination, Sdcb.SimdCodecs.Abstractions.EncodeOptions? options = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> void +static Sdcb.SimdCodecs.SimdCodecs.Encode(Sdcb.SimdCodecs.Abstractions.IDecodedImage! image, Sdcb.SimdCodecs.Abstractions.ImageFormat format, System.IO.Stream! destination, Sdcb.SimdCodecs.Abstractions.EncodeOptions? options = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> void +static Sdcb.SimdCodecs.SimdCodecs.Encode(System.ReadOnlySpan pixels, int width, int height, Sdcb.SimdCodecs.Abstractions.PixelFormat pixelFormat, Sdcb.SimdCodecs.Abstractions.ImageFormat format, int stride = 0, Sdcb.SimdCodecs.Abstractions.EncodeOptions? options = null, Sdcb.SimdCodecs.Abstractions.ImageMetadata? metadata = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> byte[]! +static Sdcb.SimdCodecs.SimdCodecs.GetClosestInputFormat(Sdcb.SimdCodecs.Abstractions.ImageFormat format, Sdcb.SimdCodecs.Abstractions.PixelFormat requested) -> Sdcb.SimdCodecs.Abstractions.PixelFormat +static Sdcb.SimdCodecs.SimdCodecs.IsDecodable(Sdcb.SimdCodecs.Abstractions.ImageFormat format) -> bool +static Sdcb.SimdCodecs.SimdCodecs.IsEncodable(Sdcb.SimdCodecs.Abstractions.ImageFormat format) -> bool +static Sdcb.SimdCodecs.SimdCodecs.Register(Sdcb.SimdCodecs.Abstractions.ImageDecoderRegistration! registration) -> void +static Sdcb.SimdCodecs.SimdCodecs.RegisterEncoder(Sdcb.SimdCodecs.Abstractions.ImageEncoderRegistration! registration) -> void +static Sdcb.SimdCodecs.SimdCodecs.TryDecode(System.ReadOnlySpan data, out Sdcb.SimdCodecs.Abstractions.IDecodedImage? image, Sdcb.SimdCodecs.Abstractions.DecodeOptions? options = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> bool +static Sdcb.SimdCodecs.SimdCodecs.TryDecodeInto(System.ReadOnlySpan data, System.Span destination, int stride, Sdcb.SimdCodecs.Abstractions.PixelFormat format, Sdcb.SimdCodecs.Abstractions.DecodeOptions? options = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> bool +static Sdcb.SimdCodecs.SimdCodecs.TryDecodeIntoRgba8(System.ReadOnlySpan data, System.Span rgbaDestination) -> bool +static Sdcb.SimdCodecs.SimdCodecs.TryDecodePlanes(System.ReadOnlySpan data, System.Span y, System.Span cb, System.Span cr, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> bool +static Sdcb.SimdCodecs.SimdCodecs.TryDecodeThumbnail(System.ReadOnlySpan data, out Sdcb.SimdCodecs.Abstractions.IDecodedImage? thumbnail) -> bool +static Sdcb.SimdCodecs.SimdCodecs.TryGetClosestSize(System.ReadOnlySpan data, int requestedWidth, int requestedHeight, out int width, out int height, out int scaleDenominator) -> bool +static Sdcb.SimdCodecs.SimdCodecs.TryOpenFrames(System.ReadOnlyMemory data, out Sdcb.SimdCodecs.Abstractions.IImageFrameReader? reader) -> bool +static Sdcb.SimdCodecs.SimdCodecs.TryReadInfo(System.ReadOnlySpan data, out Sdcb.SimdCodecs.Abstractions.ImageInfo info) -> bool +static Sdcb.SimdCodecs.SimdCodecs.TryReadMetadata(System.ReadOnlySpan data, out Sdcb.SimdCodecs.Abstractions.ImageMetadata? metadata) -> bool +static Sdcb.SimdCodecs.SimdCodecs.TryReadPlanarInfo(System.ReadOnlySpan data, out Sdcb.SimdCodecs.Abstractions.PlanarInfo info) -> bool diff --git a/src/Sdcb.SimdCodecs/PublicAPI.Unshipped.txt b/src/Sdcb.SimdCodecs/PublicAPI.Unshipped.txt new file mode 100644 index 0000000..7dc5c58 --- /dev/null +++ b/src/Sdcb.SimdCodecs/PublicAPI.Unshipped.txt @@ -0,0 +1 @@ +#nullable enable From 25613d4152b97b87432a13a82ec41cbf49761945 Mon Sep 17 00:00:00 2001 From: sdcb Date: Wed, 4 Nov 2026 19:39:08 +0800 Subject: [PATCH 4/5] AOT smoke: build before `dotnet run --no-build`, so restore warnings stay out of jit.txt A NuGet advisory published 2026-11-03 (GHSA-p3jp-9v83-76w9, Microsoft.DotNet.ILCompiler 10.0.13) makes restore print NU1903 to stdout; `dotnet run` captured it into jit.txt, which then differed from the AOT binary's output. The pixel digests were identical. The WebAssembly smoke script already builds first. Co-Authored-By: Claude Opus 5.5 --- tests/Sdcb.SimdCodecs.AotSmoke/run.sh | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tests/Sdcb.SimdCodecs.AotSmoke/run.sh b/tests/Sdcb.SimdCodecs.AotSmoke/run.sh index e711ee4..901dc6a 100644 --- a/tests/Sdcb.SimdCodecs.AotSmoke/run.sh +++ b/tests/Sdcb.SimdCodecs.AotSmoke/run.sh @@ -16,7 +16,10 @@ mkdir -p "$work" # The HEIF fixtures FacadeSmoke embeds are downloaded, never committed. bash "$here/../Sdcb.SimdCodecs.Tests/Oracle/heif/fetch.sh" > "$work/heif-fetch.log" || { cat "$work/heif-fetch.log"; exit 1; } -dotnet run --project "$here" -c Release > "$work/jit.txt" +# Build first, then run with --no-build: `dotnet run` prints restore warnings (e.g. NU1903 for a package advisory) +# to stdout, which would land in jit.txt but never in the AOT binary's output. +dotnet build "$here" -c Release > "$work/jit-build.log" || { cat "$work/jit-build.log"; exit 1; } +dotnet run --project "$here" -c Release --no-build > "$work/jit.txt" lines="$(wc -l < "$work/jit.txt" | tr -d ' ')" [ "$lines" -gt 0 ] || { echo "no decodes ran" >&2; exit 1; } From a3aeffee40d9e4e26c85eda026359d982e3f6fa5 Mon Sep 17 00:00:00 2001 From: sdcb Date: Wed, 4 Nov 2026 19:48:00 +0800 Subject: [PATCH 5/5] docs: the API baseline makes changes visible; it does not freeze the API All packages ship together, so a breaking change is allowed when it is worth it: write it into PublicAPI.Unshipped.txt and name it in the release notes. Co-Authored-By: Claude Opus 5.5 --- .editorconfig | 3 ++- AGENTS.md | 9 +++++---- Directory.Build.props | 3 ++- docs/api-design.md | 9 +++++---- docs/migrating-to-2.0.md | 4 ++-- 5 files changed, 16 insertions(+), 12 deletions(-) diff --git a/.editorconfig b/.editorconfig index efb16b2..c4a2d19 100644 --- a/.editorconfig +++ b/.editorconfig @@ -2,7 +2,8 @@ root = true [*.cs] # Public API baseline (Microsoft.CodeAnalysis.PublicApiAnalyzers, see Directory.Build.props): an API that is not in -# PublicAPI.Shipped.txt / PublicAPI.Unshipped.txt, or one listed there that no longer exists, fails the build. +# PublicAPI.Shipped.txt / PublicAPI.Unshipped.txt, or one listed there that no longer exists, fails the build. This makes +# API changes visible in review; it does not forbid them: update the files (and the release notes for a break). dotnet_diagnostic.RS0016.severity = error dotnet_diagnostic.RS0017.severity = error diff --git a/AGENTS.md b/AGENTS.md index d2b409c..6997abf 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -84,10 +84,11 @@ bash tests/Sdcb.SimdCodecs.WasmSmoke/run.sh # Mono AOT ( locally after touching the facade or a codec's `IImageDecoder` adapter. - **No new warnings.** The build stays at its current set (pre-existing XML-doc warnings only); fix what you introduce, never suppress it. -- **The public API is a baseline.** Every package under `src/` lists its public API in `PublicAPI.Shipped.txt` - (the 2.0 surface) and `PublicAPI.Unshipped.txt` (changes since the last release); an API change that is not - written there is a build error (RS0016 / RS0017). A removal or a changed signature after 2.0 is a breaking change: - make it only in a major version. On a release, Unshipped moves into Shipped. +- **Public API changes are visible, not frozen.** Every package under `src/` lists its public API in + `PublicAPI.Shipped.txt` (what the last release shipped) and `PublicAPI.Unshipped.txt` (changes since); a change + not written there is a build error (RS0016 / RS0017), so every change shows up in review. Changing or removing an + API is allowed when it is worth it (all packages ship together): update the files, and name the break in the + release notes. On a release, Unshipped moves into Shipped. - **A skipped oracle is not a passing oracle.** Oracle tests skip when their tool is missing; read the skip messages, or run with `REQUIRE_ORACLES=1`. - Every vector kernel has a scalar twin and must produce identical output on every tier diff --git a/Directory.Build.props b/Directory.Build.props index b2db974..0948772 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -37,7 +37,8 @@ + PublicAPI.Unshipped.txt fails the build (RS0016 / RS0017), so every API change shows up in review; changes, + breaking ones included, are fine once written there. On a release, Unshipped moves into Shipped. --> diff --git a/docs/api-design.md b/docs/api-design.md index fcd79d1..d2d9f5a 100644 --- a/docs/api-design.md +++ b/docs/api-design.md @@ -61,7 +61,7 @@ Premultiplied,只对 Rgba / Bgra 有意义)。构造函数拒绝无意义的 Abstractions 不依赖它。提取:JPEG(APP1 Exif / XMP、APP2 ICC)、PNG(eXIf、iTXt XMP、iCCP)、WebP(EXIF、XMP、ICCP)、 TIFF(XMP 标签 700、ICC)、HEIF(`cdsc` 关联的 Exif item 和 `mime` XMP item、`colr` ICC)。缩略图:JPEG Exif IFD1、 HEIF `thmb`。编码器把帧的 `ImageMetadata` 写进各自格式的位置。ICC 只有这一个入口(`IDecodedImage.Metadata.Icc`)。 -`ImageMetadata` 是 record,用初始化器构造、`with` 修改,以后加块(IPTC、文本、HDR 静态元数据)不破坏兼容。 +`ImageMetadata` 是 record,用初始化器构造、`with` 修改,以后加块(IPTC、文本、HDR 静态元数据)不必破坏兼容。 ## 会话:`ImageDecoder` / `ImageFrame` @@ -98,11 +98,12 @@ duration)` → `WriteRows(rows, count, stride)` → `Commit()`。 ## 兼容性 -2.0 之后不再破坏兼容,形状按这个目标定: +公开 API 的变动要看得见,但不冻结:所有包同时发布,值得时可以改、可以删,在发布说明里写明即可。形状尽量让常见的 +扩展不必破坏兼容: - 注册类和 `ImageMetadata` 用 `init` 属性(门面需要的标 `required`),不用位置参数的构造函数:加成员不会让已编译的 调用方在运行时找不到方法。只有成对出现的平面委托由 `SimdCodecs.Register` 调 `Validate()` 检查。 - 每个包都有 `PublicAPI.Shipped.txt` / `PublicAPI.Unshipped.txt`(`Microsoft.CodeAnalysis.PublicApiAnalyzers`)。 - Shipped 记的是 2.0 的公开 API;之后的变动写进 Unshipped,不写就编译报错(RS0016 / RS0017);发布一个版本时把 - Unshipped 并进 Shipped。同一分析器里关于可选参数重载形状的 RS0026 / RS0027 在 `.editorconfig` 里关闭:codec 有意 + Shipped 记的是上一次发布的公开 API;之后的变动写进 Unshipped,不写就编译报错(RS0016 / RS0017),这样每处变动都会 + 出现在评审的 diff 里。破坏性改动照常可以做,只要它值得、并在发布说明里写明。发布一个版本时把 Unshipped 并进 Shipped。同一分析器里关于可选参数重载形状的 RS0026 / RS0027 在 `.editorconfig` 里关闭:codec 有意 同时提供 `byte[]` 和 `ReadOnlySpan` 重载并带相同的可选参数。 diff --git a/docs/migrating-to-2.0.md b/docs/migrating-to-2.0.md index 640afd8..08b745f 100644 --- a/docs/migrating-to-2.0.md +++ b/docs/migrating-to-2.0.md @@ -1,7 +1,7 @@ # Migrating to 2.0 -2.0 makes all its breaking changes to `Sdcb.SimdCodecs.Abstractions` and the facade at once, so that 2.x can add -without breaking again. Most code needs a rename and nothing else. Every 8-bit decode output is byte-for-byte what +2.0 makes its breaking changes to `Sdcb.SimdCodecs.Abstractions` and the facade at once, and shapes the API so that +the usual additions in 2.x need no further break. Most code needs a rename and nothing else. Every 8-bit decode output is byte-for-byte what 1.x produced; the decoded pixels change only where 2.0 keeps precision 1.x threw away (HEIF Main 10, see below). ## Renames