private SmartStream ReadBrotli(EndianReader reader) { using (SmartStream stream = SmartStream.CreateMemory()) { using (BrotliInputStream brotliStream = new BrotliInputStream(reader.BaseStream)) { brotliStream.CopyTo(stream); } return(stream.CreateReference()); } }
private byte[] ReadBrotli(EndianReader reader) { using (MemoryStream stream = new MemoryStream()) { using (BrotliInputStream brotliStream = new BrotliInputStream(reader.BaseStream)) { brotliStream.CopyTo(stream); } return(stream.ToArray()); } }
public static FileReader DecompressBrotli(FileReader reader) { using (reader) { var stream = new MemoryStream(); using (var brotliStream = new BrotliInputStream(reader.BaseStream)) { brotliStream.CopyTo(stream); } stream.Position = 0; return(new FileReader(reader.FullPath, stream)); } }
private void ReadBrotli(EndianReader reader) { using (SmartStream stream = SmartStream.CreateMemory()) { using (BrotliInputStream brotliStream = new BrotliInputStream(reader.BaseStream)) { brotliStream.CopyStream(stream); stream.Position = 0; } string name = Path.GetFileName(m_filePath); ArchiveFileEntry entry = new ArchiveFileEntry(stream, m_filePath, name, 0, stream.Length); Metadata = new ArchiveMetadata(entry); } }
private byte[] ReadBrotli(EndianReader reader) { using (MemoryStream stream = new MemoryStream()) { using (BrotliInputStream brotliStream = new BrotliInputStream(reader.BaseStream)) { int count; byte[] buffer = new byte[81920]; while ((count = brotliStream.Read(buffer, 0, buffer.Length)) > 0) { stream.Write(buffer, 0, count); } } return(stream.ToArray()); } }
private void ReadBrotli(EndianStream stream, bool isClosable) { MemoryStream memStream = new MemoryStream(); using (BrotliInputStream brotliStream = new BrotliInputStream(stream.BaseStream)) { brotliStream.CopyStream(memStream); memStream.Position = 0; } if (isClosable) { stream.Dispose(); } using (EndianStream dataStream = new EndianStream(memStream, EndianType.LittleEndian)) { ReadWebFiles(dataStream, true); } }
public WebFile(EndianBinaryReader reader) { var magic = reader.ReadBytes(2); reader.Position = 0; if (gzipMagic.SequenceEqual(magic)) { var stream = new MemoryStream(); using (var gs = new GZipStream(reader.BaseStream, CompressionMode.Decompress)) { gs.CopyTo(stream); } stream.Position = 0; using (var binaryReader = new BinaryReader(stream)) { ReadWebData(binaryReader); } } else { reader.Position = 0x20; magic = reader.ReadBytes(6); reader.Position = 0; if (brotliMagic.SequenceEqual(magic)) { var brotliStream = new BrotliInputStream(reader.BaseStream); var stream = new MemoryStream(); brotliStream.CopyTo(stream); stream.Position = 0; using (var binaryReader = new BinaryReader(stream)) { ReadWebData(binaryReader); } } else { reader.endian = EndianType.LittleEndian; ReadWebData(reader); } } }
private long DecompressAndCalculateCrc(Stream input) { try { long crc = -1; byte[] buffer = new byte[65536]; BrotliInputStream decompressedStream = new BrotliInputStream(input); while (true) { int len = decompressedStream.Read(buffer); if (len <= 0) { break; } crc = UpdateCrc64(crc, buffer, 0, len); } decompressedStream.Close(); return(crc ^ -1); } catch (IOException ex) { throw ex; } }
private bool ImportWoff2(Stream stream) { int sizeRead = 0; // 1. WOFF2Header: File header with basic font type and version, along with offsets // to metadata and private data blocks. _woffHeader = new SvgWoffHeader(); _woffTables = null; var buffer = new byte[SvgWoffHeader.Woff2Size]; sizeRead = stream.Read(buffer, 0, (int)SvgWoffHeader.Woff2Size); Debug.Assert(sizeRead == SvgWoffHeader.Woff2Size); if (!_woffHeader.SetHeader(buffer)) { return(false); } // 2. TableDirectory: Directory of font tables, containing size and other info. _woffTables = new List <SvgWoffTableDirectory>(_woffHeader.NumTables); for (int i = 0; i < _woffHeader.NumTables; i++) { var woffTable = new SvgWoffTableDirectory(); if (woffTable.SetHeader(stream, _woffHeader.IsTrueType)) { if (woffTable.IsTransformed) { _isTransformed = true; } _woffTables.Add(woffTable); } } // 3. CollectionDirectory: An optional table containing the font fragment descriptions // of font collection entries. if (_woffHeader.IsCollection) { //TODO: WOFF2 - Font collection not yet supported return(false); } // 4. CompressedFontData: Contents of font tables, compressed for storage in the WOFF2 file. int bytesRead = 0; int bytesCount = (int)_woffHeader.TotalCompressedSize; if (bytesCount != 0) { byte[] compressedBuffer = SvgWoffObject.ReadBytes(stream, bytesCount, out bytesRead); Debug.Assert(bytesRead == bytesCount); if (bytesRead != bytesCount) { return(false); } using (var brotliStream = new BrotliInputStream(new MemoryStream(compressedBuffer))) { for (int i = 0; i < _woffHeader.NumTables; i++) { var woffTable = _woffTables[i]; bytesCount = (int)woffTable.TransformLength; var tableBuffer = SvgWoffObject.ReadBytes(brotliStream, bytesCount, out bytesRead); Debug.Assert(bytesRead == bytesCount); if (bytesRead != bytesCount) { return(false); } woffTable.CompTable = tableBuffer; woffTable.OrigTable = tableBuffer; if (!_isTransformed) { woffTable.OrigChecksum = woffTable.CalculateChecksum(); } } } } // 5. ExtendedMetadata: An optional block of extended metadata, represented in XML format // and compressed for storage in the WOFF2 file. _metadata = new SvgWoffMetadata(_woffHeader.MetaOffset, _woffHeader.MetaLength, _woffHeader.MetaOrigLength); if (_woffHeader.HasMetadata) { stream.Seek(_woffHeader.MetaOffset, SeekOrigin.Begin); bytesRead = 0; bytesCount = (int)_woffHeader.MetaLength; var metaBuffer = SvgWoffObject.ReadBytes(stream, bytesCount, out bytesRead); Debug.Assert(bytesRead == bytesCount); if (bytesRead != bytesCount) { return(false); } _metadata.Data = metaBuffer; _metadata.OrigData = metaBuffer; if (_woffHeader.MetaLength != _woffHeader.MetaOrigLength) { bytesCount = (int)_woffHeader.MetaOrigLength; using (var brotliStream = new BrotliInputStream(new MemoryStream(metaBuffer))) { var origBuffer = SvgWoffObject.ReadBytes(brotliStream, bytesCount, out bytesRead); Debug.Assert(bytesRead == bytesCount); if (bytesRead != bytesCount) { return(false); } _metadata.OrigData = origBuffer; } } } // 6. PrivateData: An optional block of private data for the font designer, foundry, or vendor to use. _privateData = new SvgWoffPrivateData(_woffHeader.PrivateOffset, _woffHeader.PrivateLength); if (_woffHeader.HasPrivateData) { stream.Seek(_woffHeader.PrivateOffset, SeekOrigin.Begin); bytesRead = 0; bytesCount = (int)_woffHeader.PrivateLength; var privateBuffer = SvgWoffObject.ReadBytes(stream, bytesCount, out bytesRead); Debug.Assert(bytesRead == bytesCount); if (bytesRead != bytesCount) { return(false); } _privateData.Data = privateBuffer; } _woffVersion = 2; // ((List<SvgWoffTableDirectory>)(_woffTables)).Sort(new WoffTableComparer()); return(true); }
private bool ReadWoff2Fonts(Stream stream) { // 1. Read the collection font header _collectionHeader = new CollectionHeader(); if (_collectionHeader.Read(stream) == false) { Trace.TraceError("Collection Font Error: Reading of collection header failed."); return(false); } // 2. Read this collection font entries var numFonts = _collectionHeader.NumFonts; _collectionEntries = new List <CollectionFontEntry>(numFonts); for (ushort i = 0; i < numFonts; i++) { var collectionEntry = new CollectionFontEntry(i); if (collectionEntry.Read(stream, _woffDirs.Count) == false) { return(false); } _collectionEntries.Add(collectionEntry); } // 3. TableDirectory: Directory of font tables, containing size and other info. for (ushort i = 0; i < numFonts; i++) { var collectionEntry = _collectionEntries[i]; var woffFont = new WoffFont(_woffHeader, _collectionHeader, collectionEntry); _woffFonts.Add(woffFont); woffFont.BeginDirectory(_woffVersion); for (ushort j = 0; j < collectionEntry.NumTables; j++) { var index = collectionEntry.TableIndices[j]; var woffDir = _woffDirs[index]; woffFont.AddDirectory(woffDir); } } // 4. CompressedFontData: Contents of font tables, compressed for storage in the WOFF2 file. int bytesRead = 0; int bytesCount = (int)_woffHeader.TotalCompressedSize; if (bytesCount != 0) { byte[] compressedBuffer = WoffBuffer.ReadBytes(stream, bytesCount, out bytesRead); Debug.Assert(bytesRead == bytesCount); if (bytesRead != bytesCount) { return(false); } bool errorOccurred = false; var memoryStream = new MemoryStream(compressedBuffer); using (var brotliStream = new BrotliInputStream(memoryStream)) { var decompressedStream = new MemoryStream(); brotliStream.CopyTo(decompressedStream); decompressedStream.Seek(0, SeekOrigin.Begin); for (int i = 0; i < _woffHeader.NumTables; i++) { var woffDir = _woffDirs[i]; try { // bytesCount = (int)woffDir.TransformLength; bytesCount = (int)woffDir.CompLength; decompressedStream.Seek(woffDir.Offset, SeekOrigin.Begin); var tableBuffer = WoffBuffer.ReadBytes(decompressedStream, bytesCount, out bytesRead); Debug.Assert(bytesRead == bytesCount); if (bytesRead != bytesCount) { return(false); } woffDir.CompTable = tableBuffer; woffDir.OrigTable = tableBuffer; } catch (Exception ex) { errorOccurred = true; Trace.TraceError(ex.Message); } } } if (errorOccurred) { return(false); } } for (ushort i = 0; i < numFonts; i++) { var collectionEntry = _collectionEntries[i]; var woffFont = _woffFonts[i]; _woffFonts.Add(woffFont); woffFont.EndDirectory(); } return(true); }
private bool ReadWoff2Font(Stream stream) { var woffFont = new WoffFont(_woffHeader); _woffFonts.Add(woffFont); woffFont.BeginDirectory(_woffVersion); // 2. TableDirectory: Directory of font tables, containing size and other info. for (ushort i = 0; i < _woffHeader.NumTables; i++) { var woffDir = _woffDirs[i]; woffFont.AddDirectory(woffDir); } // 4. CompressedFontData: Contents of font tables, compressed for storage in the WOFF2 file. int bytesRead = 0; int bytesCount = (int)_woffHeader.TotalCompressedSize; if (bytesCount != 0) { byte[] compressedBuffer = WoffBuffer.ReadBytes(stream, bytesCount, out bytesRead); Debug.Assert(bytesRead == bytesCount); if (bytesRead != bytesCount) { return(false); } bool errorOccurred = false; var memoryStream = new MemoryStream(compressedBuffer); using (var brotliStream = new BrotliInputStream(memoryStream)) { var decompressedStream = new MemoryStream(); brotliStream.CopyTo(decompressedStream); decompressedStream.Seek(0, SeekOrigin.Begin); for (int i = 0; i < _woffHeader.NumTables; i++) { var woffDir = _woffDirs[i]; try { // bytesCount = (int)woffDir.TransformLength; bytesCount = (int)woffDir.CompLength; decompressedStream.Seek(woffDir.Offset, SeekOrigin.Begin); var tableBuffer = WoffBuffer.ReadBytes(decompressedStream, bytesCount, out bytesRead); Debug.Assert(bytesRead == bytesCount); if (bytesRead != bytesCount) { return(false); } woffDir.CompTable = tableBuffer; woffDir.OrigTable = tableBuffer; } catch (Exception ex) { errorOccurred = true; Trace.TraceError(ex.Message); } } } if (errorOccurred) { return(false); } } woffFont.EndDirectory(); return(true); }
private bool ReadWoff2(Stream stream) { _woffVersion = WoffUtils.Woff2Version; uint sizeRead = 0; // 1. WOFF2Header: File header with basic font type and version, along with offsets // to metadata and private data blocks. _woffHeader = new WoffHeader(WoffUtils.Woff2Version); _woffDirs = null; sizeRead = _woffHeader.HeaderSize; Debug.Assert(sizeRead == WoffUtils.Woff2HeaderSize); if (!_woffHeader.Read(stream)) { return(false); } // 2. TableDirectory: Directory of font tables, containing size and other info. uint offset = 0; _woffDirs = new List <WoffTableDirectory>(_woffHeader.NumTables); for (ushort i = 0; i < _woffHeader.NumTables; i++) { var woffDir = new WoffTableDirectory(i, _woffVersion, offset); if (woffDir.Read(stream, _woffHeader.IsTrueType)) { if (woffDir.IsTransformed) { _isTransformed = true; } _woffDirs.Add(woffDir); offset += woffDir.CompLength; } } // 3. CollectionDirectory: An optional table containing the font fragment descriptions // of font collection entries. if (_woffHeader.IsCollection) { var isLoaded = this.ReadWoff2Fonts(stream); } else { var isLoaded = this.ReadWoff2Font(stream); } // 5. ExtendedMetadata: An optional block of extended metadata, represented in XML format // and compressed for storage in the WOFF2 file. _metadata = new WoffMetadata(_woffHeader.MetaOffset, _woffHeader.MetaLength, _woffHeader.MetaOrigLength); if (_woffHeader.HasMetadata) { stream.Seek(_woffHeader.MetaOffset, SeekOrigin.Begin); int bytesRead = 0; int bytesCount = (int)_woffHeader.MetaLength; var metaBuffer = WoffBuffer.ReadBytes(stream, bytesCount, out bytesRead); Debug.Assert(bytesRead == bytesCount); if (bytesRead != bytesCount) { return(false); } _metadata.Data = metaBuffer; _metadata.OrigData = metaBuffer; if (_woffHeader.MetaLength != _woffHeader.MetaOrigLength) { bytesCount = (int)_woffHeader.MetaOrigLength; using (var brotliStream = new BrotliInputStream(new MemoryStream(metaBuffer))) { var origBuffer = WoffBuffer.ReadBytes(brotliStream, bytesCount, out bytesRead); Debug.Assert(bytesRead == bytesCount); if (bytesRead != bytesCount) { return(false); } _metadata.OrigData = origBuffer; } } } // 6. PrivateData: An optional block of private data for the font designer, foundry, or vendor to use. _privateData = new WoffPrivateData(_woffHeader.PrivateOffset, _woffHeader.PrivateLength); if (_woffHeader.HasPrivateData) { stream.Seek(_woffHeader.PrivateOffset, SeekOrigin.Begin); int bytesRead = 0; int bytesCount = (int)_woffHeader.PrivateLength; var privateBuffer = WoffBuffer.ReadBytes(stream, bytesCount, out bytesRead); Debug.Assert(bytesRead == bytesCount); if (bytesRead != bytesCount) { return(false); } _privateData.Data = privateBuffer; } return(true); }