コード例 #1
0
 internal Screen(GameProfile gameProfile, string name, bool useAdvanced, Geometry geometry)
 {
     GameProfile = gameProfile;
     Name        = name;
     UseAdvanced = useAdvanced;
     Geometry    = geometry;
 }
コード例 #2
0
        public static GameProfile FromZip(string filePath)
        {
            var archive  = ZipFile.OpenRead(filePath);
            var entries  = archive.Entries;
            var xmlFiles = entries.Where(z => z.Name.Contains(".xml"));

            if (xmlFiles.Count() == 0)
            {
                throw new Exception("Game Profile XML is missing");
            }
            else if (xmlFiles.Count() > 1)
            {
                throw new Exception("Multiple XML files found, we only need one.");
            }
            var stream = xmlFiles.First().Open();

            GameProfile gp = FromXml(stream);

            foreach (var s in gp.Screens)
            {
                var search = s.Name.ToLower() + "_autofit.png";
                var files  = entries.Where(z => z.Name.ToLower().Contains(search));
                if (files.Count() == 0)
                {
                    continue;
                }
                else if (files.Count() > 1)
                {
                    throw new Exception("Multiple autofit images found for " + s.Name + ", only one per screen is currently supported.");
                }
                var imageStream = files.First().Open();
                s.Autofitter.Image = new Bitmap(imageStream);
            }
            foreach (var wi in gp.WatchImages)
            {
                var search = wi.FilePath.Replace('\\', '/').ToLower();
                var files  = entries.Where(z => z.FullName.ToLower().Contains(search));
                if (files.Count() == 0)
                {
                    throw new Exception("Image for " + search + " not found.");
                }
                else if (files.Count() > 1)
                {
                    throw new Exception("Multiple images found for " + search + ", somehow.");
                }
                var imageStream = files.First().Open();
                wi.Image = new Bitmap(imageStream);
            }

            return(gp);
        }
コード例 #3
0
        public static GameProfile FromXml(Stream stream)
        {
            using (StreamReader reader = new StreamReader(stream))
            {
                XmlSerializer serializer = new XmlSerializer(typeof(GameProfile));
                GameProfile   gp         = null;

                // Todo: ACTUAL exception handling.
                try
                {
                    gp = (GameProfile)serializer.Deserialize(reader);
                    gp.ReSyncRelationships();
                }
                catch (Exception e) {
                    System.Diagnostics.Debug.WriteLine("Game Profile failed to load.");
                    System.Diagnostics.Debug.WriteLine(e.ToString());
                    return(null);
                }

                return(gp);
            }
        }
コード例 #4
0
        public static void Compile(GameProfile gameProfile, bool useExtremePrecision)
        {
            if (CWatchZones != null)
            {
                foreach (var cWatchZone in CWatchZones)
                {
                    cWatchZone.Dispose();
                }
                Array.Clear(CWatchZones, 0, CWatchZones.Length);
            }
            HasDupeCheck        = false;
            UseExtremePrecision = useExtremePrecision;

            var cWatchZones = new CWatchZone[gameProfile.WatchZones.Count];
            var indexCount  = 0;

            for (int i1 = 0; i1 < gameProfile.WatchZones.Count; i1++)
            {
                WatchZone watchZone = gameProfile.WatchZones[i1];
                Screen    screen    = watchZone.Screen;

                var CWatches = new CWatcher[watchZone.Watches.Count];

                var gameGeo   = screen.GameGeometry.HasSize ? screen.GameGeometry : screen.Geometry;
                var wzCropGeo = watchZone.WithoutScale(gameGeo);
                wzCropGeo.RemoveAnchor(gameGeo);
                wzCropGeo.ResizeTo(screen.CropGeometry, gameGeo);
                wzCropGeo.Update(screen.CropGeometry.X, screen.CropGeometry.Y);

                for (int i2 = 0; i2 < watchZone.Watches.Count; i2++)
                {
                    Watcher watcher = watchZone.Watches[i2];

                    if (watcher.WatcherType == WatcherType.Standard)
                    {
                        var CWatchImages = new CWatchImage[watcher.WatchImages.Count];

                        for (int i3 = 0; i3 < watcher.WatchImages.Count; i3++)
                        {
                            WatchImage watchImage = watcher.WatchImages[i3];
                            var        mi         = new MagickImage(watchImage.Image)
                            {
                                ColorSpace = watcher.ColorSpace
                            };
                            GetComposedImage(ref mi, watcher.Channel);
                            if (!UseExtremePrecision)
                            {
                                StandardResize(ref mi, wzCropGeo.ToMagick(false));
                            }
                            else
                            {
                                PreciseResize(ref mi, watchZone.Geometry, gameGeo);
                            }
                            if (watcher.Equalize)
                            {
                                mi.Equalize();
                            }

                            CWatchImages[i3] = new CWatchImage(watchImage.Name, indexCount, mi);
                            indexCount++;
                        }

                        CWatches[i2] = new CWatcher(CWatchImages, watcher);
                    }
                    else if (watcher.WatcherType == WatcherType.BestMatch)
                    {
                        var mic = new MagickImageCollection();
                        for (int i3 = 0; i3 < watcher.WatchImages.Count; i3++)
                        {
                            WatchImage watchImage = watcher.WatchImages[i3];
                            var        mi         = new MagickImage(watchImage.FilePath)
                            {
                                ColorSpace = watcher.ColorSpace
                            };
                            GetComposedImage(ref mi, watcher.Channel);
                            if (!UseExtremePrecision)
                            {
                                StandardResize(ref mi, wzCropGeo.ToMagick(false));
                            }
                            else
                            {
                                PreciseResize(ref mi, watchZone.Geometry, gameGeo);
                            }
                            if (watcher.Equalize)
                            {
                                mi.Equalize();
                            }

                            //CWatchImages[i3] = new CWatchImage(watchImage.Name, indexCount, mi);
                            indexCount++;
                        }
                    }
                    else if (watcher.WatcherType == WatcherType.DuplicateFrame)
                    {
                        HasDupeCheck = true;
                    }
                }

                cWatchZones[i1] = new CWatchZone(watchZone.Name, wzCropGeo, CWatches);
            }

            CWatchZones = cWatchZones;
        }