Пример #1
0
        public static FlicChunk Load(ISerializer s, int width, int height)
        {
            if (s == null)
            {
                throw new ArgumentNullException(nameof(s));
            }

            var  chunkSizeOffset = s.Offset;
            uint chunkSize       = s.UInt32(null, 0);

            if ((chunkSize & 0x1) != 0)
            {
                chunkSize++;
            }
            FlicChunkType type = (FlicChunkType)s.UInt16(null, 0);

            // Chunk
            FlicChunk c = type switch
            {
                FlicChunkType.Palette8Bit => new Palette8Chunk(),
                FlicChunkType.DeltaWordOrientedRle => new DeltaFlcChunk(),
                FlicChunkType.FullByteOrientedRle => new FullByteOrientedRleChunk(width, height),
                FlicChunkType.FullUncompressed => new CopyChunk(),
                FlicChunkType.Frame => new FlicFrame(width, height),
                // FlicChunkType.Palette6Bit          => new Palette6Chunk(),
                // FlicChunkType.DeltaByteOrientedRle => new DeltaFliChunk(),
                // FlicChunkType.BlackFrameData       => new BlackFrameChunk(),
                // FlicChunkType.Thumbnail            => new ThumbnailChunk(),
                _ => new UnknownChunk(type)
            };

            // Fix export issue in Autodesk Animator
            if (type == FlicChunkType.FullUncompressed &&
                width * height + ChunkHeaderSize - 2 == chunkSize)
            {
                chunkSize += 2;
            }

            chunkSize = c.LoadChunk(chunkSize - ChunkHeaderSize, s) + ChunkHeaderSize;

            var actualChunkSize = s.Offset - chunkSizeOffset;

            if (actualChunkSize - chunkSize < 4) // pad
            {
                for (long i = chunkSize - actualChunkSize; i != 0; i--)
                {
                    s.UInt8(null, 0);
                }

                actualChunkSize = s.Offset - chunkSizeOffset;
            }

            ApiUtil.Assert(actualChunkSize == chunkSize);
            return(c);
        }
    }
Пример #2
0
        public static FlicChunk Load(BinaryReader br, int width, int height)
        {
            var  chunkSizeOffset = br.BaseStream.Position;
            uint chunkSize       = br.ReadUInt32();

            if ((chunkSize & 0x1) != 0)
            {
                chunkSize++;
            }
            FlicChunkType type = (FlicChunkType)br.ReadUInt16();

            // Chunk
            FlicChunk c = type switch
            {
                FlicChunkType.Palette8Bit => new Palette8Chunk(),
                FlicChunkType.DeltaWordOrientedRle => new DeltaFlcChunk(),
                FlicChunkType.FullByteOrientedRle => new FullByteOrientedRleChunk(width, height),
                FlicChunkType.FullUncompressed => new CopyChunk(),
                FlicChunkType.Frame => new FlicFrame(width, height),
                // FlicChunkType.Palette6Bit          => new Palette6Chunk(),
                // FlicChunkType.DeltaByteOrientedRle => new DeltaFliChunk(),
                // FlicChunkType.BlackFrameData       => new BlackFrameChunk(),
                // FlicChunkType.Thumbnail            => new ThumbnailChunk(),
                _ => new UnknownChunk(type)
            };

            // Fix export issue in Autodesk Animator
            if (type == FlicChunkType.FullUncompressed &&
                width * height + ChunkHeaderSize - 2 == chunkSize)
            {
                chunkSize += 2;
            }

            chunkSize = c.LoadChunk(chunkSize - ChunkHeaderSize, br) + ChunkHeaderSize;

            var actualChunkSize = br.BaseStream.Position - chunkSizeOffset;

            if (actualChunkSize - chunkSize < 4) // pad
            {
                for (long i = chunkSize - actualChunkSize; i != 0; i--)
                {
                    br.ReadByte();
                }

                actualChunkSize = br.BaseStream.Position - chunkSizeOffset;
            }

            ApiUtil.Assert(actualChunkSize == chunkSize);
            return(c);
        }
    }