Пример #1
0
        private static void SplitThread(object o)
        {
#if TEST_AS_FRENCH
            Tools.SetThreadToFrench();
#endif
            SplitThreadParams stp = (SplitThreadParams)o;
            WaitDlg           dlg = stp.dlg;
            Stopwatch         sw  = new Stopwatch();
            sw.Start();
            try
            {
                stp.splitter();
                sw.Stop();
                dlg.AllowClose("Completed in {0:F2} seconds", sw.Elapsed.TotalSeconds);
            }
            catch (Exception e)
            {
                string exception = String.Format("Failed with exception {0} during split ", e.Message);
                dlg.AllowClose(exception);
                DebugLogger.Log("Split", exception + "{0}{1}", Environment.NewLine, e.StackTrace);
            }
            sw.Stop();
            GC.Collect();
        }
Пример #2
0
 private void FGImageLoad(string fileName, Images.ImageLoadResult info)
 {
     if (DebugLogger.DoDebugActions())
     {
         string fgImageName = Globals.MakeDebugSaveName(true, Path.GetFileName(fileName));
         File.Copy(fileName, fgImageName, true);
     }
     if (info.type != Images.ImageType.GM)
     {
         byte[] newForegroundData;
         if (info.type != Images.ImageType.GMLL)
         {
             newForegroundData = Tools.CheckConvertImageTo(info.image, Tools.ConvertType.GM);
             if (newForegroundData == null)
             {
                 info.image.Dispose();
                 return;
             }
         }
         else
         {
             newForegroundData = File.ReadAllBytes(fileName);
         }
         DebugLogger.Log("Main", "Got {0} bytes of non-GM GMLL data", newForegroundData.Length);
         if (DebugLogger.DoDebugActions())
         {
             string nonGMDataFile = Globals.MakeDebugSaveName(false, "{0}nongm-fg.gmll", Path.GetFileNameWithoutExtension(fileName));
             File.WriteAllBytes(nonGMDataFile, newForegroundData);
         }
         layerState.On(LayerStateManager.Layers.Foreground);
         ReplaceForegroundImage(newForegroundData, info.image);
     }
     else // (info.type == Images.ImageType.GM)
     {
         // This is a hack since CloseCurrentFile() resets everything
         // and disposes the images, but when we're reloading the foreground
         // only, we should preserve the background, so lets do this
         // rather than bool-ing it up just for this one case
         Image bgBackup = null;
         if (canvasBgImage != null)
         {
             bgBackup = (Image)canvasBgImage.Clone();
         }
         if (!CloseCurrentFile())
         {
             // didn't need it anyway
             if (bgBackup != null)
             {
                 bgBackup.Dispose();
             }
             info.image.Dispose();
             return;
         }
         canvasBgImage = bgBackup;
         layerState.On(LayerStateManager.Layers.Foreground);
         byte[] gmllData = Images.LoadGMLLData(fileName);
         ReplaceForegroundImage(gmllData, info.image);
         GTMP.GMFile.GMFileInfo fileInf = info.gmInfo;
         DebugLogger.Log("Main", "Got {0} bytes of GM-GMLL data from {1}, file had {2} boxes", gmllData.Length, fileName, fileInf.Boxes == null ? -1 : fileInf.Boxes.Count);
         if (fileInf.Boxes != null)
         {
             boxList.BeginUpdate();
             try
             {
                 allBoxes.Clear();
                 List <IBox> boxes = ConvertGMFileBoxes(fileInf.Boxes);
                 allBoxes.Load(boxes);
             }
             finally
             {
                 boxList.EndUpdate();
             }
         }
         metadataPropertyList.SelectedObject = fileInf.Metadata;
     }
     SetTitleFileName(fileName);
 }
Пример #3
0
        void SaveDebugLog(object sender, EventArgs e)
        {
            string debugFile = System.IO.Path.Combine(Application.StartupPath, "log.txt");

            System.IO.File.WriteAllText(debugFile, DebugLogger.GetContents());
        }
Пример #4
0
 private void openForegroundToolStripMenuItem_Click(object sender, EventArgs e)
 {
     DebugLogger.Log("Main", "Opening foreground by menu");
     LoadAndDisplayFile(new PostImageLoad(FGImageLoad));
     RedrawCanvas();
 }
Пример #5
0
        public static bool Load(string fileName, out Bitmap bg, out Bitmap fg, out byte[] fgGMLL, out List <IBox> boxes, out GTMP.GMFile.GMMetadata metadata)
        {
            fg       = bg = null;
            fgGMLL   = null;
            boxes    = null;
            metadata = null;
            DebugLogger.Log("Project", "Loading file at {0}", fileName);
            if (DebugLogger.DoDebugActions())
            {
                string projectCopy = Globals.MakeDebugSaveName(true, Path.GetFileName(fileName));
                File.Copy(fileName, projectCopy, true);
            }
            byte[] projectBytes;
            using (FileStream fs = File.OpenRead(fileName))
            {
                projectBytes = Compress.DecompressStream(fs).ToArray();
            }
            string jsonText = Encoding.UTF8.GetString(projectBytes);
            GMSerializedProject projectData = Json.Parse <GMSerializedProject>(jsonText);
            IconImgType         projType    = projectData.gt2BoxVersion;
            IconImgType         currentType = Globals.App.GT2Version;

            Debug.Assert(projType != IconImgType.Invalid);
            if (projType != currentType)
            {
                System.Windows.Forms.DialogResult res = MainForm.DisplayMsgBox(
                    System.Windows.Forms.MessageBoxButtons.YesNoCancel,
                    System.Windows.Forms.MessageBoxIcon.Question,
                    "{0} was saved with GT2 Version {1} which is different from the current version {2}. Change the current version?",
                    fileName,
                    projType,
                    currentType
                    );
                if (res != System.Windows.Forms.DialogResult.Yes)
                {
                    return(false);
                }
                Globals.App.GT2Version = projType;
                Hardcoded.Refresh(System.Windows.Forms.Application.StartupPath);
            }
            byte[] imageData;
            if (!String.IsNullOrEmpty(projectData.background))
            {
                imageData = Convert.FromBase64String(projectData.background);
                bg        = Images.FromBytes(imageData);
            }
            else
            {
                bg = null;
            }
            if (!String.IsNullOrEmpty(projectData.foreground))
            {
                fgGMLL = Convert.FromBase64String(projectData.foreground);
                fg     = Images.FromBytes(fgGMLL);
            }
            metadata = projectData.fileMetadata;
            boxes    = new List <IBox>();
            foreach (IconImgBox img in projectData.iconBoxes)
            {
                boxes.Add(img);
            }
            foreach (Box box in projectData.boxes)
            {
                boxes.Add(box);
            }
            return(true);
        }
Пример #6
0
        public static void ExportGM(
            string fileName,
            List <IBox> boxes,
            GTMP.GMFile.GMMetadata metadata,
            byte[] gmllData
            )
        {
            List <Box>        bigBoxes;
            List <IconImgBox> icons;

            SeparateBoxes(boxes, out bigBoxes, out icons);
            DebugLogger.Log(
                "Project",
                "Exporting as GMFile to {0} with {1} boxes, {2} item boxes, metadata ({3}), and gmllData of {4} bytes",
                fileName,
                bigBoxes.Count,
                icons.Count,
                metadata.ToString(),
                (gmllData == null) ? -1 : gmllData.Length
                );
            // this can be possible is the user just starts drawing boxes and wants to export that
            // without loading an associated image
            if (gmllData == null)
            {
                // 4 - "GMLL"
                // 4 - int for number of positions
                // 0 - position data length
                // 32 * 16 * 2 = 32 palettes of 16 2-byte colour
                // 4 - int for number of tiles
                // 0 - bytes of tile pixel data
                gmllData = new byte[4 + 4 + 0 + (32 * 16 * 2) + 4 + 0];
                Array.Copy(Encoding.ASCII.GetBytes("GMLL"), gmllData, 4);
            }
            try
            {
                using (MemoryStream ms = new MemoryStream(15000))
                    using (BinaryWriter bw = new BinaryWriter(ms))
                    {
                        // the game files never have more than four iconimgs
                        // in one box group, it seems to handle more than that
                        // perfectly fine, so we make slightly smaller files by not
                        // splitting them up like that
                        int numIcons    = icons.Count;
                        int numBigBoxes = bigBoxes.Count;
                        //int curIcon = 0;
                        //int curBigBox = 0;
                        //int boxGroups = numIcons / 4;

                        bw.Write(Encoding.ASCII.GetBytes("GM\x3\x0"));
                        bw.Write(numIcons > 0 ? 1 : 0); // 0x4

                        if (numIcons > 0)
                        {
                            bw.Write(numIcons);
                            foreach (IconImgBox icon in icons)
                            {
                                icon.Serialize(bw);
                            }
                        }

                        // if anybody ever wants to write files with the 4 iconimg per group
                        // here it is, don't forget to comment out the above, or it won't work right
                        // if(numIcons > 0)
                        //{
                        //do
                        //{
                        //    int iconsToWrite = Math.Min(4, numIcons);
                        //    int bigBoxesToWrite = Math.Min(4, numBigBoxes);
                        //    bw.Write((ushort)iconsToWrite);
                        //    bw.Write((ushort)bigBoxesToWrite);
                        //    for (int i = 0; i < iconsToWrite; ++i)
                        //    {
                        //        icons[0].Serialize(bw);
                        //        icons.RemoveAt(0);
                        //    }
                        //    for(int i = 0; i < bigBoxesToWrite; ++i)
                        //    {
                        //        bigBoxes[0].Serialise(bw);
                        //        bigBoxes.RemoveAt(0);
                        //    }
                        //    numIcons -= iconsToWrite;
                        //    numBigBoxes -= bigBoxesToWrite;
                        //}
                        //while (numIcons != 0);
                        //}

                        bw.Write(numBigBoxes);

                        // if any box is a CarDisplay, set flag 2 in the metadata flags
                        // check for more than one box with the default cursor position attribute
                        // don't care of there aren't any
                        int numCars        = 0;
                        int defaultCursors = 0;
                        foreach (Box b in bigBoxes)
                        {
                            if (b.Contents == GTMP.GMFile.BoxItem.CarDisplay)
                            {
                                if (++numCars > 1)
                                {
                                    throw new InvalidBoxStateException("The game will not render more than 1 CarDisplay box", b);
                                }
                            }
                            if ((b.BehaviourAttributes & GTMP.GMFile.InfoBoxAttributes.DefaultCursorPos) != 0)
                            {
                                if (++defaultCursors > 1)
                                {
                                    throw new InvalidBoxStateException("More than one box has the DefaultCursorPos BehaviourAttribute set", b);
                                }
                            }
                            b.Serialize(bw);
                        }

                        int screenBehaviour = (numCars != 0) ? 2 : 0;
                        if (metadata.BackLinkToPreviousScreen)
                        {
                            screenBehaviour = 3;
                        }
                        bw.Write((sbyte)metadata.ManufacturerID);
                        bw.Write((byte)screenBehaviour);
                        bw.Write((ushort)metadata.ScreenType);
                        bw.Write(metadata.BackLink);
                        bw.Write((int)metadata.BackgroundIndex);
                        bw.Write(gmllData);
                        bw.Flush();

                        ms.Position = 0;
#if DEBUG
                        File.WriteAllBytes(@"T:\uncompressedgm.gm", ms.ToArray());
#endif
                        MemoryStream compressed      = Compress.GZipCompressStream(ms);
                        byte[]       compressedBytes = compressed.ToArray();
                        File.WriteAllBytes(fileName, compressedBytes);
                    }
            }
            catch (InvalidBoxStateException ibse)
            {
                MainForm.DisplayMsgBox(
                    System.Windows.Forms.MessageBoxButtons.OK,
                    System.Windows.Forms.MessageBoxIcon.Error,
                    ibse.Message
                    );
            }
        }