/// <summary>
        /// Writes a color image into a DjVu IW44 file. This function creates a
        /// composite Form element containing one or more IW44 encoded chunks.
        /// Data for each chunk is generated with a call to EncodeChunk method
        /// while encoding is controlled by the corresponding parameters in an array
        /// parameter settings.
        /// </summary>
        /// <param name="writer"></param>
        /// <param name="settings"></param>
        /// <returns></returns>
        public DjvuFormElement EncodeImage(IDjvuWriter writer, int nchunks, InterWaveEncoderSettings[] settings,
                                           ChunkType formType = ChunkType.PM44Form, ChunkType nodeType = ChunkType.PM44)
        {
            if (_YEncoder != null)
            {
                throw new DjvuInvalidOperationException($"Encoder already exists or left open from previous operation.");
            }

            int flag = 1;

            PM44Form form = (PM44Form)DjvuParser.CreateEncodedDjvuNode(writer, null, formType, 0);

            for (int i = 0; flag != 0 && i < nchunks; i++)
            {
                byte[] data = null;
                using (MemoryStream stream = new MemoryStream())
                {
                    flag = EncodeChunk(stream, settings[i]);
                    data = new byte[stream.Position];
                    Buffer.BlockCopy(stream.GetBuffer(), 0, data, 0, data.Length);
                }

                PM44Chunk chunk = (PM44Chunk)DjvuParser.CreateEncodedDjvuNode(writer, form, nodeType, data.Length);
                chunk.ChunkData = data;
                form.AddChild(chunk);
            }

            CloseEncoder();
            return(form);
        }
Example #2
0
        public void PM44FormTest()
        {
            Mock <IDjvuReader> readerMock = new Mock <IDjvuReader>();

            readerMock.Setup(x => x.Position).Returns(1024);

            PM44Form unk = new PM44Form(readerMock.Object, null, null, null, 0);

            Assert.Equal <ChunkType>(ChunkType.PM44Form, unk.ChunkType);
            Assert.Equal(ChunkType.PM44Form.ToString(), unk.Name);
            Assert.Equal <long>(1024, unk.DataOffset);
        }
Example #3
0
        public void WriteDataTest()
        {
            byte[] buffer = new byte[2048];

            Mock <IDjvuReader> readerMock = new Mock <IDjvuReader>();

            readerMock.Setup(x => x.Position).Returns(1024);

            Mock <DjvuNode> nodeMock1 = new Mock <DjvuNode> {
                CallBase = true
            };

            nodeMock1.Object.ChunkData = buffer;
            nodeMock1.Setup(x => x.Name).Returns("PM44");
            nodeMock1.Object.Length = buffer.Length;

            Mock <DjvuNode> nodeMock2 = new Mock <DjvuNode> {
                CallBase = true
            };

            nodeMock2.Object.ChunkData = buffer;
            nodeMock2.Setup(x => x.Name).Returns("PM44");
            nodeMock2.Object.Length = buffer.Length;

            Mock <IDjvuWriter> writerMock = new Mock <IDjvuWriter>();

            writerMock.Setup <long>(x => x.WriteUTF8String(It.IsAny <string>())).Returns(4);
            writerMock.Setup(x => x.WriteUInt32BigEndian(It.IsAny <uint>()));
            writerMock.Setup(x => x.Write(buffer, 0, buffer.Length));

            PM44Form form = new PM44Form(readerMock.Object, null, null, "PM44Form", 2048);

            form.ChunkData = buffer;

            int result = form.AddChild(nodeMock1.Object);

            Assert.Equal <int>(1, result);
            Assert.Equal <int>(1, form.Children.Count);

            result = form.InsertChild(0, nodeMock2.Object);
            Assert.Equal <int>(2, result);
            Assert.Equal <int>(2, form.Children.Count);

            form.WriteData(writerMock.Object);

            writerMock.Verify(x => x.WriteUTF8String("FORM"), Times.Once());
            writerMock.Verify(x => x.WriteUTF8String("PM44"), Times.Exactly(3));
            writerMock.Verify(x => x.WriteUInt32BigEndian((uint)buffer.Length), Times.Exactly(2));
            writerMock.Verify(x => x.WriteUInt32BigEndian(((uint)buffer.Length + 8) * 2 + 4), Times.Exactly(1));
            writerMock.Verify(x => x.Write(buffer, 0, buffer.Length), Times.Exactly(2));
        }
Example #4
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);
        }
Example #5
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);
        }
Example #6
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);
                        }
Example #7
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;
                var pixMap = PixelMapFromBitmap(bmp);

                var map = new InterWavePixelMapEncoder();
                map.InitializeEncoder(pixMap, null, YCrCbMode.Full);

                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;
                    Assert.Equal(nchunks, pageForm.Children.Count);

                    Assert.NotNull(form);
                    Assert.Equal(nchunks, form.Children.Count);
                    Assert.IsType <PM44Form>(form);
                    for (int i = 0; i < form.Children.Count; i++)
                    {
                        var c = form.Children[i];
                        Assert.NotNull(c);
                        Assert.IsType <PM44Chunk>(c);
                        PM44Chunk chunk = (PM44Chunk)c;
                        Assert.NotNull(chunk.ChunkData);
                        if (chunk.ChunkData.Length >= 2)
                        {
                            Assert.Equal(i, chunk.ChunkData[0]);
                            Assert.Equal(slices[i] - (i == 0 ? 0 : slices[i - 1]), chunk.ChunkData[1]);
                            if (i == 0)
                            {
                                Assert.Equal(1, chunk.ChunkData[2]);
                                Assert.Equal(2, chunk.ChunkData[3]);

                                int widthTest = chunk.ChunkData[4] << 8;
                                widthTest |= chunk.ChunkData[5];
                                Assert.Equal(bmp.Width, widthTest);

                                int heightTest = chunk.ChunkData[6] << 8;
                                heightTest |= chunk.ChunkData[7];
                                Assert.Equal(bmp.Height, heightTest);
                            }
                        }
                    }
                }
            }
        }