Exemple #1
0
 protected void OnParsedDjvuNode(IDjvuNode node)
 {
     if (ParsedDjvuNodeEvent != null)
     {
         ParsedDjvuNodeEvent(this, new ParsedDjvuNodeEventArgs(node));
     }
 }
Exemple #2
0
        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);
            }
        }
Exemple #3
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;
            }
        }
        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);
            }
        }
Exemple #7
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);
                }
            }
        }
Exemple #8
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);
        }
Exemple #9
0
        /// <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());
        }
Exemple #10
0
 public bool RemoveChild(IDjvuNode node)
 {
     return(_Children.Remove(node));
 }
Exemple #11
0
 public bool ContainsChild(IDjvuNode node, IEqualityComparer <IDjvuNode> comparer)
 {
     return(_Children.Contains(node, comparer));
 }
Exemple #12
0
 public bool ContainsChild(IDjvuNode node)
 {
     return(_Children.Contains(node));
 }
Exemple #13
0
 public int AddChild(IDjvuNode node)
 {
     _Children.Add(node);
     return(_Children.Count);
 }
Exemple #14
0
 public ParsedDjvuNodeEventArgs(IDjvuNode node) : base()
 {
     Node = node;
 }
Exemple #15
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);
        }
Exemple #16
0
 public int InsertChild(int index, IDjvuNode node)
 {
     _Children.Insert(index, node);
     return(_Children.Count);
 }
Exemple #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);
        }
Exemple #18
0
        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);
                        }