protected void OnParsedDjvuNode(IDjvuNode node) { if (ParsedDjvuNodeEvent != null) { ParsedDjvuNodeEvent(this, new ParsedDjvuNodeEventArgs(node)); } }
public override void WriteData(IDjvuWriter writer, bool writeHeader = true) { if (writer == null) { throw new DjvuArgumentNullException(nameof(writer)); } if (writeHeader) { writer.WriteUTF8String("AT&T"); writer.WriteUTF8String("FORM"); uint length = 0; for (int i = 0; i < Children.Count; i++) { IDjvuNode node = Children[i]; uint tempLength = (uint)node.Length; length += (tempLength + node.OffsetDiff); if (i + 1 < Children.Count) { length += tempLength % 2; } } writer.WriteUInt32BigEndian(length + 4); writer.WriteUTF8String("PM44"); } for (int i = 0; i < Children.Count; i++) { IDjvuNode node = Children[i]; node.WriteData(writer, writeHeader); } }
public void CreateEncodedDjvuNode_Theory(IDjvuWriter writer, IDjvuElement parent, ChunkType chunkType, long length = 0) { if (writer == null) { Mock <IDjvuWriter> writerMock = new Mock <IDjvuWriter>(); writerMock.Setup <long>(x => x.Position).Returns(1024); writer = writerMock.Object; } switch (chunkType) { case ChunkType.Cida: case ChunkType.Unknown: Assert.Throws <DjvuInvalidOperationException>( () => DjvuParser.CreateEncodedDjvuNode(writer, parent, chunkType, length)); break; default: if (ChunkType.Info == chunkType) { length = 10; } IDjvuNode node = DjvuParser.CreateEncodedDjvuNode(writer, parent, chunkType, length); Assert.NotNull(node); Assert.Equal <ChunkType>(chunkType, node.ChunkType); Assert.Equal <long>(length, node.Length); break; } }
public void LastChildTest() { int pageCount = 0; using (DjvuDocument document = Util.GetTestDocument(2, out pageCount)) { Util.VerifyDjvuDocument(pageCount, document); var page = document.Pages[11]; IDjvuElement element = page.PageForm; IDjvuNode lastChild = element.LastChild; Assert.NotNull(lastChild); Assert.IsType <TxtzChunk>(lastChild); } }
public void FirstSiblingTest001() { int pageCount = 0; using (DjvuDocument document = Util.GetTestDocument(2, out pageCount)) { Util.VerifyDjvuDocument(pageCount, document); var page = document.Pages[11]; var firstPage = document.Pages[0]; IDjvuElement element = page.PageForm; IDjvuNode firstSibling = element.FirstSibling; Assert.NotNull(firstSibling); Assert.IsType <DirmChunk>(firstSibling); } }
public void LastSiblingTest001() { int pageCount = 0; using (DjvuDocument document = Util.GetTestDocument(2, out pageCount)) { Util.VerifyDjvuDocument(pageCount, document); var page = document.Pages[11]; var lastPage = document.Pages[document.Pages.Count - 1]; IDjvuElement element = page.PageForm; IDjvuNode lastSibling = element.LastSibling; Assert.NotNull(lastSibling); Assert.Same(lastSibling, lastPage.PageForm); } }
public void ThumChunk_Theory(DjvuJsonDocument doc, int index) { int pageCount = 0; using (DjvuDocument document = DjvuNet.Tests.Util.GetTestDocument(index, out pageCount)) { DjvuNet.Tests.Util.VerifyDjvuDocument(pageCount, document); DjvuNet.Tests.Util.VerifyDjvuDocumentCtor(pageCount, document); if (doc.Data.Thumbnails?.Length > 0) { DjvuJsonDocument.RootChild[] thumbsJson = doc.Data.Thumbnails; var thumbs = document.RootForm.Children.Where((x) => x.ChunkType == ChunkType.Thum).ToArray(); Assert.Equal <int>(thumbsJson.Length, thumbs.Length); for (int i = 0; i < thumbs.Length; i++) { IDjvuNode th = thumbs[i]; IDjvuElement thum = th as IDjvuElement; DjvuJsonDocument.RootChild r = thumbsJson[i]; Assert.Equal <int>(thum.Children.Count, r.Children.Length); //DumpTH44ChunkList(index, thum.Children, i); for (int k = 0; k < thum.Children.Count; k++) { IDjvuNode th44 = thum.Children[k]; Assert.Equal <ChunkType>(ChunkType.TH44, th44.ChunkType); DjvuJsonDocument.Chunk c = r.Children[k]; Assert.Equal <long>(th44.Length, c.Size); } } } else { var thumbs = document.RootForm.Children.Where((x) => x.ChunkType == ChunkType.Thum).ToArray(); Assert.Equal <int>(0, thumbs.Length); } } }
public void CreateDecodedDjvuNode_Theory(IDjvuReader reader, IDjvuDocument rootDocument, IDjvuElement parent, ChunkType chunkType, string chunkID = "", long length = 0) { if (reader == null) { Mock <IDjvuReader> readerMock = new Mock <IDjvuReader>(); readerMock.Setup <long>(x => x.Position).Returns(1024); reader = readerMock.Object; } if (ChunkType.Info == chunkType) { length = 10; } IDjvuNode node = DjvuParser.CreateDecodedDjvuNode(reader, rootDocument, parent, chunkType, chunkID, length); Assert.NotNull(node); Assert.Equal <ChunkType>(chunkType, node.ChunkType); Assert.Equal(chunkID, node.ChunkID); Assert.Equal <long>(length, node.Length); Assert.Equal <long>(reader.Position, node.DataOffset); }
/// <summary> /// Gets all the children items of the given type /// </summary> /// <typeparam name="T"></typeparam> /// <param name="page"></param> /// <returns></returns> internal T[] GetChildrenItems <T>(IDjvuNode page) where T : DjvuNode { // Check if this is a thumbnail if (page is T) { return(new T[] { Unsafe.As <T>(page) }); } // No items if not form if (page is DjvuFormElement == false) { return(new T[0]); } List <T> results = new List <T>(); DjvuFormElement form = Unsafe.As <DjvuFormElement>(page); foreach (IDjvuNode chunk in form.Children) { results.AddRange(GetChildrenItems <T>(chunk)); } return(results.ToArray()); }
public bool RemoveChild(IDjvuNode node) { return(_Children.Remove(node)); }
public bool ContainsChild(IDjvuNode node, IEqualityComparer <IDjvuNode> comparer) { return(_Children.Contains(node, comparer)); }
public bool ContainsChild(IDjvuNode node) { return(_Children.Contains(node)); }
public int AddChild(IDjvuNode node) { _Children.Add(node); return(_Children.Count); }
public ParsedDjvuNodeEventArgs(IDjvuNode node) : base() { Node = node; }
/// <summary> /// Builds the appropriate chunk for the ID /// </summary> /// <returns></returns> public static IDjvuNode CreateDecodedDjvuNode(IDjvuReader reader, IDjvuDocument rootDocument, IDjvuElement parent, ChunkType chunkType, string chunkID = "", long length = 0) { IDjvuNode result = null; switch (chunkType) { case ChunkType.Djvm: result = new DjvmChunk(reader, parent, rootDocument, chunkID, length); break; case ChunkType.Djvu: result = new DjvuChunk(reader, parent, rootDocument, chunkID, length); break; case ChunkType.Djvi: result = new DjviChunk(reader, parent, rootDocument, chunkID, length); break; case ChunkType.Thum: result = new ThumChunk(reader, parent, rootDocument, chunkID, length); break; case ChunkType.Dirm: result = new DirmChunk(reader, parent, rootDocument, chunkID, length); break; case ChunkType.Navm: result = new NavmChunk(reader, parent, rootDocument, chunkID, length); break; case ChunkType.Anta: result = new AntaChunk(reader, parent, rootDocument, chunkID, length); break; case ChunkType.Antz: result = new AntzChunk(reader, parent, rootDocument, chunkID, length); break; case ChunkType.Txta: result = new TxtaChunk(reader, parent, rootDocument, chunkID, length); break; case ChunkType.Txtz: result = new TxtzChunk(reader, parent, rootDocument, chunkID, length); break; case ChunkType.Djbz: result = new DjbzChunk(reader, parent, rootDocument, chunkID, length); break; case ChunkType.Sjbz: result = new SjbzChunk(reader, parent, rootDocument, chunkID, length); break; case ChunkType.FG44: result = new FG44Chunk(reader, parent, rootDocument, chunkID, length); break; case ChunkType.BG44: result = new BG44Chunk(reader, parent, rootDocument, chunkID, length); break; case ChunkType.TH44: result = new TH44Chunk(reader, parent, rootDocument, chunkID, length); break; case ChunkType.BM44: result = new BM44Chunk(reader, parent, rootDocument, chunkID, length); break; case ChunkType.BM44Form: result = new BM44Form(reader, parent, rootDocument, chunkID, length); break; case ChunkType.PM44: result = new PM44Chunk(reader, parent, rootDocument, chunkID, length); break; case ChunkType.PM44Form: result = new PM44Form(reader, parent, rootDocument, chunkID, length); break; case ChunkType.Wmrm: result = new WmrmChunk(reader, parent, rootDocument, chunkID, length); break; case ChunkType.FGbz: result = new FGbzChunk(reader, parent, rootDocument, chunkID, length); break; case ChunkType.Info: result = new InfoChunk(reader, parent, rootDocument, chunkID, length); break; case ChunkType.Incl: result = new InclChunk(reader, parent, rootDocument, chunkID, length); break; case ChunkType.BGjp: result = new BGjpChunk(reader, parent, rootDocument, chunkID, length); break; case ChunkType.FGjp: result = new FGjpChunk(reader, parent, rootDocument, chunkID, length); break; case ChunkType.Smmr: result = new SmmrChunk(reader, parent, rootDocument, chunkID, length); break; case ChunkType.Cida: result = new CidaChunk(reader, parent, rootDocument, chunkID, length); break; default: result = new UnknownChunk(reader, parent, rootDocument, chunkID, length); break; } return(result); }
public int InsertChild(int index, IDjvuNode node) { _Children.Insert(index, node); return(_Children.Count); }
public static IDjvuNode CreateEncodedDjvuNode(IDjvuWriter writer, IDjvuElement parent, ChunkType chunkType, long length) { IDjvuNode result = null; switch (chunkType) { case ChunkType.Djvm: result = new DjvmChunk(writer, parent, length); break; case ChunkType.Djvu: result = new DjvuChunk(writer, parent, length); break; case ChunkType.Djvi: result = new DjviChunk(writer, parent, length); break; case ChunkType.Thum: result = new ThumChunk(writer, parent, length); break; case ChunkType.Dirm: result = new DirmChunk(writer, parent, length); break; case ChunkType.Navm: result = new NavmChunk(writer, parent, length); break; case ChunkType.Anta: result = new AntaChunk(writer, parent, length); break; case ChunkType.Antz: result = new AntzChunk(writer, parent, length); break; case ChunkType.Txta: result = new TxtaChunk(writer, parent, length); break; case ChunkType.Txtz: result = new TxtzChunk(writer, parent, length); break; case ChunkType.Djbz: result = new DjbzChunk(writer, parent, length); break; case ChunkType.Sjbz: result = new SjbzChunk(writer, parent, length); break; case ChunkType.FG44: result = new FG44Chunk(writer, parent, length); break; case ChunkType.BG44: result = new BG44Chunk(writer, parent, length); break; case ChunkType.TH44: result = new TH44Chunk(writer, parent, length); break; case ChunkType.BM44: result = new BM44Chunk(writer, parent, length); break; case ChunkType.BM44Form: result = new BM44Form(writer, parent, length); break; case ChunkType.PM44: result = new PM44Chunk(writer, parent, length); break; case ChunkType.PM44Form: result = new PM44Form(writer, parent, length); break; case ChunkType.Wmrm: result = new WmrmChunk(writer, parent, length); break; case ChunkType.FGbz: result = new FGbzChunk(writer, parent, length); break; case ChunkType.Info: result = new InfoChunk(writer, parent, length); break; case ChunkType.Incl: result = new InclChunk(writer, parent, length); break; case ChunkType.BGjp: result = new BGjpChunk(writer, parent, length); break; case ChunkType.FGjp: result = new FGjpChunk(writer, parent, length); break; case ChunkType.Smmr: result = new SmmrChunk(writer, parent, length); break; default: throw new DjvuInvalidOperationException($"Chunk type is not supported in encoding. ChunkType: {chunkType}"); } return(result); }
public void EncodeImage_Theory(string fileName) { string file = Path.Combine(Util.ArtifactsPath, fileName); string outFile = Path.Combine(Util.ArtifactsDataPath, fileName + ".djvu"); using (System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(file)) { bmp.RotateFlip(System.Drawing.RotateFlipType.Rotate180FlipX); int width = bmp.Width; int height = bmp.Height; IPixelMap pixMap = PixelMapFromBitmap(bmp); var map = new InterWavePixelMapEncoder(); map.InitializeEncoder(pixMap, null, YCrCbMode.Full); const int nchunks = 4; int[] slices = new int[] { 74, 90, 98, 103 }; //float[] decibel = new float[] { 5.0f, 10.0f, 15.0f, 20.0f }; InterWaveEncoderSettings[] settings = new InterWaveEncoderSettings[nchunks]; if (fileName != "") { for (int i = 0; i < nchunks; i++) { settings[i] = new InterWaveEncoderSettings { Slices = slices[i] }; } } //else //{ // for (int i = 0; i < nchunks; i++) // { // settings[i] = new InterWaveEncoderSettings // { // Decibels = decibel[i] // }; // } //} DjvuFormElement form = null; using (MemoryStream stream = new MemoryStream()) using (IDjvuWriter writer = new DjvuWriter(stream)) { form = map.EncodeImage(writer, nchunks, settings); } using (IDjvuWriter writer = new DjvuWriter(outFile)) { form.WriteData(writer); } using (DjvuDocument doc = new DjvuDocument(outFile)) { IDjvuPage page = doc.Pages[0]; PM44Form pageForm = (PM44Form)page.PageForm; if (nchunks != pageForm.Children.Count) { Assert.True(false); } if (nchunks != form.Children.Count) { Assert.True(false); } Assert.IsType <PM44Form>(form); for (int i = 0; i < nchunks; i++) { IDjvuNode c = form.Children[i]; if (c == null) { Assert.True(false); } byte[] chunkDataBuffer = null; if (!(c is PM44Chunk chunk)) { Assert.True(false); }