public System.Drawing.Bitmap GetImage(string name)
 {
     if (LoadedImages.ContainsKey(name))
     {
         return(LoadedImages[name].image);
     }
     else
     {
         return(null);
     }
 }
 public virtual void AddImageToSelection(string id, bool checkExistence = false)
 {
     Debug.Assert(id != null, $"{nameof(id)} cannot be null");
     if (checkExistence && _selectedImages.Contains(id))
     {
         return;
     }
     if (LoadedImages.Contains(id))
     {
         _selectedImages.Add(id);
     }
 }
 public void ResetImages()
 {
     LoadedImages.Clear();
     LoadDefaults();
 }
        unsafe void CompositionTarget_Rendering(object sender, EventArgs e)
        {
            RenderingEventArgs args = (RenderingEventArgs)e;

            // It's possible for Rendering to call back twice in the same frame
            // so only render when we haven't already rendered in this frame.
            if (_lastRender != args.RenderingTime)
            {
                if (!LoadedImages.ContainsKey("roaam_path"))
                {
                    LoadDefaults();
                }

                foreach (Article art in articles)
                {
                    string spriteName = art.Sprite;
                    // Check if the sprite is loaded
                    if (!LoadedImages.ContainsKey(spriteName))
                    {
                        // If spritename is set, attempt to load sprite
                        bool hasSprite = false;
                        if (!string.IsNullOrEmpty(spriteName))
                        {
                            hasSprite = WindowAPI.LoadImage(spriteName, renderer, out TexData data);
                            LoadedImages.Add(spriteName, data);
                        }

                        // If no sprite is found, use EmptyImage for this article
                        if (!hasSprite)
                        {
                            BitmapImage overrideSpr = FindResource("EmptyImage") as BitmapImage;
                            WindowAPI.RegisterTexture(renderer, spriteName, AppDomain.CurrentDomain.BaseDirectory + overrideSpr.UriSource.LocalPath, 1, out int texture);
                            LoadedImages[spriteName] = new TexData(false, texture, null);
                        }
                    }

                    // Get texture data for this article
                    TexData sprite             = LoadedImages[spriteName];
                    Point   offset             = art.RealPoint - new Vector(sprite.offset.X, sprite.offset.Y);
                    Point   scale              = new Point(1, 1);
                    System.Drawing.Color color = System.Drawing.Color.White;

                    switch (art.ArticleNum)
                    {
                    case ArticleType.Terrain:
                        scale = new Point(2, 2);
                        break;

                    case ArticleType.Zone:
                        if (art is Zone zone)
                        {
                            scale = new Point(zone.TriggerWidth, zone.TriggerHeight);
                            // Set the color based on event type
                            switch (zone.EventID)
                            {
                            //blastzone
                            case 4:
                                color = System.Drawing.Color.Red;
                                break;
                            }
                            // Make semi-transparent
                            color = System.Drawing.Color.FromArgb(64, color.R, color.G, color.B);

                            // Show transform handles
                            if (SelectedObj == art)
                            {
                                // Push a box at each corner of the zone for scale handles
                                TexData spr = LoadedImages["roaam_square"];
                                foreach (Point point in ROAAM_CONST.ZONE_POINTS)
                                {
                                    PushArticle(new DX_Article(
                                                    spr.texture,
                                                    zone.RealPoint + new Vector(point.X * zone.TriggerWidth, point.Y * zone.TriggerHeight) - (Vector)spr.offset / zoomLevel,
                                                    new Point(1 / zoomLevel, 1 / zoomLevel),
                                                    -15));
                                }
                            }
                        }
                        break;

                    case ArticleType.Target:
                        if (SelectedObj == art && (art as Target).Path.Any())
                        {
                            Vector prev = (Vector)(art as Target).Path.Last();
                            for (int i = 0; i < (art as Target).Path.Count; i++)
                            {
                                Vector  point   = (Vector)(art as Target).Path[i];
                                TexData targSpr = LoadedImages["roaam_path"];

                                // Push path point sprite to renderer
                                PushArticle(new DX_Article(
                                                targSpr.texture,
                                                (Point)((point * ROAAM_CONST.GRID_SIZE) - (Vector)targSpr.offset),
                                                new Point(1, 1),
                                                -10));
                                // Push semi-transparent target sprite to renderer
                                PushArticle(new DX_Article(
                                                sprite.texture,
                                                (Point)((point * ROAAM_CONST.GRID_SIZE) - (Vector)sprite.offset),
                                                scale,
                                                art.Depth,
                                                unchecked ((int)0x40FFFFFF)));

                                // Push transform handles if this path point is selected
                                if (SelectedPath == i)
                                {
                                    TexData arrowSpr = LoadedImages["roaam_arrows"];
                                    PushArticle(new DX_Article(
                                                    arrowSpr.texture,
                                                    (Point)((point * ROAAM_CONST.GRID_SIZE) - ((Vector)arrowSpr.offset / zoomLevel)),
                                                    new Point(1 / zoomLevel, 1 / zoomLevel),
                                                    -15));
                                }

                                // Push path line to renderer, and highlight orange if selected in editor panel
                                IntPtr pathColor = WhiteBrush;
                                float  width     = 2;
                                if (i == ObjViewer.Instance.HighlightedPath)
                                {
                                    pathColor = OrangeBrush;
                                    width     = 4;
                                }
                                PushLine(new DX_Line((Point)(prev * ROAAM_CONST.GRID_SIZE),
                                                     (Point)(point * ROAAM_CONST.GRID_SIZE),
                                                     width,
                                                     art.Depth - 0.1f,
                                                     pathColor));
                                // Store this point for line drawing
                                prev = point;
                            }
                        }
                        break;

                    case ArticleType.Tilemap:
                        if (art is Tilemap tilemap)
                        {
                            Tileset tileset = tilemap.Tileset;
                            if (tileset == null || string.IsNullOrEmpty(tileset.SpritePath))
                            {
                                continue;
                            }
                            // Check if the sprite is loaded
                            if (!LoadedImages.ContainsKey(tileset.SpritePath))
                            {
                                // If spritename is set, attempt to load sprite
                                bool hasSprite = false;
                                if (!string.IsNullOrEmpty(tileset.SpritePath))
                                {
                                    hasSprite = WindowAPI.LoadImage(tileset.SpritePath, renderer, out TexData data);
                                    LoadedImages.Add(tileset.SpritePath, data);
                                }

                                // If no sprite is found, use EmptyImage for this article
                                if (!hasSprite)
                                {
                                    BitmapImage overrideSpr = FindResource("EmptyImage") as BitmapImage;
                                    WindowAPI.RegisterTexture(renderer, tileset.SpritePath, AppDomain.CurrentDomain.BaseDirectory + overrideSpr.UriSource.LocalPath, 1, out int texture);
                                    LoadedImages[tileset.SpritePath] = new TexData(false, texture, null);
                                }
                            }

                            TexData tex = LoadedImages[tileset.SpritePath];
                            foreach (var tilegrid in tilemap.Tilegrid)
                            {
                                Point pos = new Point(tileset.TileWidth * 2 * TilegridArray.ChunkSizeX * tilegrid.Key.Item1 + tilemap.RealPoint.X,
                                                      tileset.TileHeight * 2 * TilegridArray.ChunkSizeY * tilegrid.Key.Item2 + tilemap.RealPoint.Y);
                                PushTilemap(new DX_Tilemap(tex.texture, pos, tileset.TileWidth, tileset.TileHeight, tilegrid.Value, tilemap.Depth, new Point(2, 2)));
                            }
                        }
                        break;
                    }

                    if (art.ArticleNum != ArticleType.Tilemap)
                    {
                        var c = color.ToArgb();
                        // Push the article sprite to the renderer
                        PushArticle(new DX_Article(
                                        sprite.texture,
                                        new Point(offset.X, offset.Y),
                                        scale,
                                        art.Depth,
                                        SelectedObj == art ? System.Drawing.Color.Orange.ToArgb() : color.ToArgb()));
                    }

                    if (SelectedObj == art && SelectedPath == -1 && Overlay.Visibility != Visibility.Visible)
                    {
                        TexData arrowSpr = LoadedImages["roaam_arrows"];
                        if (art is Zone zone)
                        {
                            offset = new Point(offset.X + zone.TriggerWidth / 2, offset.Y + zone.TriggerHeight / 2);
                        }

                        // Push the transform handles to the renderer if selected
                        PushArticle(new DX_Article(
                                        arrowSpr.texture,
                                        offset - ((Vector)arrowSpr.offset / zoomLevel),
                                        new Point(1 / zoomLevel, 1 / zoomLevel),
                                        -15));
                    }
                }

                if (ApplicationSettings.Instance.ActiveProject != null)
                {
                    TexData respawnSpr = LoadedImages["roaam_respawn"];
                    PushArticle(new DX_Article(
                                    respawnSpr.texture,
                                    ApplicationSettings.Instance.ActiveProject.RespawnPoint - (Vector)respawnSpr.offset,
                                    new Point(1, 1),
                                    5));
                }

                WindowAPI.PrepareForRender(renderer);
                WindowAPI.SetCameraTransform(renderer, new Point(RenderOffset.X, RenderOffset.Y), zoomLevel);
                WindowAPI.Render(renderer, articles_internal, articles_count_internal, lines_internal, lines_count_internal, tilemap_internal, tilemap_count_internal);

                ClearArticles();
                ClearLines();
                ClearTilemaps();

                _lastRender = args.RenderingTime;
            }
        }