} // 'Enti' public override ImageMetaData ReadMetaData(IBinaryStream stream) { var header = stream.ReadHeader(0x40); if (0x03000100 != header.ToUInt32(8)) { return(null); } if (!header.AsciiEqual(0x10, "Entis Rasterized Image") && !header.AsciiEqual(0x10, "Moving Entis Image")) { return(null); } using (var reader = new EriFile(stream.AsStream)) { var section = reader.ReadSection(); if (section.Id != "Header " || section.Length <= 0) { return(null); } int header_size = (int)section.Length; int stream_pos = 0x50 + header_size; EriFileHeader file_header = null; EriMetaData info = null; string desc = null; while (header_size > 0x10) { section = reader.ReadSection(); header_size -= 0x10; if (section.Length <= 0 || section.Length > header_size) { break; } if ("FileHdr " == section.Id) { file_header = new EriFileHeader { Version = reader.ReadInt32() }; if (file_header.Version > 0x00020100) { throw new InvalidFormatException("Invalid ERI file version"); } file_header.ContainedFlag = reader.ReadInt32(); file_header.KeyFrameCount = reader.ReadInt32(); file_header.FrameCount = reader.ReadInt32(); file_header.AllFrameTime = reader.ReadInt32(); } else if ("ImageInf" == section.Id) { int version = reader.ReadInt32(); if (version != 0x00020100 && version != 0x00020200) { return(null); } info = new EriMetaData { StreamPos = stream_pos, Version = version }; info.Transformation = (CvType)reader.ReadInt32(); info.Architecture = (EriCode)reader.ReadInt32(); info.FormatType = (EriType)reader.ReadInt32(); int w = reader.ReadInt32(); int h = reader.ReadInt32(); info.Width = (uint)Math.Abs(w); info.Height = (uint)Math.Abs(h); info.VerticalFlip = h < 0; info.BPP = reader.ReadInt32(); info.ClippedPixel = reader.ReadInt32(); info.SamplingFlags = (EriSampling)reader.ReadInt32(); info.QuantumizedBits = reader.ReadUInt64(); info.AllottedBits = reader.ReadUInt64(); info.BlockingDegree = reader.ReadInt32(); info.LappedBlock = reader.ReadInt32(); info.FrameTransform = reader.ReadInt32(); info.FrameDegree = reader.ReadInt32(); } else if ("descript" == section.Id) { if (0xFEFF == reader.PeekChar()) { reader.Read(); var desc_chars = reader.ReadChars((int)section.Length / 2 - 1); desc = new string (desc_chars); } else { var desc_chars = reader.ReadBytes((int)section.Length); desc = Encoding.UTF8.GetString(desc_chars); } } else { reader.BaseStream.Seek(section.Length, SeekOrigin.Current); } header_size -= (int)section.Length; } if (info != null) { if (file_header != null) { info.Header = file_header; } if (desc != null) { info.Description = desc; } } return(info); } }
public override ImageMetaData ReadMetaData(Stream stream) { byte[] header = new byte[0x40]; if (header.Length != stream.Read (header, 0, header.Length)) return null; if (0x03000100 != LittleEndian.ToUInt32 (header, 8)) return null; if (!Binary.AsciiEqual (header, 0x10, "Entis Rasterized Image") && !Binary.AsciiEqual (header, 0x10, "Moving Entis Image")) return null; using (var reader = new EriFile (stream)) { var section = reader.ReadSection(); if (section.Id != "Header " || section.Length <= 0) return null; int header_size = (int)section.Length; int stream_pos = 0x50 + header_size; EriFileHeader file_header = null; EriMetaData info = null; string desc = null; while (header_size > 0x10) { section = reader.ReadSection(); header_size -= 0x10; if (section.Length <= 0 || section.Length > header_size) break; if ("FileHdr " == section.Id) { file_header = new EriFileHeader { Version = reader.ReadInt32() }; if (file_header.Version > 0x00020100) throw new InvalidFormatException ("Invalid ERI file version"); file_header.ContainedFlag = reader.ReadInt32(); file_header.KeyFrameCount = reader.ReadInt32(); file_header.FrameCount = reader.ReadInt32(); file_header.AllFrameTime = reader.ReadInt32(); } else if ("ImageInf" == section.Id) { int version = reader.ReadInt32(); if (version != 0x00020100 && version != 0x00020200) return null; info = new EriMetaData { StreamPos = stream_pos, Version = version }; info.Transformation = (CvType)reader.ReadInt32(); info.Architecture = (EriCode)reader.ReadInt32(); info.FormatType = (EriType)reader.ReadInt32(); int w = reader.ReadInt32(); int h = reader.ReadInt32(); info.Width = (uint)Math.Abs (w); info.Height = (uint)Math.Abs (h); info.VerticalFlip = h < 0; info.BPP = reader.ReadInt32(); info.ClippedPixel = reader.ReadInt32(); info.SamplingFlags = (EriSampling)reader.ReadInt32(); info.QuantumizedBits = reader.ReadUInt64(); info.AllottedBits = reader.ReadUInt64(); info.BlockingDegree = reader.ReadInt32(); info.LappedBlock = reader.ReadInt32(); info.FrameTransform = reader.ReadInt32(); info.FrameDegree = reader.ReadInt32(); } else if ("descript" == section.Id) { if (0xFEFF == reader.PeekChar()) { reader.Read(); var desc_chars = reader.ReadChars ((int)section.Length/2 - 1); desc = new string (desc_chars); } else { var desc_chars = reader.ReadBytes ((int)section.Length); desc = Encoding.UTF8.GetString (desc_chars); } } else { reader.BaseStream.Seek (section.Length, SeekOrigin.Current); } header_size -= (int)section.Length; } if (info != null) { if (file_header != null) info.Header = file_header; if (desc != null) info.Description = desc; } return info; } }