internal JB2Image ReadCompressedImage() { using (IDjvuReader reader = Reader.CloneReaderToMemory(DataOffset, Length)) { JB2Image image = new JB2Image(); JB2.JB2Dictionary includedDictionary = null; if (Parent is DjvuChunk djvuChunk) { IReadOnlyList <InclChunk> includes = djvuChunk.IncludedItems; if (includes?.Count > 0) { var includeIDs = includes .Where <InclChunk>(x => x.ChunkType == ChunkType.Incl); var root = Document.RootForm as DjvmChunk; DjbzChunk djbzItem = null; foreach (InclChunk iChunk in includeIDs) { DirmComponent component = root?.Dirm.Components .Where <DirmComponent>(x => x.ID == iChunk.IncludeID).FirstOrDefault(); var includeForm = root.Includes .FirstOrDefault <IDjviChunk>(x => x.DataOffset == (component.Offset + 12)); djbzItem = includeForm?.Children .FirstOrDefault(x => x.ChunkType == ChunkType.Djbz) as DjbzChunk; if (djbzItem != null) { break; } } includedDictionary = djbzItem?.ShapeDictionary; } } image.Decode(reader, includedDictionary); return(image); } }
/// <summary> /// Builds the appropriate chunk for the ID /// </summary> /// <returns></returns> public static IFFChunk BuildIFFChunk(DjvuReader reader, DjvuDocument rootDocument, IFFChunk parent, ChunkTypes chunkType) { IFFChunk result = null; if (chunkType == ChunkTypes.Form) { result = new FormChunk(reader, parent, rootDocument); } else if (chunkType == ChunkTypes.Form_Djvm) { result = new DjvmChunk(reader, parent, rootDocument); } else if (chunkType == ChunkTypes.Form_Djvu) { result = new DjvuChunk(reader, parent, rootDocument); } else if (chunkType == ChunkTypes.Form_Djvi) { result = new DjviChunk(reader, parent, rootDocument); } else if (chunkType == ChunkTypes.Form_Thum) { result = new ThumChunk(reader, parent, rootDocument); } else if (chunkType == ChunkTypes.Dirm) { result = new DirmChunk(reader, parent, rootDocument); } else if (chunkType == ChunkTypes.Navm) { result = new NavmChunk(reader, parent, rootDocument); } else if (chunkType == ChunkTypes.Anta) { result = new AntaChunk(reader, parent, rootDocument); } else if (chunkType == ChunkTypes.Antz) { result = new AntzChunk(reader, parent, rootDocument); } else if (chunkType == ChunkTypes.Txta) { result = new TxtaChunk(reader, parent, rootDocument); } else if (chunkType == ChunkTypes.Txtz) { result = new TxtzChunk(reader, parent, rootDocument); } else if (chunkType == ChunkTypes.Djbz) { result = new DjbzChunk(reader, parent, rootDocument); } else if (chunkType == ChunkTypes.Sjbz) { result = new SjbzChunk(reader, parent, rootDocument); } else if (chunkType == ChunkTypes.FG44) { result = new FG44Chunk(reader, parent, rootDocument); } else if (chunkType == ChunkTypes.BG44) { result = new BG44Chunk(reader, parent, rootDocument); } else if (chunkType == ChunkTypes.TH44) { result = new TH44Chunk(reader, parent, rootDocument); } else if (chunkType == ChunkTypes.WMRM) { result = new WmrmChunk(reader, parent, rootDocument); } else if (chunkType == ChunkTypes.FGbz) { result = new FGbzChunk(reader, parent, rootDocument); } else if (chunkType == ChunkTypes.Info) { result = new InfoChunk(reader, parent, rootDocument); } else if (chunkType == ChunkTypes.Incl) { result = new InclChunk(reader, parent, rootDocument); } else if (chunkType == ChunkTypes.BGjp) { result = new BGjpChunk(reader, parent, rootDocument); } else if (chunkType == ChunkTypes.FGjp) { result = new FGjpChunk(reader, parent, rootDocument); } else if (chunkType == ChunkTypes.Smmr) { result = new SmmrChunk(reader, parent, rootDocument); } else { result = new UnknownChunk(reader, parent, rootDocument); } //Console.WriteLine(result); return(result); }