Пример #1
0
        // Save to MDI / TIFF
        private static void SaveToDoc(IList<int> pages, string modiFile, string outFile,
            MODI.MiFILE_FORMAT format, WaitForm wait, string tmpDir, bool closeForm=true)
        {
            MODI.Document modiDoc = null;

            try
            {
                wait.Status = "Saving to " + Path.GetFileName(outFile) + "...";
                modiDoc = new MODI.Document();
                modiDoc.Create(modiFile);

                // Can't find a way to add images to an empty doc...
                // doc.Images.Add doesn't like images from other docs
                // Probably the same bug that doesn't allow access to Image.Picture
                // This works backwards and removes unselected images from a complete doc
                for (int page = modiDoc.Images.Count - 1; page >= 0; page--)
                {
                    if (!pages.Contains(page))
                        modiDoc.Images.Remove(modiDoc.Images[page]);
                }

                modiDoc.SaveAs(outFile, format);
                //modiDoc.Close(false);
                // closing still keeps the file locked... see below
            }
            catch
            {
                wait.MessageSafe("Failed to save " + Path.GetFileName(outFile));
                if(closeForm)
                    wait.CloseSafe();
            }

            try
            {
                // The file gets locked for some reason until the program exits
                // or another save is made elsewhere
                // This unlocks the file on 2 of the 3 machines I tested on ...

                while (modiDoc.Images.Count > 1) // can't save w/ 0 imgs - leave 1
                    modiDoc.Images.Remove(modiDoc.Images[0]);

                // Needed new files for batch processing :/ This. Is. Ugly.
                // Not to mention slow

                if (!Directory.Exists(tmpDir))
                    Directory.CreateDirectory(tmpDir);
                modiDoc.SaveAs(tmpDir+"\\"+Path.GetRandomFileName());

               modiDoc.Close();

                if(closeForm)
                    wait.CloseSafe();
            }
            catch { }
        }
Пример #2
0
        public void SaveToDocAsync(IList<int> pages, string outFile, MODI.MiFILE_FORMAT format, WaitForm wait)
        {
            if (!isOpen) return;

            doc.Save();
            Thread thread = new Thread(() => SaveToDoc(pages, fileName, outFile, format, wait, tmpDir));
            thread.Start();
        }
Пример #3
0
 public void SaveToDocAsync(IList<int> pages, string outFile, MODI.MiFILE_FORMAT format)
 {
     WaitForm dummy = new WaitForm();
     SaveToDocAsync(pages, outFile, format, dummy);
 }
Пример #4
0
        public void Read(byte[] data)
        {
            // Clear chunks to prevent double data.
            Chunks.Clear();

            using (var stream = new MemoryStream(data))
                using (var reader = new BinaryReader(stream))
                {
                    while (reader.BaseStream.Position < reader.BaseStream.Length)
                    {
                        var chunkId   = (WMOChunkId)reader.ReadUInt32();
                        var chunkSize = reader.ReadUInt32();

                        var chunkData = new byte[chunkSize];
                        Buffer.BlockCopy(stream.ToArray(), (int)reader.BaseStream.Position, chunkData, 0, (int)chunkSize);

                        IChunk chunk = null;
                        switch (chunkId)
                        {
                        case WMOChunkId.MVER: chunk = new MVER(); break;

                        case WMOChunkId.MOHD: chunk = new MOHD(); break;

                        case WMOChunkId.MOTX: chunk = new MOTX(); break;

                        case WMOChunkId.MOMT: chunk = new MOMT(); break;

                        case WMOChunkId.MOGN: chunk = new MOGN(); break;

                        case WMOChunkId.MOGI: chunk = new MOGI(); break;

                        case WMOChunkId.MOPV: chunk = new MOPV(); break;

                        case WMOChunkId.MOPT: chunk = new MOPT(); break;

                        case WMOChunkId.MOPR: chunk = new MOPR(); break;

                        case WMOChunkId.MOLT: chunk = new MOLT(); break;

                        case WMOChunkId.MODS: chunk = new MODS(); break;

                        case WMOChunkId.MODI: chunk = new MODI(); break;

                        case WMOChunkId.MODD: chunk = new MODD(); break;

                        case WMOChunkId.MFOG: chunk = new MFOG(); break;

                        default: Console.WriteLine($"Skipping {chunkId} (0x{(uint)chunkId:X})"); break;
                        }

                        if (chunk != null)
                        {
                            chunk.Read(chunkData);
                            Chunks.Add(chunk);
                        }

                        reader.BaseStream.Position += chunkSize;
                    }

                    // Add mandatory chunks.
                    Chunks.Add(new MOSB());
                    Chunks.Add(new MOVV());
                    Chunks.Add(new MOVB());

                    // Close the streams so they can be written.
                    reader.Close();
                    stream.Close();
                }
        }