private static unsafe HeifIntegerEncoderParameter CreateIntegerParameter(SafeHeifEncoder encoder, heif_encoder_parameter nativeParameter, string name, bool hasDefaultValue) { int defaultValue = 0; if (hasDefaultValue) { // The error value is ignored because some encoders return an error // when getting the value of a valid command. _ = LibHeifNative.heif_encoder_get_parameter_integer(encoder, name, out defaultValue); } int minimum = 0; int maximum = 0; var error = LibHeifNative.heif_encoder_parameter_get_valid_integer_range(nativeParameter, out bool haveMinimumMaximum, ref minimum, ref maximum); error.ThrowIfError(); return(new HeifIntegerEncoderParameter(name, hasDefaultValue, defaultValue, haveMinimumMaximum, minimum, maximum)); }
/// <summary> /// Initializes a new instance of the <see cref="HeifEncoder"/> class. /// </summary> /// <param name="encoder">The encoder.</param> internal HeifEncoder(SafeHeifEncoder encoder) { Validate.IsNotNull(encoder, nameof(encoder)); this.encoder = encoder; this.encoderParameterList = new Lazy <ReadOnlyCollection <IHeifEncoderParameter> >(GetEncoderParameterList); this.encoderParameterTypes = new Lazy <IReadOnlyDictionary <string, HeifEncoderParameterType> >(GetEncoderParameterTypes); }
private static HeifBooleanEncoderParameter CreateBooleanParameter(SafeHeifEncoder encoder, string name, bool hasDefaultValue) { bool defaultValue = false; if (hasDefaultValue) { // The error value is ignored because some encoders return an error // when getting the value of a valid command. _ = LibHeifNative.heif_encoder_get_parameter_boolean(encoder, name, out defaultValue); } return(new HeifBooleanEncoderParameter(name, hasDefaultValue, defaultValue)); }
private static unsafe HeifStringEncoderParameter CreateStringParameter(SafeHeifEncoder encoder, heif_encoder_parameter nativeParameter, string name, bool hasDefaultValue) { string defaultValue = string.Empty; if (hasDefaultValue) { byte[] bytes = new byte[256]; fixed(byte *ptr = bytes) { // The error value is ignored because some encoders return an error // when getting the value of a valid command. _ = LibHeifNative.heif_encoder_get_parameter_string(encoder, name, ptr, bytes.Length); } int count = bytes.Length; // Look for the NUL terminator at the end of the string. for (int i = 0; i < bytes.Length; i++) { if (bytes[i] == 0) { count = i; break; } } defaultValue = System.Text.Encoding.ASCII.GetString(bytes, 0, count); } var error = LibHeifNative.heif_encoder_parameter_get_valid_string_values(nativeParameter, out var stringArray); error.ThrowIfError(); var validItems = stringArray.ToReadOnlyCollection(); return(new HeifStringEncoderParameter(name, hasDefaultValue, defaultValue, validItems)); }
/// <summary> /// Creates the specified encoder parameter. /// </summary> /// <param name="encoder">The encoder.</param> /// <param name="nativeParameter">The native encoder parameter.</param> /// <returns></returns> /// <exception cref="HeifException">An error occurred when creating the encoder parameter.</exception> public static unsafe IHeifEncoderParameter Create(SafeHeifEncoder encoder, heif_encoder_parameter nativeParameter) { string name = LibHeifNative.heif_encoder_parameter_get_name(nativeParameter).GetStringValue(); var type = LibHeifNative.heif_encoder_parameter_get_type(nativeParameter); bool hasDefaultValue = LibHeifNative.heif_encoder_has_default(encoder, name); switch (type) { case heif_encoder_parameter_type.Integer: return(CreateIntegerParameter(encoder, nativeParameter, name, hasDefaultValue)); case heif_encoder_parameter_type.Boolean: return(CreateBooleanParameter(encoder, name, hasDefaultValue)); case heif_encoder_parameter_type.String: return(CreateStringParameter(encoder, nativeParameter, name, hasDefaultValue)); default: throw new HeifException($"Unknown { nameof(heif_encoder_parameter_type)}: { type }."); } }
private static unsafe HeifIntegerEncoderParameter CreateIntegerParameter(SafeHeifEncoder encoder, heif_encoder_parameter nativeParameter, string name, bool hasDefaultValue) { int defaultValue = 0; if (hasDefaultValue) { // The error value is ignored because some encoders return an error // when getting the value of a valid command. _ = LibHeifNative.heif_encoder_get_parameter_integer(encoder, name, out defaultValue); } bool haveMinimumMaximum; int minimum = 0; int maximum = 0; var validValues = new List <int>(); if (LibHeifVersion.Is1Point10OrLater) { var error = LibHeifNative.heif_encoder_parameter_get_valid_integer_values(nativeParameter, out bool haveMinimum, out bool haveMaximum, ref minimum, ref maximum, out int numValidValues, out var validValuesArray); error.ThrowIfError(); haveMinimumMaximum = haveMinimum && haveMaximum; if (numValidValues > 0 && validValuesArray != IntPtr.Zero) { validValues.Capacity = numValidValues; int *integerArray = (int *)validValuesArray; for (int i = 0; i < numValidValues; i++) { validValues.Add(integerArray[i]); } } } else { var error = LibHeifNative.heif_encoder_parameter_get_valid_integer_range(nativeParameter, out haveMinimumMaximum, ref minimum, ref maximum); error.ThrowIfError(); } return(new HeifIntegerEncoderParameter(name, hasDefaultValue, defaultValue, haveMinimumMaximum, minimum, maximum, validValues.AsReadOnly())); }