Example #1
0
        private void WriteGraphicsControlExtension(GraphicsControlExtension extension)
        {
            var data = new byte[4];

            data[0] = (byte)(extension.DisposalMethod << 2 |
                             (extension.UserInputFlag ? 1 : 0) << 1 |
                             (extension.TransparencyFlag ? 1 : 0));
            data[1] = (byte)(extension.DelayTime & 0xFF);
            data[2] = (byte)((extension.DelayTime & 0xFF00) >> 8);
            data[3] = (byte)extension.TransparencyIndex;

            this.WriteExtension(0xF9, data);
        }
Example #2
0
        private void createImage(uint[] colorIndexes, ImageDescriptor imageDescriptor, ColorTable localColorTable)
        {
            uint localX = imageDescriptor.X;
            uint localY = imageDescriptor.Y;
            uint localW = imageDescriptor.Width;
            uint localH = imageDescriptor.Height;

            //Every pixel consists of 4 bytes: R, G, B, A values
            byte[] data = new byte[localW * localH * 4];

            int transparentColorIndex = -1;
            int delay = 0;
            FrameDisposalMethod disposalMethod = FrameDisposalMethod.Clear;

            if (_extensions.Count > 0 && _extensions.Last() is GraphicsControlExtension)
            {
                GraphicsControlExtension gce = _extensions.Last() as GraphicsControlExtension;
                delay = gce.Delay;

                if (gce.HasTransparency)
                {
                    transparentColorIndex = gce.TransparentColorIndex;
                }

                disposalMethod = gce.DisposalMethod;
            }

            for (int i = 0; i < data.Length; i += 4)
            {
                Color color = localColorTable[(int)colorIndexes[i / 4]];
                data[i + 0] = color.R;
                data[i + 1] = color.G;
                data[i + 2] = color.B;

                if (colorIndexes[i / 4] == transparentColorIndex)
                {
                    data[i + 3] = 0;
                }
                else
                {
                    data[i + 3] = byte.MaxValue;
                }
            }

            if (imageDescriptor.Interlaced)
            {
                data = interlace(data, localW, localH);
            }

            _images.Add(new GifImage(data, localX, localY, localW, localH, delay, disposalMethod));
        }