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(); }
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; }
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); } }
/// <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; }
/// <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; }
/// <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 }
/// <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(); } }
/// <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); }
/// <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(); } }
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(); }