Example #1
0
        /* The IntPtr passed in here is a blob returned from
         * GdipImageGetEncoderParameterList.  Its internal pointers
         * (i.e. the Value pointers in the EncoderParameter entries)
         * point to areas within this block of memeory; this means
         * that we need to free it as a whole, and also means that
         * we can't Marshal.PtrToStruct our way to victory.
         */
        internal static EncoderParameters FromNativePtr(IntPtr epPtr)
        {
            if (epPtr == IntPtr.Zero)
            {
                return(null);
            }

            IntPtr ptr = epPtr;

            int count = Marshal.ReadInt32(ptr);

            ptr = (IntPtr)(ptr.ToInt64() + 4);

            if (count == 0)
            {
                return(null);
            }

            EncoderParameters result = new EncoderParameters(count);

            for (int i = 0; i < count; i++)
            {
                result.parameters[i] = EncoderParameter.FromNativePtr(ptr);
                ptr = (IntPtr)(ptr.ToInt64() + EncoderParameter.NativeSize());
            }

            return(result);
        }
Example #2
0
        internal IntPtr ToNativePtr()
        {
            IntPtr result;
            IntPtr ptr;

            // 4 is the initial int32 "count" value
            result = Marshal.AllocHGlobal(4 + parameters.Length * EncoderParameter.NativeSize());

            ptr = result;
            Marshal.WriteInt32(ptr, parameters.Length);

            ptr = (IntPtr)(ptr.ToInt64() + 4);
            for (int i = 0; i < parameters.Length; i++)
            {
                parameters[i].ToNativePtr(ptr);
                ptr = (IntPtr)(ptr.ToInt64() + EncoderParameter.NativeSize());
            }

            return(result);
        }