/// <summary> /// Reads range from IFF stream. /// </summary> public ColorRange(IFFReader reader) : this() { pad1 = reader.ReadInt16(); Rate = reader.ReadInt16(); Flags = (ColorRangeFlags)reader.ReadInt16(); Low = reader.ReadByte(); High = reader.ReadByte(); }
/// <param name="stream"> /// Stream containing ILBM image data. /// </param> public ILBMImage(Stream stream) { //BinaryReader reader = new BinaryReader(stream, Encoding.ASCII); //ReadNext(reader); IFFReader reader = new IFFReader(stream); var file = reader.ReadFileHeader(); if (file.FormatID != "PBM ") { throw new NotSupportedException("This is not supported IBLM file."); } foreach (IFFChunk chunk in reader.ReadAll()) { switch (chunk.TypeID) { case "BMHD": Width = reader.ReadInt16(); Height = reader.ReadInt16(); PosX = reader.ReadInt16(); PosY = reader.ReadInt16(); NumPlanes = reader.ReadByte(); Mask = reader.ReadByte(); Compression = reader.ReadByte(); Padding = reader.ReadByte(); Transparent = reader.ReadInt16(); AspectRatio = reader.ReadInt16(); PageWidth = reader.ReadInt16(); PageHeight = reader.ReadInt16(); break; case "CMAP": Color[] pal = new Color[chunk.Length / 3]; for (int i = 0; i < pal.Length; i++) { byte R = reader.ReadByte(); byte G = reader.ReadByte(); byte B = reader.ReadByte(); pal[i] = Color.FromArgb(R, G, B); } Palette = ImagePalette.Create(pal); break; case "GRAB": HotspotX = reader.ReadInt16(); HotspotY = reader.ReadInt16(); break; case "CRNG": if (ColorRanges == null) { ColorRanges = new List <ColorRange>(); } ColorRanges.Add(new ColorRange(reader)); break; case "TINY": short width = reader.ReadInt16(); short height = reader.ReadInt16(); byte[] tiny; if (Compression == 1) { tiny = reader.ReadUnpack(chunk.Length - 4); } else { tiny = reader.ReadBytes(chunk.Length - 4); } Tiny = new TinyImage(width, height, tiny); break; case "BODY": if (Compression == 1) { ImageData = reader.ReadUnpack(chunk.Length); } else { ImageData = reader.ReadBytes(chunk.Length); } break; } } }