1 |
using System; |
2 |
using System.Collections.Generic; |
3 |
|
4 |
namespace Oni.Imaging |
5 |
{ |
6 |
internal static class DdsReader |
7 |
{ |
8 |
public static List<Surface> Read(string filePath, bool noMipMaps) |
9 |
{ |
10 |
var surfaces = new List<Surface>(); |
11 |
|
12 |
using (var reader = new BinaryReader(filePath)) |
13 |
{ |
14 |
var header = DdsHeader.Read(reader); |
15 |
var format = header.GetSurfaceFormat(); |
16 |
|
17 |
for (int i = 0; i < header.MipmapCount; i++) |
18 |
{ |
19 |
int width = Math.Max(header.Width >> i, 1); |
20 |
int height = Math.Max(header.Height >> i, 1); |
21 |
|
22 |
if (format == SurfaceFormat.DXT1) |
23 |
{ |
24 |
width = Math.Max(width, 4); |
25 |
height = Math.Max(height, 4); |
26 |
} |
27 |
|
28 |
var surface = new Surface(width, height, format); |
29 |
reader.Read(surface.Data, 0, surface.Data.Length); |
30 |
surfaces.Add(surface); |
31 |
|
32 |
if (noMipMaps) |
33 |
break; |
34 |
} |
35 |
} |
36 |
|
37 |
return surfaces; |
38 |
} |
39 |
} |
40 |
} |