11using System ;
22using System . Collections . Generic ;
3+ using System . Drawing . Imaging ;
34using System . Linq ;
45using System . IO ;
56using Sledge . Graphics ;
@@ -11,6 +12,54 @@ namespace Sledge.Providers.Texture
1112{
1213 public class WadProvider : TextureProvider
1314 {
15+ private static Bitmap PostProcessBitmap ( string name , Bitmap bmp )
16+ {
17+ // Transparent textures are named like: {Name
18+ if ( name . StartsWith ( "{" ) )
19+ {
20+ var palette = bmp . Palette ;
21+
22+ // Two transparency types: "blue" transparency and "decal" transparency
23+ // Decal transparency is all greyscale and doesn't contain any of palette #255 colour
24+ var blueTransparency = false ;
25+ for ( var i = 0 ; i < palette . Entries . Length - 1 ; i ++ )
26+ {
27+ var color = palette . Entries [ i ] ;
28+ if ( color . R != color . B || color . R != color . G || color . B != color . G )
29+ {
30+ blueTransparency = true ;
31+ break ;
32+ }
33+ }
34+
35+ if ( blueTransparency )
36+ {
37+ // We found the last index, therefore it should be transparent
38+ palette . Entries [ palette . Entries . Length - 1 ] = Color . Transparent ;
39+ }
40+ else
41+ {
42+ // If we didn't find the last index, we have a decal
43+ var last = palette . Entries [ palette . Entries . Length - 1 ] ;
44+ for ( var i = 0 ; i < palette . Entries . Length - 1 ; i ++ )
45+ {
46+ palette . Entries [ i ] = Color . FromArgb ( 255 - palette . Entries [ i ] . R , last ) ;
47+ }
48+ }
49+ bmp . Palette = palette ;
50+
51+ // Copy the bitmap to a new one with a proper alpha channel
52+ var clone = new Bitmap ( bmp . Width , bmp . Height , PixelFormat . Format32bppArgb ) ;
53+ using ( var g = System . Drawing . Graphics . FromImage ( clone ) )
54+ {
55+ g . DrawImage ( bmp , new Rectangle ( 0 , 0 , clone . Width , clone . Height ) ) ;
56+ }
57+ bmp . Dispose ( ) ;
58+ return clone ;
59+ }
60+ return bmp ;
61+ }
62+
1463 public class WadStreamSource : TextureStreamSource
1564 {
1665 private readonly Dictionary < string , Tuple < HLLib . Package , HLLib . Folder > > _packages ;
@@ -34,7 +83,8 @@ public override Bitmap GetImage(TextureItem item)
3483 {
3584 using ( var stream = root . Item1 . CreateStream ( search ) )
3685 {
37- return new Bitmap ( new MemoryStream ( stream . ReadAll ( ) ) ) ;
86+ var bmp = new Bitmap ( new MemoryStream ( stream . ReadAll ( ) ) ) ;
87+ return PostProcessBitmap ( item . Name , bmp ) ;
3888 }
3989 }
4090 return null ;
@@ -72,10 +122,10 @@ protected override void LoadTexture(TexturePackage package, string name)
72122 var item = pack . GetRootFolder ( ) . GetItemByName ( name + ".bmp" , HLLib . FindType . Files ) ;
73123 using ( var stream = pack . CreateStream ( item ) )
74124 {
75- using ( var bmp = new Bitmap ( new MemoryStream ( stream . ReadAll ( ) ) ) )
76- {
77- TextureHelper . Create ( name , bmp ) ;
78- }
125+ var bmp = new Bitmap ( new MemoryStream ( stream . ReadAll ( ) ) ) ;
126+ bmp = PostProcessBitmap ( name , bmp ) ;
127+ TextureHelper . Create ( name , bmp ) ;
128+ bmp . Dispose ( ) ;
79129 }
80130 }
81131 }
@@ -99,10 +149,10 @@ protected override void LoadTextures(TexturePackage package, IEnumerable<string>
99149 if ( ! item . Exists ) continue ;
100150 using ( var stream = pack . CreateStream ( item ) )
101151 {
102- using ( var bmp = new Bitmap ( new MemoryStream ( stream . ReadAll ( ) ) ) )
103- {
104- TextureHelper . Create ( name , bmp ) ;
105- }
152+ var bmp = new Bitmap ( new MemoryStream ( stream . ReadAll ( ) ) ) ;
153+ bmp = PostProcessBitmap ( name , bmp ) ;
154+ TextureHelper . Create ( name , bmp ) ;
155+ bmp . Dispose ( ) ;
106156 }
107157 }
108158 }
0 commit comments