|  | // Copyright 2020 The Monogon Project Authors. | 
|  | // | 
|  | // SPDX-License-Identifier: Apache-2.0 | 
|  | // | 
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | 
|  | // you may not use this file except in compliance with the License. | 
|  | // You may obtain a copy of the License at | 
|  | // | 
|  | //     http://www.apache.org/licenses/LICENSE-2.0 | 
|  | // | 
|  | // Unless required by applicable law or agreed to in writing, software | 
|  | // distributed under the License is distributed on an "AS IS" BASIS, | 
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
|  | // See the License for the specific language governing permissions and | 
|  | // limitations under the License. | 
|  |  | 
|  | package erofs | 
|  |  | 
|  | // This file contains compression-related functions. | 
|  | // TODO(lorenz): Fully implement compression. These are currently unused. | 
|  |  | 
|  | import "encoding/binary" | 
|  |  | 
|  | // mapHeader is a legacy but still-used advisory structure at the start of a | 
|  | // compressed VLE block. It contains constant values as annotated. | 
|  | type mapHeader struct { | 
|  | Reserved      uint32 // 0 | 
|  | Advise        uint16 // 1 | 
|  | AlgorithmType uint8  // 0 | 
|  | ClusterBits   uint8  // 0 | 
|  | } | 
|  |  | 
|  | // encodeSmallVLEBlock encodes two VLE extents into a 8 byte block. | 
|  | func encodeSmallVLEBlock(vals [2]uint16, blkaddr uint32) [8]byte { | 
|  | var out [8]byte | 
|  | binary.LittleEndian.PutUint16(out[0:2], vals[0]) | 
|  | binary.LittleEndian.PutUint16(out[2:4], vals[1]) | 
|  | binary.LittleEndian.PutUint32(out[4:8], blkaddr) | 
|  | return out | 
|  | } | 
|  |  | 
|  | // encodeBigVLEBlock encodes 16 VLE extents into a 32 byte block. | 
|  | func encodeBigVLEBlock(vals [16]uint16, blkaddr uint32) [32]byte { | 
|  | var out [32]byte | 
|  | for i, val := range vals { | 
|  | if val > 1<<14 { | 
|  | panic("value is bigger than 14 bits, cannot encode") | 
|  | } | 
|  | // Writes packed 14 bit unsigned integers | 
|  | pos := i * 14 | 
|  | bitStartPos := pos % 8 | 
|  | byteStartPos := pos / 8 | 
|  | out[byteStartPos] = out[byteStartPos]&((1<<bitStartPos)-1) | uint8(val<<bitStartPos) | 
|  | out[byteStartPos+1] = uint8(val >> (8 - bitStartPos)) | 
|  | out[byteStartPos+2] = uint8(val >> (16 - bitStartPos)) | 
|  | } | 
|  | binary.LittleEndian.PutUint32(out[28:32], blkaddr) | 
|  | return out | 
|  | } |