Example #1
0
        /// <summary>
        /// Copy the native GDI+ EncoderParameters data from a chunk of memory into a managed EncoderParameters object.
        /// See ConvertToMemory for more info.
        /// </summary>
        internal static EncoderParameters ConvertFromMemory(IntPtr memory)
        {
            if (memory == IntPtr.Zero)
            {
                throw Gdip.StatusException(Gdip.InvalidParameter);
            }

            int count = Marshal.ReadInt32(memory);

            EncoderParameters p = new EncoderParameters(count);
            int  size           = Marshal.SizeOf(typeof(EncoderParameter));
            long arrayOffset    = (long)memory + Marshal.SizeOf(typeof(IntPtr));

            for (int i = 0; i < count; i++)
            {
                Guid guid                      = (Guid)Marshal.PtrToStructure((IntPtr)(i * size + arrayOffset), typeof(Guid));
                int  numberOfValues            = Marshal.ReadInt32((IntPtr)(i * size + arrayOffset + 16));
                EncoderParameterValueType type = (EncoderParameterValueType)Marshal.ReadInt32((IntPtr)(i * size + arrayOffset + 20));
                IntPtr value                   = Marshal.ReadIntPtr((IntPtr)(i * size + arrayOffset + 24));

                p._param[i] = new EncoderParameter(new Encoder(guid), numberOfValues, type, value);
            }

            return(p);
        }
Example #2
0
        public EncoderParameter(Encoder encoder,
                                int[] numerator1, int[] denominator1,
                                int[] numerator2, int[] denominator2)
        {
            _parameterGuid = encoder.Guid;

            if (numerator1.Length != denominator1.Length ||
                numerator1.Length != denominator2.Length ||
                denominator1.Length != denominator2.Length)
            {
                throw SafeNativeMethods.Gdip.StatusException(SafeNativeMethods.Gdip.InvalidParameter);
            }

            _parameterValueType = EncoderParameterValueType.ValueTypeRationalRange;
            _numberOfValues     = numerator1.Length;
            int size = Marshal.SizeOf(typeof(Int32));

            _parameterValue = Marshal.AllocHGlobal(checked (_numberOfValues * 4 * size));

            if (_parameterValue == IntPtr.Zero)
            {
                throw SafeNativeMethods.Gdip.StatusException(SafeNativeMethods.Gdip.OutOfMemory);
            }

            for (int i = 0; i < _numberOfValues; i++)
            {
                Marshal.WriteInt32(Add(_parameterValue, 4 * i * size), numerator1[i]);
                Marshal.WriteInt32(Add(_parameterValue, (4 * i + 1) * size), denominator1[i]);
                Marshal.WriteInt32(Add(_parameterValue, (4 * i + 2) * size), numerator2[i]);
                Marshal.WriteInt32(Add(_parameterValue, (4 * i + 3) * size), denominator2[i]);
            }
            GC.KeepAlive(this);
        }
Example #3
0
        public EncoderParameter(Encoder encoder, int[] numerator, int[] denominator)
        {
            _parameterGuid = encoder.Guid;

            if (numerator.Length != denominator.Length)
            {
                throw SafeNativeMethods.Gdip.StatusException(SafeNativeMethods.Gdip.InvalidParameter);
            }

            _parameterValueType = EncoderParameterValueType.ValueTypeRational;
            _numberOfValues     = numerator.Length;
            int size = Marshal.SizeOf(typeof(Int32));

            _parameterValue = Marshal.AllocHGlobal(checked (_numberOfValues * 2 * size));

            if (_parameterValue == IntPtr.Zero)
            {
                throw SafeNativeMethods.Gdip.StatusException(SafeNativeMethods.Gdip.OutOfMemory);
            }

            for (int i = 0; i < _numberOfValues; i++)
            {
                Marshal.WriteInt32(Add(i * 2 * size, _parameterValue), (int)numerator[i]);
                Marshal.WriteInt32(Add((i * 2 + 1) * size, _parameterValue), (int)denominator[i]);
            }
            GC.KeepAlive(this);
        }
Example #4
0
 public EncoderParameter(Encoder encoder, int NumberOfValues, int Type, int Value)
 {
     this.encoder     = encoder;
     this.valuePtr    = (IntPtr)Value;
     this.valuesCount = NumberOfValues;
     this.type        = (EncoderParameterValueType)Type;
 }
Example #5
0
 public EncoderParameter(Encoder encoder, short value)
 {
     this.encoder        = encoder.Guid;
     this.numberOfValues = 1;
     this.type           = EncoderParameterValueType.ValueTypeShort;
     this.value          = value;
 }
Example #6
0
        public unsafe EncoderParameter(Encoder encoder, long[] value)
        {
            _parameterGuid = encoder.Guid;

            _parameterValueType = EncoderParameterValueType.ValueTypeLong;
            _numberOfValues     = value.Length;
            int size = Marshal.SizeOf(typeof(Int32));

            _parameterValue = Marshal.AllocHGlobal(checked (_numberOfValues * size));

            if (_parameterValue == IntPtr.Zero)
            {
                throw SafeNativeMethods.Gdip.StatusException(SafeNativeMethods.Gdip.OutOfMemory);
            }

            int *dest = (int *)_parameterValue;

            fixed(long *source = value)
            {
                for (int i = 0; i < value.Length; i++)
                {
                    dest[i] = unchecked ((int)source[i]);
                }
            }

            GC.KeepAlive(this);
        }
Example #7
0
        public EncoderParameter(Encoder encoder, long[] rangebegin, long[] rangeend)
        {
            _parameterGuid = encoder.Guid;

            if (rangebegin.Length != rangeend.Length)
            {
                throw SafeNativeMethods.Gdip.StatusException(SafeNativeMethods.Gdip.InvalidParameter);
            }

            _parameterValueType = EncoderParameterValueType.ValueTypeLongRange;
            _numberOfValues     = rangebegin.Length;
            int size = Marshal.SizeOf(typeof(Int32));

            _parameterValue = Marshal.AllocHGlobal(checked (_numberOfValues * 2 * size));

            if (_parameterValue == IntPtr.Zero)
            {
                throw SafeNativeMethods.Gdip.StatusException(SafeNativeMethods.Gdip.OutOfMemory);
            }

            for (int i = 0; i < _numberOfValues; i++)
            {
                Marshal.WriteInt32(Add(i * 2 * size, _parameterValue), unchecked ((int)rangebegin[i]));
                Marshal.WriteInt32(Add((i * 2 + 1) * size, _parameterValue), unchecked ((int)rangeend[i]));
            }
            GC.KeepAlive(this);
        }
 public void Ctor_Encoder_NumberOfValues_Type_Value(int numberOfValues, EncoderParameterValueType type, IntPtr value)
 {
     using (EncoderParameter ep = new EncoderParameter(s_anyEncoder, numberOfValues, type, value))
     {
         CheckEncoderParameter(ep, s_anyEncoder, type, numberOfValues);
     }
 }
 public void Ctor_Encoder_ByteArray_Bool(byte[] value, bool undefined, EncoderParameterValueType expected)
 {
     using (EncoderParameter ep = new EncoderParameter(s_anyEncoder, value, undefined))
     {
         CheckEncoderParameter(ep, s_anyEncoder, expected, value.Length);
     }
 }
Example #10
0
 public EncoderParameter(Encoder encoder, String value)
 {
     this.encoder        = encoder.Guid;
     this.numberOfValues = value.Length + 1;
     this.type           = EncoderParameterValueType.ValueTypeAscii;
     this.value          = value;
 }
Example #11
0
 public EncoderParameter(Encoder encoder, long value)
 {
     this.encoder        = encoder.Guid;
     this.numberOfValues = 1;
     this.type           = EncoderParameterValueType.ValueTypeLong;
     this.value          = value;
 }
Example #12
0
 public EncoderParameter(Encoder encoder, long rangebegin, long rangeend)
 {
     this.encoder        = encoder.Guid;
     this.numberOfValues = 1;
     this.type           = EncoderParameterValueType.ValueTypeLongRange;
     this.value          = new Tuple(rangebegin, rangeend);
 }
Example #13
0
 public EncoderParameter(Encoder encoder, int numerator, int denominator)
 {
     this.encoder        = encoder.Guid;
     this.numberOfValues = 1;
     this.type           = EncoderParameterValueType.ValueTypeRational;
     this.value          = new Tuple(numerator, denominator);
 }
	public EncoderParameter(Encoder encoder, byte[] value)
			{
				this.encoder = encoder.Guid;
				this.numberOfValues = value.Length;
				this.type = EncoderParameterValueType.ValueTypeByte;
				this.value = value;
			}
Example #15
0
 public EncoderParameter(Encoder encoder, byte[] value)
 {
     this.encoder        = encoder.Guid;
     this.numberOfValues = value.Length;
     this.type           = EncoderParameterValueType.ValueTypeByte;
     this.value          = value;
 }
Example #16
0
        public EncoderParameter(
            Encoder encoder,
            int[] numerator1,
            int[] denominator1,
            int[] numerator2,
            int[] denominator2)
        {
            if (numerator1.Length != denominator1.Length || numerator2.Length != denominator2.Length ||
                numerator1.Length != numerator2.Length)
            {
                throw new ArgumentException("Invalid parameter used.");
            }

            this.encoder     = encoder;
            this.valuesCount = numerator1.Length;
            this.type        = EncoderParameterValueType.ValueTypeRationalRange;

            this.valuePtr = Marshal.AllocHGlobal(4 * valuesCount * 4);
            IntPtr dest = this.valuePtr;

            for (int i = 0; i < valuesCount; i++)
            {
                Marshal.WriteInt32(dest, i * 4, numerator1[i]);
                Marshal.WriteInt32(dest, (i + 1) * 4, denominator1[i]);
                Marshal.WriteInt32(dest, (i + 2) * 4, numerator2[i]);
                Marshal.WriteInt32(dest, (i + 3) * 4, denominator2[i]);
            }
        }
        public void Ctor_Encoder_NegativeNumberOfValues_Type_Value_OutOfMemoryException(int numberOfValues)
        {
            IntPtr anyValue = IntPtr.Zero;
            EncoderParameterValueType anyTypw = EncoderParameterValueType.ValueTypeAscii;

            Assert.Throws <OutOfMemoryException>(() => new EncoderParameter(s_anyEncoder, numberOfValues, anyTypw, anyValue));
        }
Example #18
0
        public EncoderParameter(Encoder encoder,
                                int[] numerator1, int[] denominator1,
                                int[] numerator2, int[] denominator2)
        {
            _parameterGuid = encoder.Guid;

            if (numerator1.Length != denominator1.Length ||
                numerator1.Length != denominator2.Length ||
                denominator1.Length != denominator2.Length)
            {
                throw Gdip.StatusException(Gdip.InvalidParameter);
            }

            _parameterValueType = EncoderParameterValueType.ValueTypeRationalRange;
            _numberOfValues     = numerator1.Length;
            _parameterValue     = Marshal.AllocHGlobal(checked (_numberOfValues * 4 * sizeof(int)));

            for (int i = 0; i < _numberOfValues; i++)
            {
                ((int *)_parameterValue)[i * 4 + 0] = numerator1[i];
                ((int *)_parameterValue)[i * 4 + 1] = denominator1[i];
                ((int *)_parameterValue)[i * 4 + 2] = numerator2[i];
                ((int *)_parameterValue)[i * 4 + 3] = denominator2[i];
            }
            GC.KeepAlive(this);
        }
Example #19
0
        internal static EncoderParameters ConvertFromMemory(IntPtr memory)
        {
            if (memory == IntPtr.Zero)
            {
                throw SafeNativeMethods.Gdip.StatusException(SafeNativeMethods.Gdip.InvalidParameter);
            }

            int count = Marshal.ReadIntPtr(memory).ToInt32();

            EncoderParameters p = new EncoderParameters(count);
            int  size           = Marshal.SizeOf(typeof(EncoderParameter));
            long arrayOffset    = (long)memory + Marshal.SizeOf(typeof(IntPtr));

            IntSecurity.UnmanagedCode.Assert();

            try {
                for (int i = 0; i < count; i++)
                {
                    Guid guid                      = (Guid)UnsafeNativeMethods.PtrToStructure((IntPtr)(i * size + arrayOffset), typeof(Guid));
                    int  numberOfValues            = Marshal.ReadInt32((IntPtr)(i * size + arrayOffset + 16));
                    EncoderParameterValueType type = (EncoderParameterValueType)Marshal.ReadInt32((IntPtr)(i * size + arrayOffset + 20));
                    IntPtr value                   = Marshal.ReadIntPtr((IntPtr)(i * size + arrayOffset + 24));

                    p.param[i] = new EncoderParameter(new Encoder(guid), numberOfValues, type, value);
                }
            }
            finally {
                System.Security.CodeAccessPermission.RevertAssert();
            }

            return(p);
        }
 public EncoderParameter(Encoder encoder, int numberOfValues, int type, int value)
 {
     this.encoder     = encoder;
     this.valuePtr    = (IntPtr)value;
     this.valuesCount = numberOfValues;
     this.type        = (EncoderParameterValueType)type;
 }
 public EncoderParameter(Encoder encoder, short value)
 {
     this.encoder = encoder;
     this.valuesCount = 1;
     this.type = EncoderParameterValueType.ValueTypeShort;
     this.valuePtr = Marshal.AllocHGlobal(2);
     Marshal.WriteInt16(this.valuePtr, value);
 }
 public EncoderParameter(Encoder encoder, byte[] value)
 {
     this.encoder = encoder;
     this.valuesCount = value.Length;
     this.type = EncoderParameterValueType.ValueTypeByte;
     this.valuePtr = Marshal.AllocHGlobal(1 * valuesCount);
     Marshal.Copy(value, 0, this.valuePtr, valuesCount);
 }
 public EncoderParameter(Encoder encoder, long value)
 {
     this.encoder     = encoder;
     this.valuesCount = 1;
     this.type        = EncoderParameterValueType.ValueTypeLong;
     this.valuePtr    = Marshal.AllocHGlobal(4);
     Marshal.WriteInt32(this.valuePtr, (int)value);
 }
Example #24
0
 public EncoderParameter(Encoder encoder, int NumberOfValues,
                         int Type, int Value)
 {
     this.encoder        = encoder.Guid;
     this.numberOfValues = NumberOfValues;
     this.type           = (EncoderParameterValueType)Type;
     this.value          = Value;
 }
 public EncoderParameter(Encoder encoder, short value)
 {
     this.encoder     = encoder;
     this.valuesCount = 1;
     this.type        = EncoderParameterValueType.ValueTypeShort;
     this.valuePtr    = Marshal.AllocHGlobal(2);
     Marshal.WriteInt16(this.valuePtr, value);
 }
 public EncoderParameter(Encoder encoder, byte value)
 {
     this.encoder     = encoder;
     this.valuesCount = 1;
     this.type        = EncoderParameterValueType.ValueTypeByte;
     this.valuePtr    = Marshal.AllocHGlobal(1);
     Marshal.WriteByte(this.valuePtr, value);
 }
 public EncoderParameter(Encoder encoder, byte value)
 {
     this.encoder = encoder;
     this.valuesCount = 1;
     this.type = EncoderParameterValueType.ValueTypeByte;
     this.valuePtr = Marshal.AllocHGlobal(1);
     Marshal.WriteByte(this.valuePtr, value);
 }
 public EncoderParameter(Encoder encoder, short[] value)
 {
     this.encoder     = encoder;
     this.valuesCount = value.Length;
     this.type        = EncoderParameterValueType.ValueTypeShort;
     this.valuePtr    = Marshal.AllocHGlobal(2 * valuesCount);
     Marshal.Copy(value, 0, this.valuePtr, valuesCount);
 }
	public EncoderParameter(Encoder encoder, byte value, bool undefined)
			{
				this.encoder = encoder.Guid;
				this.numberOfValues = 1;
				this.type = (undefined ?
							  EncoderParameterValueType.ValueTypeUndefined :
							  EncoderParameterValueType.ValueTypeByte);
				this.value = value;
			}
 public EncoderParameter(Encoder encoder, int numerator1, int denominator1, int numerator2, int denominator2)
 {
     this.encoder     = encoder;
     this.valuesCount = 1;
     this.type        = EncoderParameterValueType.ValueTypeRationalRange;
     this.valuePtr    = Marshal.AllocHGlobal(4 * 4);
     int[] valuearray = { numerator1, denominator1, numerator2, denominator2 };
     Marshal.Copy(valuearray, 0, this.valuePtr, 4);
 }
 public EncoderParameter(Encoder encoder, int numerator, int denominator)
 {
     this.encoder     = encoder;
     this.valuesCount = 1;
     this.type        = EncoderParameterValueType.ValueTypeRational;
     this.valuePtr    = Marshal.AllocHGlobal(8);
     int[] valuearray = { numerator, denominator };
     Marshal.Copy(valuearray, 0, this.valuePtr, valuearray.Length);
 }
Example #32
0
        public EncoderParameter(Encoder encoder, string value)
        {
            _parameterGuid = encoder.Guid;

            _parameterValueType = EncoderParameterValueType.ValueTypeAscii;
            _numberOfValues     = value.Length;
            _parameterValue     = Marshal.StringToHGlobalAnsi(value);
            GC.KeepAlive(this);
        }
 public EncoderParameter(Encoder encoder, long rangebegin, long rangeend)
 {
     this.encoder     = encoder;
     this.valuesCount = 1;
     this.type        = EncoderParameterValueType.ValueTypeLongRange;
     this.valuePtr    = Marshal.AllocHGlobal(8);
     int[] valuearray = { (int)rangebegin, (int)rangeend };
     Marshal.Copy(valuearray, 0, this.valuePtr, valuearray.Length);
 }
Example #34
0
 public EncoderParameter(Encoder encoder, byte[] value, bool undefined)
 {
     this.encoder        = encoder.Guid;
     this.numberOfValues = value.Length;
     this.type           = (undefined ?
                            EncoderParameterValueType.ValueTypeUndefined :
                            EncoderParameterValueType.ValueTypeByte);
     this.value = value;
 }
Example #35
0
 public EncoderParameter(Encoder encoder, int[] numerator1,
                         int[] denominator1, int[] numerator2,
                         int[] denominator2)
 {
     this.encoder        = encoder.Guid;
     this.numberOfValues = numerator1.Length;
     this.type           = EncoderParameterValueType.ValueTypeRationalRange;
     this.value          = new Tuple(numerator1, denominator1,
                                     numerator2, denominator2);
 }
        public EncoderParameter(Encoder encoder, int numberValues, EncoderParameterValueType type, IntPtr value)
        {
            int size;

            IntSecurity.UnmanagedCode.Demand();

            switch (type)
            {
                case EncoderParameterValueType.ValueTypeByte:
                case EncoderParameterValueType.ValueTypeAscii: size = 1; break;
                case EncoderParameterValueType.ValueTypeShort: size = 2; break;
                case EncoderParameterValueType.ValueTypeLong: size = 4; break;
                case EncoderParameterValueType.ValueTypeRational:
                case EncoderParameterValueType.ValueTypeLongRange: size = 2 * 4; break;
                case EncoderParameterValueType.ValueTypeUndefined: size = 1; break;
                case EncoderParameterValueType.ValueTypeRationalRange: size = 2 * 2 * 4; break;
                default:
                    throw SafeNativeMethods.Gdip.StatusException(SafeNativeMethods.Gdip.WrongState);
                   //
            }

            int bytes = checked(size * numberValues);

            parameterValue = Marshal.AllocHGlobal(bytes);

            if (parameterValue == IntPtr.Zero)
                throw SafeNativeMethods.Gdip.StatusException(SafeNativeMethods.Gdip.OutOfMemory);

            for (int i = 0; i < bytes; i++)
            {
                Marshal.WriteByte(Add(parameterValue, i), Marshal.ReadByte((IntPtr)(value + i)));
            }

            parameterValueType = type;
            numberOfValues = numberValues;
            parameterGuid = encoder.Guid;
            GC.KeepAlive(this);
        }
 /// <include file='doc\EncoderParameter.uex' path='docs/doc[@for="EncoderParameter.EncoderParameter"]/*' />
 /// <devdoc>
 ///    <para>[To be supplied.]</para>
 /// </devdoc>
 public EncoderParameter(Encoder encoder, byte value)
 {
     parameterGuid = encoder.Guid;
     
     parameterValueType = EncoderParameterValueType.ValueTypeByte;
     numberOfValues = 1;
     parameterValue = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(Byte)));
     
     if (parameterValue == IntPtr.Zero)
         throw SafeNativeMethods.Gdip.StatusException(SafeNativeMethods.Gdip.OutOfMemory);
         
     Marshal.WriteByte(parameterValue, value);
     GC.KeepAlive(this);
 }
         // Consider supporting a 'float' and converting to numerator/denominator                               
         /// <include file='doc\EncoderParameter.uex' path='docs/doc[@for="EncoderParameter.EncoderParameter5"]/*' />
         /// <devdoc>
         ///    <para>[To be supplied.]</para>
         /// </devdoc>
         public EncoderParameter(Encoder encoder, long rangebegin, long rangeend)
         {
             parameterGuid = encoder.Guid;
             
             parameterValueType = EncoderParameterValueType.ValueTypeLongRange;
             numberOfValues = 1;
             int size = Marshal.SizeOf(typeof(Int32));
             parameterValue = Marshal.AllocHGlobal(2*size);
             
             if (parameterValue == IntPtr.Zero)
                 throw SafeNativeMethods.Gdip.StatusException(SafeNativeMethods.Gdip.OutOfMemory);

             Marshal.WriteInt32(parameterValue, unchecked((int)rangebegin));
             Marshal.WriteInt32(Add(parameterValue, size), unchecked((int)rangeend));
             GC.KeepAlive(this);
         }
 /// <include file='doc\EncoderParameter.uex' path='docs/doc[@for="EncoderParameter.EncoderParameter3"]/*' />
 /// <devdoc>
 ///    <para>[To be supplied.]</para>
 /// </devdoc>
 public EncoderParameter(Encoder encoder, long value)
 {
     parameterGuid = encoder.Guid;
     
     parameterValueType = EncoderParameterValueType.ValueTypeLong;
     numberOfValues = 1;
     parameterValue = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(Int32)));
     
     if (parameterValue == IntPtr.Zero)
         throw SafeNativeMethods.Gdip.StatusException(SafeNativeMethods.Gdip.OutOfMemory);
     
     Marshal.WriteInt32(parameterValue, unchecked((int)value));
     GC.KeepAlive(this);
 }
 // Consider supporting a 'float' and converting to numerator/denominator                               
 /// <include file='doc\EncoderParameter.uex' path='docs/doc[@for="EncoderParameter.EncoderParameter6"]/*' />
 /// <devdoc>
 ///    <para>[To be supplied.]</para>
 /// </devdoc>
 public EncoderParameter(Encoder encoder, 
                         int numerator1, int demoninator1,
                         int numerator2, int demoninator2)
 {
     parameterGuid = encoder.Guid;
     
     parameterValueType = EncoderParameterValueType.ValueTypeRationalRange;
     numberOfValues = 1;
     int size = Marshal.SizeOf(typeof(Int32));
     parameterValue = Marshal.AllocHGlobal(4*size);
     
     if (parameterValue == IntPtr.Zero)
         throw SafeNativeMethods.Gdip.StatusException(SafeNativeMethods.Gdip.OutOfMemory);
     
     Marshal.WriteInt32(parameterValue, numerator1);
     Marshal.WriteInt32(Add(parameterValue, size), demoninator1);
     Marshal.WriteInt32(Add(parameterValue, 2*size), numerator2);
     Marshal.WriteInt32(Add(parameterValue, 3*size), demoninator2);
     GC.KeepAlive(this);
 }
  // Consider supporting a 'float' and converting to numerator/denominator                               
  /// <include file='doc\EncoderParameter.uex' path='docs/doc[@for="EncoderParameter.EncoderParameter14"]/*' />
  /// <devdoc>
  ///    <para>[To be supplied.]</para>
  /// </devdoc>
  public EncoderParameter(Encoder encoder, 
                          int[] numerator1, int[] denominator1,
                          int[] numerator2, int[] denominator2)
  {
      parameterGuid = encoder.Guid;
      
      if (numerator1.Length != denominator1.Length ||
          numerator1.Length != denominator2.Length ||
          denominator1.Length != denominator2.Length)
          throw SafeNativeMethods.Gdip.StatusException(SafeNativeMethods.Gdip.InvalidParameter);
      
      parameterValueType = EncoderParameterValueType.ValueTypeRationalRange;
      numberOfValues = numerator1.Length;
      int size = Marshal.SizeOf(typeof(Int32));
      
      parameterValue = Marshal.AllocHGlobal(checked(numberOfValues*4*size));
      
      if (parameterValue == IntPtr.Zero)
          throw SafeNativeMethods.Gdip.StatusException(SafeNativeMethods.Gdip.OutOfMemory);
      
      for (int i=0; i<numberOfValues; i++)
      {
          Marshal.WriteInt32(Add(parameterValue, 4*i*size), numerator1[i]);
          Marshal.WriteInt32(Add(parameterValue, (4*i+1)*size), denominator1[i]);
          Marshal.WriteInt32(Add(parameterValue, (4*i+2)*size), numerator2[i]);
          Marshal.WriteInt32(Add(parameterValue, (4*i+3)*size), denominator2[i]);
      }
      GC.KeepAlive(this);
 }
 /// <include file='doc\EncoderParameter.uex' path='docs/doc[@for="EncoderParameter.EncoderParameter9"]/*' />
 /// <devdoc>
 ///    <para>[To be supplied.]</para>
 /// </devdoc>
 public EncoderParameter(Encoder encoder, byte[] value, bool undefined)
 {
     parameterGuid = encoder.Guid;
     
     if (undefined == true)
         parameterValueType = EncoderParameterValueType.ValueTypeUndefined;
     else               
         parameterValueType = EncoderParameterValueType.ValueTypeByte;
         
     numberOfValues = value.Length;
     parameterValue = Marshal.AllocHGlobal(numberOfValues);
     
     if (parameterValue == IntPtr.Zero)
         throw SafeNativeMethods.Gdip.StatusException(SafeNativeMethods.Gdip.OutOfMemory);
         
     Marshal.Copy(value, 0, parameterValue, numberOfValues);
     GC.KeepAlive(this);
 }
         // Consider supporting a 'float' and converting to numerator/denominator                               
         /// <include file='doc\EncoderParameter.uex' path='docs/doc[@for="EncoderParameter.EncoderParameter12"]/*' />
         /// <devdoc>
         ///    <para>[To be supplied.]</para>
         /// </devdoc>
         public EncoderParameter(Encoder encoder, int[] numerator, int[] denominator)
         {
             parameterGuid = encoder.Guid;
             
             if (numerator.Length != denominator.Length)
                 throw SafeNativeMethods.Gdip.StatusException(SafeNativeMethods.Gdip.InvalidParameter);
                                                                
             parameterValueType = EncoderParameterValueType.ValueTypeRational;
             numberOfValues = numerator.Length;
             int size = Marshal.SizeOf(typeof(Int32));
             
             parameterValue = Marshal.AllocHGlobal(checked(numberOfValues*2*size));
             
             if (parameterValue == IntPtr.Zero)
                 throw SafeNativeMethods.Gdip.StatusException(SafeNativeMethods.Gdip.OutOfMemory);

             for (int i=0; i<numberOfValues; i++)
             {             
                 Marshal.WriteInt32(Add(i*2*size, parameterValue), (int)numerator[i]);
                 Marshal.WriteInt32(Add((i*2+1)*size, parameterValue), (int)denominator[i]);
             }
             GC.KeepAlive(this);
         }
 /// <include file='doc\EncoderParameter.uex' path='docs/doc[@for="EncoderParameter.EncoderParameter10"]/*' />
 /// <devdoc>
 ///    <para>[To be supplied.]</para>
 /// </devdoc>
 public EncoderParameter(Encoder encoder, short[] value)
 {
     parameterGuid = encoder.Guid;
     
     parameterValueType = EncoderParameterValueType.ValueTypeShort;
     numberOfValues = value.Length;
     int size = Marshal.SizeOf(typeof(short));
     
     parameterValue = Marshal.AllocHGlobal(checked(numberOfValues*size));
     
     if (parameterValue == IntPtr.Zero)
         throw SafeNativeMethods.Gdip.StatusException(SafeNativeMethods.Gdip.OutOfMemory);
     
     Marshal.Copy(value, 0, parameterValue, numberOfValues);
     GC.KeepAlive(this);
 }
	public EncoderParameter(Encoder encoder, short value)
			{
				this.encoder = encoder.Guid;
				this.numberOfValues = 1;
				this.type = EncoderParameterValueType.ValueTypeShort;
				this.value = value;
			}
	public EncoderParameter(Encoder encoder, int[] numerator1,
							int[] denominator1, int[] numerator2,
							int[] denominator2)
			{
				this.encoder = encoder.Guid;
				this.numberOfValues = numerator1.Length;
				this.type = EncoderParameterValueType.ValueTypeRationalRange;
				this.value = new Tuple(numerator1, denominator1,
									   numerator2, denominator2);
			}
	public EncoderParameter(Encoder encoder, String value)
			{
				this.encoder = encoder.Guid;
				this.numberOfValues = value.Length + 1;
				this.type = EncoderParameterValueType.ValueTypeAscii;
				this.value = value;
			}
 /// <include file='doc\EncoderParameter.uex' path='docs/doc[@for="EncoderParameter.EncoderParameter11"]/*' />
 /// <devdoc>
 ///    <para>[To be supplied.]</para>
 /// </devdoc>
 public unsafe EncoderParameter(Encoder encoder, long[] value)
 {
     parameterGuid = encoder.Guid;
     
     parameterValueType = EncoderParameterValueType.ValueTypeLong;
     numberOfValues = value.Length;
     int size = Marshal.SizeOf(typeof(Int32));
     
     parameterValue = Marshal.AllocHGlobal(checked(numberOfValues*size));
     
     if (parameterValue == IntPtr.Zero)
         throw SafeNativeMethods.Gdip.StatusException(SafeNativeMethods.Gdip.OutOfMemory);
     
     int* dest = (int*)parameterValue;
     fixed (long* source = value) {
         for (int i=0; i<value.Length; i++) {
             dest[i] = unchecked((int)source[i]);
         }
     }
     GC.KeepAlive(this);
 }
 public EncoderParameter(Encoder encoder, long value)
 {
     this.encoder = encoder;
     this.valuesCount = 1;
     this.type = EncoderParameterValueType.ValueTypeLong;
     this.valuePtr = Marshal.AllocHGlobal(4);
     Marshal.WriteInt32(this.valuePtr, (int)value);
 }
 /// <include file='doc\EncoderParameter.uex' path='docs/doc[@for="EncoderParameter.EncoderParameter7"]/*' />
 /// <devdoc>
 ///    <para>[To be supplied.]</para>
 /// </devdoc>
 public EncoderParameter(Encoder encoder, string value)
 {
     parameterGuid = encoder.Guid;
     
     parameterValueType = EncoderParameterValueType.ValueTypeAscii;
     numberOfValues = value.Length;
     parameterValue = Marshal.StringToHGlobalAnsi(value);
     GC.KeepAlive(this);
     
     if (parameterValue == IntPtr.Zero)
         throw SafeNativeMethods.Gdip.StatusException(SafeNativeMethods.Gdip.OutOfMemory);
 }
	public EncoderParameter(Encoder encoder, long value)
			{
				this.encoder = encoder.Guid;
				this.numberOfValues = 1;
				this.type = EncoderParameterValueType.ValueTypeLong;
				this.value = value;
			}
         // Consider supporting a 'float' and converting to numerator/denominator                               
         /// <include file='doc\EncoderParameter.uex' path='docs/doc[@for="EncoderParameter.EncoderParameter13"]/*' />
         /// <devdoc>
         ///    <para>[To be supplied.]</para>
         /// </devdoc>
         public EncoderParameter(Encoder encoder, long[] rangebegin, long[] rangeend)
         {
             parameterGuid = encoder.Guid;
             
             if (rangebegin.Length != rangeend.Length)
                 throw SafeNativeMethods.Gdip.StatusException(SafeNativeMethods.Gdip.InvalidParameter);
             
             parameterValueType = EncoderParameterValueType.ValueTypeLongRange;
             numberOfValues = rangebegin.Length;
             int size = Marshal.SizeOf(typeof(Int32));
             
             parameterValue = Marshal.AllocHGlobal(checked(numberOfValues*2*size));
             
             if (parameterValue == IntPtr.Zero)
                 throw SafeNativeMethods.Gdip.StatusException(SafeNativeMethods.Gdip.OutOfMemory);

             for (int i=0; i<numberOfValues; i++)
             {
                 Marshal.WriteInt32(Add(i*2*size, parameterValue), unchecked((int)rangebegin[i]));
                 Marshal.WriteInt32(Add((i*2+1)*size, parameterValue), unchecked((int)rangeend[i]));
             }
             GC.KeepAlive(this);
         }
	public EncoderParameter(Encoder encoder, long[] rangebegin,
							long[] rangeend)
			{
				this.encoder = encoder.Guid;
				this.numberOfValues = rangebegin.Length;
				this.type = EncoderParameterValueType.ValueTypeLongRange;
				this.value = new Tuple(rangebegin, rangeend);
			}
	public EncoderParameter(Encoder encoder, int NumberOfValues,
							int Type, int Value)
			{
				this.encoder = encoder.Guid;
				this.numberOfValues = NumberOfValues;
				this.type = (EncoderParameterValueType)Type;
				this.value = Value;
			}
 public EncoderParameter(Encoder encoder, int numerator1, int denominator1, int numerator2, int denominator2)
 {
     this.encoder = encoder;
     this.valuesCount = 1;
     this.type = EncoderParameterValueType.ValueTypeRationalRange;
     this.valuePtr = Marshal.AllocHGlobal(4 * 4);
     int[] valuearray = { numerator1, denominator1, numerator2, denominator2 };
     Marshal.Copy(valuearray, 0, this.valuePtr, 4);
 }
	public EncoderParameter(Encoder encoder, int numerator, int denominator)
			{
				this.encoder = encoder.Guid;
				this.numberOfValues = 1;
				this.type = EncoderParameterValueType.ValueTypeRational;
				this.value = new Tuple(numerator, denominator);
			}
        public EncoderParameter(Encoder encoder, long[] rangebegin, long[] rangeend)
        {
            if (rangebegin.Length != rangeend.Length)
                throw new ArgumentException("Invalid parameter used.");

            this.encoder = encoder;
            this.valuesCount = rangebegin.Length;
            this.type = EncoderParameterValueType.ValueTypeLongRange;

            this.valuePtr = Marshal.AllocHGlobal(4 * valuesCount * 2);
            IntPtr dest = this.valuePtr;
            for (int i = 0; i < valuesCount; i++)
            {
                Marshal.WriteInt32(dest, i * 4, (int)rangebegin[i]);
                Marshal.WriteInt32(dest, (i + 1) * 4, (int)rangeend[i]);
            }
        }
        public EncoderParameter(Encoder encoder, int[] numerator1, int[] denominator1, int[] numerator2, int[] denominator2)
        {
            if (numerator1.Length != denominator1.Length ||
                numerator2.Length != denominator2.Length ||
                numerator1.Length != numerator2.Length)
                throw new ArgumentException("Invalid parameter used.");

            this.encoder = encoder;
            this.valuesCount = numerator1.Length;
            this.type = EncoderParameterValueType.ValueTypeRationalRange;

            this.valuePtr = Marshal.AllocHGlobal(4 * valuesCount * 4);
            IntPtr dest = this.valuePtr;
            for (int i = 0; i < valuesCount; i++)
            {
                Marshal.WriteInt32(dest, i * 4, numerator1[i]);
                Marshal.WriteInt32(dest, (i + 1) * 4, denominator1[i]);
                Marshal.WriteInt32(dest, (i + 2) * 4, numerator2[i]);
                Marshal.WriteInt32(dest, (i + 3) * 4, denominator2[i]);
            }
        }
 public EncoderParameter(Encoder encoder, long rangebegin, long rangeend)
 {
     this.encoder = encoder;
     this.valuesCount = 1;
     this.type = EncoderParameterValueType.ValueTypeLongRange;
     this.valuePtr = Marshal.AllocHGlobal(8);
     int[] valuearray = { (int)rangebegin, (int)rangeend };
     Marshal.Copy(valuearray, 0, this.valuePtr, valuearray.Length);
 }
 public EncoderParameter(Encoder encoder, int numberOfValues, int type, int value)
 {
     this.encoder = encoder;
     this.valuePtr = (IntPtr)value;
     this.valuesCount = numberOfValues;
     this.type = (EncoderParameterValueType)type;
 }