File: System\Drawing\Imaging\EncoderParameters.cs
Web Access
Project: src\src\System.Drawing.Common\src\System.Drawing.Common.csproj (System.Drawing.Common)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System.Runtime.InteropServices;
 
namespace System.Drawing.Imaging;
 
public sealed class EncoderParameters : IDisposable
{
    public EncoderParameters(int count) => Param = new EncoderParameter[count];
 
    public EncoderParameters() => Param = new EncoderParameter[1];
 
    public EncoderParameter[] Param { get; set; }
 
    internal unsafe GdiPlus.EncoderParameters* ConvertToNative()
    {
        int length = Param.Length;
 
        // The struct has the first EncoderParameter in it.
        GdiPlus.EncoderParameters* native = (GdiPlus.EncoderParameters*)Marshal.AllocHGlobal(
            sizeof(GdiPlus.EncoderParameters) + ((length - 1) * sizeof(GdiPlus.EncoderParameter)));
 
        native->Count = (uint)length;
        Span<GdiPlus.EncoderParameter> parameters = native->Parameters;
 
        for (int i = 0; i < length; i++)
        {
            parameters[i] = Param[i].ToNative();
        }
 
        return native;
    }
 
    internal static unsafe EncoderParameters ConvertFromNative(GdiPlus.EncoderParameters* native)
    {
        if (native is null)
        {
            throw Status.InvalidParameter.GetException();
        }
 
        var nativeParameters = native->Parameters;
        EncoderParameters parameters = new(nativeParameters.Length);
        for (int i = 0; i < nativeParameters.Length; i++)
        {
            parameters.Param[i] = new EncoderParameter(
                new Encoder(nativeParameters[i].Guid),
                (int)nativeParameters[i].NumberOfValues,
                (EncoderParameterValueType)nativeParameters[i].Type,
                (nint)nativeParameters[i].Value);
        }
 
        return parameters;
    }
 
    public void Dispose()
    {
        foreach (EncoderParameter p in Param)
        {
            p?.Dispose();
        }
 
        Param = null!;
    }
}