public void WriteToStreamTest()
        {
            ReportStart();
            int            blockSize              = 4;
            DisposalMethod disposalMethod         = DisposalMethod.DoNotDispose;
            bool           expectsUserInput       = false;
            bool           hasTransparentColour   = true;
            int            delayTime              = 10;
            int            transparentColourIndex = 6;

            _gce = new GraphicControlExtension(blockSize,
                                               disposalMethod,
                                               expectsUserInput,
                                               hasTransparentColour,
                                               delayTime,
                                               transparentColourIndex);

            MemoryStream s = new MemoryStream();

            _gce.WriteToStream(s);
            s.Seek(0, SeekOrigin.Begin);

            _gce = new GraphicControlExtension(s);

            Assert.AreEqual(ErrorState.Ok, _gce.ConsolidatedState);
            Assert.AreEqual(blockSize, _gce.BlockSize);
            Assert.AreEqual(disposalMethod, _gce.DisposalMethod);
            Assert.AreEqual(expectsUserInput, _gce.ExpectsUserInput);
            Assert.AreEqual(hasTransparentColour, _gce.HasTransparentColour);
            Assert.AreEqual(delayTime, _gce.DelayTime);
            Assert.AreEqual(transparentColourIndex, _gce.TransparentColourIndex);

            ReportEnd();
        }
        public void ConstructorTest()
        {
            ReportStart();
            int            blockSize              = 4;
            DisposalMethod method                 = DisposalMethod.DoNotDispose;
            bool           expectsUserInput       = false;
            bool           hasTransparentColour   = true;
            int            delayTime              = 40;
            int            transparentColourIndex = 22;

            _gce = new GraphicControlExtension(blockSize,
                                               method,
                                               expectsUserInput,
                                               hasTransparentColour,
                                               delayTime,
                                               transparentColourIndex);

            Assert.AreEqual(blockSize, _gce.BlockSize);
            Assert.AreEqual(method, _gce.DisposalMethod);
            Assert.AreEqual(expectsUserInput, _gce.ExpectsUserInput);
            Assert.AreEqual(hasTransparentColour, _gce.HasTransparentColour);
            Assert.AreEqual(delayTime, _gce.DelayTime);
            Assert.AreEqual(transparentColourIndex, _gce.TransparentColourIndex);
            Assert.AreEqual(ErrorState.Ok, _gce.ErrorState);
            ReportEnd();
        }
Ejemplo n.º 3
0
        private void WriteGraphicalControlExtension(ImageBase image, EndianBinaryWriter writer,
                                                    int transparencyIndex)
        {
            // TODO: Check transparency logic.
            bool           hasTransparent         = transparencyIndex > -1;
            DisposalMethod disposalMethod         = hasTransparent ? DisposalMethod.RestoreToBackground : DisposalMethod.Unspecified;
            GifGraphicsControlExtension extension = new GifGraphicsControlExtension()
            {
                DisposalMethod    = disposalMethod,
                TransparencyFlag  = hasTransparent,
                TransparencyIndex = transparencyIndex,
                DelayTime         = image.FrameDelay
            };

            // Reduce the number of writes.
            byte[] intro =
            {
                GifConstants.extensionIntroducer, GifConstants.graphicControlLabel, 4                 // size
            };
            writer.Write(intro);
            PackedField field = new PackedField();

            field.SetBits(3, 3, (int)extension.DisposalMethod);              // 1-3 : Reserved, 4-6 : Disposal

            // TODO: Allow this as an option.
            field.SetBit(6, false);                      // 7 : User input - 0 = none
            field.SetBit(7, extension.TransparencyFlag); // 8: Has transparent.
            writer.Write(field.Byte);
            writer.Write((ushort)extension.DelayTime);
            writer.Write((byte)(extension.TransparencyIndex == -1 ? 255 : extension.TransparencyIndex));
            writer.Write(GifConstants.terminator);
        }
 public GifGraphicsControlExtension()
 {
     _disposalMethod = DisposalMethod.None;
     _delayTime = 0;
     _transparentColourIndex = 0;
     _userInputFlag = false;
     _transparentColorFlag = false;
 }
Ejemplo n.º 5
0
 public GifGraphicsControlExtension(
     DisposalMethod disposalMethod,
     bool transparencyFlag,
     ushort delayTime,
     byte transparencyIndex)
 {
     this.DisposalMethod    = disposalMethod;
     this.TransparencyFlag  = transparencyFlag;
     this.DelayTime         = delayTime;
     this.TransparencyIndex = transparencyIndex;
 }
        private void ConstructorStreamTest(bool xmlDebugging)
        {
            int            blockSize              = 4;
            DisposalMethod method                 = DisposalMethod.DoNotDispose;
            bool           expectsUserInput       = false;
            bool           hasTransparentColour   = true;
            int            delayTime              = 40;
            int            transparentColourIndex = 22;

            MemoryStream s = new MemoryStream();

            s.WriteByte((byte)blockSize);

            // Packed fields:
            //	bits 1-3 = reserved
            //	bits 4-6 = disposal method
            //	bit 7 = user input flag
            //	bit 8 = transparent flag
            byte packedFields = (byte)
                                (
                ((int)method & 7) << 2
                    | (expectsUserInput ? 1 : 0) << 1
                    | (hasTransparentColour ? 1 : 0)
                                );

            s.WriteByte(packedFields);

            // Write delay time, least significant byte first
            s.WriteByte((byte)(delayTime & 0xff));
            s.WriteByte((byte)((delayTime & 0xff00) >> 8));

            s.WriteByte((byte)transparentColourIndex);

            s.WriteByte(0);               // block terminator

            s.Seek(0, SeekOrigin.Begin);

            _gce = new GraphicControlExtension(s, xmlDebugging);

            Assert.AreEqual(blockSize, _gce.BlockSize);
            Assert.AreEqual(method, _gce.DisposalMethod);
            Assert.AreEqual(expectsUserInput, _gce.ExpectsUserInput);
            Assert.AreEqual(hasTransparentColour, _gce.HasTransparentColour);
            Assert.AreEqual(delayTime, _gce.DelayTime);
            Assert.AreEqual(transparentColourIndex, _gce.TransparentColourIndex);
            Assert.AreEqual(ErrorState.Ok, _gce.ConsolidatedState);

            if (xmlDebugging)
            {
                Assert.AreEqual(ExpectedDebugXml, _gce.DebugXml);
            }
        }
Ejemplo n.º 7
0
		/// <summary>
		/// Constructor.
		/// </summary>
		/// <param name="blockSize">
		/// Sets the <see cref="BlockSize"/>.
		/// </param>
		/// <param name="disposalMethod">
		/// Sets the <see cref="DisposalMethod"/>.
		/// </param>
		/// <param name="expectsUserInput">
		/// Sets the <see cref="ExpectsUserInput"/> flag.
		/// </param>
		/// <param name="hasTransparentColour">
		/// Sets the <see cref="HasTransparentColour"/> flag.
		/// </param>
		/// <param name="delayTime">
		/// Sets the <see cref="DelayTime"/>.
		/// </param>
		/// <param name="transparentColourIndex">
		/// Sets the <see cref="TransparentColourIndex"/>.
		/// </param>
		public GraphicControlExtension( int blockSize, 
		                                DisposalMethod disposalMethod, 
		                                bool expectsUserInput, 
		                                bool hasTransparentColour, 
		                                int delayTime, 
		                                int transparentColourIndex )
		{
			_blockSize = blockSize;
			_disposalMethod = disposalMethod;
			_expectsUserInput = expectsUserInput;
			_hasTransparentColour = hasTransparentColour;
			_delayTime = delayTime;
			_transparentColourIndex = transparentColourIndex;
		}
Ejemplo n.º 8
0
 /// <summary>
 /// Constructor.
 /// </summary>
 /// <param name="blockSize">
 /// Sets the <see cref="BlockSize"/>.
 /// </param>
 /// <param name="disposalMethod">
 /// Sets the <see cref="DisposalMethod"/>.
 /// </param>
 /// <param name="expectsUserInput">
 /// Sets the <see cref="ExpectsUserInput"/> flag.
 /// </param>
 /// <param name="hasTransparentColour">
 /// Sets the <see cref="HasTransparentColour"/> flag.
 /// </param>
 /// <param name="delayTime">
 /// Sets the <see cref="DelayTime"/>.
 /// </param>
 /// <param name="transparentColourIndex">
 /// Sets the <see cref="TransparentColourIndex"/>.
 /// </param>
 public GraphicControlExtension(int blockSize,
                                DisposalMethod disposalMethod,
                                bool expectsUserInput,
                                bool hasTransparentColour,
                                int delayTime,
                                int transparentColourIndex)
 {
     _blockSize              = blockSize;
     _disposalMethod         = disposalMethod;
     _expectsUserInput       = expectsUserInput;
     _hasTransparentColour   = hasTransparentColour;
     _delayTime              = delayTime;
     _transparentColourIndex = transparentColourIndex;
 }
Ejemplo n.º 9
0
        /// <summary>
        /// Constructor.
        /// </summary>
        /// <param name="inputStream">
        /// The input stream to read.
        /// </param>
        public GraphicControlExtension(Stream inputStream)
        {
            _blockSize = Read(inputStream);               // block size

            PackedFields packed = new PackedFields(Read(inputStream));

            _disposalMethod       = (DisposalMethod)packed.GetBits(3, 3);
            _expectsUserInput     = packed.GetBit(6);
            _hasTransparentColour = packed.GetBit(7);

            if (_disposalMethod == 0)
            {
                _disposalMethod = DisposalMethod.DoNotDispose;                 // elect to keep old image if discretionary
            }

            _delayTime = ReadShort(inputStream);         // delay in hundredths of a second
            _transparentColourIndex = Read(inputStream); // transparent color index
            Read(inputStream);                           // block terminator
        }
Ejemplo n.º 10
0
        /// <summary>
        /// Constructor.
        /// </summary>
        /// <param name="inputStream">
        /// The input stream to read.
        /// </param>
        /// <param name="xmlDebugging">Whether or not to create debug XML</param>
        public GraphicControlExtension(Stream inputStream, bool xmlDebugging)
            : base(xmlDebugging)
        {
            _blockSize = Read(inputStream); // block size

            PackedFields packed = new PackedFields(Read(inputStream));

            _disposalMethod       = (DisposalMethod)packed.GetBits(3, 3);
            _expectsUserInput     = packed.GetBit(6);
            _hasTransparentColour = packed.GetBit(7);

            if (_disposalMethod == 0)
            {
                _disposalMethod = DisposalMethod.DoNotDispose; // elect to keep old image if discretionary
            }

            _delayTime = ReadShort(inputStream);         // delay in hundredths of a second
            _transparentColourIndex = Read(inputStream); // transparent color index
            int blockTerminator = Read(inputStream);     // block terminator

            if (xmlDebugging)
            {
                WriteDebugXmlElement("BlockSize", _blockSize);

                WriteDebugXmlStartElement("PackedFields");
                WriteDebugXmlAttribute("ByteRead", ToHex(packed.Byte));
                WriteDebugXmlAttribute("DisposalMethod",
                                       _disposalMethod.ToString());
                WriteDebugXmlAttribute("ExpectsUserInput", _expectsUserInput);
                WriteDebugXmlAttribute("HasTransparentColour", _hasTransparentColour);
                WriteDebugXmlEndElement();

                WriteDebugXmlElement("DelayTime", _delayTime);
                WriteDebugXmlElement("TransparentColourIndex",
                                     _transparentColourIndex);
                WriteDebugXmlElement("BlockTerminator", blockTerminator);

                WriteDebugXmlFinish();
            }
        }
Ejemplo n.º 11
0
        /// <summary>
        /// Writes the graphics control extension to the stream.
        /// </summary>
        /// <typeparam name="TPixel">The pixel format.</typeparam>
        /// <param name="image">The <see cref="ImageBase{TPixel}"/> to encode.</param>
        /// <param name="metaData">The metadata of the image or frame.</param>
        /// <param name="writer">The stream to write to.</param>
        /// <param name="transparencyIndex">The index of the color in the color palette to make transparent.</param>
        private void WriteGraphicalControlExtension <TPixel>(ImageBase <TPixel> image, IMetaData metaData, EndianBinaryWriter writer, int transparencyIndex)
            where TPixel : struct, IPixel <TPixel>
        {
            // TODO: Check transparency logic.
            bool           hasTransparent = transparencyIndex < 255;
            DisposalMethod disposalMethod = hasTransparent
                ? DisposalMethod.RestoreToBackground
                : DisposalMethod.Unspecified;

            GifGraphicsControlExtension extension = new GifGraphicsControlExtension()
            {
                DisposalMethod    = disposalMethod,
                TransparencyFlag  = hasTransparent,
                TransparencyIndex = transparencyIndex,
                DelayTime         = metaData.FrameDelay
            };

            // Write the intro.
            this.buffer[0] = GifConstants.ExtensionIntroducer;
            this.buffer[1] = GifConstants.GraphicControlLabel;
            this.buffer[2] = 4;
            writer.Write(this.buffer, 0, 3);

            PackedField field = default(PackedField);

            field.SetBits(3, 3, (int)extension.DisposalMethod); // 1-3 : Reserved, 4-6 : Disposal

            // TODO: Allow this as an option.
            field.SetBit(6, false);                      // 7 : User input - 0 = none
            field.SetBit(7, extension.TransparencyFlag); // 8: Has transparent.

            writer.Write(field.Byte);
            writer.Write((ushort)extension.DelayTime);
            writer.Write((byte)extension.TransparencyIndex);
            writer.Write(GifConstants.Terminator);
        }
Ejemplo n.º 12
0
		/// <summary>
		/// Constructor.
		/// </summary>
		/// <param name="inputStream">
		/// The input stream to read.
		/// </param>
		/// <param name="xmlDebugging">Whether or not to create debug XML</param>
		public GraphicControlExtension( Stream inputStream, bool xmlDebugging )
			: base( xmlDebugging )
		{
			_blockSize = Read( inputStream ); // block size
			
			PackedFields packed = new PackedFields( Read( inputStream ) );
			_disposalMethod = (DisposalMethod) packed.GetBits( 3, 3 );
			_expectsUserInput = packed.GetBit( 6 );
			_hasTransparentColour = packed.GetBit( 7 );

			if( _disposalMethod == 0 )
			{
				_disposalMethod = DisposalMethod.DoNotDispose; // elect to keep old image if discretionary
			}
			
			_delayTime = ReadShort( inputStream ); // delay in hundredths of a second
			_transparentColourIndex = Read( inputStream ); // transparent color index
			int blockTerminator = Read( inputStream ); // block terminator
			
			if( xmlDebugging )
			{
				WriteDebugXmlElement( "BlockSize", _blockSize );
				
				WriteDebugXmlStartElement( "PackedFields" );
				WriteDebugXmlAttribute( "ByteRead", ToHex( packed.Byte ) );
				WriteDebugXmlAttribute( "DisposalMethod", 
				                        _disposalMethod.ToString() );
				WriteDebugXmlAttribute( "ExpectsUserInput", _expectsUserInput );
				WriteDebugXmlAttribute( "HasTransparentColour", _hasTransparentColour );
				WriteDebugXmlEndElement();
				
				WriteDebugXmlElement( "DelayTime", _delayTime );
				WriteDebugXmlElement( "TransparentColourIndex", 
				                      _transparentColourIndex );
				WriteDebugXmlElement( "BlockTerminator", blockTerminator );
				
				WriteDebugXmlFinish();
			}
		}
Ejemplo n.º 13
0
 public GifFrame(Texture2D texture, float delay, DisposalMethod disposalMethod = DisposalMethod.RestoreToBackgroundColor)
 {
     Texture        = texture;
     Delay          = delay;
     DisposalMethod = disposalMethod;
 }
        internal void ReadFromFile(BinaryReader reader)
        {
            byte blockSize = reader.ReadByte();

            if (blockSize != 4) throw new FormatException("A graphics control extension block has an incorrect length; the GIF is corrupt.");

            byte flags = reader.ReadByte();

            _disposalMethod = (DisposalMethod)((flags & 0x1c) >> 2);
            _userInputFlag = (flags & 0x02) != 0;
            _transparentColorFlag = (flags & 0x01) != 0;

            _delayTime = reader.ReadUInt16();
            _transparentColourIndex = reader.ReadByte();
        }