public VPXFile(string filename) { _cf = new CompoundFile(filename, CFSUpdateMode.ReadOnly, CFSConfiguration.Default); CFStorage gameStg = _cf.RootStorage.GetStorage("GameStg"); UInt32 version = new VPXReader(gameStg.GetStream("Version")).ReadUInt32(); void visitor(CFItem item) { if (item.Name.StartsWith("Image") && item is CFStream stream) { ReadImage(stream, true); } } gameStg.VisitEntries(visitor, true); }
private byte[] ReadImage(CFStream stream, bool nameOnly) { var reader = new VPXReader(stream); var inJpg = false; int size = 0; var done = false; byte[] data = null; var entry = new Entry(); entry._stream = stream; while (!done) { var bytesInRecordRemaining = reader.ReadUInt32(); var tag = reader.ReadString(Encoding.ASCII, 4); switch (tag) { case "ENDB": if (inJpg) { inJpg = false; } else { done = true; } break; case "NAME": entry._name = reader.ReadLenPrefixedString(Encoding.ASCII); _images[entry._name] = entry; break; case "PATH": entry._file = reader.ReadLenPrefixedString(Encoding.ASCII); break; case "INME": reader.ReadLenPrefixedString(Encoding.ASCII); break; case "WDTH": reader.ReadUInt32(); break; case "HGHT": reader.ReadUInt32(); break; case "SIZE": size = reader.ReadInt32(); break; case "ALTV": reader.Skip(4); // skip the float break; case "JPEG": inJpg = true; break; case "DATA": if (nameOnly) { done = true; } else { data = reader.Read(size); if (data[0] == 0x89 && data[1] == 0x50 && data[2] == 0x4E && data[3] == 0x47 && data[4] == 0x0D && data[5] == 0x0A && data[6] == 0x1A && data[7] == 0x0A) { // PNG } else if (data[0] == 0xFF && data[1] == 0xD8) { // JPG } else if (data[0] == 0x23 && data[1] == 0x3F && data[2] == 0x52 && data[3] == 0x41 && data[4] == 0x44 && data[5] == 0x49 && data[6] == 0x41 && data[7] == 0x4E && data[8] == 0x43 && data[9] == 0x45 && data[10] == 0x0A) { // HDR (unsupported) data = null; } else { data = null; } } break; } } return(data); }