public void ReadH2BitmapRaw(int TagIndex, Map map, bool dontreadraw)
{
// Offset 68 = Bitmap Data reflexive
map.BR.BaseStream.Position = map.MetaInfo.Offset[TagIndex] + 68;
int tempc = map.BR.ReadInt32();
int tempr = map.BR.ReadInt32() - map.SecondaryMagic;
for (int x = 0; x < tempc; x++)
{
// Bitmap Data reflexive is 116 bytes large
// Offset 4 in BD reflexive is (short) width
map.BR.BaseStream.Position = tempr + (x * 116) + 4;
int width = map.BR.ReadInt16();
// Offset 6 in BD reflexive is (short) width
int height = map.BR.ReadInt16();
// Offset 8 in BD reflexive is (short) width
int depth = map.BR.ReadInt16();
// Offset 10 in BD reflexive is (short) type
int type = map.BR.ReadInt16();
// Offset 12 in BD reflexive is (short) format
int format = map.BR.ReadInt16();
// Offset 20 in BD reflexive is (short) mipmap Count
map.BR.BaseStream.Position = tempr + (x * 116) + 20;
int mipmapCount = map.BR.ReadInt16();
for (int xx = 0; xx < 6; xx++)
{
BitmapRawDataChunk Raw = new BitmapRawDataChunk();
Raw.inchunk = x;
Raw.num = xx;
Raw.pointerMetaOffset = tempr + (x * 116) + 28 + (xx * 4) - map.MetaInfo.Offset[TagIndex];
Raw.rawDataType = RawDataType.bitm;
map.BR.BaseStream.Position = map.MetaInfo.Offset[TagIndex] + Raw.pointerMetaOffset;
Raw.offset = map.BR.ReadInt32();
if (Raw.offset == -1)
{
break;
}
map.BR.BaseStream.Position = map.MetaInfo.Offset[TagIndex] + Raw.pointerMetaOffset + 24;
Raw.size = map.BR.ReadInt32();
map.Functions.ParsePointer(ref Raw.offset, ref Raw.rawLocation);
if (dontreadraw == false)
{
map.OpenMap(Raw.rawLocation);
map.BR.BaseStream.Position = Raw.offset;
Raw.MS = new MemoryStream(Raw.size);
Raw.MS.Write(map.BR.ReadBytes(Raw.size), 0, Raw.size);
#region mipmap loading section
int offset = 0;
int Bpp = 4; // 32 bit
switch (format)
{
case 0:
case 1:
case 2:
case 17:
Bpp = 1; // 8 bit
break;
case 3:
case 6:
case 8:
case 9:
case 22:
Bpp = 2; // 16 bit
break;
}
for (int xxx = xx; xxx < mipmapCount; xxx++)
{
mipmapDataChunk mipmapDC = new mipmapDataChunk();
mipmapDC.width = width >> xxx;
mipmapDC.height = height >> xxx;
mipmapDC.depth = depth >> xxx != 0 ? depth >> xxx : 1;
mipmapDC.offset = offset;
mipmapDC.size = mipmapDC.width * mipmapDC.height * mipmapDC.depth * Bpp;
// if (type == 2) // Cubemap, 6 sides
// mipmapDC.size *= 6;
switch (format)
{
case 14: // DXT1
mipmapDC.size /= 8;
break;
case 15: // DXT3
case 16: // DXT5
mipmapDC.size /= 4;
break;
}
offset += mipmapDC.size;
Raw.mipmaps.Add(mipmapDC);
}
#endregion
map.OpenMap(MapTypes.Internal);
}
this.rawChunks.Add(Raw);
}
}
}