diff --git a/Source/Core/Data/ImageData.cs b/Source/Core/Data/ImageData.cs index 016b3f4cb215e807d32f7353a7be99a20920a81b..480d600e4d1903aeb216f30d0f5a34de3c050b24 100755 --- a/Source/Core/Data/ImageData.cs +++ b/Source/Core/Data/ImageData.cs @@ -17,6 +17,7 @@ #region ================== Namespaces using System; +using System.Collections; using System.Collections.Generic; using System.Drawing; using System.Drawing.Drawing2D; @@ -70,8 +71,13 @@ namespace CodeImp.DoomBuilder.Data private ImageLoadState imagestate; private bool loadfailed; + // Alpha test + private BitArray alphatest; + private int alphatestWidth = 64; + private int alphatestHeight = 64; + // GDI bitmap - private Bitmap bitmap; + private Bitmap loadedbitmap; private Bitmap previewbitmap; private Bitmap spritepreviewbitmap; @@ -146,12 +152,12 @@ namespace CodeImp.DoomBuilder.Data // Not already disposed? if(!isdisposed) { - // Clean up - bitmap?.Dispose(); + // Clean up + loadedbitmap?.Dispose(); previewbitmap?.Dispose(); spritepreviewbitmap?.Dispose(); texture?.Dispose(); - bitmap = null; + loadedbitmap = null; previewbitmap = null; spritepreviewbitmap = null; texture = null; @@ -190,30 +196,22 @@ namespace CodeImp.DoomBuilder.Data shortnamewidth = (int)Math.Ceiling(General.Interface.MeasureString(shortname, SystemFonts.MessageBoxFont, 10000, StringFormat.GenericTypographic).Width) + 6; } - // This returns the bitmap image - Bitmap GetBitmap() - { - // Image loaded successfully? - if(!loadfailed && (imagestate == ImageLoadState.Ready) && (bitmap != null)) - return bitmap; - - // Image loading failed? - return (loadfailed ? Properties.Resources.Failed : Properties.Resources.Hourglass); - } - public int GetAlphaTestWidth() { - return GetBitmap().Width; + return alphatestWidth; } public int GetAlphaTestHeight() { - return GetBitmap().Height; + return alphatestHeight; } public bool AlphaTestPixel(int x, int y) { - return GetBitmap().GetPixel(x, y).A > 0; + if (alphatest != null) + return alphatest.Get(x + y * alphatestWidth); + else + return true; } public Image GetBackgroundBitmap() @@ -269,6 +267,7 @@ namespace CodeImp.DoomBuilder.Data ConvertImageFormat(loadResult); MakeImagePreview(loadResult); + MakeAlphaTestImage(loadResult); // Save memory by disposing the original image immediately if we only used it to load a preview image bool onlyPreview = false; @@ -293,10 +292,13 @@ namespace CodeImp.DoomBuilder.Data loadfailed = true; } - bitmap?.Dispose(); + loadedbitmap?.Dispose(); texture?.Dispose(); imagestate = ImageLoadState.Ready; - bitmap = loadResult.bitmap; + loadedbitmap = loadResult.bitmap; + alphatest = loadResult.alphatest; + alphatestWidth = loadResult.alphatestWidth; + alphatestHeight = loadResult.alphatestHeight; if (loadResult.uiThreadWork != null) loadResult.uiThreadWork(); @@ -342,6 +344,9 @@ namespace CodeImp.DoomBuilder.Data public Bitmap bitmap; public Bitmap preview; + public BitArray alphatest; + public int alphatestWidth; + public int alphatestHeight; public List<LogMessage> messages; public Action uiThreadWork; } @@ -610,6 +615,29 @@ namespace CodeImp.DoomBuilder.Data loadResult.preview = preview; } + void MakeAlphaTestImage(LocalLoadResult loadResult) + { + if (loadResult.bitmap == null) + return; + + int width = loadResult.bitmap.Width; + int height = loadResult.bitmap.Height; + loadResult.alphatestWidth = width; + loadResult.alphatestHeight = height; + for (int y = 0; y < height; y++) + { + for (int x = 0; x < width; x++) + { + if (loadResult.bitmap.GetPixel(x, y).A == 0) + { + if (loadResult.alphatest == null) + loadResult.alphatest = new BitArray(width * height, true); + loadResult.alphatest.Set(x + y * width, false); + } + } + } + } + Texture GetTexture() { if (texture != null) @@ -625,13 +653,18 @@ namespace CodeImp.DoomBuilder.Data return General.Map.Data.LoadingTexture; } - texture = new Texture(General.Map.Graphics, bitmap); + texture = new Texture(General.Map.Graphics, loadedbitmap); if (dynamictexture) { if ((width != texture.Width) || (height != texture.Height)) throw new Exception("Could not create a texture with the same size as the image."); } + else + { + loadedbitmap.Dispose(); + loadedbitmap = null; + } #if DEBUG texture.Tag = name; //mxd. Helps with tracking undisposed resources... @@ -647,7 +680,7 @@ namespace CodeImp.DoomBuilder.Data if((texture != null) && !texture.Disposed) { - General.Map.Graphics.SetPixels(texture, bitmap); + General.Map.Graphics.SetPixels(texture, loadedbitmap); } }