Пример #1
0
        public bool Read(Stream stream)
        {
            if (stream == null)
            {
                return(false);
            }
            Debug.Assert(_woffVersion == WoffUtils.Woff1Version || _woffVersion == WoffUtils.Woff2Version);

            var headerSize = this.HeaderSize;

            var header = new byte[headerSize];

            var sizeRead = stream.Read(header, 0, headerSize);

            Debug.Assert(sizeRead == headerSize);

            var bufferSize = header.Length;

            _signature = WoffBuffer.ReadUInt32BE(header, 0);
            _flavor    = WoffBuffer.ReadUInt32BE(header, 4);
            _length    = WoffBuffer.ReadUInt32BE(header, 8);

            _numTables = WoffBuffer.ReadUInt16BE(header, 12);
            _reserved  = WoffBuffer.ReadUInt16BE(header, 14);

            _totalSfntSize = WoffBuffer.ReadUInt32BE(header, 16);
            if (_woffVersion == WoffUtils.Woff1Version)
            {
                _majorVersion = WoffBuffer.ReadUInt16BE(header, 20);
                _minorVersion = WoffBuffer.ReadUInt16BE(header, 22);

                _metaOffset     = WoffBuffer.ReadUInt32BE(header, 24);
                _metaLength     = WoffBuffer.ReadUInt32BE(header, 28);
                _metaOrigLength = WoffBuffer.ReadUInt32BE(header, 32);
                _privateOffset  = WoffBuffer.ReadUInt32BE(header, 36);
                _privateLength  = WoffBuffer.ReadUInt32BE(header, 40);
            }
            else
            {
                _totalCompressedSize = WoffBuffer.ReadUInt32BE(header, 20);

                _majorVersion = WoffBuffer.ReadUInt16BE(header, 24);
                _minorVersion = WoffBuffer.ReadUInt16BE(header, 26);

                _metaOffset     = WoffBuffer.ReadUInt32BE(header, 28);
                _metaLength     = WoffBuffer.ReadUInt32BE(header, 32);
                _metaOrigLength = WoffBuffer.ReadUInt32BE(header, 36);
                _privateOffset  = WoffBuffer.ReadUInt32BE(header, 40);
                _privateLength  = WoffBuffer.ReadUInt32BE(header, 44);
            }

            // The signature field in the WOFF-1 header must contain the "magic number" 0x774F4646.
            // If the field does not contain this value, user agents must reject the file as invalid.
            Debug.Assert((bufferSize == WoffUtils.Woff1HeaderSize)
                ? _signature == WoffUtils.Woff1Signature : _signature == WoffUtils.Woff2Signature);

            // The header includes a reserved field; this must be set to zero.
            // If this field is non-zero, a conforming user agent must reject the file as invalid.
            Debug.Assert(_reserved == 0);

            return(true);
        }