Ejemplo n.º 1
0
        private static byte[] FinalizeBitmap(IcoFrame source, BitmapEncoding encoding, Dialect dialect, ByteWriter writer, uint offsetToData, uint offsetToImageSize)
        {
            var offsetToEndOfData = writer.SeekOffset;

            if (dialect == Dialect.Ico)
            {
                var padding = writer.Data.Count % 4;

                var inferMaskFromAlpha = (source.Encoding.PixelFormat == BitmapEncoding.Pixel_argb32 && encoding != BitmapEncoding.Pixel_argb32);

                for (var y = source.CookedData.Height - 1; y >= 0; y--)
                {
                    var bits = new BitWriter(writer);

                    for (var x = 0; x < source.CookedData.Width; x++)
                    {
                        var mask = inferMaskFromAlpha
                            ? (source.CookedData[x, y].A == 0)
                            : source.Mask[x, y];

                        bits.AddBit1((byte)(mask ? 1 : 0));
                    }

                    while ((writer.Data.Count % 4) != padding)
                    {
                        writer.AddUint8(0);
                    }
                }
            }

            if (dialect != Dialect.Ico)
            {
                writer.SeekOffset = 2;
                writer.AddUint32((uint)writer.Data.Count);

                writer.SeekOffset = 10;
                writer.AddUint32(offsetToData);
            }

            writer.SeekOffset = (int)offsetToImageSize;
            writer.AddUint32((uint)(offsetToEndOfData - offsetToData)); // biSizeImage

            return(writer.Data.ToArray());
        }