コード例 #1
0
        public void EndGroup(string id)
        {
            if (_layers.ContainsKey(id))
            {
                var rect = _layers[id];

                _layers.Remove(id);

                if (_activeLayer != null)
                {
                    _activeLayer.Dispose();
                    _activeLayer     = null;
                    _activeLayerRect = Rect.Empty;
                }

                if (rect.IsEmpty == false)
                {
                    if (_session != null)
                    {
                        _activeLayerRect = rect;
                        _activeLayer     = _session.CreateLayer(1.0f, _activeLayerRect);
                    }
                }
            }
        }
コード例 #2
0
 public void setRawClip(ui.geom.Shape clip)
 {
     removeClip();
     if (clip == null)
     {
         return;
     }
     com.codename1.ui.geom.Rectangle bounds = clip.getBounds();
     if (bounds.getWidth() <= 0 || bounds.getHeight() <= 0)
     {
         layer = graphics.CreateLayer(1f, new Rect(
                                          bounds.getX(),
                                          bounds.getY(),
                                          1,
                                          1
                                          ));
         return;
     }
     if (clip.isRectangle())
     {
         layer = graphics.CreateLayer(1f, new Rect(
                                          bounds.getX(),
                                          bounds.getY(),
                                          bounds.getWidth(),
                                          bounds.getHeight()
                                          ));
         return;
     }
     layer = graphics.CreateLayer(1f, CanvasGeometry.CreatePath(SilverlightImplementation.instance.cn1ShapeToAndroidPath(clip)));
 }
コード例 #3
0
        public Canvas(CanvasDrawingSession session, IRenderTarget target, ImageLoader imageLoader)
        {
            _session     = session;
            _target      = target;
            _imageLoader = imageLoader;

            _transform = new Transform(1, 0, 0, 0, 1, 0);

            _strokeWidth = 1.0f;
            _strokeColor = Windows.UI.Colors.Transparent;

            _strokeStyle = new CanvasStrokeStyle
            {
                StartCap = CanvasCapStyle.Flat,
                EndCap   = CanvasCapStyle.Flat,
                DashCap  = CanvasCapStyle.Flat,
                LineJoin = CanvasLineJoin.Miter
            };

            _fillColor = Windows.UI.Colors.Black;
            _fillRule  = CanvasFilledRegionDetermination.Winding;

            _fontProperties = new CanvasTextFormat
            {
                FontStyle  = Windows.UI.Text.FontStyle.Normal,
                FontWeight = Windows.UI.Text.FontWeights.Normal
            };

            _baseline = 1.0f;

            _layers          = new Dictionary <string, Rect>();
            _activeLayer     = null;
            _activeLayerRect = Rect.Empty;
        }
コード例 #4
0
 internal virtual void setClip(ui.geom.Rectangle clip)
 {
     removeClip();
     if (clip == null)
     {
         return;
     }
     if (clip.getWidth() <= 0)
     {
         // System.Diagnostics.Debug.WriteLine("aaaaaaaaaaaaaaaaaaaa width");
         clip.setWidth(1);
     }
     if (clip.getHeight() <= 0)
     {
         // System.Diagnostics.Debug.WriteLine("aaaaaaaaaaaaaaaaaaaa height");
         clip.setHeight(1);
     }
     if (transform != null && !transform.isIdentity())
     {
         GeneralPath gp = new GeneralPath();
         gp.setShape(clip, transform);
         layer = graphics.CreateLayer(1f, CanvasGeometry.CreatePath(SilverlightImplementation.instance.cn1ShapeToAndroidPath(gp)));
     }
     else
     {
         layer = graphics.CreateLayer(1f, new Rect(
                                          clip.getX(),
                                          clip.getY(),
                                          clip.getWidth(),
                                          clip.getHeight()
                                          ));
     }
 }
コード例 #5
0
 internal void removeClip()
 {
     if (layer != null)
     {
         layer.Dispose();
         layer = null;
     }
 }
コード例 #6
0
 internal void removeClip()
 {
     if (layer != null)
     {
         layer.Dispose();
         layer = null;
     }
 }
コード例 #7
0
        public void EndDraw()
        {
            End();

            if (_drawingLayer != null)
            {
                _drawingLayer.Dispose();
                _drawingLayer = null;
            }
        }
コード例 #8
0
        public void StartDraw(int x, int y, int width, int height)
        {
            Begin();

            EditorUserControl editor = _target as EditorUserControl;

            if (editor?.SupportsOffscreenRendering() ?? false)
            {
                var drawingLayerRect = new Rect(x, y, width, height);
                _drawingLayer = _session.CreateLayer(1.0f, drawingLayerRect);
                var color = Windows.UI.Color.FromArgb((byte)0, (byte)0, (byte)0, (byte)0);
                _session.Clear(color);
            }
        }
コード例 #9
0
        internal virtual void setClipShape(ui.geom.Shape clip)
        {
            removeClip();
            if (clip == null)
            {
                return;
            }
            com.codename1.ui.geom.Rectangle bounds = clip.getBounds();
            if (bounds.getWidth() <= 0 || bounds.getHeight() <= 0)
            {
                setClip(bounds);
                return;
            }

            CanvasPathBuilder nativeShape = SilverlightImplementation.instance.cn1ShapeToAndroidPath(clip);

            layer = graphics.CreateLayer(1f, CanvasGeometry.CreatePath(nativeShape));
        }
コード例 #10
0
        public void StartGroup(string id, float x, float y, float width, float height, bool clipContent)
        {
            if (clipContent)
            {
                _layers.Add(id, _activeLayerRect);

                if (_activeLayer != null)
                {
                    _activeLayer.Dispose();
                    _activeLayer     = null;
                    _activeLayerRect = Rect.Empty;
                }

                if (_session != null)
                {
                    _activeLayerRect = new Rect(x, y, width, height);
                    _activeLayer     = _session.CreateLayer(1.0f, _activeLayerRect);
                }
            }
        }
コード例 #11
0
 internal virtual void setClip(ui.geom.Rectangle clip)
 {
     if (clip == null)
     {
         return;
     }
     if (clip.getWidth() <= 0)
     {
         // System.Diagnostics.Debug.WriteLine("aaaaaaaaaaaaaaaaaaaa width");
         clip.setWidth(1);
     }
     if (clip.getHeight() <= 0)
     {
         // System.Diagnostics.Debug.WriteLine("aaaaaaaaaaaaaaaaaaaa height");
         clip.setHeight(1);
     }
     layer = graphics.CreateLayer(1, new Rect(
                                      clip.getX(),
                                      clip.getY(),
                                      clip.getWidth(),
                                      clip.getHeight()
                                      ));
 }
コード例 #12
0
 internal virtual void setClip(Rectangle clip)
 {
     if (clip == null)
     {
         return;
     }
     if (clip.getWidth() <= 0)
     {
         System.Diagnostics.Debug.WriteLine("aaaaaaaaaaaaaaaaaaaa width");
         clip.setWidth(1);
     }
     if (clip.getHeight() <= 0)
     {
         System.Diagnostics.Debug.WriteLine("aaaaaaaaaaaaaaaaaaaa height");
         clip.setHeight(1);
     }
     layer = graphics.CreateLayer(1, new Rect(
         clip.getX(),
         clip.getY(),
         clip.getWidth(),
         clip.getHeight()
     ));
 }
コード例 #13
0
        public void DrawText(FormattedText formattedText, Point point, Rect?clipRect)
        {
            var text = formattedText.Text;

            var vector           = new System.Numerics.Vector2((float)point.X, (float)point.Y);
            var brush            = formattedText.Brush.ToWin2D(drawingSession);
            var canvasTextFormat = new CanvasTextFormat
            {
                FontSize   = formattedText.FontSize,
                FontWeight = formattedText.FontWeight.ToWin2D(),
                FontFamily = formattedText.FontName,
            };

            CanvasActiveLayer layer = null;

            if (clipRect != null)
            {
                layer = drawingSession.CreateLayer(new CanvasSolidColorBrush(drawingSession, Colors.Black.ToWin2D()), clipRect.Value.ToWin2D());
            }

            drawingSession.DrawText(text, vector, brush, canvasTextFormat);

            layer?.Dispose();
        }
コード例 #14
0
 public ClipSave(Rect rect, CanvasActiveLayer layer)
 {
     Rect  = rect;
     Layer = layer;
 }
コード例 #15
0
		public CanvasLayer(CanvasDrawingSession session, CanvasActiveLayer layer, Matrix3x2 transform)
		{
			Session = session;
			Layer = layer;
			Transform = transform;
		}
コード例 #16
0
ファイル: MainPage.xaml.cs プロジェクト: Gawson/Navi
        private async void Map_MapTapped(int tileX, int tileY, int zoomLevel)
        {
            float canvasScale = 1f;
            float canvasSize  = 768;
            float lineScale   = 1f;

            //int zoomLevel = Math.Min(14, Math.Max(1, (int)sender.ZoomLevel));
            //var tileAddr = MapUtil.WorldToTilePos(args.Location.Position.Longitude, args.Location.Position.Latitude, zoomLevel);
            System.Diagnostics.Debug.WriteLine($"{tileX} x {tileY}");
            System.Diagnostics.Debug.WriteLine($"zoom: {zoomLevel}");
            {
                var reader = await db.GetTile((int)tileX, (int)tileY, zoomLevel);

                if (!reader.HasRows)
                {
                    textOutput.Text = DateTime.Now + ": No data";
                }
                var tile = VectorTile.Parse(reader);
                if (tile.tile_data_raw != null)
                {
                    PBF pbf = new PBF(tile.tile_data_raw);
                    currentTile = ProtoBuf.Serializer.Deserialize <Tile>(new MemoryStream(tile.tile_data_raw));

                    if (GeometryDecoder.CanvasTileId != tile.id)
                    {
                        GeometryDecoder.CanvasTileId = tile.id;

                        if (GeometryDecoder.offscreen == null)
                        {
                            CanvasDevice device = CanvasDevice.GetSharedDevice();
                            GeometryDecoder.offscreen = new CanvasRenderTarget(device, canvasSize, canvasSize, Windows.Graphics.Display.DisplayInformation.GetForCurrentView().LogicalDpi *canvasScale);
                            //GeometryDecoder.offscreenText = new CanvasRenderTarget(device, canvasSize, canvasSize, Windows.Graphics.Display.DisplayInformation.GetForCurrentView().LogicalDpi * canvasScale);
                        }


                        //Performance benchmark
                        Tile.Layer layer_buildings           = null;
                        Tile.Layer layer_landcover           = null;
                        Tile.Layer layer_transportation      = null;
                        Tile.Layer layer_transportation_name = null;
                        Tile.Layer layer_housenumber         = null;
                        Tile.Layer layer_poi = null;

                        if (currentTile.Layers.Any(l => l.Name == "building"))
                        {
                            layer_buildings = currentTile.Layers.Where(l => l.Name == "building").ToList()?.First();
                        }
                        if (currentTile.Layers.Any(l => l.Name == "landcover"))
                        {
                            layer_landcover = currentTile.Layers.Where(l => l.Name == "landcover").ToList()?.First();
                        }
                        if (currentTile.Layers.Any(l => l.Name == "transportation"))
                        {
                            layer_transportation = currentTile.Layers.Where(l => l.Name == "transportation").ToList()?.First();
                        }
                        if (currentTile.Layers.Any(l => l.Name == "transportation_name"))
                        {
                            layer_transportation_name = currentTile.Layers.Where(l => l.Name == "transportation_name").ToList()?.First();
                        }
                        if (currentTile.Layers.Any(l => l.Name == "housenumber"))
                        {
                            layer_housenumber = currentTile.Layers.Where(l => l.Name == "housenumber").ToList()?.First();
                        }
                        if (currentTile.Layers.Any(l => l.Name == "poi"))
                        {
                            layer_poi = currentTile.Layers.Where(l => l.Name == "poi").ToList()?.First();
                        }

                        System.Diagnostics.Stopwatch stopwatch = new System.Diagnostics.Stopwatch();
                        stopwatch.Start();

                        Dictionary <string, Windows.UI.Color> landColors = new Dictionary <string, Windows.UI.Color>();
                        landColors.Add("grass", Windows.UI.Colors.LawnGreen);
                        landColors.Add("meadow", Windows.UI.Colors.Green);
                        landColors.Add("wood", Windows.UI.Colors.ForestGreen);
                        landColors.Add("forest", Windows.UI.Colors.DarkGreen);
                        landColors.Add("park", Windows.UI.Colors.LightGreen);
                        landColors.Add("village_green", Windows.UI.Colors.GreenYellow);
                        landColors.Add("wetland", Windows.UI.Colors.CornflowerBlue);
                        landColors.Add("recreation_ground", Windows.UI.Colors.LightYellow);
                        landColors.Add("allotments", Windows.UI.Colors.Red);

                        Dictionary <string, Tuple <Color, float, Color, float> > roadProperties = new Dictionary <string, Tuple <Color, float, Color, float> >();
                        roadProperties.Add("transit", new Tuple <Color, float, Color, float>(Colors.Black, 0.5f, Colors.Black, 0.5f));
                        roadProperties.Add("primary", new Tuple <Color, float, Color, float>(Colors.LightYellow, 3, Colors.SandyBrown, 4.5f));
                        roadProperties.Add("secondary", new Tuple <Color, float, Color, float>(Colors.LightYellow, 2, Colors.SandyBrown, 3f));
                        roadProperties.Add("tertiary", new Tuple <Color, float, Color, float>(Colors.LightYellow, 2, Colors.SandyBrown, 3f));
                        roadProperties.Add("minor", new Tuple <Color, float, Color, float>(Colors.WhiteSmoke, 1.8f, Colors.Gray, 2.5f));
                        roadProperties.Add("service", new Tuple <Color, float, Color, float>(Colors.WhiteSmoke, 1.8f, Colors.Gray, 2.5f));
                        roadProperties.Add("track", new Tuple <Color, float, Color, float>(Colors.LightGray, 1, Colors.Gray, 2));
                        roadProperties.Add("path", new Tuple <Color, float, Color, float>(Colors.LightGray, 1, Colors.Gray, 2));
                        roadProperties.Add("rail", new Tuple <Color, float, Color, float>(Colors.Gainsboro, 0.75f, Colors.DimGray, 1.4f));
                        roadProperties.Add("motorway", new Tuple <Color, float, Color, float>(Colors.Orange, 3, Colors.Red, 4.5f));
                        roadProperties.Add("trunk", new Tuple <Color, float, Color, float>(Colors.Orange, 3, Colors.Red, 4.5f));


                        GeometryDecoder.renderList = new CanvasCommandList(GeometryDecoder.offscreen);
                        GeometryDecoder.renderText = new CanvasCommandList(GeometryDecoder.offscreen);

                        //using (CanvasDrawingSession ds = GeometryDecoder.offscreen.CreateDrawingSession())
                        using (CanvasDrawingSession textDs = GeometryDecoder.renderText.CreateDrawingSession())
                            using (CanvasDrawingSession ds = GeometryDecoder.renderList.CreateDrawingSession())
                                using (CanvasActiveLayer activeLayer = ds.CreateLayer(1, new Rect(0, 0, canvasSize, canvasSize)))
                                    using (CanvasActiveLayer activeTextLayer = textDs.CreateLayer(1, new Rect(0, 0, canvasSize, canvasSize)))
                                    {
                                        ds.Antialiasing = CanvasAntialiasing.Antialiased;
                                        ds.Clear(Windows.UI.Colors.Snow);
                                        for (int it = 0; it < 1; it++)
                                        {
                                            layer_landcover?.Features.ForEach(f =>
                                            {
                                                var tags  = GeometryDecoder.GetTags(f, layer_landcover);
                                                var color = Colors.LightGreen;
                                                if (tags.ContainsKey("subclass"))
                                                {
                                                    color = landColors.ContainsKey(tags["subclass"].StringValue) ? landColors[tags["subclass"].StringValue] : Windows.UI.Colors.LightGreen;
                                                }
                                                GeometryDecoder.DrawGeometry(f, canvasSize / 4096f, ds, color, color);
                                            });

                                            layer_buildings?.Features.ForEach(f =>
                                            {
                                                var tags = GeometryDecoder.GetTags(f, layer_buildings);
                                                GeometryDecoder.DrawGeometry(f, canvasSize / 4096f, ds, Windows.UI.Colors.SandyBrown, Windows.UI.Colors.Brown);
                                            });


                                            List <string> tagsNames = new List <string>();
                                            var           names     = layer_transportation?.Features.ConvertAll <Tuple <string, string> >(f =>
                                            {
                                                var tags = GeometryDecoder.GetTags(f, layer_transportation);

                                                foreach (var t in tags)
                                                {
                                                    tagsNames.Add(t.Key);
                                                }
                                                return(new Tuple <string, string>(tags.ContainsKey("class") ? tags["class"].StringValue : "", tags.ContainsKey("subclass") ? tags["subclass"].StringValue : ""));
                                            }).ToList().Distinct().ToList();

                                            var distinctTagsNames = tagsNames.Distinct().ToList();

                                            Tuple <Color, float, Color, float> rc = new Tuple <Color, float, Color, float>(Colors.Pink, 2, Colors.DeepPink, 2);


                                            Dictionary <int, List <Tile.Feature> > transportationFeatures = new Dictionary <int, List <Tile.Feature> >();
                                            foreach (var f in layer_transportation.Features)
                                            {
                                                var tags  = GeometryDecoder.GetTags(f, layer_transportation);
                                                int layer = tags.ContainsKey("layer") ? (int)tags["layer"].IntValue : 0;
                                                if (!transportationFeatures.ContainsKey(layer))
                                                {
                                                    transportationFeatures.Add(layer, new List <Tile.Feature>());
                                                }
                                                transportationFeatures[layer].Add(f);
                                            }

                                            foreach (int layerNo in transportationFeatures.Keys.OrderBy(k => k))
                                            {
                                                //background / stroke pass
                                                foreach (var f in transportationFeatures[layerNo])
                                                {
                                                    var tags = GeometryDecoder.GetTags(f, layer_transportation);

                                                    if (tags.ContainsKey("class"))
                                                    {
                                                        if (roadProperties.ContainsKey(tags["class"].StringValue))
                                                        {
                                                            var p = roadProperties[tags["class"].StringValue];
                                                            GeometryDecoder.DrawGeometry(f, canvasSize / 4096f, ds, p.Item1, p.Item3, 0, p.Item4 * lineScale, layerNo > 0 ? GeometryDecoder.openStrokeStyle : GeometryDecoder.normalStrokeStyle);
                                                        }
                                                        else
                                                        {
                                                            GeometryDecoder.DrawGeometry(f, canvasSize / 4096f, ds, rc.Item1, rc.Item3, 0, rc.Item4 * lineScale, GeometryDecoder.normalStrokeStyle);
                                                        }
                                                    }
                                                    else
                                                    {
                                                        GeometryDecoder.DrawGeometry(f, canvasSize / 4096f, ds, rc.Item1, rc.Item3, 0, rc.Item4 * lineScale, GeometryDecoder.normalStrokeStyle);
                                                    }
                                                }

                                                //foreground / fill pass
                                                foreach (var f in transportationFeatures[layerNo])
                                                {
                                                    var tags = GeometryDecoder.GetTags(f, layer_transportation);
                                                    if (tags.ContainsKey("class"))
                                                    {
                                                        if (roadProperties.ContainsKey(tags["class"].StringValue))
                                                        {
                                                            var p = roadProperties[tags["class"].StringValue];
                                                            if (tags["class"].StringValue == "rail" || tags["class"].StringValue == "transit")
                                                            {
                                                                GeometryDecoder.DrawGeometry(f, canvasSize / 4096f, ds, p.Item1, p.Item3, p.Item2 * lineScale, 0, GeometryDecoder.railStrokeStyle);
                                                                //												System.Diagnostics.Debug.WriteLine(t)
                                                            }
                                                            else
                                                            {
                                                                GeometryDecoder.DrawGeometry(f, canvasSize / 4096f, ds, p.Item1, p.Item3, p.Item2 * lineScale, 0, GeometryDecoder.normalStrokeStyle);
                                                            }
                                                        }
                                                        else
                                                        {
                                                            System.Diagnostics.Debug.WriteLine($"Unsupported class: {tags["class"]}");
                                                            GeometryDecoder.DrawGeometry(f, canvasSize / 4096f, ds, rc.Item1, rc.Item3, rc.Item2 * lineScale, 0, GeometryDecoder.normalStrokeStyle);
                                                        }
                                                    }
                                                    else
                                                    {
                                                        GeometryDecoder.DrawGeometry(f, canvasSize / 4096f, ds, rc.Item1, rc.Item3, rc.Item2 * lineScale, 0, GeometryDecoder.normalStrokeStyle);
                                                    }
                                                }
                                            }



                                            //								layer_transportation?.Features.ForEach(f =>
                                            //								{
                                            //									var tags = GeometryDecoder.GetTags(f, layer_transportation);

                                            //									if (tags.ContainsKey("class"))
                                            //									{
                                            //										if (roadProperties.ContainsKey(tags["class"].StringValue))
                                            //										{
                                            //											var p = roadProperties[tags["class"].StringValue];
                                            //											GeometryDecoder.DrawGeometry(f, canvasSize / 4096f, ds, p.Item1, p.Item3, 0, p.Item4 * lineScale);
                                            //										}
                                            //										else
                                            //										{
                                            //											GeometryDecoder.DrawGeometry(f, canvasSize / 4096f, ds, rc.Item1, rc.Item3, 0, rc.Item4 * lineScale);
                                            //										}
                                            //									}
                                            //									else
                                            //										GeometryDecoder.DrawGeometry(f, canvasSize / 4096f, ds, rc.Item1, rc.Item3, 0, rc.Item4 * lineScale);
                                            //								});

                                            //								layer_transportation?.Features.ForEach(f =>
                                            //								{
                                            //									var tags = GeometryDecoder.GetTags(f, layer_transportation);
                                            //									if (tags.ContainsKey("class"))
                                            //									{
                                            //										if (roadProperties.ContainsKey(tags["class"].StringValue))
                                            //										{
                                            //											var p = roadProperties[tags["class"].StringValue];
                                            //											if (tags["class"].StringValue == "rail")
                                            //											{
                                            //												GeometryDecoder.DrawGeometry(f, canvasSize / 4096f, ds, p.Item1, p.Item3, p.Item2 * lineScale, 0, GeometryDecoder.railStrokeStyle);
                                            ////												System.Diagnostics.Debug.WriteLine(t)
                                            //											}
                                            //											else
                                            //												GeometryDecoder.DrawGeometry(f, canvasSize / 4096f, ds, p.Item1, p.Item3, p.Item2 * lineScale, 0);
                                            //										}
                                            //										else
                                            //										{
                                            //											System.Diagnostics.Debug.WriteLine($"Unsupported class: {tags["class"]}");
                                            //											GeometryDecoder.DrawGeometry(f, canvasSize / 4096f, ds, rc.Item1, rc.Item3, rc.Item2 * lineScale, 0);
                                            //										}
                                            //									}
                                            //									else
                                            //										GeometryDecoder.DrawGeometry(f, canvasSize / 4096f, ds, rc.Item1, rc.Item3, rc.Item2 * lineScale, 0);
                                            //								});



                                            layer_housenumber?.Features.ForEach(f =>
                                            {
                                                var tags    = GeometryDecoder.GetTags(f, layer_housenumber);
                                                string text = tags["housenumber"].StringValue;
                                                //GeometryDecoder.DrawHousenumber(f, canvasSize / 4096f, textDs, Colors.Black, Colors.White, 1, 1.2f, text);
                                                GeometryDecoder.DrawText(f, canvasSize / 4096f, textDs, Colors.Black, Colors.White, 1, 1.2f, text, 2f);
                                            });

                                            layer_poi?.Features.ForEach(f => {
                                                var tags = GeometryDecoder.GetTags(f, layer_poi);
                                                if (tags.ContainsKey("subclass"))
                                                {
                                                    string subclass = tags["subclass"].StringValue;
                                                    if (icons.ContainsKey(subclass + "_11"))
                                                    {
                                                        GeometryDecoder.DrawIcon(f, canvasSize / 4096f, ds, icons[subclass + "_11"], Colors.Black, Colors.DarkGray);
                                                    }
                                                }
                                            });


                                            layer_transportation_name?.Features.ForEach(f =>
                                            {
                                                var tags = GeometryDecoder.GetTags(f, layer_transportation_name);
                                                if (tags.ContainsKey("name"))
                                                {
                                                    string text = tags["name"].StringValue;
                                                    GeometryDecoder.DrawText(f, canvasSize / 4096f, textDs, Colors.Black, Colors.White, 1, 1.2f, text, 3f);
                                                }
                                            });
                                        }
                                    }
                        //StorageFolder storageFolder = KnownFolders.PicturesLibrary;
                        //StorageFile file = await storageFolder.CreateFileAsync("map.bmp", CreationCollisionOption.ReplaceExisting);
                        //var stream = await file.OpenAsync(Windows.Storage.FileAccessMode.ReadWrite);
                        //await GeometryDecoder.offscreen.SaveAsync(stream, CanvasBitmapFileFormat.Bmp);
                        //stream.Dispose();



                        stopwatch.Stop();


                        System.Diagnostics.Debug.WriteLine($"TIME: {stopwatch.ElapsedMilliseconds} ms");
                        textOutput.Text = $"TIME: {stopwatch.ElapsedMilliseconds} ms";
                    }
                }
                else
                {
                    currentTile = null;
                }
            }

            win2dCanvas.Invalidate();
        }