|
|
@@ -1,5 +1,6 @@ |
|
|
using System; |
|
|
using System.Collections.Generic; |
|
|
using System.Drawing.Imaging; |
|
|
using System.Linq; |
|
|
using System.IO; |
|
|
using Sledge.Graphics; |
|
@@ -11,6 +12,54 @@ namespace Sledge.Providers.Texture |
|
|
{ |
|
|
public class WadProvider : TextureProvider |
|
|
{ |
|
|
private static Bitmap PostProcessBitmap(string name, Bitmap bmp) |
|
|
{ |
|
|
// Transparent textures are named like: {Name |
|
|
if (name.StartsWith("{")) |
|
|
{ |
|
|
var palette = bmp.Palette; |
|
|
|
|
|
// Two transparency types: "blue" transparency and "decal" transparency |
|
|
// Decal transparency is all greyscale and doesn't contain any of palette #255 colour |
|
|
var blueTransparency = false; |
|
|
for (var i = 0; i < palette.Entries.Length - 1; i++) |
|
|
{ |
|
|
var color = palette.Entries[i]; |
|
|
if (color.R != color.B || color.R != color.G || color.B != color.G) |
|
|
{ |
|
|
blueTransparency = true; |
|
|
break; |
|
|
} |
|
|
} |
|
|
|
|
|
if (blueTransparency) |
|
|
{ |
|
|
// We found the last index, therefore it should be transparent |
|
|
palette.Entries[palette.Entries.Length - 1] = Color.Transparent; |
|
|
} |
|
|
else |
|
|
{ |
|
|
// If we didn't find the last index, we have a decal |
|
|
var last = palette.Entries[palette.Entries.Length - 1]; |
|
|
for (var i = 0; i < palette.Entries.Length - 1; i++) |
|
|
{ |
|
|
palette.Entries[i] = Color.FromArgb(255 - palette.Entries[i].R, last); |
|
|
} |
|
|
} |
|
|
bmp.Palette = palette; |
|
|
|
|
|
// Copy the bitmap to a new one with a proper alpha channel |
|
|
var clone = new Bitmap(bmp.Width, bmp.Height, PixelFormat.Format32bppArgb); |
|
|
using (var g = System.Drawing.Graphics.FromImage(clone)) |
|
|
{ |
|
|
g.DrawImage(bmp, new Rectangle(0, 0, clone.Width, clone.Height)); |
|
|
} |
|
|
bmp.Dispose(); |
|
|
return clone; |
|
|
} |
|
|
return bmp; |
|
|
} |
|
|
|
|
|
public class WadStreamSource : TextureStreamSource |
|
|
{ |
|
|
private readonly Dictionary<string, Tuple<HLLib.Package, HLLib.Folder>> _packages; |
|
@@ -34,7 +83,8 @@ public override Bitmap GetImage(TextureItem item) |
|
|
{ |
|
|
using (var stream = root.Item1.CreateStream(search)) |
|
|
{ |
|
|
return new Bitmap(new MemoryStream(stream.ReadAll())); |
|
|
var bmp = new Bitmap(new MemoryStream(stream.ReadAll())); |
|
|
return PostProcessBitmap(item.Name, bmp); |
|
|
} |
|
|
} |
|
|
return null; |
|
@@ -72,10 +122,10 @@ protected override void LoadTexture(TexturePackage package, string name) |
|
|
var item = pack.GetRootFolder().GetItemByName(name + ".bmp", HLLib.FindType.Files); |
|
|
using (var stream = pack.CreateStream(item)) |
|
|
{ |
|
|
using (var bmp = new Bitmap(new MemoryStream(stream.ReadAll()))) |
|
|
{ |
|
|
TextureHelper.Create(name, bmp); |
|
|
} |
|
|
var bmp = new Bitmap(new MemoryStream(stream.ReadAll())); |
|
|
bmp = PostProcessBitmap(name, bmp); |
|
|
TextureHelper.Create(name, bmp); |
|
|
bmp.Dispose(); |
|
|
} |
|
|
} |
|
|
} |
|
@@ -99,10 +149,10 @@ protected override void LoadTextures(TexturePackage package, IEnumerable<string> |
|
|
if (!item.Exists) continue; |
|
|
using (var stream = pack.CreateStream(item)) |
|
|
{ |
|
|
using (var bmp = new Bitmap(new MemoryStream(stream.ReadAll()))) |
|
|
{ |
|
|
TextureHelper.Create(name, bmp); |
|
|
} |
|
|
var bmp = new Bitmap(new MemoryStream(stream.ReadAll())); |
|
|
bmp = PostProcessBitmap(name, bmp); |
|
|
TextureHelper.Create(name, bmp); |
|
|
bmp.Dispose(); |
|
|
} |
|
|
} |
|
|
} |
|
|