| 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 |
} |