/* Parse FUJI information */ /* It is a simpler form of Tiff IFD, so we add them as TiffEntries */ void ParseFuji(uint offset) { try { IFD tempIFD = new IFD(ifd.endian, ifd.Depth); ImageBinaryReaderBigEndian bytes = new ImageBinaryReaderBigEndian(stream, offset); uint entries = bytes.ReadUInt32(); if (entries > 255) { throw new RawDecoderException("Too many entries"); } for (int i = 0; i < entries; i++) { UInt16 tag = bytes.ReadUInt16(); uint length = bytes.ReadUInt16(); Tag t; // Set types of known tags switch (tag) { case 0x100: case 0x121: case 0x2ff0: t = new Tag((TagType)tag, TiffDataType.SHORT, length / 2); for (int k = 0; k < t.dataCount; k++) { t.data[k] = bytes.ReadUInt16(); } break; case 0xc000: // This entry seem to have swapped endianness: t = new Tag((TagType)tag, TiffDataType.LONG, length / 4); for (int k = 0; k < t.dataCount; k++) { t.data[k] = bytes.ReadUInt32(); } break; default: t = new Tag((TagType)tag, TiffDataType.UNDEFINED, length); for (int k = 0; k < t.dataCount; k++) { t.data[k] = bytes.ReadByte(); } break; } tempIFD.tags.Add(t.TagId, t); //bytes.ReadBytes((int)length); } ifd.subIFD.Add(tempIFD); } catch (IOException) { throw new RawDecoderException("IO error occurred during parsing. Skipping the rest"); } }