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