Beispiel #1
0
        public void InclChunk_Theory(string file, DjvuJsonDocument doc)
        {
            byte[] buffer = null;
            using (FileStream fs = new FileStream(file, FileMode.Open, FileAccess.Read, FileShare.Read))
            {
                buffer = new byte[fs.Length];
                int result = fs.Read(buffer, 0, buffer.Length);
                Assert.Equal <long>(fs.Length, result);
            }
            Mock <IDjvuDocument> docMock    = new Mock <IDjvuDocument>();
            Mock <IDjvuElement>  parentMock = new Mock <IDjvuElement>();
            IDjvuElement         parent     = parentMock.Object;
            IDjvuDocument        document   = docMock.Object;

            using (MemoryStream ms = new MemoryStream(buffer, false))
                using (IDjvuReader reader = new DjvuReader(ms))
                {
                    InclChunk chunk = new InclChunk(reader, parent, document, "INCL", buffer.Length);
                    Assert.False(chunk.IsInitialized);
                    // Support multiple INCL chunks in single DjvuChunk
                    var testChunk = doc.Data.Pages[0].Children
                                    .Where(x => x.ID == "INCL" && x.Name == chunk.IncludeID)
                                    .FirstOrDefault <DjvuJsonDocument.Chunk>();
                    Assert.NotNull(testChunk);
                    Assert.Equal(testChunk.Name, chunk.IncludeID);
                }
        }
Beispiel #2
0
        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;
            }
        }
Beispiel #3
0
        public void Palette_Theory(string file, DjvuJsonDocument doc)
        {
            byte[] buffer = null;
            using (FileStream fs = new FileStream(file, FileMode.Open, FileAccess.Read, FileShare.Read))
            {
                buffer = new byte[fs.Length];
                int result = fs.Read(buffer, 0, buffer.Length);
                Assert.Equal <long>(fs.Length, result);
            }
            Mock <IDjvuDocument> docMock    = new Mock <IDjvuDocument>();
            Mock <IDjvuElement>  parentMock = new Mock <IDjvuElement>();
            IDjvuElement         parent     = parentMock.Object;
            IDjvuDocument        document   = docMock.Object;

            using (MemoryStream ms = new MemoryStream(buffer, false))
                using (IDjvuReader reader = new DjvuReader(ms))
                {
                    FGbzChunk chunk = new FGbzChunk(reader, parent, document, "FGBZ", buffer.Length);
                    Assert.False(chunk.IsInitialized);
                    var testChunk = doc.Data.Pages[0].Children
                                    .Where(x => x.ID == "FGbz")
                                    .FirstOrDefault <DjvuJsonDocument.Chunk>();
                    Assert.Equal <int>((int)testChunk?.Version.Value, chunk.Version);
                    Assert.Equal <int>((int)testChunk.Colors.Value, (int)chunk.Palette?.PaletteColors?.Length);
                }
        }
Beispiel #4
0
 protected void OnParsedDjvuElement(IDjvuElement element)
 {
     if (ParsedDjvuElementEvent != null)
     {
         ParsedDjvuElementEvent(this, new ParsedDjvuElementEventArgs(element));
     }
 }
Beispiel #5
0
 /// <summary>
 /// IFFChunk constructor
 /// </summary>
 /// <param name="reader"></param>
 /// <param name="parent"></param>
 /// <param name="document"></param>
 /// <param name="chunkID"></param>
 /// <param name="length"></param>
 public DjvuNode(IDjvuReader reader, IDjvuElement parent, IDjvuDocument document,
                 string chunkID = "", long length = 0)
 {
     Reader     = reader;
     Parent     = parent;
     Document   = document;
     Length     = length;
     ChunkID    = chunkID;
     DataOffset = reader.Position;
 }
Beispiel #6
0
        public static DjvuFormElement GetRootForm(IDjvuReader reader, IDjvuElement parent, IDjvuDocument document)
        {
            string formStr = reader.ReadUTF8String(4);
            // use of uint in Djvu Format limits file read size to 4 GB - should be long (int64)
            int    length   = (int)reader.ReadUInt32BigEndian();
            string formType = reader.ReadUTF8String(4);

            reader.Position -= 4;

            ChunkType type = DjvuParser.GetFormType(formType);

            DjvuFormElement formObj = (DjvuFormElement)DjvuParser.CreateDecodedDjvuNode(reader, document, parent, type, formType, length);

            return(formObj);
        }
Beispiel #7
0
        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);
            }
        }
Beispiel #8
0
        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);
            }
        }
Beispiel #9
0
        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);
            }
        }
Beispiel #10
0
        public void ToStringTest()
        {
            IDjvuReader        reader     = null;
            Mock <IDjvuReader> readerMock = new Mock <IDjvuReader>();

            readerMock.Setup <long>(x => x.Position).Returns(1024);
            reader = readerMock.Object;

            IDjvuElement element = (IDjvuElement)DjvuParser.CreateDecodedDjvuNode(reader, null, null, ChunkType.Djvi, "DJVI", 127);
            string       result  = element.ToString();

            Assert.False(String.IsNullOrWhiteSpace(result));
            Assert.Contains("ID: DJVI", result);
            Assert.Contains("Name: Djvi", result);
            Assert.Contains("Length: 127", result);
            Assert.Contains("Offset: 1024", result);
            Assert.Contains("Children: 0", result);
        }
Beispiel #11
0
        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);
                }
            }
        }
Beispiel #12
0
        public void ImageTest()
        {
            Mock <IDjvuReader> readerMock = new Mock <IDjvuReader>();

            readerMock.SetupAllProperties();
            readerMock.Object.Position = 1024;

            Mock <IDjvuDocument> docMock    = new Mock <IDjvuDocument>();
            Mock <IDjvuElement>  parentMock = new Mock <IDjvuElement>();

            IDjvuReader   reader   = readerMock.Object;
            IDjvuElement  parent   = parentMock.Object;
            IDjvuDocument document = docMock.Object;

            SjbzChunk chunk = new SjbzChunk(reader, parent, document, "SJBZ", 2048);

            Assert.False(chunk.IsInitialized);

            chunk.ReadData(reader);
            Assert.Equal <long>(reader.Position, chunk.DataOffset + chunk.Length);
        }
Beispiel #13
0
        public void FGbzChunkTest001()
        {
            Mock <IDjvuReader> readerMock = new Mock <IDjvuReader>();

            readerMock.Setup <long>(x => x.Position).Returns(1024);
            // readerMock.SetupAllProperties();

            Mock <IDjvuDocument> docMock    = new Mock <IDjvuDocument>();
            Mock <IDjvuElement>  parentMock = new Mock <IDjvuElement>();

            IDjvuReader   reader   = readerMock.Object;
            IDjvuElement  parent   = parentMock.Object;
            IDjvuDocument document = docMock.Object;

            FGbzChunk chunk = new FGbzChunk(reader, parent, document, "FGBZ", 2048);

            Assert.False(chunk.IsInitialized);
            Assert.Equal <long>(1024, chunk.DataOffset);
            Assert.Equal <long>(2048, chunk.Length);
            Assert.Same(reader, chunk.Reader);
            Assert.Same(parent, chunk.Parent);
            Assert.Same(document, chunk.Document);
        }
Beispiel #14
0
        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);
        }
Beispiel #15
0
 public DjvuNode(IDjvuWriter writer, IDjvuElement parent, long length = 0)
 {
     Writer = writer;
     Parent = parent;
     Length = length;
 }
Beispiel #16
0
 public ParsedDjvuElementEventArgs(IDjvuElement element) : base()
 {
     Element = element;
 }
Beispiel #17
0
        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);
        }
Beispiel #18
0
 public DjvuFormElement(IDjvuReader reader, IDjvuElement parent, IDjvuDocument document,
                        string chunkID = "", long length = 0)
     : base(reader, parent, document, chunkID, length)
 {
     InitializeInternal();
 }
Beispiel #19
0
        /// <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);
        }
Beispiel #20
0
 public DjvuFormElement(IDjvuWriter writer, IDjvuElement parent, long length = 0)
     : base(writer, parent, length)
 {
     InitializeInternal();
 }
Beispiel #21
0
 public PM44Form(IDjvuWriter writer, IDjvuElement parent, long length = 0)
     : base(writer, parent, length)
 {
 }
Beispiel #22
0
 public AntaChunk(IDjvuReader reader, IDjvuElement parent, IDjvuDocument document,
                  string chunkID = "", long length = 0)
     : base(reader, parent, document, chunkID, length)
 {
 }
Beispiel #23
0
 public AntaChunk(IDjvuWriter writer, IDjvuElement parent, long length = 0)
     : base(writer, parent, length)
 {
 }
Beispiel #24
0
 public UnknownChunk(IDjvuReader reader, IDjvuElement parent, IDjvuDocument document,
                     string chunkID = "", long length = 0)
     : base(reader, parent, document, chunkID, length)
 {
     // Nothing
 }