github.com/shogo82148/std@v1.22.1-0.20240327122250-4e474527810c/compress/lzw/reader.go (about)

     1  // Copyright 2011 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  // パッケージ lzw は、T. A. Welchによって述べられた「高性能データ圧縮のためのテクニック」という文書で説明されている、Lempel-Ziv-Welch圧縮データフォーマットを実装します。
     6  //
     7  // 特に、これはGIFおよびPDFファイル形式で使用されるLZWを実装しており、可変幅コード(最大12ビット)および最初の2つの非文字コードはクリアコードとEOFコードを意味します。
     8  //
     9  // TIFFファイル形式は、LZWアルゴリズムの似ているが互換性のないバージョンを使用しています。実装については、golang.org/x/image/tiff/lzwパッケージを参照してください。
    10  package lzw
    11  
    12  import (
    13  	"github.com/shogo82148/std/io"
    14  )
    15  
    16  // OrderはLZWデータストリーム内のビットの順序を指定します。
    17  type Order int
    18  
    19  const (
    20  	// LSBは、GIFファイルフォーマットで使用されるLeast Significant Bits(最下位ビット優先)の意味です。
    21  	LSB Order = iota
    22  
    23  	// MSBは、TIFFおよびPDFファイル形式で使用される、最上位ビットを優先することを意味します。
    24  	MSB
    25  )
    26  
    27  // ReaderはLZW形式で圧縮されたデータを読み込むために使用できるio.Readerです。
    28  type Reader struct {
    29  	r        io.ByteReader
    30  	bits     uint32
    31  	nBits    uint
    32  	width    uint
    33  	read     func(*Reader) (uint16, error)
    34  	litWidth int
    35  	err      error
    36  
    37  	// 最初の1<<litWidthのコードはリテラルコードです。
    38  	// 次の2つのコードはクリアとEOFを意味します。
    39  	// 他の有効なコードは [lo, hi] の範囲にあります。ここで、lo := clear + 2 であり、
    40  	// 各コードが現れるたびに上限が増加します。
    41  	//
    42  	// overflowはhiがコード幅を超えるコードです。常に1 << widthと等しくなります。
    43  	//
    44  	// lastは最後に見たコード、またはdecoderInvalidCodeです。
    45  	//
    46  	// 不変事項はhi < overflowです。
    47  	clear, eof, hi, overflow, last uint16
    48  
    49  	// [lo, hi]の各コードcは2バイト以上に展開されます。ただし、c != hiの場合:
    50  	//   suffix[c]はこれらのバイトの最後のバイトです。
    51  	//   prefix[c]は最後のバイト以外のコードです。
    52  	//   このコードは、リテラルコードまたは[lo, c)内の別のコードである場合があります。
    53  	// c == hiの場合は特別なケースです。
    54  	suffix [1 << maxWidth]uint8
    55  	prefix [1 << maxWidth]uint16
    56  
    57  	// outputは一時的な出力バッファです。
    58  	// 文字コードはバッファの先頭から蓄積されます。
    59  	// リテラルコードは、バッファの末尾から右から左にデコードされ、
    60  	// バッファの先頭にコピーされる接尾辞のシーケンスにデコードされます。
    61  	// バッファに >= 1<<maxWidth バイトが含まれている場合、フラッシュされます。
    62  	// したがって、常にコード全体をデコードするためのスペースがあります。
    63  	output [2 * 1 << maxWidth]byte
    64  	o      int
    65  	toRead []byte
    66  }
    67  
    68  // Readはio.Readerを実装し、基になる [Reader] から非圧縮バイトを読み取ります。
    69  func (r *Reader) Read(b []byte) (int, error)
    70  
    71  // Closeは [Reader] を閉じ、将来の読み込み操作に対してエラーを返します。
    72  // サブの [io.Reader] を閉じません。
    73  func (r *Reader) Close() error
    74  
    75  func (r *Reader) Reset(src io.Reader, order Order, litWidth int)
    76  
    77  // NewReader creates a new [io.ReadCloser].
    78  // Reads from the returned [io.ReadCloser] read and decompress data from r.
    79  // If r does not also implement [io.ByteReader],
    80  // the decompressor may read more data than necessary from r.
    81  // It is the caller's responsibility to call Close on the ReadCloser when
    82  // finished reading.
    83  // The number of bits to use for literal codes, litWidth, must be in the
    84  // range [2,8] and is typically 8. It must equal the litWidth
    85  // used during compression.
    86  //
    87  // 返された [io.ReadCloser] の基底型は、*[Reader] であることが保証されます。
    88  func NewReader(r io.Reader, order Order, litWidth int) io.ReadCloser