/// <summary> /// Writes the graphics control extension to the stream. /// </summary> /// <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(ImageFrameMetaData metaData, EndianBinaryWriter writer, int transparencyIndex) { var extension = new GifGraphicsControlExtension { DisposalMethod = metaData.DisposalMethod, TransparencyFlag = transparencyIndex > -1, TransparencyIndex = unchecked ((byte)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); var 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(extension.TransparencyIndex); writer.Write(GifConstants.Terminator); }
/// <summary> /// Reads the graphic control extension. /// </summary> private void ReadGraphicalControlExtension() { this.currentStream.Read(this.buffer, 0, 6); byte packed = this.buffer[1]; this.graphicsControlExtension = new GifGraphicsControlExtension { DelayTime = BitConverter.ToInt16(this.buffer, 2), TransparencyIndex = this.buffer[4], TransparencyFlag = (packed & 0x01) == 1, DisposalMethod = (DisposalMethod)((packed & 0x1C) >> 2) }; }
/// <summary> /// Reads the graphic control extension. /// </summary> private void ReadGraphicalControlExtension() { this.currentStream.Read(this.buffer, 0, 6); this.graphicsControlExtension = GifGraphicsControlExtension.Parse(this.buffer); }