Beispiel #1
0
            private void ScaleRegion(TileScaleEntry entry)
            {
                var sw        = Stopwatch.StartNew();
                var regionPos = entry.Position;

                if (!entry.IsRegionDirty(regionPos.GetBlockBounds()))
                {
                    return;
                }

                using (var baseImg = entry.GetBitmap())
                {
                    var format = baseImg.PixelFormat;
                    var sync   = new object();

                    //Parallel.For(0, Scale, tX =>
                    for (int tX = 0; tX < Scale; tX++)
                    {
                        //Parallel.For(0, Scale, tZ =>
                        for (int tZ = 0; tZ < Scale; tZ++)
                        {
                            // Check if update is actually required.
                            var tilePos = new TilePosition((regionPos.X << Zoom) + tX, (regionPos.Z << Zoom) + tZ,
                                                           Zoom);

                            if (!entry.IsRegionDirty(tilePos.GetBlockBounds()))
                            {
                                continue;
                            }

                            Bitmap img;
                            lock (sync)
                            {
                                img = baseImg.Clone(
                                    new Rectangle(tX * RegionTileSize.Width, tZ * RegionTileSize.Height,
                                                  RegionTileSize.Width, RegionTileSize.Height), format);
                            }


                            DrawTile(img, tilePos);
                            Scaler.OnTileUpdated?.Invoke(this,
                                                         new TileUpdateEventArgs(Scaler.LevelId, Scaler.LayerId, tilePos));
                        } //);
                    }     //);
                }

                //Log.InfoFormat("Scaled Region {0} to Zoom Level {1} in {2}ms", regionPos, Zoom, sw.ElapsedMilliseconds);
            }